xref: /netbsd-src/sys/arch/arm/amlogic/meson8b_pinctrl.c (revision df01e1af48216bd908706d439df81c8d95a1e1f7)
1 /* $NetBSD: meson8b_pinctrl.c,v 1.3 2022/06/23 03:36:00 brook Exp $ */
2 
3 /*-
4  * Copyright (c) 2019 Jared McNeill <jmcneill@invisible.ca>
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
21  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
23  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26  * SUCH DAMAGE.
27  */
28 
29 #include <sys/cdefs.h>
30 __KERNEL_RCSID(0, "$NetBSD: meson8b_pinctrl.c,v 1.3 2022/06/23 03:36:00 brook Exp $");
31 
32 #include <sys/param.h>
33 
34 #include <arm/amlogic/meson_pinctrl.h>
35 
36 /* CBUS pinmux registers */
37 #define	CBUS_REG(n)	((n) << 2)
38 #define	REG0		CBUS_REG(0)
39 #define	REG1		CBUS_REG(1)
40 #define	REG2		CBUS_REG(2)
41 #define	REG3		CBUS_REG(3)
42 #define	REG4		CBUS_REG(4)
43 #define	REG5		CBUS_REG(5)
44 #define	REG6		CBUS_REG(6)
45 #define	REG7		CBUS_REG(7)
46 #define	REG8		CBUS_REG(8)
47 #define	REG9		CBUS_REG(9)
48 
49 /* AO pinmux registers */
50 #define	REG		0x00
51 
52 /*
53  * GPIO banks. The values must match those in dt-bindings/gpio/meson8b-gpio.h
54  */
55 enum {
56 	GPIOX_0 = 0,
57 	GPIOX_1,
58 	GPIOX_2,
59 	GPIOX_3,
60 	GPIOX_4,
61 	GPIOX_5,
62 	GPIOX_6,
63 	GPIOX_7,
64 	GPIOX_8,
65 	GPIOX_9,
66 	GPIOX_10,
67 	GPIOX_11,
68 	GPIOX_16,
69 	GPIOX_17,
70 	GPIOX_18,
71 	GPIOX_19,
72 	GPIOX_20,
73 	GPIOX_21,
74 
75 	GPIOY_0 = 18,
76 	GPIOY_1,
77 	GPIOY_3,
78 	GPIOY_6,
79 	GPIOY_7,
80 	GPIOY_8,
81 	GPIOY_9,
82 	GPIOY_10,
83 	GPIOY_11,
84 	GPIOY_12,
85 	GPIOY_13,
86 	GPIOY_14,
87 
88 	GPIODV_9 = 30,
89 	GPIODV_24,
90 	GPIODV_25,
91 	GPIODV_26,
92 	GPIODV_27,
93 	GPIODV_28,
94 	GPIODV_29,
95 
96 	GPIOH_0 = 37,
97 	GPIOH_1,
98 	GPIOH_2,
99 	GPIOH_3,
100 	GPIOH_4,
101 	GPIOH_5,
102 	GPIOH_6,
103 	GPIOH_7,
104 	GPIOH_8,
105 	GPIOH_9,
106 
107 	CARD_0 = 47,
108 	CARD_1,
109 	CARD_2,
110 	CARD_3,
111 	CARD_4,
112 	CARD_5,
113 	CARD_6,
114 
115 	BOOT_0 = 54,
116 	BOOT_1,
117 	BOOT_2,
118 	BOOT_3,
119 	BOOT_4,
120 	BOOT_5,
121 	BOOT_6,
122 	BOOT_7,
123 	BOOT_8,
124 	BOOT_9,
125 	BOOT_10,
126 	BOOT_11,
127 	BOOT_12,
128 	BOOT_13,
129 	BOOT_14,
130 	BOOT_15,
131 	BOOT_18,
132 
133 	DIF_0_P = 73,
134 	DIF_0_N,
135 	DIF_1_P,
136 	DIF_1_N,
137 	DIF_2_P,
138 	DIF_2_N,
139 	DIF_3_P,
140 	DIF_3_N,
141 	DIF_4_P,
142 	DIF_4_N,
143 
144 	GPIOAO_0 = 0,
145 	GPIOAO_1,
146 	GPIOAO_2,
147 	GPIOAO_3,
148 	GPIOAO_4,
149 	GPIOAO_5,
150 	GPIOAO_6,
151 	GPIOAO_7,
152 	GPIOAO_8,
153 	GPIOAO_9,
154 	GPIOAO_10,
155 	GPIOAO_11,
156 	GPIOAO_12,
157 	GPIOAO_13,
158 	GPIO_BSD_EN,
159 	GPIO_TEST_N,
160 };
161 
162 #define	CBUS_GPIO(_id, _gpiobase, _gpiobit, _pullbase, _pullbit)	\
163 	[_id] = {							\
164 		.id = (_id),						\
165 		.name = __STRING(_id),					\
166 		.oen = {						\
167 			.type = MESON_PINCTRL_REGTYPE_GPIO,		\
168 			.reg = CBUS_REG((_gpiobase) + 0),		\
169 			.mask = __BIT(_gpiobit)				\
170 		},							\
171 		.out = {						\
172 			.type = MESON_PINCTRL_REGTYPE_GPIO,		\
173 			.reg = CBUS_REG((_gpiobase) + 1),		\
174 			.mask = __BIT(_gpiobit)				\
175 		},							\
176 		.in = {							\
177 			.type = MESON_PINCTRL_REGTYPE_GPIO,		\
178 			.reg = CBUS_REG((_gpiobase) + 2),		\
179 			.mask = __BIT(_gpiobit)				\
180 		},							\
181 		.pupden = {						\
182 			.type = MESON_PINCTRL_REGTYPE_PULL_ENABLE,	\
183 			.reg = CBUS_REG(_pullbase),			\
184 			.mask = __BIT(_pullbit)				\
185 		},							\
186 		.pupd = {						\
187 			.type = MESON_PINCTRL_REGTYPE_PULL,		\
188 			.reg = CBUS_REG(_pullbase),			\
189 			.mask = __BIT(_pullbit)				\
190 		},							\
191 	}
192 
193 static const struct meson_pinctrl_gpio meson8b_cbus_gpios[] = {
194 	/* GPIOX */
195 	CBUS_GPIO(GPIOX_0, 0, 0, 4, 0),
196 	CBUS_GPIO(GPIOX_1, 0, 1, 4, 1),
197 	CBUS_GPIO(GPIOX_2, 0, 2, 4, 2),
198 	CBUS_GPIO(GPIOX_3, 0, 3, 4, 3),
199 	CBUS_GPIO(GPIOX_4, 0, 4, 4, 4),
200 	CBUS_GPIO(GPIOX_5, 0, 5, 4, 5),
201 	CBUS_GPIO(GPIOX_6, 0, 6, 4, 6),
202 	CBUS_GPIO(GPIOX_7, 0, 7, 4, 7),
203 	CBUS_GPIO(GPIOX_8, 0, 8, 4, 8),
204 	CBUS_GPIO(GPIOX_9, 0, 9, 4, 9),
205 	CBUS_GPIO(GPIOX_10, 0, 10, 4, 10),
206 	CBUS_GPIO(GPIOX_11, 0, 11, 4, 11),
207 	CBUS_GPIO(GPIOX_16, 0, 16, 4, 16),
208 	CBUS_GPIO(GPIOX_17, 0, 17, 4, 17),
209 	CBUS_GPIO(GPIOX_18, 0, 18, 4, 18),
210 	CBUS_GPIO(GPIOX_19, 0, 19, 4, 19),
211 	CBUS_GPIO(GPIOX_20, 0, 20, 4, 20),
212 	CBUS_GPIO(GPIOX_21, 0, 21, 4, 21),
213 
214 	/* GPIOY */
215 	CBUS_GPIO(GPIOY_0, 3, 0, 3, 0),
216 	CBUS_GPIO(GPIOY_1, 3, 1, 3, 1),
217 	CBUS_GPIO(GPIOY_3, 3, 3, 3, 3),
218 	CBUS_GPIO(GPIOY_6, 3, 6, 3, 6),
219 	CBUS_GPIO(GPIOY_7, 3, 7, 3, 7),
220 	CBUS_GPIO(GPIOY_8, 3, 8, 3, 8),
221 	CBUS_GPIO(GPIOY_9, 3, 9, 3, 9),
222 	CBUS_GPIO(GPIOY_10, 3, 10, 3, 10),
223 	CBUS_GPIO(GPIOY_11, 3, 11, 3, 11),
224 	CBUS_GPIO(GPIOY_12, 3, 12, 3, 12),
225 	CBUS_GPIO(GPIOY_13, 3, 13, 3, 13),
226 	CBUS_GPIO(GPIOY_14, 3, 14, 3, 14),
227 
228 	/* GPIODV */
229 	CBUS_GPIO(GPIODV_9, 6, 9, 0, 9),
230 	CBUS_GPIO(GPIODV_24, 6, 24, 0, 24),
231 	CBUS_GPIO(GPIODV_25, 6, 25, 0, 25),
232 	CBUS_GPIO(GPIODV_26, 6, 26, 0, 26),
233 	CBUS_GPIO(GPIODV_27, 6, 27, 0, 27),
234 	CBUS_GPIO(GPIODV_28, 6, 28, 0, 28),
235 	CBUS_GPIO(GPIODV_29, 6, 29, 0, 29),
236 
237 	/* GPIOH */
238 	CBUS_GPIO(GPIOH_0, 9, 19, 1, 16),
239 	CBUS_GPIO(GPIOH_1, 9, 20, 1, 17),
240 	CBUS_GPIO(GPIOH_2, 9, 21, 1, 18),
241 	CBUS_GPIO(GPIOH_3, 9, 22, 1, 19),
242 	CBUS_GPIO(GPIOH_4, 9, 23, 1, 20),
243 	CBUS_GPIO(GPIOH_5, 9, 24, 1, 21),
244 	CBUS_GPIO(GPIOH_6, 9, 25, 1, 22),
245 	CBUS_GPIO(GPIOH_7, 9, 26, 1, 23),
246 	CBUS_GPIO(GPIOH_8, 9, 27, 1, 24),
247 	CBUS_GPIO(GPIOH_9, 9, 28, 1, 25),
248 
249 	/* BOOT */
250 	CBUS_GPIO(BOOT_0, 9, 0, 2, 0),
251 	CBUS_GPIO(BOOT_1, 9, 1, 2, 1),
252 	CBUS_GPIO(BOOT_2, 9, 2, 2, 2),
253 	CBUS_GPIO(BOOT_3, 9, 3, 2, 3),
254 	CBUS_GPIO(BOOT_4, 9, 4, 2, 4),
255 	CBUS_GPIO(BOOT_5, 9, 5, 2, 5),
256 	CBUS_GPIO(BOOT_6, 9, 6, 2, 6),
257 	CBUS_GPIO(BOOT_7, 9, 7, 2, 7),
258 	CBUS_GPIO(BOOT_8, 9, 8, 2, 8),
259 	CBUS_GPIO(BOOT_9, 9, 9, 2, 9),
260 	CBUS_GPIO(BOOT_10, 9, 10, 2, 10),
261 	CBUS_GPIO(BOOT_11, 9, 11, 2, 11),
262 	CBUS_GPIO(BOOT_12, 9, 12, 2, 12),
263 	CBUS_GPIO(BOOT_13, 9, 13, 2, 13),
264 	CBUS_GPIO(BOOT_14, 9, 14, 2, 14),
265 	CBUS_GPIO(BOOT_15, 9, 15, 2, 15),
266 	CBUS_GPIO(BOOT_18, 9, 18, 2, 18),
267 
268 	/* CARD */
269 	CBUS_GPIO(CARD_0, 0, 22, 2, 20),
270 	CBUS_GPIO(CARD_1, 0, 23, 2, 21),
271 	CBUS_GPIO(CARD_2, 0, 24, 2, 22),
272 	CBUS_GPIO(CARD_3, 0, 25, 2, 23),
273 	CBUS_GPIO(CARD_4, 0, 26, 2, 24),
274 	CBUS_GPIO(CARD_5, 0, 27, 2, 25),
275 	CBUS_GPIO(CARD_6, 0, 28, 2, 26),
276 };
277 
278 #define	AO_GPIO(_id, _bit)						\
279 	[_id] = {							\
280 		.id = (_id),						\
281 		.name = __STRING(_id),					\
282 		.oen = {						\
283 			.type = MESON_PINCTRL_REGTYPE_GPIO,		\
284 			.reg = 0,					\
285 			.mask = __BIT(_bit)				\
286 		},							\
287 		.out = {						\
288 			.type = MESON_PINCTRL_REGTYPE_GPIO,		\
289 			.reg = 0,					\
290 			.mask = __BIT(_bit + 16)			\
291 		},							\
292 		.in = {							\
293 			.type = MESON_PINCTRL_REGTYPE_GPIO,		\
294 			.reg = 4,					\
295 			.mask = __BIT(_bit)				\
296 		},							\
297 		.pupden = {						\
298 			.type = MESON_PINCTRL_REGTYPE_PULL,		\
299 			.reg = 0,					\
300 			.mask = __BIT(_bit)				\
301 		},							\
302 		.pupd = {						\
303 			.type = MESON_PINCTRL_REGTYPE_PULL,		\
304 			.reg = 0,					\
305 			.mask = __BIT(_bit + 16)			\
306 		},							\
307 	}
308 
309 static const struct meson_pinctrl_gpio meson8b_aobus_gpios[] = {
310 	/* GPIOAO */
311 	AO_GPIO(GPIOAO_0, 0),
312 	AO_GPIO(GPIOAO_1, 1),
313 	AO_GPIO(GPIOAO_2, 2),
314 	AO_GPIO(GPIOAO_3, 3),
315 	AO_GPIO(GPIOAO_4, 4),
316 	AO_GPIO(GPIOAO_5, 5),
317 	AO_GPIO(GPIOAO_6, 6),
318 	AO_GPIO(GPIOAO_7, 7),
319 	AO_GPIO(GPIOAO_8, 8),
320 	AO_GPIO(GPIOAO_9, 9),
321 	AO_GPIO(GPIOAO_10, 10),
322 	AO_GPIO(GPIOAO_11, 11),
323 	AO_GPIO(GPIOAO_12, 12),
324 	AO_GPIO(GPIOAO_13, 13),
325 };
326 
327 static const struct meson_pinctrl_group meson8b_cbus_groups[] = {
328 	/* GPIOX */
329 	{ "sd_d0_a",		REG8,	5,	{ GPIOX_0 }, 1 },
330 	{ "sd_d1_a",		REG8,	4,	{ GPIOX_1 }, 1 },
331 	{ "sd_d2_a",		REG8,	3,	{ GPIOX_2 }, 1 },
332 	{ "sd_d3_a",		REG8,	2,	{ GPIOX_3 }, 1 },
333 	{ "sdxc_d0_0_a",	REG5,	29,	{ GPIOX_4 }, 1 },
334 	{ "sdxc_d47_a",		REG5,	12,	{ GPIOX_4, GPIOX_5, GPIOX_6, GPIOX_7 }, 4 },
335 	{ "sdxc_d13_0_a",	REG5,	28,	{ GPIOX_5, GPIOX_6, GPIOX_7 }, 3 },
336 	{ "sd_clk_a",		REG8,	1,	{ GPIOX_8 }, 1 },
337 	{ "sd_cmd_a",		REG8,	0,	{ GPIOX_9 }, 1 },
338 	{ "xtal_32k_out",	REG3,	22,	{ GPIOX_10 }, 1 },
339 	{ "xtal_24m_out",	REG3,	20,	{ GPIOX_11 }, 1 },
340 	{ "uart_tx_b0",		REG4,	9,	{ GPIOX_16 }, 1 },
341 	{ "uart_rx_b0",		REG4,	8,	{ GPIOX_17 }, 1 },
342 	{ "uart_cts_b0",	REG4,	7,	{ GPIOX_18 }, 1 },
343 	{ "uart_rts_b0",	REG4,	6,	{ GPIOX_19 }, 1 },
344 	{ "sdxc_d0_1_a",	REG5,	14,	{ GPIOX_0 }, 1 },
345 	{ "sdxc_d13_1_a",	REG5,	13,	{ GPIOX_1, GPIOX_2, GPIOX_3 }, 3 },
346 	{ "pcm_out_a",		REG3,	30,	{ GPIOX_4 }, 1 },
347 	{ "pcm_in_a",		REG3,	29,	{ GPIOX_5 }, 1 },
348 	{ "pcm_fs_a",		REG3,	28,	{ GPIOX_6 }, 1 },
349 	{ "pcm_clk_a",		REG3,	27,	{ GPIOX_7 }, 1 },
350 	{ "sdxc_clk_a",		REG5,	11,	{ GPIOX_8 }, 1 },
351 	{ "sdxc_cmd_a",		REG5,	10,	{ GPIOX_9 }, 1 },
352 	{ "pwm_vs_0",		REG7,	31,	{ GPIOX_10 }, 1 },
353 	{ "pwm_e",		REG9,	19,	{ GPIOX_10 }, 1 },
354 	{ "pwm_vs_1",		REG7,	30,	{ GPIOX_11 }, 1 },
355 	{ "uart_tx_a",		REG4,	17,	{ GPIOX_4 }, 1 },
356 	{ "uart_rx_a",		REG4,	16,	{ GPIOX_5 }, 1 },
357 	{ "uart_cts_a",		REG4,	15,	{ GPIOX_6 }, 1 },
358 	{ "uart_rts_a",		REG4,	14,	{ GPIOX_7 }, 1 },
359 	{ "uart_tx_b1",		REG6,	19,	{ GPIOX_8 }, 1 },
360 	{ "uart_rx_b1",		REG6,	18,	{ GPIOX_9 }, 1 },
361 	{ "uart_cts_b1",	REG6,	17,	{ GPIOX_10 }, 1 },
362 	{ "uart_rts_b1",	REG6,	16,	{ GPIOX_20 }, 1 },
363 	{ "iso7816_0_clk",	REG5,	9,	{ GPIOX_6 }, 1 },
364 	{ "iso7816_0_data",	REG5,	8,	{ GPIOX_7 }, 1 },
365 	{ "spi_sclk_0",		REG4,	22,	{ GPIOX_8 }, 1 },
366 	{ "spi_miso_0",		REG4,	24,	{ GPIOX_9 }, 1 },
367 	{ "spi_mosi_0",		REG4,	23,	{ GPIOX_10 }, 1 },
368 	{ "iso7816_det",	REG4,	21,	{ GPIOX_16 }, 1 },
369 	{ "iso7816_reset",	REG4,	20,	{ GPIOX_17 }, 1 },
370 	{ "iso7816_1_clk",	REG4,	19,	{ GPIOX_18 }, 1 },
371 	{ "iso7816_1_data",	REG4,	18,	{ GPIOX_19 }, 1 },
372 	{ "spi_ss0_0",		REG4,	25,	{ GPIOX_20 }, 1 },
373 	{ "tsin_clk_b",		REG3,	6,	{ GPIOX_8 }, 1 },
374 	{ "tsin_sop_b",		REG3,	7,	{ GPIOX_9 }, 1 },
375 	{ "tsin_d0_b",		REG3,	8,	{ GPIOX_10 }, 1 },
376 	{ "pwm_b",		REG2,	3,	{ GPIOX_11 }, 1 },
377 	{ "i2c_sda_d0",		REG4,	5,	{ GPIOX_16 }, 1 },
378 	{ "i2c_sck_d0",		REG4,	4,	{ GPIOX_17 }, 1 },
379 	{ "tsin_d_valid_b",	REG3,	9,	{ GPIOX_20 }, 1 },
380 
381 	/* GPIOY */
382 	{ "tsin_d_valid_a",	REG3,	2,	{ GPIOY_0 }, 1},
383 	{ "tsin_sop_a",		REG3,	1,	{ GPIOY_1 }, 1 },
384 	{ "tsin_d17_a",		REG3,	5,	{ GPIOY_6, GPIOY_7, GPIOY_10, GPIOY_11, GPIOY_12, GPIOY_13, GPIOY_14 }, 8 },
385 	{ "tsin_clk_a",		REG3,	0,	{ GPIOY_8 }, 1 },
386 	{ "tsin_d0_a",		REG3,	4,	{ GPIOY_9 }, 1 },
387 	{ "spdif_out_0",	REG1,	7,	{ GPIOY_3 }, 1 },
388 	{ "xtal_24m",		REG3,	18,	{ GPIOY_3 }, 1 },
389 	{ "iso7816_2_clk",	REG5,	7,	{ GPIOY_13 }, 1 },
390 	{ "iso7816_2_data",	REG5,	6,	{ GPIOY_14 }, 1 },
391 
392 	/* GPIODV */
393 	{ "pwm_d",		REG3,	26,	{ GPIODV_28 }, 1 },
394 	{ "pwm_c0",		REG3,	25,	{ GPIODV_29 }, 1 },
395 	{ "pwm_vs_2",		REG7,	28,	{ GPIODV_9 }, 1 },
396 	{ "pwm_vs_3",		REG7,	27,	{ GPIODV_28 }, 1 },
397 	{ "pwm_vs_4",		REG7,	26,	{ GPIODV_29 }, 1 },
398 	{ "xtal24_out",		REG7,	25,	{ GPIODV_29 }, 1 },
399 	{ "uart_tx_c",		REG6,	23,	{ GPIODV_24 }, 1 },
400 	{ "uart_rx_c",		REG6,	22,	{ GPIODV_25 }, 1 },
401 	{ "uart_cts_c",		REG6,	21,	{ GPIODV_26 }, 1 },
402 	{ "uart_rts_c",		REG6,	20,	{ GPIODV_27 }, 1 },
403 	{ "pwm_c1",		REG3,	24,	{ GPIODV_9 }, 1 },
404 	{ "i2c_sda_a",		REG9,	31,	{ GPIODV_24 }, 1 },
405 	{ "i2c_sck_a",		REG9,	30,	{ GPIODV_25 }, 1 },
406 	{ "i2c_sda_b0",		REG9,	29,	{ GPIODV_26 }, 1 },
407 	{ "i2c_sck_b0",		REG9,	28,	{ GPIODV_27 }, 1 },
408 	{ "i2c_sda_c0",		REG9,	27,	{ GPIODV_28 }, 1 },
409 	{ "i2c_sck_c0",		REG9,	26,	{ GPIODV_29 }, 1 },
410 
411 	/* GPIOH */
412 	{ "hdmi_hpd",		REG1,	26,	{ GPIOH_0 }, 1 },
413 	{ "hdmi_sda",		REG1,	25,	{ GPIOH_1 }, 1 },
414 	{ "hdmi_scl",		REG1,	24,	{ GPIOH_2 }, 1 },
415 	{ "hdmi_cec_0",		REG1,	23,	{ GPIOH_3 }, 1 },
416 	{ "eth_txd1_0",		REG7,	21,	{ GPIOH_5 }, 1 },
417 	{ "eth_txd0_0",		REG7,	20,	{ GPIOH_6 }, 1 },
418 	{ "clk_24m_out",	REG4,	1,	{ GPIOH_9 }, 1 },
419 	{ "spi_ss1",		REG8,	11,	{ GPIOH_0 }, 1 },
420 	{ "spi_ss2",		REG8,	12,	{ GPIOH_1 }, 1 },
421 	{ "spi_ss0_1",		REG9,	13,	{ GPIOH_3 }, 1 },
422 	{ "spi_miso_1",		REG9,	12,	{ GPIOH_4 }, 1 },
423 	{ "spi_mosi_1",		REG9,	11,	{ GPIOH_5 }, 1 },
424 	{ "spi_sclk_1",		REG9,	10,	{ GPIOH_6 }, 1 },
425 	{ "eth_txd3",		REG6,	13,	{ GPIOH_7 }, 1 },
426 	{ "eth_txd2",		REG6,	12,	{ GPIOH_8 }, 1 },
427 	{ "eth_tx_clk",		REG6,	11,	{ GPIOH_9 }, 1 },
428 	{ "i2c_sda_b1",		REG5,	27,	{ GPIOH_3 }, 1 },
429 	{ "i2c_sck_b1",		REG5,	26,	{ GPIOH_4 }, 1 },
430 	{ "i2c_sda_c1",		REG5,	25,	{ GPIOH_5 }, 1 },
431 	{ "i2c_sck_c1",		REG5,	24,	{ GPIOH_6 }, 1 },
432 	{ "i2c_sda_d1",		REG4,	3,	{ GPIOH_7 }, 1 },
433 	{ "i2c_sck_d1",		REG4,	2,	{ GPIOH_8 }, 1 },
434 
435 	/* BOOT */
436 	{ "nand_io",		REG2,	26,	{ BOOT_0, BOOT_1, BOOT_2, BOOT_3, BOOT_4, BOOT_5, BOOT_6, BOOT_7 }, 8 },
437 	{ "nand_io_ce0",	REG2,	25,	{ BOOT_8 }, 1 },
438 	{ "nand_io_ce1",	REG2,	24,	{ BOOT_9 }, 1 },
439 	{ "nand_io_rb0",	REG2,	17,	{ BOOT_10 }, 1 },
440 	{ "nand_ale",		REG2,	21,	{ BOOT_11 }, 1 },
441 	{ "nand_cle",		REG2,	20,	{ BOOT_12 }, 1 },
442 	{ "nand_wen_clk",	REG2,	19,	{ BOOT_13 }, 1 },
443 	{ "nand_ren_clk",	REG2,	18,	{ BOOT_14 }, 1 },
444 	{ "nand_dqs_15",	REG2,	27,	{ BOOT_15 }, 1 },
445 	{ "nand_dqs_18",	REG2,	28,	{ BOOT_18 }, 1 },
446 	{ "sdxc_d0_c",		REG4,	30,	{ BOOT_0 }, 1 },
447 	{ "sdxc_d13_c",		REG4,	29,	{ BOOT_1, BOOT_2, BOOT_3 }, 3 },
448 	{ "sdxc_d47_c",		REG4,	28,	{ BOOT_4, BOOT_5, BOOT_6, BOOT_7 }, 4 },
449 	{ "sdxc_clk_c",		REG7,	19,	{ BOOT_8 }, 1 },
450 	{ "sdxc_cmd_c",		REG7,	18,	{ BOOT_10 }, 1 },
451 	{ "nor_d",		REG5,	1,	{ BOOT_11 }, 1 },
452 	{ "nor_q",		REG5,	3,	{ BOOT_12 }, 1 },
453 	{ "nor_c",		REG5,	2,	{ BOOT_13 }, 1 },
454 	{ "nor_cs",		REG5,	0,	{ BOOT_18 }, 1 },
455 	{ "sd_d0_c",		REG6,	29,	{ BOOT_0 }, 1 },
456 	{ "sd_d1_c",		REG6,	28,	{ BOOT_1 }, 1 },
457 	{ "sd_d2_c",		REG6,	27,	{ BOOT_2 }, 1 },
458 	{ "sd_d3_c",		REG6,	26,	{ BOOT_3 }, 1 },
459 	{ "sd_cmd_c",		REG6,	30,	{ BOOT_8 }, 1 },
460 	{ "sd_clk_c",		REG6,	31,	{ BOOT_10 }, 1 },
461 
462 	/* CARD */
463 	{ "sd_d1_b",		REG2,	14,	{ CARD_0 }, 1 },
464 	{ "sd_d0_b",		REG2,	15,	{ CARD_1 }, 1 },
465 	{ "sd_clk_b",		REG2,	11,	{ CARD_2 }, 1 },
466 	{ "sd_cmd_b",		REG2,	10,	{ CARD_3 }, 1 },
467 	{ "sd_d3_b",		REG2,	12,	{ CARD_4 }, 1 },
468 	{ "sd_d2_b",		REG2,	13,	{ CARD_5 }, 1 },
469 	{ "sdxc_d13_b",		REG2,	6,	{ CARD_0, CARD_4, CARD_5 }, 3 },
470 	{ "sdxc_d0_b",		REG2,	7,	{ CARD_1 }, 1 },
471 	{ "sdxc_clk_b",		REG2,	5,	{ CARD_2 }, 1 },
472 	{ "sdxc_cmd_b",		REG2,	4,	{ CARD_3 }, 1 },
473 
474 	/* DIF */
475 	{ "eth_rxd1",		REG6,	0,	{ DIF_0_P }, 1 },
476 	{ "eth_rxd0",		REG6,	1,	{ DIF_0_N }, 1 },
477 	{ "eth_rx_dv",		REG6,	2,	{ DIF_1_P }, 1 },
478 	{ "eth_rx_clk",		REG6,	3,	{ DIF_1_N }, 1 },
479 	{ "eth_txd0_1",		REG6,	4,	{ DIF_2_P }, 1 },
480 	{ "eth_txd1_1",		REG6,	5,	{ DIF_2_N }, 1 },
481 	{ "eth_tx_en",		REG6,	6,	{ DIF_3_P }, 1 },
482 	{ "eth_ref_clk",	REG6,	8,	{ DIF_3_N }, 1 },
483 	{ "eth_mdc",		REG6,	9,	{ DIF_4_P }, 1 },
484 	{ "eth_mdio_en",	REG6,	10,	{ DIF_4_N }, 1 },
485 	{ "eth_rxd3",		REG7,	22,	{ DIF_2_P }, 1 },
486 	{ "eth_rxd2",		REG7,	23,	{ DIF_2_N }, 1 },
487 };
488 
489 static const struct meson_pinctrl_group meson8b_aobus_groups[] = {
490 	/* GPIOAO */
491 	{ "uart_tx_ao_a",	REG,	12,	{ GPIOAO_0 }, 1 },
492 	{ "uart_rx_ao_a",	REG,	11,	{ GPIOAO_1 }, 1 },
493 	{ "uart_cts_ao_a",	REG,	10,	{ GPIOAO_2 }, 1 },
494 	{ "uart_rts_ao_a",	REG,	9,	{ GPIOAO_3 }, 1 },
495 	{ "i2c_mst_sck_ao",	REG,	6,	{ GPIOAO_4 }, 1 },
496 	{ "i2c_mst_sda_ao",	REG,	5,	{ GPIOAO_5 }, 1 },
497 	{ "clk_32k_in_out",	REG,	18,	{ GPIOAO_6 }, 1 },
498 	{ "remote_input",	REG,	0,	{ GPIOAO_7 }, 1 },
499 	{ "hdmi_cec_1",		REG,	17,	{ GPIOAO_12 }, 1 },
500 	{ "ir_blaster",		REG,	31,	{ GPIOAO_13 }, 1 },
501 	{ "pwm_c2",		REG,	22,	{ GPIOAO_3 }, 1 },
502 	{ "i2c_sck_ao",		REG,	2,	{ GPIOAO_4 }, 1 },
503 	{ "i2c_sda_ao",		REG,	1,	{ GPIOAO_5 }, 1 },
504 	{ "ir_remote_out",	REG,	21,	{ GPIOAO_7 }, 1 },
505 	{ "i2s_am_clk_out",	REG,	30,	{ GPIOAO_8 }, 1 },
506 	{ "i2s_ao_clk_out",	REG,	29,	{ GPIOAO_9 }, 1 },
507 	{ "i2s_lr_clk_out",	REG,	28,	{ GPIOAO_10 }, 1 },
508 	{ "i2s_out_01",		REG,	27,	{ GPIOAO_11 }, 1 },
509 	{ "uart_tx_ao_b0",	REG,	26,	{ GPIOAO_0 }, 1 },
510 	{ "uart_rx_ao_b0",	REG,	25,	{ GPIOAO_1 }, 1 },
511 	{ "uart_cts_ao_b",	REG,	8,	{ GPIOAO_2 }, 1 },
512 	{ "uart_rts_ao_b",	REG,	7,	{ GPIOAO_3 }, 1 },
513 	{ "uart_tx_ao_b1",	REG,	24,	{ GPIOAO_4 }, 1 },
514 	{ "uart_rx_ao_b1",	REG,	23,	{ GPIOAO_5 }, 1 },
515 	{ "spdif_out_1",	REG,	16,	{ GPIOAO_6 }, 1 },
516 	{ "i2s_in_ch01",	REG,	13,	{ GPIOAO_6 }, 1 },
517 	{ "i2s_ao_clk_in",	REG,	15,	{ GPIOAO_9 }, 1 },
518 	{ "i2s_lr_clk_in",	REG,	14,	{ GPIOAO_10 }, 1 },
519 };
520 
521 const struct meson_pinctrl_config meson8b_cbus_pinctrl_config = {
522 	.name = "Meson8b CBUS GPIO",
523 	.groups = meson8b_cbus_groups,
524 	.ngroups = __arraycount(meson8b_cbus_groups),
525 	.gpios = meson8b_cbus_gpios,
526 	.ngpios = __arraycount(meson8b_cbus_gpios),
527 };
528 
529 const struct meson_pinctrl_config meson8b_aobus_pinctrl_config = {
530 	.name = "Meson8b AO GPIO",
531 	.groups = meson8b_aobus_groups,
532 	.ngroups = __arraycount(meson8b_aobus_groups),
533 	.gpios = meson8b_aobus_gpios,
534 	.ngpios = __arraycount(meson8b_aobus_gpios),
535 };
536