/* $NetBSD: mesongxbb_pinctrl.c,v 1.3 2021/11/17 11:31:12 jmcneill Exp $ */ /*- * Copyright (c) 2019 Jared McNeill * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include __KERNEL_RCSID(0, "$NetBSD: mesongxbb_pinctrl.c,v 1.3 2021/11/17 11:31:12 jmcneill Exp $"); #include #include /* CBUS pinmux registers */ #define CBUS_REG(n) ((n) << 2) #define REG0 CBUS_REG(0) #define REG1 CBUS_REG(1) #define REG2 CBUS_REG(2) #define REG3 CBUS_REG(3) #define REG4 CBUS_REG(4) #define REG5 CBUS_REG(5) #define REG6 CBUS_REG(6) #define REG7 CBUS_REG(7) #define REG8 CBUS_REG(8) #define REG9 CBUS_REG(9) /* AO pinmux registers */ #define AOREG0 0x00 #define AOREG1 0x04 /* * GPIO banks. The values must match those in dt-bindings/gpio/meson-gxbb-gpio.h */ enum { GPIOZ_0 = 0, GPIOZ_1, GPIOZ_2, GPIOZ_3, GPIOZ_4, GPIOZ_5, GPIOZ_6, GPIOZ_7, GPIOZ_8, GPIOZ_9, GPIOZ_10, GPIOZ_11, GPIOZ_12, GPIOZ_13, GPIOZ_14, GPIOZ_15, GPIOH_0 = 16, GPIOH_1, GPIOH_2, GPIOH_3, BOOT_0 = 20, BOOT_1, BOOT_2, BOOT_3, BOOT_4, BOOT_5, BOOT_6, BOOT_7, BOOT_8, BOOT_9, BOOT_10, BOOT_11, BOOT_12, BOOT_13, BOOT_14, BOOT_15, BOOT_16, BOOT_17, CARD_0 = 38, CARD_1, CARD_2, CARD_3, CARD_4, CARD_5, CARD_6, GPIODV_0 = 45, GPIODV_1, GPIODV_2, GPIODV_3, GPIODV_4, GPIODV_5, GPIODV_6, GPIODV_7, GPIODV_8, GPIODV_9, GPIODV_10, GPIODV_11, GPIODV_12, GPIODV_13, GPIODV_14, GPIODV_15, GPIODV_16, GPIODV_17, GPIODV_18, GPIODV_19, GPIODV_20, GPIODV_21, GPIODV_22, GPIODV_23, GPIODV_24, GPIODV_25, GPIODV_26, GPIODV_27, GPIODV_28, GPIODV_29, GPIOY_0 = 75, GPIOY_1, GPIOY_2, GPIOY_3, GPIOY_4, GPIOY_5, GPIOY_6, GPIOY_7, GPIOY_8, GPIOY_9, GPIOY_10, GPIOY_11, GPIOY_12, GPIOY_13, GPIOY_14, GPIOY_15, GPIOY_16, GPIOX_0 = 92, GPIOX_1, GPIOX_2, GPIOX_3, GPIOX_4, GPIOX_5, GPIOX_6, GPIOX_7, GPIOX_8, GPIOX_9, GPIOX_10, GPIOX_11, GPIOX_12, GPIOX_13, GPIOX_14, GPIOX_15, GPIOX_16, GPIOX_17, GPIOX_18, GPIOX_19, GPIOX_20, GPIOX_21, GPIOX_22, GPIOCLK_0 = 115, GPIOCLK_1, GPIOCLK_2, GPIOCLK_3, GPIOAO_0 = 0, GPIOAO_1, GPIOAO_2, GPIOAO_3, GPIOAO_4, GPIOAO_5, GPIOAO_6, GPIOAO_7, GPIOAO_8, GPIOAO_9, GPIOAO_10, GPIOAO_11, GPIOAO_12, GPIOAO_13, GPIO_TEST_N, }; #define CBUS_GPIO(_id, _off, _bit) \ [_id] = { \ .id = (_id), \ .name = __STRING(_id), \ .oen = { \ .type = MESON_PINCTRL_REGTYPE_GPIO, \ .reg = CBUS_REG((_off) * 3 + 0), \ .mask = __BIT(_bit) \ }, \ .out = { \ .type = MESON_PINCTRL_REGTYPE_GPIO, \ .reg = CBUS_REG((_off) * 3 + 1), \ .mask = __BIT(_bit) \ }, \ .in = { \ .type = MESON_PINCTRL_REGTYPE_GPIO, \ .reg = CBUS_REG((_off) * 3 + 2), \ .mask = __BIT(_bit) \ }, \ .pupden = { \ .type = MESON_PINCTRL_REGTYPE_PULL_ENABLE, \ .reg = CBUS_REG(_off), \ .mask = __BIT(_bit) \ }, \ .pupd = { \ .type = MESON_PINCTRL_REGTYPE_PULL, \ .reg = CBUS_REG(_off), \ .mask = __BIT(_bit) \ }, \ } static const struct meson_pinctrl_gpio mesongxbb_periphs_gpios[] = { /* GPIODV */ CBUS_GPIO(GPIODV_0, 0, 0), CBUS_GPIO(GPIODV_1, 0, 1), CBUS_GPIO(GPIODV_2, 0, 2), CBUS_GPIO(GPIODV_3, 0, 3), CBUS_GPIO(GPIODV_4, 0, 4), CBUS_GPIO(GPIODV_5, 0, 5), CBUS_GPIO(GPIODV_6, 0, 6), CBUS_GPIO(GPIODV_7, 0, 7), CBUS_GPIO(GPIODV_8, 0, 8), CBUS_GPIO(GPIODV_9, 0, 9), CBUS_GPIO(GPIODV_10, 0, 10), CBUS_GPIO(GPIODV_11, 0, 11), CBUS_GPIO(GPIODV_12, 0, 12), CBUS_GPIO(GPIODV_13, 0, 13), CBUS_GPIO(GPIODV_14, 0, 14), CBUS_GPIO(GPIODV_15, 0, 15), CBUS_GPIO(GPIODV_16, 0, 16), CBUS_GPIO(GPIODV_17, 0, 17), CBUS_GPIO(GPIODV_18, 0, 18), CBUS_GPIO(GPIODV_19, 0, 19), CBUS_GPIO(GPIODV_20, 0, 20), CBUS_GPIO(GPIODV_21, 0, 21), CBUS_GPIO(GPIODV_22, 0, 22), /* GPIOY */ CBUS_GPIO(GPIOY_0, 1, 0), CBUS_GPIO(GPIOY_1, 1, 1), CBUS_GPIO(GPIOY_2, 1, 2), CBUS_GPIO(GPIOY_3, 1, 3), CBUS_GPIO(GPIOY_4, 1, 4), CBUS_GPIO(GPIOY_5, 1, 5), CBUS_GPIO(GPIOY_6, 1, 6), CBUS_GPIO(GPIOY_7, 1, 7), CBUS_GPIO(GPIOY_8, 1, 8), CBUS_GPIO(GPIOY_9, 1, 9), CBUS_GPIO(GPIOY_10, 1, 10), CBUS_GPIO(GPIOY_11, 1, 11), CBUS_GPIO(GPIOY_12, 1, 12), CBUS_GPIO(GPIOY_13, 1, 13), CBUS_GPIO(GPIOY_14, 1, 14), CBUS_GPIO(GPIOY_15, 1, 15), CBUS_GPIO(GPIOY_16, 1, 16), /* GPIOH */ CBUS_GPIO(GPIOH_0, 1, 20), CBUS_GPIO(GPIOH_1, 1, 21), CBUS_GPIO(GPIOH_2, 1, 22), CBUS_GPIO(GPIOH_3, 1, 23), /* BOOT */ CBUS_GPIO(BOOT_0, 2, 0), CBUS_GPIO(BOOT_1, 2, 1), CBUS_GPIO(BOOT_2, 2, 2), CBUS_GPIO(BOOT_3, 2, 3), CBUS_GPIO(BOOT_4, 2, 4), CBUS_GPIO(BOOT_5, 2, 5), CBUS_GPIO(BOOT_6, 2, 6), CBUS_GPIO(BOOT_7, 2, 7), CBUS_GPIO(BOOT_8, 2, 8), CBUS_GPIO(BOOT_9, 2, 9), CBUS_GPIO(BOOT_10, 2, 10), CBUS_GPIO(BOOT_11, 2, 11), CBUS_GPIO(BOOT_12, 2, 12), CBUS_GPIO(BOOT_13, 2, 13), CBUS_GPIO(BOOT_14, 2, 14), CBUS_GPIO(BOOT_15, 2, 15), CBUS_GPIO(BOOT_16, 2, 16), CBUS_GPIO(BOOT_17, 2, 17), /* CARD */ CBUS_GPIO(CARD_0, 2, 20), CBUS_GPIO(CARD_1, 2, 21), CBUS_GPIO(CARD_2, 2, 22), CBUS_GPIO(CARD_3, 2, 23), CBUS_GPIO(CARD_4, 2, 24), CBUS_GPIO(CARD_5, 2, 25), CBUS_GPIO(CARD_6, 2, 26), /* GPIOZ */ CBUS_GPIO(GPIOZ_0, 3, 0), CBUS_GPIO(GPIOZ_1, 3, 1), CBUS_GPIO(GPIOZ_2, 3, 2), CBUS_GPIO(GPIOZ_3, 3, 3), CBUS_GPIO(GPIOZ_4, 3, 4), CBUS_GPIO(GPIOZ_5, 3, 5), CBUS_GPIO(GPIOZ_6, 3, 6), CBUS_GPIO(GPIOZ_7, 3, 7), CBUS_GPIO(GPIOZ_8, 3, 8), CBUS_GPIO(GPIOZ_9, 3, 9), CBUS_GPIO(GPIOZ_10, 3, 10), CBUS_GPIO(GPIOZ_11, 3, 11), CBUS_GPIO(GPIOZ_12, 3, 12), CBUS_GPIO(GPIOZ_13, 3, 13), CBUS_GPIO(GPIOZ_14, 3, 14), CBUS_GPIO(GPIOZ_15, 3, 15), /* CLK */ CBUS_GPIO(GPIOCLK_0, 3, 28), CBUS_GPIO(GPIOCLK_1, 3, 29), CBUS_GPIO(GPIOCLK_2, 3, 30), CBUS_GPIO(GPIOCLK_3, 3, 31), /* GPIOX */ CBUS_GPIO(GPIOX_0, 4, 0), CBUS_GPIO(GPIOX_1, 4, 1), CBUS_GPIO(GPIOX_2, 4, 2), CBUS_GPIO(GPIOX_3, 4, 3), CBUS_GPIO(GPIOX_4, 4, 4), CBUS_GPIO(GPIOX_5, 4, 5), CBUS_GPIO(GPIOX_6, 4, 6), CBUS_GPIO(GPIOX_7, 4, 7), CBUS_GPIO(GPIOX_8, 4, 8), CBUS_GPIO(GPIOX_9, 4, 9), CBUS_GPIO(GPIOX_10, 4, 10), CBUS_GPIO(GPIOX_11, 4, 11), CBUS_GPIO(GPIOX_12, 4, 12), CBUS_GPIO(GPIOX_13, 4, 13), CBUS_GPIO(GPIOX_14, 4, 14), CBUS_GPIO(GPIOX_15, 4, 15), CBUS_GPIO(GPIOX_16, 4, 16), CBUS_GPIO(GPIOX_17, 4, 17), CBUS_GPIO(GPIOX_18, 4, 18), CBUS_GPIO(GPIOX_19, 4, 19), CBUS_GPIO(GPIOX_20, 4, 20), CBUS_GPIO(GPIOX_21, 4, 21), CBUS_GPIO(GPIOX_22, 4, 22), }; #define AO_GPIO(_id, _bit) \ [_id] = { \ .id = (_id), \ .name = __STRING(_id), \ .oen = { \ .type = MESON_PINCTRL_REGTYPE_GPIO, \ .reg = 0, \ .mask = __BIT(_bit) \ }, \ .out = { \ .type = MESON_PINCTRL_REGTYPE_GPIO, \ .reg = 0, \ .mask = __BIT(_bit + 16) \ }, \ .in = { \ .type = MESON_PINCTRL_REGTYPE_GPIO, \ .reg = 4, \ .mask = __BIT(_bit) \ }, \ .pupden = { \ .type = MESON_PINCTRL_REGTYPE_PULL, \ .reg = 0, \ .mask = __BIT(_bit) \ }, \ .pupd = { \ .type = MESON_PINCTRL_REGTYPE_PULL, \ .reg = 0, \ .mask = __BIT(_bit + 16) \ }, \ } static const struct meson_pinctrl_gpio mesongxbb_aobus_gpios[] = { /* GPIOAO */ AO_GPIO(GPIOAO_0, 0), AO_GPIO(GPIOAO_1, 1), AO_GPIO(GPIOAO_2, 2), AO_GPIO(GPIOAO_3, 3), AO_GPIO(GPIOAO_4, 4), AO_GPIO(GPIOAO_5, 5), AO_GPIO(GPIOAO_6, 6), AO_GPIO(GPIOAO_7, 7), AO_GPIO(GPIOAO_8, 8), AO_GPIO(GPIOAO_9, 9), AO_GPIO(GPIOAO_10, 10), AO_GPIO(GPIOAO_11, 11), AO_GPIO(GPIOAO_12, 12), AO_GPIO(GPIOAO_13, 13), }; static const struct meson_pinctrl_group mesongxbb_periphs_groups[] = { /* GPIOX */ { "sdio_d0", REG8, 5, { GPIOX_0 }, 1 }, { "sdio_d1", REG8, 4, { GPIOX_1 }, 1 }, { "sdio_d2", REG8, 3, { GPIOX_2 }, 1 }, { "sdio_d3", REG8, 2, { GPIOX_3 }, 1 }, { "sdio_cmd", REG8, 1, { GPIOX_4 }, 1 }, { "sdio_clk", REG8, 0, { GPIOX_5 }, 1 }, { "sdio_irq", REG8, 11, { GPIOX_7 }, 1 }, { "uart_tx_a", REG4, 13, { GPIOX_12 }, 1 }, { "uart_rx_a", REG4, 12, { GPIOX_13 }, 1 }, { "uart_cts_a", REG4, 11, { GPIOX_14 }, 1 }, { "uart_rts_a", REG4, 10, { GPIOX_15 }, 1 }, { "pwm_a_x", REG3, 17, { GPIOX_6 }, 1 }, { "pwm_e", REG2, 30, { GPIOX_19 }, 1 }, { "pwm_f_x", REG3, 18, { GPIOX_7 }, 1 }, /* GPIOY */ { "uart_cts_c", REG1, 19, { GPIOY_11 }, 1 }, { "uart_rts_c", REG1, 18, { GPIOY_12 }, 1 }, { "uart_tx_c", REG1, 17, { GPIOY_13 }, 1 }, { "uart_rx_c", REG1, 16, { GPIOY_14 }, 1 }, { "pwm_a_y", REG1, 21, { GPIOY_16 }, 1 }, { "pwm_f_y", REG1, 20, { GPIOY_15 }, 1 }, { "i2s_out_ch23_y", REG1, 5, { GPIOY_8 }, 1 }, { "i2s_out_ch45_y", REG1, 6, { GPIOY_9 }, 1 }, { "i2s_out_ch67_y", REG1, 7, { GPIOY_10 }, 1 }, { "spdif_out_y", REG1, 9, { GPIOY_12 }, 1 }, { "gen_clk_out", REG6, 15, { GPIOY_15 }, 1 }, /* GPIOZ */ { "eth_mdio", REG6, 1, { GPIOZ_0 }, 1 }, { "eth_mdc", REG6, 0, { GPIOZ_1 }, 1 }, { "eth_clk_rx_clk", REG6, 13, { GPIOZ_2 }, 1 }, { "eth_rx_dv", REG6, 12, { GPIOZ_3 }, 1 }, { "eth_rxd0", REG6, 11, { GPIOZ_4 }, 1 }, { "eth_rxd1", REG6, 10, { GPIOZ_5 }, 1 }, { "eth_rxd2", REG6, 9, { GPIOZ_6 }, 1 }, { "eth_rxd3", REG6, 8, { GPIOZ_7 }, 1 }, { "eth_rgmii_tx_clk", REG6, 7, { GPIOZ_8 }, 1 }, { "eth_tx_en", REG6, 6, { GPIOZ_9 }, 1 }, { "eth_txd0", REG6, 5, { GPIOZ_10 }, 1 }, { "eth_txd1", REG6, 4, { GPIOZ_11 }, 1 }, { "eth_txd2", REG6, 3, { GPIOZ_12 }, 1 }, { "eth_txd3", REG6, 2, { GPIOZ_13 }, 1 }, { "spi_ss0", REG5, 26, { GPIOZ_7 }, 1 }, { "spi_sclk", REG5, 27, { GPIOZ_6 }, 1 }, { "spi_miso", REG5, 28, { GPIOZ_12 }, 1 }, { "spi_mosi", REG5, 29, { GPIOZ_13 }, 1 }, /* GPIOH */ { "hdmi_hpd", REG1, 26, { GPIOH_0 }, 1 }, { "hdmi_sda", REG1, 25, { GPIOH_1 }, 1 }, { "hdmi_scl", REG1, 24, { GPIOH_2 }, 1 }, /* GPIODV */ { "uart_tx_b", REG2, 29, { GPIODV_24 }, 1 }, { "uart_rx_b", REG2, 28, { GPIODV_25 }, 1 }, { "uart_cts_b", REG2, 27, { GPIODV_26 }, 1 }, { "uart_rts_b", REG2, 26, { GPIODV_27 }, 1 }, { "pwm_b", REG3, 21, { GPIODV_29 }, 1 }, { "pwm_d", REG3, 20, { GPIODV_28 }, 1 }, { "i2c_sck_a", REG7, 27, { GPIODV_25 }, 1 }, { "i2c_sda_a", REG7, 26, { GPIODV_24 }, 1 }, { "i2c_sck_b", REG7, 25, { GPIODV_27 }, 1 }, { "i2c_sda_b", REG7, 24, { GPIODV_26 }, 1 }, { "i2c_sck_c", REG7, 23, { GPIODV_29 }, 1 }, { "i2c_sda_c", REG7, 22, { GPIODV_28 }, 1 }, /* BOOT */ { "emmc_nand_d07", REG4, 30, { BOOT_0, BOOT_1, BOOT_2, BOOT_3, BOOT_4, BOOT_5, BOOT_6, BOOT_7 }, 8 }, { "emmc_clk", REG4, 18, { BOOT_8 }, 1 }, { "emmc_cmd", REG4, 19, { BOOT_10 }, 1 }, { "emmc_ds", REG4, 31, { BOOT_15 }, 1 }, { "nor_d", REG5, 1, { BOOT_11 }, 1 }, { "nor_q", REG5, 3, { BOOT_12 }, 1 }, { "nor_c", REG5, 2, { BOOT_13 }, 1 }, { "nor_cs", REG5, 0, { BOOT_15 }, 1 }, { "nand_ce0", REG4, 26, { BOOT_8 }, 1 }, { "nand_ce1", REG4, 27, { BOOT_9 }, 1 }, { "nand_rb0", REG4, 25, { BOOT_10 }, 1 }, { "nand_ale", REG4, 24, { BOOT_11 }, 1 }, { "nand_cle", REG4, 23, { BOOT_12 }, 1 }, { "nand_wen_clk", REG4, 22, { BOOT_13 }, 1 }, { "nand_ren_wr", REG4, 21, { BOOT_14 }, 1 }, { "nand_dqs", REG4, 20, { BOOT_15 }, 1 }, /* CARD */ { "sdcard_d1", REG2, 14, { CARD_0 }, 1 }, { "sdcard_d0", REG2, 15, { CARD_1 }, 1 }, { "sdcard_d3", REG2, 12, { CARD_4 }, 1 }, { "sdcard_d2", REG2, 13, { CARD_5 }, 1 }, { "sdcard_cmd", REG2, 10, { CARD_3 }, 1 }, { "sdcard_clk", REG2, 11, { CARD_2 }, 1 }, }; static const struct meson_pinctrl_group mesongxbb_aobus_groups[] = { /* GPIOAO */ { "uart_tx_ao_b", AOREG0, 24, { GPIOAO_4 }, 1 }, { "uart_rx_ao_b", AOREG0, 25, { GPIOAO_5 }, 1 }, { "uart_tx_ao_a", AOREG0, 12, { GPIOAO_0 }, 1 }, { "uart_rx_ao_a", AOREG0, 11, { GPIOAO_1 }, 1 }, { "uart_cts_ao_a", AOREG0, 10, { GPIOAO_2 }, 1 }, { "uart_rts_ao_a", AOREG0, 9, { GPIOAO_3 }, 1 }, { "uart_cts_ao_b", AOREG0, 8, { GPIOAO_2 }, 1 }, { "uart_rts_ao_b", AOREG0, 7, { GPIOAO_3 }, 1 }, { "i2c_sck_ao", AOREG0, 6, { GPIOAO_4 }, 1 }, { "i2c_sda_ao", AOREG0, 5, { GPIOAO_5 }, 1 }, { "i2c_slave_sck_ao", AOREG0, 2, { GPIOAO_4 }, 1 }, { "i2c_slave_sda_ao", AOREG0, 1, { GPIOAO_5 }, 1 }, { "remote_input_ao", AOREG0, 0, { GPIOAO_7 }, 1 }, { "pwm_ao_a_3", AOREG0, 22, { GPIOAO_3 }, 1 }, { "pwm_ao_a_6", AOREG0, 18, { GPIOAO_6 }, 1 }, { "pwm_ao_a_12", AOREG0, 17, { GPIOAO_12 }, 1 }, { "pwm_ao_b", AOREG0, 3, { GPIOAO_13 }, 1 }, { "i2s_am_clk", AOREG0, 30, { GPIOAO_8 }, 1 }, { "i2s_out_ao_clk", AOREG0, 29, { GPIOAO_9 }, 1 }, { "i2s_out_lr_clk", AOREG0, 28, { GPIOAO_10 }, 1 }, { "i2s_out_ch01_ao", AOREG0, 27, { GPIOAO_11 }, 1 }, { "i2s_out_ch23_ao", AOREG1, 0, { GPIOAO_12 }, 1 }, { "i2s_out_ch45_ao", AOREG1, 1, { GPIOAO_13 }, 1 }, { "spdif_out_ao_6", AOREG0, 16, { GPIOAO_6 }, 1 }, { "spdif_out_ao_13", AOREG0, 4, { GPIOAO_13 }, 1 }, { "ao_cec", AOREG0, 15, { GPIOAO_12 }, 1 }, { "ee_cec", AOREG0, 14, { GPIOAO_12 }, 1 }, /* TEST_N */ { "i2s_out_ch67_ao", AOREG1, 2, { GPIO_TEST_N }, 1 }, }; const struct meson_pinctrl_config mesongxbb_periphs_pinctrl_config = { .name = "Meson GXBB periphs GPIO", .groups = mesongxbb_periphs_groups, .ngroups = __arraycount(mesongxbb_periphs_groups), .gpios = mesongxbb_periphs_gpios, .ngpios = __arraycount(mesongxbb_periphs_gpios), }; const struct meson_pinctrl_config mesongxbb_aobus_pinctrl_config = { .name = "Meson GXBB AO GPIO", .groups = mesongxbb_aobus_groups, .ngroups = __arraycount(mesongxbb_aobus_groups), .gpios = mesongxbb_aobus_gpios, .ngpios = __arraycount(mesongxbb_aobus_gpios), };