cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

pinctrl-sun50i-h5.c (22703B)


      1/*
      2 * Allwinner H5 SoC pinctrl driver.
      3 *
      4 * Copyright (C) 2016 Icenowy Zheng <icenowy@aosc.xyz>
      5 *
      6 * Based on pinctrl-sun8i-h3.c, which is:
      7 * Copyright (C) 2015 Jens Kuske <jenskuske@gmail.com>
      8 *
      9 * Based on pinctrl-sun8i-a23.c, which is:
     10 * Copyright (C) 2014 Chen-Yu Tsai <wens@csie.org>
     11 * Copyright (C) 2014 Maxime Ripard <maxime.ripard@free-electrons.com>
     12 *
     13 * This file is licensed under the terms of the GNU General Public
     14 * License version 2.  This program is licensed "as is" without any
     15 * warranty of any kind, whether express or implied.
     16 */
     17
     18#include <linux/module.h>
     19#include <linux/platform_device.h>
     20#include <linux/of.h>
     21#include <linux/of_device.h>
     22#include <linux/pinctrl/pinctrl.h>
     23
     24#include "pinctrl-sunxi.h"
     25
     26static const struct sunxi_desc_pin sun50i_h5_pins[] = {
     27	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 0),
     28		  SUNXI_FUNCTION(0x0, "gpio_in"),
     29		  SUNXI_FUNCTION(0x1, "gpio_out"),
     30		  SUNXI_FUNCTION(0x2, "uart2"),		/* TX */
     31		  SUNXI_FUNCTION(0x3, "jtag"),		/* MS */
     32		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 0)),	/* PA_EINT0 */
     33	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 1),
     34		  SUNXI_FUNCTION(0x0, "gpio_in"),
     35		  SUNXI_FUNCTION(0x1, "gpio_out"),
     36		  SUNXI_FUNCTION(0x2, "uart2"),		/* RX */
     37		  SUNXI_FUNCTION(0x3, "jtag"),		/* CK */
     38		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 1)),	/* PA_EINT1 */
     39	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 2),
     40		  SUNXI_FUNCTION(0x0, "gpio_in"),
     41		  SUNXI_FUNCTION(0x1, "gpio_out"),
     42		  SUNXI_FUNCTION(0x2, "uart2"),		/* RTS */
     43		  SUNXI_FUNCTION(0x3, "jtag"),		/* DO */
     44		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 2)),	/* PA_EINT2 */
     45	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 3),
     46		  SUNXI_FUNCTION(0x0, "gpio_in"),
     47		  SUNXI_FUNCTION(0x1, "gpio_out"),
     48		  SUNXI_FUNCTION(0x2, "uart2"),		/* CTS */
     49		  SUNXI_FUNCTION(0x3, "jtag"),		/* DI */
     50		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 3)),	/* PA_EINT3 */
     51	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 4),
     52		  SUNXI_FUNCTION(0x0, "gpio_in"),
     53		  SUNXI_FUNCTION(0x1, "gpio_out"),
     54		  SUNXI_FUNCTION(0x2, "uart0"),		/* TX */
     55		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 4)),	/* PA_EINT4 */
     56	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 5),
     57		  SUNXI_FUNCTION(0x0, "gpio_in"),
     58		  SUNXI_FUNCTION(0x1, "gpio_out"),
     59		  SUNXI_FUNCTION(0x2, "uart0"),		/* RX */
     60		  SUNXI_FUNCTION(0x3, "pwm0"),
     61		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 5)),	/* PA_EINT5 */
     62	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 6),
     63		  SUNXI_FUNCTION(0x0, "gpio_in"),
     64		  SUNXI_FUNCTION(0x1, "gpio_out"),
     65		  SUNXI_FUNCTION(0x2, "sim"),		/* PWREN */
     66		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 6)),	/* PA_EINT6 */
     67	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 7),
     68		  SUNXI_FUNCTION(0x0, "gpio_in"),
     69		  SUNXI_FUNCTION(0x1, "gpio_out"),
     70		  SUNXI_FUNCTION(0x2, "sim"),		/* CLK */
     71		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 7)),	/* PA_EINT7 */
     72	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 8),
     73		  SUNXI_FUNCTION(0x0, "gpio_in"),
     74		  SUNXI_FUNCTION(0x1, "gpio_out"),
     75		  SUNXI_FUNCTION(0x2, "sim"),		/* DATA */
     76		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 8)),	/* PA_EINT8 */
     77	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 9),
     78		  SUNXI_FUNCTION(0x0, "gpio_in"),
     79		  SUNXI_FUNCTION(0x1, "gpio_out"),
     80		  SUNXI_FUNCTION(0x2, "sim"),		/* RST */
     81		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 9)),	/* PA_EINT9 */
     82	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 10),
     83		  SUNXI_FUNCTION(0x0, "gpio_in"),
     84		  SUNXI_FUNCTION(0x1, "gpio_out"),
     85		  SUNXI_FUNCTION(0x2, "sim"),		/* DET */
     86		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 10)),	/* PA_EINT10 */
     87	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 11),
     88		  SUNXI_FUNCTION(0x0, "gpio_in"),
     89		  SUNXI_FUNCTION(0x1, "gpio_out"),
     90		  SUNXI_FUNCTION(0x2, "i2c0"),		/* SCK */
     91		  SUNXI_FUNCTION(0x3, "di"),		/* TX */
     92		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 11)),	/* PA_EINT11 */
     93	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 12),
     94		  SUNXI_FUNCTION(0x0, "gpio_in"),
     95		  SUNXI_FUNCTION(0x1, "gpio_out"),
     96		  SUNXI_FUNCTION(0x2, "i2c0"),		/* SDA */
     97		  SUNXI_FUNCTION(0x3, "di"),		/* RX */
     98		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 12)),	/* PA_EINT12 */
     99	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 13),
    100		  SUNXI_FUNCTION(0x0, "gpio_in"),
    101		  SUNXI_FUNCTION(0x1, "gpio_out"),
    102		  SUNXI_FUNCTION(0x2, "spi1"),		/* CS */
    103		  SUNXI_FUNCTION(0x3, "uart3"),		/* TX */
    104		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 13)),	/* PA_EINT13 */
    105	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 14),
    106		  SUNXI_FUNCTION(0x0, "gpio_in"),
    107		  SUNXI_FUNCTION(0x1, "gpio_out"),
    108		  SUNXI_FUNCTION(0x2, "spi1"),		/* CLK */
    109		  SUNXI_FUNCTION(0x3, "uart3"),		/* RX */
    110		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 14)),	/* PA_EINT14 */
    111	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 15),
    112		  SUNXI_FUNCTION(0x0, "gpio_in"),
    113		  SUNXI_FUNCTION(0x1, "gpio_out"),
    114		  SUNXI_FUNCTION(0x2, "spi1"),		/* MOSI */
    115		  SUNXI_FUNCTION(0x3, "uart3"),		/* RTS */
    116		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 15)),	/* PA_EINT15 */
    117	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 16),
    118		  SUNXI_FUNCTION(0x0, "gpio_in"),
    119		  SUNXI_FUNCTION(0x1, "gpio_out"),
    120		  SUNXI_FUNCTION(0x2, "spi1"),		/* MISO */
    121		  SUNXI_FUNCTION(0x3, "uart3"),		/* CTS */
    122		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 16)),	/* PA_EINT16 */
    123	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 17),
    124		  SUNXI_FUNCTION(0x0, "gpio_in"),
    125		  SUNXI_FUNCTION(0x1, "gpio_out"),
    126		  SUNXI_FUNCTION(0x2, "spdif"),		/* OUT */
    127		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 17)),	/* PA_EINT17 */
    128	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 18),
    129		  SUNXI_FUNCTION(0x0, "gpio_in"),
    130		  SUNXI_FUNCTION(0x1, "gpio_out"),
    131		  SUNXI_FUNCTION(0x2, "i2s0"),		/* SYNC */
    132		  SUNXI_FUNCTION(0x3, "i2c1"),		/* SCK */
    133		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 18)),	/* PA_EINT18 */
    134	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 19),
    135		  SUNXI_FUNCTION(0x0, "gpio_in"),
    136		  SUNXI_FUNCTION(0x1, "gpio_out"),
    137		  SUNXI_FUNCTION(0x2, "i2s0"),		/* CLK */
    138		  SUNXI_FUNCTION(0x3, "i2c1"),		/* SDA */
    139		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 19)),	/* PA_EINT19 */
    140	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 20),
    141		  SUNXI_FUNCTION(0x0, "gpio_in"),
    142		  SUNXI_FUNCTION(0x1, "gpio_out"),
    143		  SUNXI_FUNCTION(0x2, "i2s0"),		/* DOUT */
    144		  SUNXI_FUNCTION(0x3, "sim"),		/* VPPEN */
    145		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 20)),	/* PA_EINT20 */
    146	SUNXI_PIN(SUNXI_PINCTRL_PIN(A, 21),
    147		  SUNXI_FUNCTION(0x0, "gpio_in"),
    148		  SUNXI_FUNCTION(0x1, "gpio_out"),
    149		  SUNXI_FUNCTION(0x2, "i2s0"),		/* DIN */
    150		  SUNXI_FUNCTION(0x3, "sim"),		/* VPPPP */
    151		  SUNXI_FUNCTION_IRQ_BANK(0x6, 0, 21)),	/* PA_EINT21 */
    152	/* Hole */
    153	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 0),
    154		  SUNXI_FUNCTION(0x0, "gpio_in"),
    155		  SUNXI_FUNCTION(0x1, "gpio_out"),
    156		  SUNXI_FUNCTION(0x2, "nand0"),		/* WE */
    157		  SUNXI_FUNCTION(0x3, "spi0")),		/* MOSI */
    158	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 1),
    159		  SUNXI_FUNCTION(0x0, "gpio_in"),
    160		  SUNXI_FUNCTION(0x1, "gpio_out"),
    161		  SUNXI_FUNCTION(0x2, "nand0"),		/* ALE */
    162		  SUNXI_FUNCTION(0x3, "spi0"),		/* MISO */
    163		  SUNXI_FUNCTION(0x4, "mmc2")),		/* DS */
    164	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 2),
    165		  SUNXI_FUNCTION(0x0, "gpio_in"),
    166		  SUNXI_FUNCTION(0x1, "gpio_out"),
    167		  SUNXI_FUNCTION(0x2, "nand0"),		/* CLE */
    168		  SUNXI_FUNCTION(0x3, "spi0")),		/* CLK */
    169	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 3),
    170		  SUNXI_FUNCTION(0x0, "gpio_in"),
    171		  SUNXI_FUNCTION(0x1, "gpio_out"),
    172		  SUNXI_FUNCTION(0x2, "nand0"),		/* CE1 */
    173		  SUNXI_FUNCTION(0x3, "spi0")),		/* CS */
    174	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 4),
    175		  SUNXI_FUNCTION(0x0, "gpio_in"),
    176		  SUNXI_FUNCTION(0x1, "gpio_out"),
    177		  SUNXI_FUNCTION(0x2, "nand0"),		/* CE0 */
    178		  SUNXI_FUNCTION(0x4, "spi0")),		/* MISO */
    179	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 5),
    180		  SUNXI_FUNCTION(0x0, "gpio_in"),
    181		  SUNXI_FUNCTION(0x1, "gpio_out"),
    182		  SUNXI_FUNCTION(0x2, "nand0"),		/* RE */
    183		  SUNXI_FUNCTION(0x3, "mmc2")),		/* CLK */
    184	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 6),
    185		  SUNXI_FUNCTION(0x0, "gpio_in"),
    186		  SUNXI_FUNCTION(0x1, "gpio_out"),
    187		  SUNXI_FUNCTION(0x2, "nand0"),		/* RB0 */
    188		  SUNXI_FUNCTION(0x3, "mmc2")),		/* CMD */
    189	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 7),
    190		  SUNXI_FUNCTION(0x0, "gpio_in"),
    191		  SUNXI_FUNCTION(0x1, "gpio_out"),
    192		  SUNXI_FUNCTION(0x2, "nand0")),	/* RB1 */
    193	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 8),
    194		  SUNXI_FUNCTION(0x0, "gpio_in"),
    195		  SUNXI_FUNCTION(0x1, "gpio_out"),
    196		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ0 */
    197		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D0 */
    198	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 9),
    199		  SUNXI_FUNCTION(0x0, "gpio_in"),
    200		  SUNXI_FUNCTION(0x1, "gpio_out"),
    201		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ1 */
    202		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D1 */
    203	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 10),
    204		  SUNXI_FUNCTION(0x0, "gpio_in"),
    205		  SUNXI_FUNCTION(0x1, "gpio_out"),
    206		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ2 */
    207		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D2 */
    208	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 11),
    209		  SUNXI_FUNCTION(0x0, "gpio_in"),
    210		  SUNXI_FUNCTION(0x1, "gpio_out"),
    211		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ3 */
    212		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D3 */
    213	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 12),
    214		  SUNXI_FUNCTION(0x0, "gpio_in"),
    215		  SUNXI_FUNCTION(0x1, "gpio_out"),
    216		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ4 */
    217		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D4 */
    218	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 13),
    219		  SUNXI_FUNCTION(0x0, "gpio_in"),
    220		  SUNXI_FUNCTION(0x1, "gpio_out"),
    221		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ5 */
    222		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D5 */
    223	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 14),
    224		  SUNXI_FUNCTION(0x0, "gpio_in"),
    225		  SUNXI_FUNCTION(0x1, "gpio_out"),
    226		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ6 */
    227		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D6 */
    228	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 15),
    229		  SUNXI_FUNCTION(0x0, "gpio_in"),
    230		  SUNXI_FUNCTION(0x1, "gpio_out"),
    231		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQ7 */
    232		  SUNXI_FUNCTION(0x3, "mmc2")),		/* D7 */
    233	SUNXI_PIN(SUNXI_PINCTRL_PIN(C, 16),
    234		  SUNXI_FUNCTION(0x0, "gpio_in"),
    235		  SUNXI_FUNCTION(0x1, "gpio_out"),
    236		  SUNXI_FUNCTION(0x2, "nand0"),		/* DQS */
    237		  SUNXI_FUNCTION(0x3, "mmc2")),		/* RST */
    238	/* Hole */
    239	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 0),
    240		  SUNXI_FUNCTION(0x0, "gpio_in"),
    241		  SUNXI_FUNCTION(0x1, "gpio_out"),
    242		  SUNXI_FUNCTION(0x2, "emac"),		/* RXD3 */
    243		  SUNXI_FUNCTION(0x3, "di"),		/* TX */
    244		  SUNXI_FUNCTION(0x4, "ts2")),		/* CLK */
    245	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 1),
    246		  SUNXI_FUNCTION(0x0, "gpio_in"),
    247		  SUNXI_FUNCTION(0x1, "gpio_out"),
    248		  SUNXI_FUNCTION(0x2, "emac"),		/* RXD2 */
    249		  SUNXI_FUNCTION(0x3, "di"),		/* RX */
    250		  SUNXI_FUNCTION(0x4, "ts2")),		/* ERR */
    251	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 2),
    252		  SUNXI_FUNCTION(0x0, "gpio_in"),
    253		  SUNXI_FUNCTION(0x1, "gpio_out"),
    254		  SUNXI_FUNCTION(0x2, "emac"),		/* RXD1 */
    255		  SUNXI_FUNCTION(0x4, "ts2")),		/* SYNC */
    256	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 3),
    257		  SUNXI_FUNCTION(0x0, "gpio_in"),
    258		  SUNXI_FUNCTION(0x1, "gpio_out"),
    259		  SUNXI_FUNCTION(0x2, "emac"),		/* RXD0 */
    260		  SUNXI_FUNCTION(0x4, "ts2")),		/* DVLD */
    261	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 4),
    262		  SUNXI_FUNCTION(0x0, "gpio_in"),
    263		  SUNXI_FUNCTION(0x1, "gpio_out"),
    264		  SUNXI_FUNCTION(0x2, "emac"),		/* RXCK */
    265		  SUNXI_FUNCTION(0x4, "ts2")),		/* D0 */
    266	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 5),
    267		  SUNXI_FUNCTION(0x0, "gpio_in"),
    268		  SUNXI_FUNCTION(0x1, "gpio_out"),
    269		  SUNXI_FUNCTION(0x2, "emac"),		/* RXCTL/RXDV */
    270		  SUNXI_FUNCTION(0x4, "ts2")),		/* D1 */
    271	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 6),
    272		  SUNXI_FUNCTION(0x0, "gpio_in"),
    273		  SUNXI_FUNCTION(0x1, "gpio_out"),
    274		  SUNXI_FUNCTION(0x2, "emac"),		/* RXERR */
    275		  SUNXI_FUNCTION(0x4, "ts2")),		/* D2 */
    276	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 7),
    277		  SUNXI_FUNCTION(0x0, "gpio_in"),
    278		  SUNXI_FUNCTION(0x1, "gpio_out"),
    279		  SUNXI_FUNCTION(0x2, "emac"),		/* TXD3 */
    280		  SUNXI_FUNCTION(0x4, "ts2"),		/* D3 */
    281		  SUNXI_FUNCTION(0x5, "ts3")),		/* CLK */
    282	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 8),
    283		  SUNXI_FUNCTION(0x0, "gpio_in"),
    284		  SUNXI_FUNCTION(0x1, "gpio_out"),
    285		  SUNXI_FUNCTION(0x2, "emac"),		/* TXD2 */
    286		  SUNXI_FUNCTION(0x4, "ts2"),		/* D4 */
    287		  SUNXI_FUNCTION(0x5, "ts3")),		/* ERR */
    288	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 9),
    289		  SUNXI_FUNCTION(0x0, "gpio_in"),
    290		  SUNXI_FUNCTION(0x1, "gpio_out"),
    291		  SUNXI_FUNCTION(0x2, "emac"),		/* TXD1 */
    292		  SUNXI_FUNCTION(0x4, "ts2"),		/* D5 */
    293		  SUNXI_FUNCTION(0x5, "ts3")),		/* SYNC */
    294	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 10),
    295		  SUNXI_FUNCTION(0x0, "gpio_in"),
    296		  SUNXI_FUNCTION(0x1, "gpio_out"),
    297		  SUNXI_FUNCTION(0x2, "emac"),		/* TXD0 */
    298		  SUNXI_FUNCTION(0x4, "ts2"),		/* D6 */
    299		  SUNXI_FUNCTION(0x5, "ts3")),		/* DVLD */
    300	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 11),
    301		  SUNXI_FUNCTION(0x0, "gpio_in"),
    302		  SUNXI_FUNCTION(0x1, "gpio_out"),
    303		  SUNXI_FUNCTION(0x2, "emac"),		/* CRS */
    304		  SUNXI_FUNCTION(0x4, "ts2"),		/* D7 */
    305		  SUNXI_FUNCTION(0x5, "ts3")),		/* D0 */
    306	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 12),
    307		  SUNXI_FUNCTION(0x0, "gpio_in"),
    308		  SUNXI_FUNCTION(0x1, "gpio_out"),
    309		  SUNXI_FUNCTION(0x2, "emac"),		/* TXCK */
    310		  SUNXI_FUNCTION(0x4, "sim")),		/* PWREN */
    311	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 13),
    312		  SUNXI_FUNCTION(0x0, "gpio_in"),
    313		  SUNXI_FUNCTION(0x1, "gpio_out"),
    314		  SUNXI_FUNCTION(0x2, "emac"),		/* TXCTL/TXEN */
    315		  SUNXI_FUNCTION(0x4, "sim")),		/* CLK */
    316	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 14),
    317		  SUNXI_FUNCTION(0x0, "gpio_in"),
    318		  SUNXI_FUNCTION(0x1, "gpio_out"),
    319		  SUNXI_FUNCTION(0x2, "emac"),		/* TXERR */
    320		  SUNXI_FUNCTION(0x4, "sim")),		/* DATA */
    321	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 15),
    322		  SUNXI_FUNCTION(0x0, "gpio_in"),
    323		  SUNXI_FUNCTION(0x1, "gpio_out"),
    324		  SUNXI_FUNCTION(0x2, "emac"),		/* CLKIN/COL */
    325		  SUNXI_FUNCTION(0x4, "sim")),		/* RST */
    326	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 16),
    327		  SUNXI_FUNCTION(0x0, "gpio_in"),
    328		  SUNXI_FUNCTION(0x1, "gpio_out"),
    329		  SUNXI_FUNCTION(0x2, "emac"),		/* MDC */
    330		  SUNXI_FUNCTION(0x4, "sim")),		/* DET */
    331	SUNXI_PIN(SUNXI_PINCTRL_PIN(D, 17),
    332		  SUNXI_FUNCTION(0x0, "gpio_in"),
    333		  SUNXI_FUNCTION(0x1, "gpio_out"),
    334		  SUNXI_FUNCTION(0x2, "emac")),		/* MDIO */
    335	/* Hole */
    336	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 0),
    337		  SUNXI_FUNCTION(0x0, "gpio_in"),
    338		  SUNXI_FUNCTION(0x1, "gpio_out"),
    339		  SUNXI_FUNCTION(0x2, "csi"),		/* PCLK */
    340		  SUNXI_FUNCTION(0x3, "ts0")),		/* CLK */
    341	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 1),
    342		  SUNXI_FUNCTION(0x0, "gpio_in"),
    343		  SUNXI_FUNCTION(0x1, "gpio_out"),
    344		  SUNXI_FUNCTION(0x2, "csi"),		/* MCLK */
    345		  SUNXI_FUNCTION(0x3, "ts0")),		/* ERR */
    346	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 2),
    347		  SUNXI_FUNCTION(0x0, "gpio_in"),
    348		  SUNXI_FUNCTION(0x1, "gpio_out"),
    349		  SUNXI_FUNCTION(0x2, "csi"),		/* HSYNC */
    350		  SUNXI_FUNCTION(0x3, "ts0")),		/* SYNC */
    351	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 3),
    352		  SUNXI_FUNCTION(0x0, "gpio_in"),
    353		  SUNXI_FUNCTION(0x1, "gpio_out"),
    354		  SUNXI_FUNCTION(0x2, "csi"),		/* VSYNC */
    355		  SUNXI_FUNCTION(0x3, "ts0")),		/* DVLD */
    356	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 4),
    357		  SUNXI_FUNCTION(0x0, "gpio_in"),
    358		  SUNXI_FUNCTION(0x1, "gpio_out"),
    359		  SUNXI_FUNCTION(0x2, "csi"),		/* D0 */
    360		  SUNXI_FUNCTION(0x3, "ts0")),		/* D0 */
    361	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 5),
    362		  SUNXI_FUNCTION(0x0, "gpio_in"),
    363		  SUNXI_FUNCTION(0x1, "gpio_out"),
    364		  SUNXI_FUNCTION(0x2, "csi"),		/* D1 */
    365		  SUNXI_FUNCTION(0x3, "ts0")),		/* D1 */
    366	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 6),
    367		  SUNXI_FUNCTION(0x0, "gpio_in"),
    368		  SUNXI_FUNCTION(0x1, "gpio_out"),
    369		  SUNXI_FUNCTION(0x2, "csi"),		/* D2 */
    370		  SUNXI_FUNCTION(0x3, "ts0")),		/* D2 */
    371	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 7),
    372		  SUNXI_FUNCTION(0x0, "gpio_in"),
    373		  SUNXI_FUNCTION(0x1, "gpio_out"),
    374		  SUNXI_FUNCTION(0x2, "csi"),		/* D3 */
    375		  SUNXI_FUNCTION(0x3, "ts0"),		/* D3 */
    376		  SUNXI_FUNCTION(0x4, "ts1")),		/* CLK */
    377	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 8),
    378		  SUNXI_FUNCTION(0x0, "gpio_in"),
    379		  SUNXI_FUNCTION(0x1, "gpio_out"),
    380		  SUNXI_FUNCTION(0x2, "csi"),		/* D4 */
    381		  SUNXI_FUNCTION(0x3, "ts0"),		/* D4 */
    382		  SUNXI_FUNCTION(0x4, "ts1")),		/* ERR */
    383	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 9),
    384		  SUNXI_FUNCTION(0x0, "gpio_in"),
    385		  SUNXI_FUNCTION(0x1, "gpio_out"),
    386		  SUNXI_FUNCTION(0x2, "csi"),		/* D5 */
    387		  SUNXI_FUNCTION(0x3, "ts0"),		/* D5 */
    388		  SUNXI_FUNCTION(0x4, "ts1")),		/* SYNC */
    389	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 10),
    390		  SUNXI_FUNCTION(0x0, "gpio_in"),
    391		  SUNXI_FUNCTION(0x1, "gpio_out"),
    392		  SUNXI_FUNCTION(0x2, "csi"),		/* D6 */
    393		  SUNXI_FUNCTION(0x3, "ts0"),		/* D6 */
    394		  SUNXI_FUNCTION(0x4, "ts1")),		/* DVLD */
    395	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 11),
    396		  SUNXI_FUNCTION(0x0, "gpio_in"),
    397		  SUNXI_FUNCTION(0x1, "gpio_out"),
    398		  SUNXI_FUNCTION(0x2, "csi"),		/* D7 */
    399		  SUNXI_FUNCTION(0x3, "ts"),		/* D7 */
    400		  SUNXI_FUNCTION(0x4, "ts1")),		/* D0 */
    401	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 12),
    402		  SUNXI_FUNCTION(0x0, "gpio_in"),
    403		  SUNXI_FUNCTION(0x1, "gpio_out"),
    404		  SUNXI_FUNCTION(0x2, "csi"),		/* SCK */
    405		  SUNXI_FUNCTION(0x3, "i2c2")),		/* SCK */
    406	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 13),
    407		  SUNXI_FUNCTION(0x0, "gpio_in"),
    408		  SUNXI_FUNCTION(0x1, "gpio_out"),
    409		  SUNXI_FUNCTION(0x2, "csi"),		/* SDA */
    410		  SUNXI_FUNCTION(0x3, "i2c2")),		/* SDA */
    411	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 14),
    412		  SUNXI_FUNCTION(0x0, "gpio_in"),
    413		  SUNXI_FUNCTION(0x1, "gpio_out"),
    414		  SUNXI_FUNCTION(0x3, "sim")),		/* VPPEN */
    415	SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 15),
    416		  SUNXI_FUNCTION(0x0, "gpio_in"),
    417		  SUNXI_FUNCTION(0x1, "gpio_out"),
    418		  SUNXI_FUNCTION(0x3, "sim")),		/* VPPPP */
    419	/* Hole */
    420	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 0),
    421		  SUNXI_FUNCTION(0x0, "gpio_in"),
    422		  SUNXI_FUNCTION(0x1, "gpio_out"),
    423		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D1 */
    424		  SUNXI_FUNCTION(0x3, "jtag"),		/* MS */
    425		  SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 0)),	/* PF_EINT0 */
    426	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 1),
    427		  SUNXI_FUNCTION(0x0, "gpio_in"),
    428		  SUNXI_FUNCTION(0x1, "gpio_out"),
    429		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D0 */
    430		  SUNXI_FUNCTION(0x3, "jtag"),		/* DI */
    431		  SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 1)),	/* PF_EINT1 */
    432	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 2),
    433		  SUNXI_FUNCTION(0x0, "gpio_in"),
    434		  SUNXI_FUNCTION(0x1, "gpio_out"),
    435		  SUNXI_FUNCTION(0x2, "mmc0"),		/* CLK */
    436		  SUNXI_FUNCTION(0x3, "uart0"),		/* TX */
    437		  SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 2)),	/* PF_EINT2 */
    438	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 3),
    439		  SUNXI_FUNCTION(0x0, "gpio_in"),
    440		  SUNXI_FUNCTION(0x1, "gpio_out"),
    441		  SUNXI_FUNCTION(0x2, "mmc0"),		/* CMD */
    442		  SUNXI_FUNCTION(0x3, "jtag"),		/* DO */
    443		  SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 3)),	/* PF_EINT3 */
    444	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 4),
    445		  SUNXI_FUNCTION(0x0, "gpio_in"),
    446		  SUNXI_FUNCTION(0x1, "gpio_out"),
    447		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D3 */
    448		  SUNXI_FUNCTION(0x3, "uart0"),		/* RX */
    449		  SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 4)),	/* PF_EINT4 */
    450	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 5),
    451		  SUNXI_FUNCTION(0x0, "gpio_in"),
    452		  SUNXI_FUNCTION(0x1, "gpio_out"),
    453		  SUNXI_FUNCTION(0x2, "mmc0"),		/* D2 */
    454		  SUNXI_FUNCTION(0x3, "jtag"),		/* CK */
    455		  SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 5)),	/* PF_EINT5 */
    456	SUNXI_PIN(SUNXI_PINCTRL_PIN(F, 6),
    457		  SUNXI_FUNCTION(0x0, "gpio_in"),
    458		  SUNXI_FUNCTION(0x1, "gpio_out"),
    459		  SUNXI_FUNCTION_IRQ_BANK(0x6, 1, 6)),	/* PF_EINT6 */
    460	/* Hole */
    461	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 0),
    462		  SUNXI_FUNCTION(0x0, "gpio_in"),
    463		  SUNXI_FUNCTION(0x1, "gpio_out"),
    464		  SUNXI_FUNCTION(0x2, "mmc1"),		/* CLK */
    465		  SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 0)),	/* PG_EINT0 */
    466	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 1),
    467		  SUNXI_FUNCTION(0x0, "gpio_in"),
    468		  SUNXI_FUNCTION(0x1, "gpio_out"),
    469		  SUNXI_FUNCTION(0x2, "mmc1"),		/* CMD */
    470		  SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 1)),	/* PG_EINT1 */
    471	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 2),
    472		  SUNXI_FUNCTION(0x0, "gpio_in"),
    473		  SUNXI_FUNCTION(0x1, "gpio_out"),
    474		  SUNXI_FUNCTION(0x2, "mmc1"),		/* D0 */
    475		  SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 2)),	/* PG_EINT2 */
    476	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 3),
    477		  SUNXI_FUNCTION(0x0, "gpio_in"),
    478		  SUNXI_FUNCTION(0x1, "gpio_out"),
    479		  SUNXI_FUNCTION(0x2, "mmc1"),		/* D1 */
    480		  SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 3)),	/* PG_EINT3 */
    481	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 4),
    482		  SUNXI_FUNCTION(0x0, "gpio_in"),
    483		  SUNXI_FUNCTION(0x1, "gpio_out"),
    484		  SUNXI_FUNCTION(0x2, "mmc1"),		/* D2 */
    485		  SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 4)),	/* PG_EINT4 */
    486	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 5),
    487		  SUNXI_FUNCTION(0x0, "gpio_in"),
    488		  SUNXI_FUNCTION(0x1, "gpio_out"),
    489		  SUNXI_FUNCTION(0x2, "mmc1"),		/* D3 */
    490		  SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 5)),	/* PG_EINT5 */
    491	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 6),
    492		  SUNXI_FUNCTION(0x0, "gpio_in"),
    493		  SUNXI_FUNCTION(0x1, "gpio_out"),
    494		  SUNXI_FUNCTION(0x2, "uart1"),		/* TX */
    495		  SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 6)),	/* PG_EINT6 */
    496	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 7),
    497		  SUNXI_FUNCTION(0x0, "gpio_in"),
    498		  SUNXI_FUNCTION(0x1, "gpio_out"),
    499		  SUNXI_FUNCTION(0x2, "uart1"),		/* RX */
    500		  SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 7)),	/* PG_EINT7 */
    501	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 8),
    502		  SUNXI_FUNCTION(0x0, "gpio_in"),
    503		  SUNXI_FUNCTION(0x1, "gpio_out"),
    504		  SUNXI_FUNCTION(0x2, "uart1"),		/* RTS */
    505		  SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 8)),	/* PG_EINT8 */
    506	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 9),
    507		  SUNXI_FUNCTION(0x0, "gpio_in"),
    508		  SUNXI_FUNCTION(0x1, "gpio_out"),
    509		  SUNXI_FUNCTION(0x2, "uart1"),		/* CTS */
    510		  SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 9)),	/* PG_EINT9 */
    511	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 10),
    512		  SUNXI_FUNCTION(0x0, "gpio_in"),
    513		  SUNXI_FUNCTION(0x1, "gpio_out"),
    514		  SUNXI_FUNCTION(0x2, "i2s1"),		/* SYNC */
    515		  SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 10)),	/* PG_EINT10 */
    516	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 11),
    517		  SUNXI_FUNCTION(0x0, "gpio_in"),
    518		  SUNXI_FUNCTION(0x1, "gpio_out"),
    519		  SUNXI_FUNCTION(0x2, "i2s1"),		/* CLK */
    520		  SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 11)),	/* PG_EINT11 */
    521	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 12),
    522		  SUNXI_FUNCTION(0x0, "gpio_in"),
    523		  SUNXI_FUNCTION(0x1, "gpio_out"),
    524		  SUNXI_FUNCTION(0x2, "i2s1"),		/* DOUT */
    525		  SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 12)),	/* PG_EINT12 */
    526	SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 13),
    527		  SUNXI_FUNCTION(0x0, "gpio_in"),
    528		  SUNXI_FUNCTION(0x1, "gpio_out"),
    529		  SUNXI_FUNCTION(0x2, "i2s1"),		/* DIN */
    530		  SUNXI_FUNCTION_IRQ_BANK(0x6, 2, 13)),	/* PG_EINT13 */
    531};
    532
    533static const struct sunxi_pinctrl_desc sun50i_h5_pinctrl_data_broken = {
    534	.pins = sun50i_h5_pins,
    535	.npins = ARRAY_SIZE(sun50i_h5_pins),
    536	.irq_banks = 2,
    537	.irq_read_needs_mux = true,
    538	.disable_strict_mode = true,
    539};
    540
    541static const struct sunxi_pinctrl_desc sun50i_h5_pinctrl_data = {
    542	.pins = sun50i_h5_pins,
    543	.npins = ARRAY_SIZE(sun50i_h5_pins),
    544	.irq_banks = 3,
    545	.irq_read_needs_mux = true,
    546	.disable_strict_mode = true,
    547};
    548
    549static int sun50i_h5_pinctrl_probe(struct platform_device *pdev)
    550{
    551	int ret;
    552
    553	ret = platform_irq_count(pdev);
    554	if (ret < 0) {
    555		if (ret != -EPROBE_DEFER)
    556			dev_err(&pdev->dev, "Couldn't determine irq count: %pe\n",
    557				ERR_PTR(ret));
    558		return ret;
    559	}
    560
    561	switch (ret) {
    562	case 2:
    563		dev_warn(&pdev->dev,
    564			 "Your device tree's pinctrl node is broken, which has no IRQ of PG bank routed.\n");
    565		dev_warn(&pdev->dev,
    566			 "Please update the device tree, otherwise PG bank IRQ won't work.\n");
    567		return sunxi_pinctrl_init(pdev,
    568					  &sun50i_h5_pinctrl_data_broken);
    569	case 3:
    570		return sunxi_pinctrl_init(pdev,
    571					  &sun50i_h5_pinctrl_data);
    572	default:
    573		return -EINVAL;
    574	}
    575}
    576
    577static const struct of_device_id sun50i_h5_pinctrl_match[] = {
    578	{ .compatible = "allwinner,sun50i-h5-pinctrl", },
    579	{}
    580};
    581
    582static struct platform_driver sun50i_h5_pinctrl_driver = {
    583	.probe	= sun50i_h5_pinctrl_probe,
    584	.driver	= {
    585		.name		= "sun50i-h5-pinctrl",
    586		.of_match_table	= sun50i_h5_pinctrl_match,
    587	},
    588};
    589builtin_platform_driver(sun50i_h5_pinctrl_driver);