brintos

brintos / linux-shallow public Read only

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