Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * Allwinner V3/V3s SoCs pinctrl driver.
0003  *
0004  * Copyright (C) 2016 Icenowy Zheng <icenowy@aosc.xyz>
0005  *
0006  * Based on pinctrl-sun8i-h3.c, which is:
0007  * Copyright (C) 2015 Jens Kuske <jenskuske@gmail.com>
0008  *
0009  * Based on pinctrl-sun8i-a23.c, which is:
0010  * Copyright (C) 2014 Chen-Yu Tsai <wens@csie.org>
0011  * Copyright (C) 2014 Maxime Ripard <maxime.ripard@free-electrons.com>
0012  *
0013  * This file is licensed under the terms of the GNU General Public
0014  * License version 2.  This program is licensed "as is" without any
0015  * warranty of any kind, whether express or implied.
0016  */
0017 
0018 #include <linux/module.h>
0019 #include <linux/platform_device.h>
0020 #include <linux/of.h>
0021 #include <linux/of_device.h>
0022 #include <linux/pinctrl/pinctrl.h>
0023 
0024 #include "pinctrl-sunxi.h"
0025 
0026 static const struct sunxi_desc_pin sun8i_v3s_pins[] = {
0027     /* Hole */
0028     SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 0),
0029           SUNXI_FUNCTION(0x0, "gpio_in"),
0030           SUNXI_FUNCTION(0x1, "gpio_out"),
0031           SUNXI_FUNCTION(0x2, "uart2"),     /* TX */
0032           SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 0)),  /* PB_EINT0 */
0033     SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 1),
0034           SUNXI_FUNCTION(0x0, "gpio_in"),
0035           SUNXI_FUNCTION(0x1, "gpio_out"),
0036           SUNXI_FUNCTION(0x2, "uart2"),     /* RX */
0037           SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 1)),  /* PB_EINT1 */
0038     SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 2),
0039           SUNXI_FUNCTION(0x0, "gpio_in"),
0040           SUNXI_FUNCTION(0x1, "gpio_out"),
0041           SUNXI_FUNCTION(0x2, "uart2"),     /* RTS */
0042           SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 2)),  /* PB_EINT2 */
0043     SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 3),
0044           SUNXI_FUNCTION(0x0, "gpio_in"),
0045           SUNXI_FUNCTION(0x1, "gpio_out"),
0046           SUNXI_FUNCTION(0x2, "uart2"),     /* D1 */
0047           SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 3)),  /* PB_EINT3 */
0048     SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 4),
0049           SUNXI_FUNCTION(0x0, "gpio_in"),
0050           SUNXI_FUNCTION(0x1, "gpio_out"),
0051           SUNXI_FUNCTION(0x2, "pwm0"),
0052           SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 4)),  /* PB_EINT4 */
0053     SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 5),
0054           SUNXI_FUNCTION(0x0, "gpio_in"),
0055           SUNXI_FUNCTION(0x1, "gpio_out"),
0056           SUNXI_FUNCTION(0x2, "pwm1"),
0057           SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 5)),  /* PB_EINT5 */
0058     SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 6),
0059           SUNXI_FUNCTION(0x0, "gpio_in"),
0060           SUNXI_FUNCTION(0x1, "gpio_out"),
0061           SUNXI_FUNCTION(0x2, "i2c0"),      /* SCK */
0062           SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 6)),  /* PB_EINT6 */
0063     SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 7),
0064           SUNXI_FUNCTION(0x0, "gpio_in"),
0065           SUNXI_FUNCTION(0x1, "gpio_out"),
0066           SUNXI_FUNCTION(0x2, "i2c0"),      /* SDA */
0067           SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 7)),  /* PB_EINT7 */
0068     SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 8),
0069           SUNXI_FUNCTION(0x0, "gpio_in"),
0070           SUNXI_FUNCTION(0x1, "gpio_out"),
0071           SUNXI_FUNCTION(0x2, "i2c1"),      /* SDA */
0072           SUNXI_FUNCTION(0x3, "uart0"),     /* TX */
0073           SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 8)),  /* PB_EINT8 */
0074     SUNXI_PIN(SUNXI_PINCTRL_PIN(B, 9),
0075           SUNXI_FUNCTION(0x0, "gpio_in"),
0076           SUNXI_FUNCTION(0x1, "gpio_out"),
0077           SUNXI_FUNCTION(0x2, "i2c1"),      /* SCK */
0078           SUNXI_FUNCTION(0x3, "uart0"),     /* RX */
0079           SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 9)),  /* PB_EINT9 */
0080     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(B, 10),
0081               PINCTRL_SUN8I_V3,
0082               SUNXI_FUNCTION(0x0, "gpio_in"),
0083               SUNXI_FUNCTION(0x1, "gpio_out"),
0084               SUNXI_FUNCTION(0x2, "jtag"),      /* MS */
0085               SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 10)), /* PB_EINT10 */
0086     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(B, 11),
0087               PINCTRL_SUN8I_V3,
0088               SUNXI_FUNCTION(0x0, "gpio_in"),
0089               SUNXI_FUNCTION(0x1, "gpio_out"),
0090               SUNXI_FUNCTION(0x2, "jtag"),      /* CK */
0091               SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 11)), /* PB_EINT11 */
0092     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(B, 12),
0093               PINCTRL_SUN8I_V3,
0094               SUNXI_FUNCTION(0x0, "gpio_in"),
0095               SUNXI_FUNCTION(0x1, "gpio_out"),
0096               SUNXI_FUNCTION(0x2, "jtag"),      /* DO */
0097               SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 12)), /* PB_EINT12 */
0098     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(B, 13),
0099               PINCTRL_SUN8I_V3,
0100               SUNXI_FUNCTION(0x0, "gpio_in"),
0101               SUNXI_FUNCTION(0x1, "gpio_out"),
0102               SUNXI_FUNCTION(0x2, "jtag"),      /* DI */
0103               SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 13)), /* PB_EINT13 */
0104     /* Hole */
0105     SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 0),
0106           SUNXI_FUNCTION(0x0, "gpio_in"),
0107           SUNXI_FUNCTION(0x1, "gpio_out"),
0108           SUNXI_FUNCTION(0x2, "mmc2"),      /* CLK */
0109           SUNXI_FUNCTION(0x3, "spi0")),     /* MISO */
0110     SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 1),
0111           SUNXI_FUNCTION(0x0, "gpio_in"),
0112           SUNXI_FUNCTION(0x1, "gpio_out"),
0113           SUNXI_FUNCTION(0x2, "mmc2"),      /* CMD */
0114           SUNXI_FUNCTION(0x3, "spi0")),     /* CLK */
0115     SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 2),
0116           SUNXI_FUNCTION(0x0, "gpio_in"),
0117           SUNXI_FUNCTION(0x1, "gpio_out"),
0118           SUNXI_FUNCTION(0x2, "mmc2"),      /* RST */
0119           SUNXI_FUNCTION(0x3, "spi0")),     /* CS */
0120     SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 3),
0121           SUNXI_FUNCTION(0x0, "gpio_in"),
0122           SUNXI_FUNCTION(0x1, "gpio_out"),
0123           SUNXI_FUNCTION(0x2, "mmc2"),      /* D0 */
0124           SUNXI_FUNCTION(0x3, "spi0")),     /* MOSI */
0125     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(C, 4),
0126               PINCTRL_SUN8I_V3,
0127               SUNXI_FUNCTION(0x0, "gpio_in"),
0128               SUNXI_FUNCTION(0x1, "gpio_out"),
0129               SUNXI_FUNCTION(0x2, "mmc2")),     /* D1 */
0130     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(C, 5),
0131               PINCTRL_SUN8I_V3,
0132               SUNXI_FUNCTION(0x0, "gpio_in"),
0133               SUNXI_FUNCTION(0x1, "gpio_out"),
0134               SUNXI_FUNCTION(0x2, "mmc2")),     /* D2 */
0135     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(C, 6),
0136               PINCTRL_SUN8I_V3,
0137               SUNXI_FUNCTION(0x0, "gpio_in"),
0138               SUNXI_FUNCTION(0x1, "gpio_out"),
0139               SUNXI_FUNCTION(0x2, "mmc2")),     /* D3 */
0140     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(C, 7),
0141               PINCTRL_SUN8I_V3,
0142               SUNXI_FUNCTION(0x0, "gpio_in"),
0143               SUNXI_FUNCTION(0x1, "gpio_out"),
0144               SUNXI_FUNCTION(0x2, "mmc2")),     /* D4 */
0145     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(C, 8),
0146               PINCTRL_SUN8I_V3,
0147               SUNXI_FUNCTION(0x0, "gpio_in"),
0148               SUNXI_FUNCTION(0x1, "gpio_out"),
0149               SUNXI_FUNCTION(0x2, "mmc2")),     /* D5 */
0150     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(C, 9),
0151               PINCTRL_SUN8I_V3,
0152               SUNXI_FUNCTION(0x0, "gpio_in"),
0153               SUNXI_FUNCTION(0x1, "gpio_out"),
0154               SUNXI_FUNCTION(0x2, "mmc2")),     /* D6 */
0155     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(C, 10),
0156               PINCTRL_SUN8I_V3,
0157               SUNXI_FUNCTION(0x0, "gpio_in"),
0158               SUNXI_FUNCTION(0x1, "gpio_out"),
0159               SUNXI_FUNCTION(0x2, "mmc2")),     /* D7 */
0160     /* Hole */
0161     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(D, 0),
0162               PINCTRL_SUN8I_V3,
0163               SUNXI_FUNCTION(0x0, "gpio_in"),
0164               SUNXI_FUNCTION(0x1, "gpio_out"),
0165               SUNXI_FUNCTION(0x2, "lcd"),       /* D2 */
0166               SUNXI_FUNCTION(0x4, "emac")),     /* RXD3 */
0167     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(D, 1),
0168               PINCTRL_SUN8I_V3,
0169               SUNXI_FUNCTION(0x0, "gpio_in"),
0170               SUNXI_FUNCTION(0x1, "gpio_out"),
0171               SUNXI_FUNCTION(0x2, "lcd"),       /* D3 */
0172               SUNXI_FUNCTION(0x4, "emac")),     /* RXD2 */
0173     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(D, 2),
0174               PINCTRL_SUN8I_V3,
0175               SUNXI_FUNCTION(0x0, "gpio_in"),
0176               SUNXI_FUNCTION(0x1, "gpio_out"),
0177               SUNXI_FUNCTION(0x2, "lcd"),       /* D4 */
0178               SUNXI_FUNCTION(0x4, "emac")),     /* RXD1 */
0179     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(D, 3),
0180               PINCTRL_SUN8I_V3,
0181               SUNXI_FUNCTION(0x0, "gpio_in"),
0182               SUNXI_FUNCTION(0x1, "gpio_out"),
0183               SUNXI_FUNCTION(0x2, "lcd"),       /* D5 */
0184               SUNXI_FUNCTION(0x4, "emac")),     /* RXD0 */
0185     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(D, 4),
0186               PINCTRL_SUN8I_V3,
0187               SUNXI_FUNCTION(0x0, "gpio_in"),
0188               SUNXI_FUNCTION(0x1, "gpio_out"),
0189               SUNXI_FUNCTION(0x2, "lcd"),       /* D6 */
0190               SUNXI_FUNCTION(0x4, "emac")),     /* RXCK */
0191     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(D, 5),
0192               PINCTRL_SUN8I_V3,
0193               SUNXI_FUNCTION(0x0, "gpio_in"),
0194               SUNXI_FUNCTION(0x1, "gpio_out"),
0195               SUNXI_FUNCTION(0x2, "lcd"),       /* D7 */
0196               SUNXI_FUNCTION(0x4, "emac")),     /* RXCTL/RXDV */
0197     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(D, 6),
0198               PINCTRL_SUN8I_V3,
0199               SUNXI_FUNCTION(0x0, "gpio_in"),
0200               SUNXI_FUNCTION(0x1, "gpio_out"),
0201               SUNXI_FUNCTION(0x2, "lcd"),       /* D10 */
0202               SUNXI_FUNCTION(0x4, "emac")),     /* RXERR */
0203     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(D, 7),
0204               PINCTRL_SUN8I_V3,
0205               SUNXI_FUNCTION(0x0, "gpio_in"),
0206               SUNXI_FUNCTION(0x1, "gpio_out"),
0207               SUNXI_FUNCTION(0x2, "lcd"),       /* D11 */
0208               SUNXI_FUNCTION(0x4, "emac")),     /* TXD3 */
0209     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(D, 8),
0210               PINCTRL_SUN8I_V3,
0211               SUNXI_FUNCTION(0x0, "gpio_in"),
0212               SUNXI_FUNCTION(0x1, "gpio_out"),
0213               SUNXI_FUNCTION(0x2, "lcd"),       /* D12 */
0214               SUNXI_FUNCTION(0x4, "emac")),     /* TXD2 */
0215     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(D, 9),
0216               PINCTRL_SUN8I_V3,
0217               SUNXI_FUNCTION(0x0, "gpio_in"),
0218               SUNXI_FUNCTION(0x1, "gpio_out"),
0219               SUNXI_FUNCTION(0x2, "lcd"),       /* D13 */
0220               SUNXI_FUNCTION(0x4, "emac")),     /* TXD1 */
0221     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(D, 10),
0222               PINCTRL_SUN8I_V3,
0223               SUNXI_FUNCTION(0x0, "gpio_in"),
0224               SUNXI_FUNCTION(0x1, "gpio_out"),
0225               SUNXI_FUNCTION(0x2, "lcd"),       /* D14 */
0226               SUNXI_FUNCTION(0x4, "emac")),     /* TXD0 */
0227     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(D, 11),
0228               PINCTRL_SUN8I_V3,
0229               SUNXI_FUNCTION(0x0, "gpio_in"),
0230               SUNXI_FUNCTION(0x1, "gpio_out"),
0231               SUNXI_FUNCTION(0x2, "lcd"),       /* D15 */
0232               SUNXI_FUNCTION(0x4, "emac")),     /* CRS */
0233     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(D, 12),
0234               PINCTRL_SUN8I_V3,
0235               SUNXI_FUNCTION(0x0, "gpio_in"),
0236               SUNXI_FUNCTION(0x1, "gpio_out"),
0237               SUNXI_FUNCTION(0x2, "lcd"),       /* D18 */
0238               SUNXI_FUNCTION(0x3, "lvds"),      /* VP0 */
0239               SUNXI_FUNCTION(0x4, "emac")),     /* TXCK */
0240     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(D, 13),
0241               PINCTRL_SUN8I_V3,
0242               SUNXI_FUNCTION(0x0, "gpio_in"),
0243               SUNXI_FUNCTION(0x1, "gpio_out"),
0244               SUNXI_FUNCTION(0x2, "lcd"),       /* D19 */
0245               SUNXI_FUNCTION(0x3, "lvds"),      /* VN0 */
0246               SUNXI_FUNCTION(0x4, "emac")),     /* TXCTL/TXEN */
0247     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(D, 14),
0248               PINCTRL_SUN8I_V3,
0249               SUNXI_FUNCTION(0x0, "gpio_in"),
0250               SUNXI_FUNCTION(0x1, "gpio_out"),
0251               SUNXI_FUNCTION(0x2, "lcd"),       /* D20 */
0252               SUNXI_FUNCTION(0x3, "lvds"),      /* VP1 */
0253               SUNXI_FUNCTION(0x4, "emac")),     /* TXERR */
0254     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(D, 15),
0255               PINCTRL_SUN8I_V3,
0256               SUNXI_FUNCTION(0x0, "gpio_in"),
0257               SUNXI_FUNCTION(0x1, "gpio_out"),
0258               SUNXI_FUNCTION(0x2, "lcd"),       /* D21 */
0259               SUNXI_FUNCTION(0x3, "lvds"),      /* VN1 */
0260               SUNXI_FUNCTION(0x4, "emac")),     /* CLKIN/COL */
0261     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(D, 16),
0262               PINCTRL_SUN8I_V3,
0263               SUNXI_FUNCTION(0x0, "gpio_in"),
0264               SUNXI_FUNCTION(0x1, "gpio_out"),
0265               SUNXI_FUNCTION(0x2, "lcd"),       /* D22 */
0266               SUNXI_FUNCTION(0x3, "lvds"),      /* VP2 */
0267               SUNXI_FUNCTION(0x4, "emac")),     /* MDC */
0268     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(D, 17),
0269               PINCTRL_SUN8I_V3,
0270               SUNXI_FUNCTION(0x0, "gpio_in"),
0271               SUNXI_FUNCTION(0x1, "gpio_out"),
0272               SUNXI_FUNCTION(0x2, "lcd"),       /* D23 */
0273               SUNXI_FUNCTION(0x3, "lvds"),      /* VN2 */
0274               SUNXI_FUNCTION(0x4, "emac")),     /* MDIO */
0275     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(D, 18),
0276               PINCTRL_SUN8I_V3,
0277               SUNXI_FUNCTION(0x0, "gpio_in"),
0278               SUNXI_FUNCTION(0x1, "gpio_out"),
0279               SUNXI_FUNCTION(0x2, "lcd"),       /* CLK */
0280               SUNXI_FUNCTION(0x3, "lvds")),     /* VPC */
0281     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(D, 19),
0282               PINCTRL_SUN8I_V3,
0283               SUNXI_FUNCTION(0x0, "gpio_in"),
0284               SUNXI_FUNCTION(0x1, "gpio_out"),
0285               SUNXI_FUNCTION(0x2, "lcd"),       /* DE */
0286               SUNXI_FUNCTION(0x3, "lvds")),     /* VNC */
0287     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(D, 20),
0288               PINCTRL_SUN8I_V3,
0289               SUNXI_FUNCTION(0x0, "gpio_in"),
0290               SUNXI_FUNCTION(0x1, "gpio_out"),
0291               SUNXI_FUNCTION(0x2, "lcd"),       /* HSYNC */
0292               SUNXI_FUNCTION(0x3, "lvds")),     /* VP3 */
0293     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(D, 21),
0294               PINCTRL_SUN8I_V3,
0295               SUNXI_FUNCTION(0x0, "gpio_in"),
0296               SUNXI_FUNCTION(0x1, "gpio_out"),
0297               SUNXI_FUNCTION(0x2, "lcd"),       /* VSYNC */
0298               SUNXI_FUNCTION(0x3, "lvds")),     /* VN3 */
0299     /* Hole */
0300     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 0),
0301           SUNXI_FUNCTION(0x0, "gpio_in"),
0302           SUNXI_FUNCTION(0x1, "gpio_out"),
0303           SUNXI_FUNCTION(0x2, "csi"),       /* PCLK */
0304           SUNXI_FUNCTION(0x3, "lcd")),      /* CLK */
0305     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 1),
0306           SUNXI_FUNCTION(0x0, "gpio_in"),
0307           SUNXI_FUNCTION(0x1, "gpio_out"),
0308           SUNXI_FUNCTION(0x2, "csi"),       /* MCLK */
0309           SUNXI_FUNCTION(0x3, "lcd")),      /* DE */
0310     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 2),
0311           SUNXI_FUNCTION(0x0, "gpio_in"),
0312           SUNXI_FUNCTION(0x1, "gpio_out"),
0313           SUNXI_FUNCTION(0x2, "csi"),       /* HSYNC */
0314           SUNXI_FUNCTION(0x3, "lcd")),      /* HSYNC */
0315     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 3),
0316           SUNXI_FUNCTION(0x0, "gpio_in"),
0317           SUNXI_FUNCTION(0x1, "gpio_out"),
0318           SUNXI_FUNCTION(0x2, "csi"),       /* VSYNC */
0319           SUNXI_FUNCTION(0x3, "lcd")),      /* VSYNC */
0320     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 4),
0321           SUNXI_FUNCTION(0x0, "gpio_in"),
0322           SUNXI_FUNCTION(0x1, "gpio_out"),
0323           SUNXI_FUNCTION(0x2, "csi"),       /* D0 */
0324           SUNXI_FUNCTION(0x3, "lcd")),      /* D2 */
0325     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 5),
0326           SUNXI_FUNCTION(0x0, "gpio_in"),
0327           SUNXI_FUNCTION(0x1, "gpio_out"),
0328           SUNXI_FUNCTION(0x2, "csi"),       /* D1 */
0329           SUNXI_FUNCTION(0x3, "lcd")),      /* D3 */
0330     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 6),
0331           SUNXI_FUNCTION(0x0, "gpio_in"),
0332           SUNXI_FUNCTION(0x1, "gpio_out"),
0333           SUNXI_FUNCTION(0x2, "csi"),       /* D2 */
0334           SUNXI_FUNCTION(0x3, "lcd")),      /* D4 */
0335     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 7),
0336           SUNXI_FUNCTION(0x0, "gpio_in"),
0337           SUNXI_FUNCTION(0x1, "gpio_out"),
0338           SUNXI_FUNCTION(0x2, "csi"),       /* D3 */
0339           SUNXI_FUNCTION(0x3, "lcd")),      /* D5 */
0340     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 8),
0341           SUNXI_FUNCTION(0x0, "gpio_in"),
0342           SUNXI_FUNCTION(0x1, "gpio_out"),
0343           SUNXI_FUNCTION(0x2, "csi"),       /* D4 */
0344           SUNXI_FUNCTION(0x3, "lcd")),      /* D6 */
0345     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 9),
0346           SUNXI_FUNCTION(0x0, "gpio_in"),
0347           SUNXI_FUNCTION(0x1, "gpio_out"),
0348           SUNXI_FUNCTION(0x2, "csi"),       /* D5 */
0349           SUNXI_FUNCTION(0x3, "lcd")),      /* D7 */
0350     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 10),
0351           SUNXI_FUNCTION(0x0, "gpio_in"),
0352           SUNXI_FUNCTION(0x1, "gpio_out"),
0353           SUNXI_FUNCTION(0x2, "csi"),       /* D6 */
0354           SUNXI_FUNCTION(0x3, "lcd")),      /* D10 */
0355     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 11),
0356           SUNXI_FUNCTION(0x0, "gpio_in"),
0357           SUNXI_FUNCTION(0x1, "gpio_out"),
0358           SUNXI_FUNCTION(0x2, "csi"),       /* D7 */
0359           SUNXI_FUNCTION(0x3, "lcd")),      /* D11 */
0360     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 12),
0361           SUNXI_FUNCTION(0x0, "gpio_in"),
0362           SUNXI_FUNCTION(0x1, "gpio_out"),
0363           SUNXI_FUNCTION(0x2, "csi"),       /* D8 */
0364           SUNXI_FUNCTION(0x3, "lcd")),      /* D12 */
0365     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 13),
0366           SUNXI_FUNCTION(0x0, "gpio_in"),
0367           SUNXI_FUNCTION(0x1, "gpio_out"),
0368           SUNXI_FUNCTION(0x2, "csi"),       /* D9 */
0369           SUNXI_FUNCTION(0x3, "lcd")),      /* D13 */
0370     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 14),
0371           SUNXI_FUNCTION(0x0, "gpio_in"),
0372           SUNXI_FUNCTION(0x1, "gpio_out"),
0373           SUNXI_FUNCTION(0x2, "csi"),       /* D10 */
0374           SUNXI_FUNCTION(0x3, "lcd")),      /* D14 */
0375     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 15),
0376           SUNXI_FUNCTION(0x0, "gpio_in"),
0377           SUNXI_FUNCTION(0x1, "gpio_out"),
0378           SUNXI_FUNCTION(0x2, "csi"),       /* D11 */
0379           SUNXI_FUNCTION(0x3, "lcd")),      /* D15 */
0380     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 16),
0381           SUNXI_FUNCTION(0x0, "gpio_in"),
0382           SUNXI_FUNCTION(0x1, "gpio_out"),
0383           SUNXI_FUNCTION(0x2, "csi"),       /* D12 */
0384           SUNXI_FUNCTION(0x3, "lcd")),      /* D18 */
0385     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 17),
0386           SUNXI_FUNCTION(0x0, "gpio_in"),
0387           SUNXI_FUNCTION(0x1, "gpio_out"),
0388           SUNXI_FUNCTION(0x2, "csi"),       /* D13 */
0389           SUNXI_FUNCTION(0x3, "lcd")),      /* D19 */
0390     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 18),
0391           SUNXI_FUNCTION(0x0, "gpio_in"),
0392           SUNXI_FUNCTION(0x1, "gpio_out"),
0393           SUNXI_FUNCTION(0x2, "csi"),       /* D14 */
0394           SUNXI_FUNCTION(0x3, "lcd")),      /* D20 */
0395     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 19),
0396           SUNXI_FUNCTION(0x0, "gpio_in"),
0397           SUNXI_FUNCTION(0x1, "gpio_out"),
0398           SUNXI_FUNCTION(0x2, "csi"),       /* D15 */
0399           SUNXI_FUNCTION(0x3, "lcd")),      /* D21 */
0400     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 20),
0401           SUNXI_FUNCTION(0x0, "gpio_in"),
0402           SUNXI_FUNCTION(0x1, "gpio_out"),
0403           SUNXI_FUNCTION(0x2, "csi"),       /* FIELD */
0404           SUNXI_FUNCTION(0x3, "csi_mipi")), /* MCLK */
0405     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 21),
0406           SUNXI_FUNCTION(0x0, "gpio_in"),
0407           SUNXI_FUNCTION(0x1, "gpio_out"),
0408           SUNXI_FUNCTION(0x2, "csi"),       /* SCK */
0409           SUNXI_FUNCTION(0x3, "i2c1"),      /* SCK */
0410           SUNXI_FUNCTION(0x4, "uart1")),    /* TX */
0411     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 22),
0412           SUNXI_FUNCTION(0x0, "gpio_in"),
0413           SUNXI_FUNCTION(0x1, "gpio_out"),
0414           SUNXI_FUNCTION(0x2, "csi"),       /* SDA */
0415           SUNXI_FUNCTION(0x3, "i2c1"),      /* SDA */
0416           SUNXI_FUNCTION(0x4, "uart1")),    /* RX */
0417     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 23),
0418           SUNXI_FUNCTION(0x0, "gpio_in"),
0419           SUNXI_FUNCTION(0x1, "gpio_out"),
0420           SUNXI_FUNCTION(0x3, "lcd"),       /* D22 */
0421           SUNXI_FUNCTION(0x4, "uart1")),    /* RTS */
0422     SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 24),
0423           SUNXI_FUNCTION(0x0, "gpio_in"),
0424           SUNXI_FUNCTION(0x1, "gpio_out"),
0425           SUNXI_FUNCTION(0x3, "lcd"),       /* D23 */
0426           SUNXI_FUNCTION(0x4, "uart1")),    /* CTS */
0427     /* Hole */
0428     SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 0),
0429           SUNXI_FUNCTION(0x0, "gpio_in"),
0430           SUNXI_FUNCTION(0x1, "gpio_out"),
0431           SUNXI_FUNCTION(0x2, "mmc0"),      /* D1 */
0432           SUNXI_FUNCTION(0x3, "jtag")),     /* MS */
0433     SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 1),
0434           SUNXI_FUNCTION(0x0, "gpio_in"),
0435           SUNXI_FUNCTION(0x1, "gpio_out"),
0436           SUNXI_FUNCTION(0x2, "mmc0"),      /* D0 */
0437           SUNXI_FUNCTION(0x3, "jtag")),     /* DI */
0438     SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 2),
0439           SUNXI_FUNCTION(0x0, "gpio_in"),
0440           SUNXI_FUNCTION(0x1, "gpio_out"),
0441           SUNXI_FUNCTION(0x2, "mmc0"),      /* CLK */
0442           SUNXI_FUNCTION(0x3, "uart0")),    /* TX */
0443     SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 3),
0444           SUNXI_FUNCTION(0x0, "gpio_in"),
0445           SUNXI_FUNCTION(0x1, "gpio_out"),
0446           SUNXI_FUNCTION(0x2, "mmc0"),      /* CMD */
0447           SUNXI_FUNCTION(0x3, "jtag")),     /* DO */
0448     SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 4),
0449           SUNXI_FUNCTION(0x0, "gpio_in"),
0450           SUNXI_FUNCTION(0x1, "gpio_out"),
0451           SUNXI_FUNCTION(0x2, "mmc0"),      /* D3 */
0452           SUNXI_FUNCTION(0x3, "uart0")),    /* RX */
0453     SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 5),
0454           SUNXI_FUNCTION(0x0, "gpio_in"),
0455           SUNXI_FUNCTION(0x1, "gpio_out"),
0456           SUNXI_FUNCTION(0x2, "mmc0"),      /* D2 */
0457           SUNXI_FUNCTION(0x3, "jtag")),     /* CK */
0458     SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 6),
0459           SUNXI_FUNCTION(0x0, "gpio_in"),
0460           SUNXI_FUNCTION(0x1, "gpio_out")),
0461     /* Hole */
0462     SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 0),
0463           SUNXI_FUNCTION(0x0, "gpio_in"),
0464           SUNXI_FUNCTION(0x1, "gpio_out"),
0465           SUNXI_FUNCTION(0x2, "mmc1"),      /* CLK */
0466           SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 0)),  /* PG_EINT0 */
0467     SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 1),
0468           SUNXI_FUNCTION(0x0, "gpio_in"),
0469           SUNXI_FUNCTION(0x1, "gpio_out"),
0470           SUNXI_FUNCTION(0x2, "mmc1"),      /* CMD */
0471           SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 1)),  /* PG_EINT1 */
0472     SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 2),
0473           SUNXI_FUNCTION(0x0, "gpio_in"),
0474           SUNXI_FUNCTION(0x1, "gpio_out"),
0475           SUNXI_FUNCTION(0x2, "mmc1"),      /* D0 */
0476           SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 2)),  /* PG_EINT2 */
0477     SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 3),
0478           SUNXI_FUNCTION(0x0, "gpio_in"),
0479           SUNXI_FUNCTION(0x1, "gpio_out"),
0480           SUNXI_FUNCTION(0x2, "mmc1"),      /* D1 */
0481           SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 3)),  /* PG_EINT3 */
0482     SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 4),
0483           SUNXI_FUNCTION(0x0, "gpio_in"),
0484           SUNXI_FUNCTION(0x1, "gpio_out"),
0485           SUNXI_FUNCTION(0x2, "mmc1"),      /* D2 */
0486           SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 4)),  /* PG_EINT4 */
0487     SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 5),
0488           SUNXI_FUNCTION(0x0, "gpio_in"),
0489           SUNXI_FUNCTION(0x1, "gpio_out"),
0490           SUNXI_FUNCTION(0x2, "mmc1"),      /* D3 */
0491           SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 5)),  /* PG_EINT5 */
0492     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(G, 6),
0493               PINCTRL_SUN8I_V3,
0494               SUNXI_FUNCTION(0x0, "gpio_in"),
0495               SUNXI_FUNCTION(0x1, "gpio_out"),
0496               SUNXI_FUNCTION(0x2, "uart1"),     /* TX */
0497               SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 6)),  /* PG_EINT6 */
0498     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(G, 7),
0499               PINCTRL_SUN8I_V3,
0500               SUNXI_FUNCTION(0x0, "gpio_in"),
0501               SUNXI_FUNCTION(0x1, "gpio_out"),
0502               SUNXI_FUNCTION(0x2, "uart1"),     /* RX */
0503               SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 7)),  /* PG_EINT7 */
0504     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(G, 8),
0505               PINCTRL_SUN8I_V3,
0506               SUNXI_FUNCTION(0x0, "gpio_in"),
0507               SUNXI_FUNCTION(0x1, "gpio_out"),
0508               SUNXI_FUNCTION(0x2, "uart1"),     /* RTS */
0509               SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 8)),  /* PG_EINT8 */
0510     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(G, 9),
0511               PINCTRL_SUN8I_V3,
0512               SUNXI_FUNCTION(0x0, "gpio_in"),
0513               SUNXI_FUNCTION(0x1, "gpio_out"),
0514               SUNXI_FUNCTION(0x2, "uart1"),     /* CTS */
0515               SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 9)),  /* PG_EINT9 */
0516     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(G, 10),
0517               PINCTRL_SUN8I_V3,
0518               SUNXI_FUNCTION(0x0, "gpio_in"),
0519               SUNXI_FUNCTION(0x1, "gpio_out"),
0520               SUNXI_FUNCTION(0x2, "i2s"),       /* SYNC */
0521               SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 10)), /* PG_EINT10 */
0522     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(G, 11),
0523               PINCTRL_SUN8I_V3,
0524               SUNXI_FUNCTION(0x0, "gpio_in"),
0525               SUNXI_FUNCTION(0x1, "gpio_out"),
0526               SUNXI_FUNCTION(0x2, "i2s"),       /* BCLK */
0527               SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 11)), /* PG_EINT11 */
0528     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(G, 12),
0529               PINCTRL_SUN8I_V3,
0530               SUNXI_FUNCTION(0x0, "gpio_in"),
0531               SUNXI_FUNCTION(0x1, "gpio_out"),
0532               SUNXI_FUNCTION(0x2, "i2s"),       /* DOUT */
0533               SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 12)), /* PG_EINT12 */
0534     SUNXI_PIN_VARIANT(SUNXI_PINCTRL_PIN(G, 13),
0535               PINCTRL_SUN8I_V3,
0536               SUNXI_FUNCTION(0x0, "gpio_in"),
0537               SUNXI_FUNCTION(0x1, "gpio_out"),
0538               SUNXI_FUNCTION(0x2, "i2s"),       /* DIN */
0539               SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 13)), /* PG_EINT13 */
0540 };
0541 
0542 static const unsigned int sun8i_v3s_pinctrl_irq_bank_map[] = { 1, 2 };
0543 
0544 static const struct sunxi_pinctrl_desc sun8i_v3s_pinctrl_data = {
0545     .pins = sun8i_v3s_pins,
0546     .npins = ARRAY_SIZE(sun8i_v3s_pins),
0547     .irq_banks = 2,
0548     .irq_bank_map = sun8i_v3s_pinctrl_irq_bank_map,
0549     .irq_read_needs_mux = true
0550 };
0551 
0552 static int sun8i_v3s_pinctrl_probe(struct platform_device *pdev)
0553 {
0554     unsigned long variant = (unsigned long)of_device_get_match_data(&pdev->dev);
0555 
0556     return sunxi_pinctrl_init_with_variant(pdev, &sun8i_v3s_pinctrl_data,
0557                            variant);
0558 }
0559 
0560 static const struct of_device_id sun8i_v3s_pinctrl_match[] = {
0561     {
0562         .compatible = "allwinner,sun8i-v3-pinctrl",
0563         .data = (void *)PINCTRL_SUN8I_V3
0564     },
0565     {
0566         .compatible = "allwinner,sun8i-v3s-pinctrl",
0567         .data = (void *)PINCTRL_SUN8I_V3S
0568     },
0569     { },
0570 };
0571 
0572 static struct platform_driver sun8i_v3s_pinctrl_driver = {
0573     .probe  = sun8i_v3s_pinctrl_probe,
0574     .driver = {
0575         .name       = "sun8i-v3s-pinctrl",
0576         .of_match_table = sun8i_v3s_pinctrl_match,
0577     },
0578 };
0579 builtin_platform_driver(sun8i_v3s_pinctrl_driver);