Home | History | Annotate | Line # | Download | only in amlogic
      1 /* $NetBSD: mesongxbb_pinctrl.c,v 1.3 2021/11/17 11:31:12 jmcneill Exp $ */
      2 
      3 /*-
      4  * Copyright (c) 2019 Jared McNeill <jmcneill (at) 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: mesongxbb_pinctrl.c,v 1.3 2021/11/17 11:31:12 jmcneill 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	AOREG0		0x00
     51 #define	AOREG1		0x04
     52 
     53 /*
     54  * GPIO banks. The values must match those in dt-bindings/gpio/meson-gxbb-gpio.h
     55  */
     56 enum {
     57 	GPIOZ_0 = 0,
     58 	GPIOZ_1,
     59 	GPIOZ_2,
     60 	GPIOZ_3,
     61 	GPIOZ_4,
     62 	GPIOZ_5,
     63 	GPIOZ_6,
     64 	GPIOZ_7,
     65 	GPIOZ_8,
     66 	GPIOZ_9,
     67 	GPIOZ_10,
     68 	GPIOZ_11,
     69 	GPIOZ_12,
     70 	GPIOZ_13,
     71 	GPIOZ_14,
     72 	GPIOZ_15,
     73 
     74 	GPIOH_0 = 16,
     75 	GPIOH_1,
     76 	GPIOH_2,
     77 	GPIOH_3,
     78 
     79 	BOOT_0 = 20,
     80 	BOOT_1,
     81 	BOOT_2,
     82 	BOOT_3,
     83 	BOOT_4,
     84 	BOOT_5,
     85 	BOOT_6,
     86 	BOOT_7,
     87 	BOOT_8,
     88 	BOOT_9,
     89 	BOOT_10,
     90 	BOOT_11,
     91 	BOOT_12,
     92 	BOOT_13,
     93 	BOOT_14,
     94 	BOOT_15,
     95 	BOOT_16,
     96 	BOOT_17,
     97 
     98 	CARD_0 = 38,
     99 	CARD_1,
    100 	CARD_2,
    101 	CARD_3,
    102 	CARD_4,
    103 	CARD_5,
    104 	CARD_6,
    105 
    106 	GPIODV_0 = 45,
    107 	GPIODV_1,
    108 	GPIODV_2,
    109 	GPIODV_3,
    110 	GPIODV_4,
    111 	GPIODV_5,
    112 	GPIODV_6,
    113 	GPIODV_7,
    114 	GPIODV_8,
    115 	GPIODV_9,
    116 	GPIODV_10,
    117 	GPIODV_11,
    118 	GPIODV_12,
    119 	GPIODV_13,
    120 	GPIODV_14,
    121 	GPIODV_15,
    122 	GPIODV_16,
    123 	GPIODV_17,
    124 	GPIODV_18,
    125 	GPIODV_19,
    126 	GPIODV_20,
    127 	GPIODV_21,
    128 	GPIODV_22,
    129 	GPIODV_23,
    130 	GPIODV_24,
    131 	GPIODV_25,
    132 	GPIODV_26,
    133 	GPIODV_27,
    134 	GPIODV_28,
    135 	GPIODV_29,
    136 
    137 	GPIOY_0 = 75,
    138 	GPIOY_1,
    139 	GPIOY_2,
    140 	GPIOY_3,
    141 	GPIOY_4,
    142 	GPIOY_5,
    143 	GPIOY_6,
    144 	GPIOY_7,
    145 	GPIOY_8,
    146 	GPIOY_9,
    147 	GPIOY_10,
    148 	GPIOY_11,
    149 	GPIOY_12,
    150 	GPIOY_13,
    151 	GPIOY_14,
    152 	GPIOY_15,
    153 	GPIOY_16,
    154 
    155 	GPIOX_0 = 92,
    156 	GPIOX_1,
    157 	GPIOX_2,
    158 	GPIOX_3,
    159 	GPIOX_4,
    160 	GPIOX_5,
    161 	GPIOX_6,
    162 	GPIOX_7,
    163 	GPIOX_8,
    164 	GPIOX_9,
    165 	GPIOX_10,
    166 	GPIOX_11,
    167 	GPIOX_12,
    168 	GPIOX_13,
    169 	GPIOX_14,
    170 	GPIOX_15,
    171 	GPIOX_16,
    172 	GPIOX_17,
    173 	GPIOX_18,
    174 	GPIOX_19,
    175 	GPIOX_20,
    176 	GPIOX_21,
    177 	GPIOX_22,
    178 
    179 	GPIOCLK_0 = 115,
    180 	GPIOCLK_1,
    181 	GPIOCLK_2,
    182 	GPIOCLK_3,
    183 
    184 	GPIOAO_0 = 0,
    185 	GPIOAO_1,
    186 	GPIOAO_2,
    187 	GPIOAO_3,
    188 	GPIOAO_4,
    189 	GPIOAO_5,
    190 	GPIOAO_6,
    191 	GPIOAO_7,
    192 	GPIOAO_8,
    193 	GPIOAO_9,
    194 	GPIOAO_10,
    195 	GPIOAO_11,
    196 	GPIOAO_12,
    197 	GPIOAO_13,
    198 	GPIO_TEST_N,
    199 };
    200 
    201 #define	CBUS_GPIO(_id, _off, _bit)	\
    202 	[_id] = {							\
    203 		.id = (_id),						\
    204 		.name = __STRING(_id),					\
    205 		.oen = {						\
    206 			.type = MESON_PINCTRL_REGTYPE_GPIO,		\
    207 			.reg = CBUS_REG((_off) * 3 + 0),		\
    208 			.mask = __BIT(_bit)				\
    209 		},							\
    210 		.out = {						\
    211 			.type = MESON_PINCTRL_REGTYPE_GPIO,		\
    212 			.reg = CBUS_REG((_off) * 3 + 1),		\
    213 			.mask = __BIT(_bit)				\
    214 		},							\
    215 		.in = {							\
    216 			.type = MESON_PINCTRL_REGTYPE_GPIO,		\
    217 			.reg = CBUS_REG((_off) * 3 + 2),		\
    218 			.mask = __BIT(_bit)				\
    219 		},							\
    220 		.pupden = {						\
    221 			.type = MESON_PINCTRL_REGTYPE_PULL_ENABLE,	\
    222 			.reg = CBUS_REG(_off),				\
    223 			.mask = __BIT(_bit)				\
    224 		},							\
    225 		.pupd = {						\
    226 			.type = MESON_PINCTRL_REGTYPE_PULL,		\
    227 			.reg = CBUS_REG(_off),				\
    228 			.mask = __BIT(_bit)				\
    229 		},							\
    230 	}
    231 
    232 static const struct meson_pinctrl_gpio mesongxbb_periphs_gpios[] = {
    233 	/* GPIODV */
    234 	CBUS_GPIO(GPIODV_0, 0, 0),
    235 	CBUS_GPIO(GPIODV_1, 0, 1),
    236 	CBUS_GPIO(GPIODV_2, 0, 2),
    237 	CBUS_GPIO(GPIODV_3, 0, 3),
    238 	CBUS_GPIO(GPIODV_4, 0, 4),
    239 	CBUS_GPIO(GPIODV_5, 0, 5),
    240 	CBUS_GPIO(GPIODV_6, 0, 6),
    241 	CBUS_GPIO(GPIODV_7, 0, 7),
    242 	CBUS_GPIO(GPIODV_8, 0, 8),
    243 	CBUS_GPIO(GPIODV_9, 0, 9),
    244 	CBUS_GPIO(GPIODV_10, 0, 10),
    245 	CBUS_GPIO(GPIODV_11, 0, 11),
    246 	CBUS_GPIO(GPIODV_12, 0, 12),
    247 	CBUS_GPIO(GPIODV_13, 0, 13),
    248 	CBUS_GPIO(GPIODV_14, 0, 14),
    249 	CBUS_GPIO(GPIODV_15, 0, 15),
    250 	CBUS_GPIO(GPIODV_16, 0, 16),
    251 	CBUS_GPIO(GPIODV_17, 0, 17),
    252 	CBUS_GPIO(GPIODV_18, 0, 18),
    253 	CBUS_GPIO(GPIODV_19, 0, 19),
    254 	CBUS_GPIO(GPIODV_20, 0, 20),
    255 	CBUS_GPIO(GPIODV_21, 0, 21),
    256 	CBUS_GPIO(GPIODV_22, 0, 22),
    257 
    258 	/* GPIOY */
    259 	CBUS_GPIO(GPIOY_0, 1, 0),
    260 	CBUS_GPIO(GPIOY_1, 1, 1),
    261 	CBUS_GPIO(GPIOY_2, 1, 2),
    262 	CBUS_GPIO(GPIOY_3, 1, 3),
    263 	CBUS_GPIO(GPIOY_4, 1, 4),
    264 	CBUS_GPIO(GPIOY_5, 1, 5),
    265 	CBUS_GPIO(GPIOY_6, 1, 6),
    266 	CBUS_GPIO(GPIOY_7, 1, 7),
    267 	CBUS_GPIO(GPIOY_8, 1, 8),
    268 	CBUS_GPIO(GPIOY_9, 1, 9),
    269 	CBUS_GPIO(GPIOY_10, 1, 10),
    270 	CBUS_GPIO(GPIOY_11, 1, 11),
    271 	CBUS_GPIO(GPIOY_12, 1, 12),
    272 	CBUS_GPIO(GPIOY_13, 1, 13),
    273 	CBUS_GPIO(GPIOY_14, 1, 14),
    274 	CBUS_GPIO(GPIOY_15, 1, 15),
    275 	CBUS_GPIO(GPIOY_16, 1, 16),
    276 
    277 	/* GPIOH */
    278 	CBUS_GPIO(GPIOH_0, 1, 20),
    279 	CBUS_GPIO(GPIOH_1, 1, 21),
    280 	CBUS_GPIO(GPIOH_2, 1, 22),
    281 	CBUS_GPIO(GPIOH_3, 1, 23),
    282 
    283 	/* BOOT */
    284 	CBUS_GPIO(BOOT_0, 2, 0),
    285 	CBUS_GPIO(BOOT_1, 2, 1),
    286 	CBUS_GPIO(BOOT_2, 2, 2),
    287 	CBUS_GPIO(BOOT_3, 2, 3),
    288 	CBUS_GPIO(BOOT_4, 2, 4),
    289 	CBUS_GPIO(BOOT_5, 2, 5),
    290 	CBUS_GPIO(BOOT_6, 2, 6),
    291 	CBUS_GPIO(BOOT_7, 2, 7),
    292 	CBUS_GPIO(BOOT_8, 2, 8),
    293 	CBUS_GPIO(BOOT_9, 2, 9),
    294 	CBUS_GPIO(BOOT_10, 2, 10),
    295 	CBUS_GPIO(BOOT_11, 2, 11),
    296 	CBUS_GPIO(BOOT_12, 2, 12),
    297 	CBUS_GPIO(BOOT_13, 2, 13),
    298 	CBUS_GPIO(BOOT_14, 2, 14),
    299 	CBUS_GPIO(BOOT_15, 2, 15),
    300 	CBUS_GPIO(BOOT_16, 2, 16),
    301 	CBUS_GPIO(BOOT_17, 2, 17),
    302 
    303 	/* CARD */
    304 	CBUS_GPIO(CARD_0, 2, 20),
    305 	CBUS_GPIO(CARD_1, 2, 21),
    306 	CBUS_GPIO(CARD_2, 2, 22),
    307 	CBUS_GPIO(CARD_3, 2, 23),
    308 	CBUS_GPIO(CARD_4, 2, 24),
    309 	CBUS_GPIO(CARD_5, 2, 25),
    310 	CBUS_GPIO(CARD_6, 2, 26),
    311 
    312 	/* GPIOZ */
    313 	CBUS_GPIO(GPIOZ_0, 3, 0),
    314 	CBUS_GPIO(GPIOZ_1, 3, 1),
    315 	CBUS_GPIO(GPIOZ_2, 3, 2),
    316 	CBUS_GPIO(GPIOZ_3, 3, 3),
    317 	CBUS_GPIO(GPIOZ_4, 3, 4),
    318 	CBUS_GPIO(GPIOZ_5, 3, 5),
    319 	CBUS_GPIO(GPIOZ_6, 3, 6),
    320 	CBUS_GPIO(GPIOZ_7, 3, 7),
    321 	CBUS_GPIO(GPIOZ_8, 3, 8),
    322 	CBUS_GPIO(GPIOZ_9, 3, 9),
    323 	CBUS_GPIO(GPIOZ_10, 3, 10),
    324 	CBUS_GPIO(GPIOZ_11, 3, 11),
    325 	CBUS_GPIO(GPIOZ_12, 3, 12),
    326 	CBUS_GPIO(GPIOZ_13, 3, 13),
    327 	CBUS_GPIO(GPIOZ_14, 3, 14),
    328 	CBUS_GPIO(GPIOZ_15, 3, 15),
    329 
    330 	/* CLK */
    331 	CBUS_GPIO(GPIOCLK_0, 3, 28),
    332 	CBUS_GPIO(GPIOCLK_1, 3, 29),
    333 	CBUS_GPIO(GPIOCLK_2, 3, 30),
    334 	CBUS_GPIO(GPIOCLK_3, 3, 31),
    335 
    336 	/* GPIOX */
    337 	CBUS_GPIO(GPIOX_0, 4, 0),
    338 	CBUS_GPIO(GPIOX_1, 4, 1),
    339 	CBUS_GPIO(GPIOX_2, 4, 2),
    340 	CBUS_GPIO(GPIOX_3, 4, 3),
    341 	CBUS_GPIO(GPIOX_4, 4, 4),
    342 	CBUS_GPIO(GPIOX_5, 4, 5),
    343 	CBUS_GPIO(GPIOX_6, 4, 6),
    344 	CBUS_GPIO(GPIOX_7, 4, 7),
    345 	CBUS_GPIO(GPIOX_8, 4, 8),
    346 	CBUS_GPIO(GPIOX_9, 4, 9),
    347 	CBUS_GPIO(GPIOX_10, 4, 10),
    348 	CBUS_GPIO(GPIOX_11, 4, 11),
    349 	CBUS_GPIO(GPIOX_12, 4, 12),
    350 	CBUS_GPIO(GPIOX_13, 4, 13),
    351 	CBUS_GPIO(GPIOX_14, 4, 14),
    352 	CBUS_GPIO(GPIOX_15, 4, 15),
    353 	CBUS_GPIO(GPIOX_16, 4, 16),
    354 	CBUS_GPIO(GPIOX_17, 4, 17),
    355 	CBUS_GPIO(GPIOX_18, 4, 18),
    356 	CBUS_GPIO(GPIOX_19, 4, 19),
    357 	CBUS_GPIO(GPIOX_20, 4, 20),
    358 	CBUS_GPIO(GPIOX_21, 4, 21),
    359 	CBUS_GPIO(GPIOX_22, 4, 22),
    360 };
    361 
    362 #define	AO_GPIO(_id, _bit)						\
    363 	[_id] = {							\
    364 		.id = (_id),						\
    365 		.name = __STRING(_id),					\
    366 		.oen = {						\
    367 			.type = MESON_PINCTRL_REGTYPE_GPIO,		\
    368 			.reg = 0,					\
    369 			.mask = __BIT(_bit)				\
    370 		},							\
    371 		.out = {						\
    372 			.type = MESON_PINCTRL_REGTYPE_GPIO,		\
    373 			.reg = 0,					\
    374 			.mask = __BIT(_bit + 16)			\
    375 		},							\
    376 		.in = {							\
    377 			.type = MESON_PINCTRL_REGTYPE_GPIO,		\
    378 			.reg = 4,					\
    379 			.mask = __BIT(_bit)				\
    380 		},							\
    381 		.pupden = {						\
    382 			.type = MESON_PINCTRL_REGTYPE_PULL,		\
    383 			.reg = 0,					\
    384 			.mask = __BIT(_bit)				\
    385 		},							\
    386 		.pupd = {						\
    387 			.type = MESON_PINCTRL_REGTYPE_PULL,		\
    388 			.reg = 0,					\
    389 			.mask = __BIT(_bit + 16)			\
    390 		},							\
    391 	}
    392 
    393 static const struct meson_pinctrl_gpio mesongxbb_aobus_gpios[] = {
    394 	/* GPIOAO */
    395 	AO_GPIO(GPIOAO_0, 0),
    396 	AO_GPIO(GPIOAO_1, 1),
    397 	AO_GPIO(GPIOAO_2, 2),
    398 	AO_GPIO(GPIOAO_3, 3),
    399 	AO_GPIO(GPIOAO_4, 4),
    400 	AO_GPIO(GPIOAO_5, 5),
    401 	AO_GPIO(GPIOAO_6, 6),
    402 	AO_GPIO(GPIOAO_7, 7),
    403 	AO_GPIO(GPIOAO_8, 8),
    404 	AO_GPIO(GPIOAO_9, 9),
    405 	AO_GPIO(GPIOAO_10, 10),
    406 	AO_GPIO(GPIOAO_11, 11),
    407 	AO_GPIO(GPIOAO_12, 12),
    408 	AO_GPIO(GPIOAO_13, 13),
    409 };
    410 
    411 static const struct meson_pinctrl_group mesongxbb_periphs_groups[] = {
    412 	/* GPIOX */
    413 	{ "sdio_d0",		REG8,	5,	{ GPIOX_0 }, 1 },
    414 	{ "sdio_d1",		REG8,	4,	{ GPIOX_1 }, 1 },
    415 	{ "sdio_d2",		REG8,	3,	{ GPIOX_2 }, 1 },
    416 	{ "sdio_d3",		REG8,	2,	{ GPIOX_3 }, 1 },
    417 	{ "sdio_cmd",		REG8,	1,	{ GPIOX_4 }, 1 },
    418 	{ "sdio_clk",		REG8,	0,	{ GPIOX_5 }, 1 },
    419 	{ "sdio_irq",		REG8,	11,	{ GPIOX_7 }, 1 },
    420 	{ "uart_tx_a",		REG4,	13,	{ GPIOX_12 }, 1 },
    421 	{ "uart_rx_a",		REG4,	12,	{ GPIOX_13 }, 1 },
    422 	{ "uart_cts_a",		REG4,	11,	{ GPIOX_14 }, 1 },
    423 	{ "uart_rts_a",		REG4,	10,	{ GPIOX_15 }, 1 },
    424 	{ "pwm_a_x",		REG3,	17,	{ GPIOX_6 }, 1 },
    425 	{ "pwm_e",		REG2,	30,	{ GPIOX_19 }, 1 },
    426 	{ "pwm_f_x",		REG3,	18,	{ GPIOX_7 }, 1 },
    427 
    428 	/* GPIOY */
    429 	{ "uart_cts_c",		REG1,	19,	{ GPIOY_11 }, 1 },
    430 	{ "uart_rts_c",		REG1,	18,	{ GPIOY_12 }, 1 },
    431 	{ "uart_tx_c",		REG1,	17,	{ GPIOY_13 }, 1 },
    432 	{ "uart_rx_c",		REG1,	16,	{ GPIOY_14 }, 1 },
    433 	{ "pwm_a_y",		REG1,	21,	{ GPIOY_16 }, 1 },
    434 	{ "pwm_f_y",		REG1,	20,	{ GPIOY_15 }, 1 },
    435 	{ "i2s_out_ch23_y",	REG1,	5,	{ GPIOY_8 }, 1 },
    436 	{ "i2s_out_ch45_y",	REG1,	6,	{ GPIOY_9 }, 1 },
    437 	{ "i2s_out_ch67_y",	REG1,	7,	{ GPIOY_10 }, 1 },
    438 	{ "spdif_out_y",	REG1,	9,	{ GPIOY_12 }, 1 },
    439 	{ "gen_clk_out",	REG6,	15,	{ GPIOY_15 }, 1 },
    440 
    441 	/* GPIOZ */
    442 	{ "eth_mdio",		REG6,	1,	{ GPIOZ_0 }, 1 },
    443 	{ "eth_mdc",		REG6,	0,	{ GPIOZ_1 }, 1 },
    444 	{ "eth_clk_rx_clk",	REG6,	13,	{ GPIOZ_2 }, 1 },
    445 	{ "eth_rx_dv",		REG6,	12,	{ GPIOZ_3 }, 1 },
    446 	{ "eth_rxd0",		REG6,	11,	{ GPIOZ_4 }, 1 },
    447 	{ "eth_rxd1",		REG6,	10,	{ GPIOZ_5 }, 1 },
    448 	{ "eth_rxd2",		REG6,	9,	{ GPIOZ_6 }, 1 },
    449 	{ "eth_rxd3",		REG6,	8,	{ GPIOZ_7 }, 1 },
    450 	{ "eth_rgmii_tx_clk",	REG6,	7,	{ GPIOZ_8 }, 1 },
    451 	{ "eth_tx_en",		REG6,	6,	{ GPIOZ_9 }, 1 },
    452 	{ "eth_txd0",		REG6,	5,	{ GPIOZ_10 }, 1 },
    453 	{ "eth_txd1",		REG6,	4,	{ GPIOZ_11 }, 1 },
    454 	{ "eth_txd2",		REG6,	3,	{ GPIOZ_12 }, 1 },
    455 	{ "eth_txd3",		REG6,	2,	{ GPIOZ_13 }, 1 },
    456 	{ "spi_ss0",		REG5,	26,	{ GPIOZ_7 }, 1 },
    457 	{ "spi_sclk",		REG5,	27,	{ GPIOZ_6 }, 1 },
    458 	{ "spi_miso",		REG5,	28,	{ GPIOZ_12 }, 1 },
    459 	{ "spi_mosi",		REG5,	29,	{ GPIOZ_13 }, 1 },
    460 
    461 	/* GPIOH */
    462 	{ "hdmi_hpd",		REG1,	26,	{ GPIOH_0 }, 1 },
    463 	{ "hdmi_sda",		REG1,	25,	{ GPIOH_1 }, 1 },
    464 	{ "hdmi_scl",		REG1,	24,	{ GPIOH_2 }, 1 },
    465 
    466 	/* GPIODV */
    467 	{ "uart_tx_b",		REG2,	29,	{ GPIODV_24 }, 1 },
    468 	{ "uart_rx_b",		REG2,	28,	{ GPIODV_25 }, 1 },
    469 	{ "uart_cts_b",		REG2,	27,	{ GPIODV_26 }, 1 },
    470 	{ "uart_rts_b",		REG2,	26,	{ GPIODV_27 }, 1 },
    471 	{ "pwm_b",		REG3,	21,	{ GPIODV_29 }, 1 },
    472 	{ "pwm_d",		REG3,	20,	{ GPIODV_28 }, 1 },
    473 	{ "i2c_sck_a",		REG7,	27,	{ GPIODV_25 }, 1 },
    474 	{ "i2c_sda_a",		REG7,	26,	{ GPIODV_24 }, 1 },
    475 	{ "i2c_sck_b",		REG7,	25,	{ GPIODV_27 }, 1 },
    476 	{ "i2c_sda_b",		REG7,	24,	{ GPIODV_26 }, 1 },
    477 	{ "i2c_sck_c",		REG7,	23,	{ GPIODV_29 }, 1 },
    478 	{ "i2c_sda_c",		REG7,	22,	{ GPIODV_28 }, 1 },
    479 
    480 	/* BOOT */
    481 	{ "emmc_nand_d07",	REG4,	30,	{ BOOT_0, BOOT_1, BOOT_2, BOOT_3, BOOT_4, BOOT_5, BOOT_6, BOOT_7 }, 8 },
    482 	{ "emmc_clk",		REG4,	18,	{ BOOT_8 }, 1 },
    483 	{ "emmc_cmd",		REG4,	19,	{ BOOT_10 }, 1 },
    484 	{ "emmc_ds",		REG4,	31,	{ BOOT_15 }, 1 },
    485 	{ "nor_d",		REG5,	1,	{ BOOT_11 }, 1 },
    486 	{ "nor_q",		REG5,	3,	{ BOOT_12 }, 1 },
    487 	{ "nor_c",		REG5,	2,	{ BOOT_13 }, 1 },
    488 	{ "nor_cs",		REG5,	0,	{ BOOT_15 }, 1 },
    489 	{ "nand_ce0",		REG4,	26,	{ BOOT_8 }, 1 },
    490 	{ "nand_ce1",		REG4,	27,	{ BOOT_9 }, 1 },
    491 	{ "nand_rb0",		REG4,	25,	{ BOOT_10 }, 1 },
    492 	{ "nand_ale",		REG4,	24,	{ BOOT_11 }, 1 },
    493 	{ "nand_cle",		REG4,	23,	{ BOOT_12 }, 1 },
    494 	{ "nand_wen_clk",	REG4,	22,	{ BOOT_13 }, 1 },
    495 	{ "nand_ren_wr",	REG4,	21,	{ BOOT_14 }, 1 },
    496 	{ "nand_dqs",		REG4,	20,	{ BOOT_15 }, 1 },
    497 
    498 	/* CARD */
    499 	{ "sdcard_d1",		REG2,	14,	{ CARD_0 }, 1 },
    500 	{ "sdcard_d0",		REG2,	15,	{ CARD_1 }, 1 },
    501 	{ "sdcard_d3",		REG2,	12,	{ CARD_4 }, 1 },
    502 	{ "sdcard_d2",		REG2,	13,	{ CARD_5 }, 1 },
    503 	{ "sdcard_cmd",		REG2,	10,	{ CARD_3 }, 1 },
    504 	{ "sdcard_clk",		REG2,	11,	{ CARD_2 }, 1 },
    505 };
    506 
    507 static const struct meson_pinctrl_group mesongxbb_aobus_groups[] = {
    508 	/* GPIOAO */
    509 	{ "uart_tx_ao_b",	AOREG0,	24,	{ GPIOAO_4 }, 1 },
    510 	{ "uart_rx_ao_b",	AOREG0,	25,	{ GPIOAO_5 }, 1 },
    511 	{ "uart_tx_ao_a",	AOREG0,	12,	{ GPIOAO_0 }, 1 },
    512 	{ "uart_rx_ao_a",	AOREG0,	11,	{ GPIOAO_1 }, 1 },
    513 	{ "uart_cts_ao_a",	AOREG0,	10,	{ GPIOAO_2 }, 1 },
    514 	{ "uart_rts_ao_a",	AOREG0,	9,	{ GPIOAO_3 }, 1 },
    515 	{ "uart_cts_ao_b",	AOREG0,	8,	{ GPIOAO_2 }, 1 },
    516 	{ "uart_rts_ao_b",	AOREG0,	7,	{ GPIOAO_3 }, 1 },
    517 	{ "i2c_sck_ao",		AOREG0,	6,	{ GPIOAO_4 }, 1 },
    518 	{ "i2c_sda_ao",		AOREG0,	5,	{ GPIOAO_5 }, 1 },
    519 	{ "i2c_slave_sck_ao",	AOREG0,	2,	{ GPIOAO_4 }, 1 },
    520 	{ "i2c_slave_sda_ao",	AOREG0,	1,	{ GPIOAO_5 }, 1 },
    521 	{ "remote_input_ao",	AOREG0,	0,	{ GPIOAO_7 }, 1 },
    522 	{ "pwm_ao_a_3",		AOREG0,	22,	{ GPIOAO_3 }, 1 },
    523 	{ "pwm_ao_a_6",		AOREG0,	18,	{ GPIOAO_6 }, 1 },
    524 	{ "pwm_ao_a_12",	AOREG0,	17,	{ GPIOAO_12 }, 1 },
    525 	{ "pwm_ao_b",		AOREG0,	3,	{ GPIOAO_13 }, 1 },
    526 	{ "i2s_am_clk",		AOREG0,	30,	{ GPIOAO_8 }, 1 },
    527 	{ "i2s_out_ao_clk",	AOREG0,	29,	{ GPIOAO_9 }, 1 },
    528 	{ "i2s_out_lr_clk",	AOREG0,	28,	{ GPIOAO_10 }, 1 },
    529 	{ "i2s_out_ch01_ao",	AOREG0,	27,	{ GPIOAO_11 }, 1 },
    530 	{ "i2s_out_ch23_ao",	AOREG1,	0,	{ GPIOAO_12 }, 1 },
    531 	{ "i2s_out_ch45_ao",	AOREG1,	1,	{ GPIOAO_13 }, 1 },
    532 	{ "spdif_out_ao_6",	AOREG0,	16,	{ GPIOAO_6 }, 1 },
    533 	{ "spdif_out_ao_13",	AOREG0,	4,	{ GPIOAO_13 }, 1 },
    534 	{ "ao_cec",		AOREG0,	15,	{ GPIOAO_12 }, 1 },
    535 	{ "ee_cec",		AOREG0,	14,	{ GPIOAO_12 }, 1 },
    536 
    537 	/* TEST_N */
    538 	{ "i2s_out_ch67_ao",	AOREG1,	2,	{ GPIO_TEST_N }, 1 },
    539 
    540 };
    541 
    542 const struct meson_pinctrl_config mesongxbb_periphs_pinctrl_config = {
    543 	.name = "Meson GXBB periphs GPIO",
    544 	.groups = mesongxbb_periphs_groups,
    545 	.ngroups = __arraycount(mesongxbb_periphs_groups),
    546 	.gpios = mesongxbb_periphs_gpios,
    547 	.ngpios = __arraycount(mesongxbb_periphs_gpios),
    548 };
    549 
    550 const struct meson_pinctrl_config mesongxbb_aobus_pinctrl_config = {
    551 	.name = "Meson GXBB AO GPIO",
    552 	.groups = mesongxbb_aobus_groups,
    553 	.ngroups = __arraycount(mesongxbb_aobus_groups),
    554 	.gpios = mesongxbb_aobus_gpios,
    555 	.ngpios = __arraycount(mesongxbb_aobus_gpios),
    556 };
    557