11ccea77eSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
2add958ceSSoren Brinkmann /*
3add958ceSSoren Brinkmann  * Zynq pin controller
4add958ceSSoren Brinkmann  *
5add958ceSSoren Brinkmann  *  Copyright (C) 2014 Xilinx
6add958ceSSoren Brinkmann  *
7a7c6f30cSLinus Walleij  *  Sören Brinkmann <soren.brinkmann@xilinx.com>
8add958ceSSoren Brinkmann  */
9add958ceSSoren Brinkmann #include <linux/io.h>
10add958ceSSoren Brinkmann #include <linux/mfd/syscon.h>
11*d5140268SSrinivas Neeli #include <linux/module.h>
124c3deee9SPaul Gortmaker #include <linux/init.h>
13add958ceSSoren Brinkmann #include <linux/of.h>
14add958ceSSoren Brinkmann #include <linux/platform_device.h>
15add958ceSSoren Brinkmann #include <linux/pinctrl/pinctrl.h>
16add958ceSSoren Brinkmann #include <linux/pinctrl/pinmux.h>
17add958ceSSoren Brinkmann #include <linux/pinctrl/pinconf.h>
18add958ceSSoren Brinkmann #include <linux/pinctrl/pinconf-generic.h>
19add958ceSSoren Brinkmann #include <linux/regmap.h>
20add958ceSSoren Brinkmann #include "pinctrl-utils.h"
21add958ceSSoren Brinkmann #include "core.h"
22add958ceSSoren Brinkmann 
23add958ceSSoren Brinkmann #define ZYNQ_NUM_MIOS	54
24add958ceSSoren Brinkmann 
25add958ceSSoren Brinkmann #define ZYNQ_PCTRL_MIO_MST_TRI0	0x10c
26add958ceSSoren Brinkmann #define ZYNQ_PCTRL_MIO_MST_TRI1	0x110
27add958ceSSoren Brinkmann 
28add958ceSSoren Brinkmann #define ZYNQ_PINMUX_MUX_SHIFT	1
29add958ceSSoren Brinkmann #define ZYNQ_PINMUX_MUX_MASK	(0x7f << ZYNQ_PINMUX_MUX_SHIFT)
30add958ceSSoren Brinkmann 
31add958ceSSoren Brinkmann /**
32add958ceSSoren Brinkmann  * struct zynq_pinctrl - driver data
33add958ceSSoren Brinkmann  * @pctrl:		Pinctrl device
34add958ceSSoren Brinkmann  * @syscon:		Syscon regmap
35add958ceSSoren Brinkmann  * @pctrl_offset:	Offset for pinctrl into the @syscon space
36add958ceSSoren Brinkmann  * @groups:		Pingroups
374cb4142bSNava kishore Manne  * @ngroups:		Number of @groups
38add958ceSSoren Brinkmann  * @funcs:		Pinmux functions
39add958ceSSoren Brinkmann  * @nfuncs:		Number of @funcs
40add958ceSSoren Brinkmann  */
41add958ceSSoren Brinkmann struct zynq_pinctrl {
42add958ceSSoren Brinkmann 	struct pinctrl_dev *pctrl;
43add958ceSSoren Brinkmann 	struct regmap *syscon;
44add958ceSSoren Brinkmann 	u32 pctrl_offset;
45add958ceSSoren Brinkmann 	const struct zynq_pctrl_group *groups;
46add958ceSSoren Brinkmann 	unsigned int ngroups;
47add958ceSSoren Brinkmann 	const struct zynq_pinmux_function *funcs;
48add958ceSSoren Brinkmann 	unsigned int nfuncs;
49add958ceSSoren Brinkmann };
50add958ceSSoren Brinkmann 
51add958ceSSoren Brinkmann struct zynq_pctrl_group {
52add958ceSSoren Brinkmann 	const char *name;
53add958ceSSoren Brinkmann 	const unsigned int *pins;
546c2c9bd2SNava kishore Manne 	const unsigned int npins;
55add958ceSSoren Brinkmann };
56add958ceSSoren Brinkmann 
57add958ceSSoren Brinkmann /**
58add958ceSSoren Brinkmann  * struct zynq_pinmux_function - a pinmux function
59add958ceSSoren Brinkmann  * @name:	Name of the pinmux function.
60add958ceSSoren Brinkmann  * @groups:	List of pingroups for this function.
61add958ceSSoren Brinkmann  * @ngroups:	Number of entries in @groups.
62add958ceSSoren Brinkmann  * @mux_val:	Selector for this function
63add958ceSSoren Brinkmann  * @mux:	Offset of function specific mux
64add958ceSSoren Brinkmann  * @mux_mask:	Mask for function specific selector
65add958ceSSoren Brinkmann  * @mux_shift:	Shift for function specific selector
66add958ceSSoren Brinkmann  */
67add958ceSSoren Brinkmann struct zynq_pinmux_function {
68add958ceSSoren Brinkmann 	const char *name;
69add958ceSSoren Brinkmann 	const char * const *groups;
70add958ceSSoren Brinkmann 	unsigned int ngroups;
71add958ceSSoren Brinkmann 	unsigned int mux_val;
72add958ceSSoren Brinkmann 	u32 mux;
73add958ceSSoren Brinkmann 	u32 mux_mask;
74add958ceSSoren Brinkmann 	u8 mux_shift;
75add958ceSSoren Brinkmann };
76add958ceSSoren Brinkmann 
77add958ceSSoren Brinkmann enum zynq_pinmux_functions {
78add958ceSSoren Brinkmann 	ZYNQ_PMUX_can0,
79add958ceSSoren Brinkmann 	ZYNQ_PMUX_can1,
80add958ceSSoren Brinkmann 	ZYNQ_PMUX_ethernet0,
81add958ceSSoren Brinkmann 	ZYNQ_PMUX_ethernet1,
82add958ceSSoren Brinkmann 	ZYNQ_PMUX_gpio0,
83add958ceSSoren Brinkmann 	ZYNQ_PMUX_i2c0,
84add958ceSSoren Brinkmann 	ZYNQ_PMUX_i2c1,
85add958ceSSoren Brinkmann 	ZYNQ_PMUX_mdio0,
86add958ceSSoren Brinkmann 	ZYNQ_PMUX_mdio1,
87add958ceSSoren Brinkmann 	ZYNQ_PMUX_qspi0,
88add958ceSSoren Brinkmann 	ZYNQ_PMUX_qspi1,
89add958ceSSoren Brinkmann 	ZYNQ_PMUX_qspi_fbclk,
90add958ceSSoren Brinkmann 	ZYNQ_PMUX_qspi_cs1,
91add958ceSSoren Brinkmann 	ZYNQ_PMUX_spi0,
92add958ceSSoren Brinkmann 	ZYNQ_PMUX_spi1,
9383a21727SHelmut Buchsbaum 	ZYNQ_PMUX_spi0_ss,
9483a21727SHelmut Buchsbaum 	ZYNQ_PMUX_spi1_ss,
95add958ceSSoren Brinkmann 	ZYNQ_PMUX_sdio0,
96add958ceSSoren Brinkmann 	ZYNQ_PMUX_sdio0_pc,
97add958ceSSoren Brinkmann 	ZYNQ_PMUX_sdio0_cd,
98add958ceSSoren Brinkmann 	ZYNQ_PMUX_sdio0_wp,
99add958ceSSoren Brinkmann 	ZYNQ_PMUX_sdio1,
100add958ceSSoren Brinkmann 	ZYNQ_PMUX_sdio1_pc,
101add958ceSSoren Brinkmann 	ZYNQ_PMUX_sdio1_cd,
102add958ceSSoren Brinkmann 	ZYNQ_PMUX_sdio1_wp,
103add958ceSSoren Brinkmann 	ZYNQ_PMUX_smc0_nor,
104add958ceSSoren Brinkmann 	ZYNQ_PMUX_smc0_nor_cs1,
105add958ceSSoren Brinkmann 	ZYNQ_PMUX_smc0_nor_addr25,
106add958ceSSoren Brinkmann 	ZYNQ_PMUX_smc0_nand,
107add958ceSSoren Brinkmann 	ZYNQ_PMUX_ttc0,
108add958ceSSoren Brinkmann 	ZYNQ_PMUX_ttc1,
109add958ceSSoren Brinkmann 	ZYNQ_PMUX_uart0,
110add958ceSSoren Brinkmann 	ZYNQ_PMUX_uart1,
111add958ceSSoren Brinkmann 	ZYNQ_PMUX_usb0,
112add958ceSSoren Brinkmann 	ZYNQ_PMUX_usb1,
113add958ceSSoren Brinkmann 	ZYNQ_PMUX_swdt0,
114add958ceSSoren Brinkmann 	ZYNQ_PMUX_MAX_FUNC
115add958ceSSoren Brinkmann };
116add958ceSSoren Brinkmann 
117c0b8555cSMasahiro Yamada static const struct pinctrl_pin_desc zynq_pins[] = {
118add958ceSSoren Brinkmann 	PINCTRL_PIN(0,  "MIO0"),
119add958ceSSoren Brinkmann 	PINCTRL_PIN(1,  "MIO1"),
120add958ceSSoren Brinkmann 	PINCTRL_PIN(2,  "MIO2"),
121add958ceSSoren Brinkmann 	PINCTRL_PIN(3,  "MIO3"),
122add958ceSSoren Brinkmann 	PINCTRL_PIN(4,  "MIO4"),
123add958ceSSoren Brinkmann 	PINCTRL_PIN(5,  "MIO5"),
124add958ceSSoren Brinkmann 	PINCTRL_PIN(6,  "MIO6"),
125add958ceSSoren Brinkmann 	PINCTRL_PIN(7,  "MIO7"),
126add958ceSSoren Brinkmann 	PINCTRL_PIN(8,  "MIO8"),
127add958ceSSoren Brinkmann 	PINCTRL_PIN(9,  "MIO9"),
128add958ceSSoren Brinkmann 	PINCTRL_PIN(10, "MIO10"),
129add958ceSSoren Brinkmann 	PINCTRL_PIN(11, "MIO11"),
130add958ceSSoren Brinkmann 	PINCTRL_PIN(12, "MIO12"),
131add958ceSSoren Brinkmann 	PINCTRL_PIN(13, "MIO13"),
132add958ceSSoren Brinkmann 	PINCTRL_PIN(14, "MIO14"),
133add958ceSSoren Brinkmann 	PINCTRL_PIN(15, "MIO15"),
134add958ceSSoren Brinkmann 	PINCTRL_PIN(16, "MIO16"),
135add958ceSSoren Brinkmann 	PINCTRL_PIN(17, "MIO17"),
136add958ceSSoren Brinkmann 	PINCTRL_PIN(18, "MIO18"),
137add958ceSSoren Brinkmann 	PINCTRL_PIN(19, "MIO19"),
138add958ceSSoren Brinkmann 	PINCTRL_PIN(20, "MIO20"),
139add958ceSSoren Brinkmann 	PINCTRL_PIN(21, "MIO21"),
140add958ceSSoren Brinkmann 	PINCTRL_PIN(22, "MIO22"),
141add958ceSSoren Brinkmann 	PINCTRL_PIN(23, "MIO23"),
142add958ceSSoren Brinkmann 	PINCTRL_PIN(24, "MIO24"),
143add958ceSSoren Brinkmann 	PINCTRL_PIN(25, "MIO25"),
144add958ceSSoren Brinkmann 	PINCTRL_PIN(26, "MIO26"),
145add958ceSSoren Brinkmann 	PINCTRL_PIN(27, "MIO27"),
146add958ceSSoren Brinkmann 	PINCTRL_PIN(28, "MIO28"),
147add958ceSSoren Brinkmann 	PINCTRL_PIN(29, "MIO29"),
148add958ceSSoren Brinkmann 	PINCTRL_PIN(30, "MIO30"),
149add958ceSSoren Brinkmann 	PINCTRL_PIN(31, "MIO31"),
150add958ceSSoren Brinkmann 	PINCTRL_PIN(32, "MIO32"),
151add958ceSSoren Brinkmann 	PINCTRL_PIN(33, "MIO33"),
152add958ceSSoren Brinkmann 	PINCTRL_PIN(34, "MIO34"),
153add958ceSSoren Brinkmann 	PINCTRL_PIN(35, "MIO35"),
154add958ceSSoren Brinkmann 	PINCTRL_PIN(36, "MIO36"),
155add958ceSSoren Brinkmann 	PINCTRL_PIN(37, "MIO37"),
156add958ceSSoren Brinkmann 	PINCTRL_PIN(38, "MIO38"),
157add958ceSSoren Brinkmann 	PINCTRL_PIN(39, "MIO39"),
158add958ceSSoren Brinkmann 	PINCTRL_PIN(40, "MIO40"),
159add958ceSSoren Brinkmann 	PINCTRL_PIN(41, "MIO41"),
160add958ceSSoren Brinkmann 	PINCTRL_PIN(42, "MIO42"),
161add958ceSSoren Brinkmann 	PINCTRL_PIN(43, "MIO43"),
162add958ceSSoren Brinkmann 	PINCTRL_PIN(44, "MIO44"),
163add958ceSSoren Brinkmann 	PINCTRL_PIN(45, "MIO45"),
164add958ceSSoren Brinkmann 	PINCTRL_PIN(46, "MIO46"),
165add958ceSSoren Brinkmann 	PINCTRL_PIN(47, "MIO47"),
166add958ceSSoren Brinkmann 	PINCTRL_PIN(48, "MIO48"),
167add958ceSSoren Brinkmann 	PINCTRL_PIN(49, "MIO49"),
168add958ceSSoren Brinkmann 	PINCTRL_PIN(50, "MIO50"),
169add958ceSSoren Brinkmann 	PINCTRL_PIN(51, "MIO51"),
170add958ceSSoren Brinkmann 	PINCTRL_PIN(52, "MIO52"),
171add958ceSSoren Brinkmann 	PINCTRL_PIN(53, "MIO53"),
172add958ceSSoren Brinkmann 	PINCTRL_PIN(54, "EMIO_SD0_WP"),
173add958ceSSoren Brinkmann 	PINCTRL_PIN(55, "EMIO_SD0_CD"),
174add958ceSSoren Brinkmann 	PINCTRL_PIN(56, "EMIO_SD1_WP"),
175add958ceSSoren Brinkmann 	PINCTRL_PIN(57, "EMIO_SD1_CD"),
176add958ceSSoren Brinkmann };
177add958ceSSoren Brinkmann 
178add958ceSSoren Brinkmann /* pin groups */
179add958ceSSoren Brinkmann static const unsigned int ethernet0_0_pins[] = {16, 17, 18, 19, 20, 21, 22, 23,
180add958ceSSoren Brinkmann 						24, 25, 26, 27};
181add958ceSSoren Brinkmann static const unsigned int ethernet1_0_pins[] = {28, 29, 30, 31, 32, 33, 34, 35,
182add958ceSSoren Brinkmann 						36, 37, 38, 39};
183add958ceSSoren Brinkmann static const unsigned int mdio0_0_pins[] = {52, 53};
184add958ceSSoren Brinkmann static const unsigned int mdio1_0_pins[] = {52, 53};
185add958ceSSoren Brinkmann static const unsigned int qspi0_0_pins[] = {1, 2, 3, 4, 5, 6};
186add958ceSSoren Brinkmann 
187add958ceSSoren Brinkmann static const unsigned int qspi1_0_pins[] = {9, 10, 11, 12, 13};
188add958ceSSoren Brinkmann static const unsigned int qspi_cs1_pins[] = {0};
189add958ceSSoren Brinkmann static const unsigned int qspi_fbclk_pins[] = {8};
19083a21727SHelmut Buchsbaum static const unsigned int spi0_0_pins[] = {16, 17, 21};
19183a21727SHelmut Buchsbaum static const unsigned int spi0_0_ss0_pins[] = {18};
19283a21727SHelmut Buchsbaum static const unsigned int spi0_0_ss1_pins[] = {19};
19383a21727SHelmut Buchsbaum static const unsigned int spi0_0_ss2_pins[] = {20,};
19483a21727SHelmut Buchsbaum static const unsigned int spi0_1_pins[] = {28, 29, 33};
19583a21727SHelmut Buchsbaum static const unsigned int spi0_1_ss0_pins[] = {30};
19683a21727SHelmut Buchsbaum static const unsigned int spi0_1_ss1_pins[] = {31};
19783a21727SHelmut Buchsbaum static const unsigned int spi0_1_ss2_pins[] = {32};
19883a21727SHelmut Buchsbaum static const unsigned int spi0_2_pins[] = {40, 41, 45};
19983a21727SHelmut Buchsbaum static const unsigned int spi0_2_ss0_pins[] = {42};
20083a21727SHelmut Buchsbaum static const unsigned int spi0_2_ss1_pins[] = {43};
20183a21727SHelmut Buchsbaum static const unsigned int spi0_2_ss2_pins[] = {44};
20283a21727SHelmut Buchsbaum static const unsigned int spi1_0_pins[] = {10, 11, 12};
20383a21727SHelmut Buchsbaum static const unsigned int spi1_0_ss0_pins[] = {13};
20483a21727SHelmut Buchsbaum static const unsigned int spi1_0_ss1_pins[] = {14};
20583a21727SHelmut Buchsbaum static const unsigned int spi1_0_ss2_pins[] = {15};
20683a21727SHelmut Buchsbaum static const unsigned int spi1_1_pins[] = {22, 23, 24};
20783a21727SHelmut Buchsbaum static const unsigned int spi1_1_ss0_pins[] = {25};
20883a21727SHelmut Buchsbaum static const unsigned int spi1_1_ss1_pins[] = {26};
20983a21727SHelmut Buchsbaum static const unsigned int spi1_1_ss2_pins[] = {27};
21083a21727SHelmut Buchsbaum static const unsigned int spi1_2_pins[] = {34, 35, 36};
21183a21727SHelmut Buchsbaum static const unsigned int spi1_2_ss0_pins[] = {37};
21283a21727SHelmut Buchsbaum static const unsigned int spi1_2_ss1_pins[] = {38};
21383a21727SHelmut Buchsbaum static const unsigned int spi1_2_ss2_pins[] = {39};
21483a21727SHelmut Buchsbaum static const unsigned int spi1_3_pins[] = {46, 47, 48, 49};
21583a21727SHelmut Buchsbaum static const unsigned int spi1_3_ss0_pins[] = {49};
21683a21727SHelmut Buchsbaum static const unsigned int spi1_3_ss1_pins[] = {50};
21783a21727SHelmut Buchsbaum static const unsigned int spi1_3_ss2_pins[] = {51};
21883a21727SHelmut Buchsbaum 
219add958ceSSoren Brinkmann static const unsigned int sdio0_0_pins[] = {16, 17, 18, 19, 20, 21};
220add958ceSSoren Brinkmann static const unsigned int sdio0_1_pins[] = {28, 29, 30, 31, 32, 33};
221add958ceSSoren Brinkmann static const unsigned int sdio0_2_pins[] = {40, 41, 42, 43, 44, 45};
222add958ceSSoren Brinkmann static const unsigned int sdio1_0_pins[] = {10, 11, 12, 13, 14, 15};
223add958ceSSoren Brinkmann static const unsigned int sdio1_1_pins[] = {22, 23, 24, 25, 26, 27};
224add958ceSSoren Brinkmann static const unsigned int sdio1_2_pins[] = {34, 35, 36, 37, 38, 39};
225b8d74b29SDaniel Glöckner static const unsigned int sdio1_3_pins[] = {46, 47, 48, 49, 50, 51};
226add958ceSSoren Brinkmann static const unsigned int sdio0_emio_wp_pins[] = {54};
227add958ceSSoren Brinkmann static const unsigned int sdio0_emio_cd_pins[] = {55};
228add958ceSSoren Brinkmann static const unsigned int sdio1_emio_wp_pins[] = {56};
229add958ceSSoren Brinkmann static const unsigned int sdio1_emio_cd_pins[] = {57};
230add958ceSSoren Brinkmann static const unsigned int smc0_nor_pins[] = {0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13,
231add958ceSSoren Brinkmann 					     15, 16, 17, 18, 19, 20, 21, 22, 23,
232add958ceSSoren Brinkmann 					     24, 25, 26, 27, 28, 29, 30, 31, 32,
233add958ceSSoren Brinkmann 					     33, 34, 35, 36, 37, 38, 39};
234add958ceSSoren Brinkmann static const unsigned int smc0_nor_cs1_pins[] = {1};
235add958ceSSoren Brinkmann static const unsigned int smc0_nor_addr25_pins[] = {1};
236add958ceSSoren Brinkmann static const unsigned int smc0_nand_pins[] = {0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
237add958ceSSoren Brinkmann 					      12, 13, 14, 16, 17, 18, 19, 20,
238add958ceSSoren Brinkmann 					      21, 22, 23};
239951f033dSJason Gunthorpe static const unsigned int smc0_nand8_pins[] = {0, 2, 3,  4,  5,  6,  7,
240951f033dSJason Gunthorpe 					       8, 9, 10, 11, 12, 13, 14};
241add958ceSSoren Brinkmann /* Note: CAN MIO clock inputs are modeled in the clock framework */
242add958ceSSoren Brinkmann static const unsigned int can0_0_pins[] = {10, 11};
243add958ceSSoren Brinkmann static const unsigned int can0_1_pins[] = {14, 15};
244add958ceSSoren Brinkmann static const unsigned int can0_2_pins[] = {18, 19};
245add958ceSSoren Brinkmann static const unsigned int can0_3_pins[] = {22, 23};
246add958ceSSoren Brinkmann static const unsigned int can0_4_pins[] = {26, 27};
247add958ceSSoren Brinkmann static const unsigned int can0_5_pins[] = {30, 31};
248add958ceSSoren Brinkmann static const unsigned int can0_6_pins[] = {34, 35};
249add958ceSSoren Brinkmann static const unsigned int can0_7_pins[] = {38, 39};
250add958ceSSoren Brinkmann static const unsigned int can0_8_pins[] = {42, 43};
251add958ceSSoren Brinkmann static const unsigned int can0_9_pins[] = {46, 47};
252add958ceSSoren Brinkmann static const unsigned int can0_10_pins[] = {50, 51};
253add958ceSSoren Brinkmann static const unsigned int can1_0_pins[] = {8, 9};
254add958ceSSoren Brinkmann static const unsigned int can1_1_pins[] = {12, 13};
255add958ceSSoren Brinkmann static const unsigned int can1_2_pins[] = {16, 17};
256add958ceSSoren Brinkmann static const unsigned int can1_3_pins[] = {20, 21};
257add958ceSSoren Brinkmann static const unsigned int can1_4_pins[] = {24, 25};
258add958ceSSoren Brinkmann static const unsigned int can1_5_pins[] = {28, 29};
259add958ceSSoren Brinkmann static const unsigned int can1_6_pins[] = {32, 33};
260add958ceSSoren Brinkmann static const unsigned int can1_7_pins[] = {36, 37};
261add958ceSSoren Brinkmann static const unsigned int can1_8_pins[] = {40, 41};
262add958ceSSoren Brinkmann static const unsigned int can1_9_pins[] = {44, 45};
263add958ceSSoren Brinkmann static const unsigned int can1_10_pins[] = {48, 49};
264add958ceSSoren Brinkmann static const unsigned int can1_11_pins[] = {52, 53};
265add958ceSSoren Brinkmann static const unsigned int uart0_0_pins[] = {10, 11};
266add958ceSSoren Brinkmann static const unsigned int uart0_1_pins[] = {14, 15};
267add958ceSSoren Brinkmann static const unsigned int uart0_2_pins[] = {18, 19};
268add958ceSSoren Brinkmann static const unsigned int uart0_3_pins[] = {22, 23};
269add958ceSSoren Brinkmann static const unsigned int uart0_4_pins[] = {26, 27};
270add958ceSSoren Brinkmann static const unsigned int uart0_5_pins[] = {30, 31};
271add958ceSSoren Brinkmann static const unsigned int uart0_6_pins[] = {34, 35};
272add958ceSSoren Brinkmann static const unsigned int uart0_7_pins[] = {38, 39};
273add958ceSSoren Brinkmann static const unsigned int uart0_8_pins[] = {42, 43};
274add958ceSSoren Brinkmann static const unsigned int uart0_9_pins[] = {46, 47};
275add958ceSSoren Brinkmann static const unsigned int uart0_10_pins[] = {50, 51};
276add958ceSSoren Brinkmann static const unsigned int uart1_0_pins[] = {8, 9};
277add958ceSSoren Brinkmann static const unsigned int uart1_1_pins[] = {12, 13};
278add958ceSSoren Brinkmann static const unsigned int uart1_2_pins[] = {16, 17};
279add958ceSSoren Brinkmann static const unsigned int uart1_3_pins[] = {20, 21};
280add958ceSSoren Brinkmann static const unsigned int uart1_4_pins[] = {24, 25};
281add958ceSSoren Brinkmann static const unsigned int uart1_5_pins[] = {28, 29};
282add958ceSSoren Brinkmann static const unsigned int uart1_6_pins[] = {32, 33};
283add958ceSSoren Brinkmann static const unsigned int uart1_7_pins[] = {36, 37};
284add958ceSSoren Brinkmann static const unsigned int uart1_8_pins[] = {40, 41};
285add958ceSSoren Brinkmann static const unsigned int uart1_9_pins[] = {44, 45};
286add958ceSSoren Brinkmann static const unsigned int uart1_10_pins[] = {48, 49};
287add958ceSSoren Brinkmann static const unsigned int uart1_11_pins[] = {52, 53};
288add958ceSSoren Brinkmann static const unsigned int i2c0_0_pins[] = {10, 11};
289add958ceSSoren Brinkmann static const unsigned int i2c0_1_pins[] = {14, 15};
290add958ceSSoren Brinkmann static const unsigned int i2c0_2_pins[] = {18, 19};
291add958ceSSoren Brinkmann static const unsigned int i2c0_3_pins[] = {22, 23};
292add958ceSSoren Brinkmann static const unsigned int i2c0_4_pins[] = {26, 27};
293add958ceSSoren Brinkmann static const unsigned int i2c0_5_pins[] = {30, 31};
294add958ceSSoren Brinkmann static const unsigned int i2c0_6_pins[] = {34, 35};
295add958ceSSoren Brinkmann static const unsigned int i2c0_7_pins[] = {38, 39};
296add958ceSSoren Brinkmann static const unsigned int i2c0_8_pins[] = {42, 43};
297add958ceSSoren Brinkmann static const unsigned int i2c0_9_pins[] = {46, 47};
298add958ceSSoren Brinkmann static const unsigned int i2c0_10_pins[] = {50, 51};
299add958ceSSoren Brinkmann static const unsigned int i2c1_0_pins[] = {12, 13};
300add958ceSSoren Brinkmann static const unsigned int i2c1_1_pins[] = {16, 17};
301add958ceSSoren Brinkmann static const unsigned int i2c1_2_pins[] = {20, 21};
302add958ceSSoren Brinkmann static const unsigned int i2c1_3_pins[] = {24, 25};
303add958ceSSoren Brinkmann static const unsigned int i2c1_4_pins[] = {28, 29};
304add958ceSSoren Brinkmann static const unsigned int i2c1_5_pins[] = {32, 33};
305add958ceSSoren Brinkmann static const unsigned int i2c1_6_pins[] = {36, 37};
306add958ceSSoren Brinkmann static const unsigned int i2c1_7_pins[] = {40, 41};
307add958ceSSoren Brinkmann static const unsigned int i2c1_8_pins[] = {44, 45};
308add958ceSSoren Brinkmann static const unsigned int i2c1_9_pins[] = {48, 49};
309add958ceSSoren Brinkmann static const unsigned int i2c1_10_pins[] = {52, 53};
310add958ceSSoren Brinkmann static const unsigned int ttc0_0_pins[] = {18, 19};
311add958ceSSoren Brinkmann static const unsigned int ttc0_1_pins[] = {30, 31};
312add958ceSSoren Brinkmann static const unsigned int ttc0_2_pins[] = {42, 43};
313add958ceSSoren Brinkmann static const unsigned int ttc1_0_pins[] = {16, 17};
314add958ceSSoren Brinkmann static const unsigned int ttc1_1_pins[] = {28, 29};
315add958ceSSoren Brinkmann static const unsigned int ttc1_2_pins[] = {40, 41};
316add958ceSSoren Brinkmann static const unsigned int swdt0_0_pins[] = {14, 15};
317add958ceSSoren Brinkmann static const unsigned int swdt0_1_pins[] = {26, 27};
318add958ceSSoren Brinkmann static const unsigned int swdt0_2_pins[] = {38, 39};
319add958ceSSoren Brinkmann static const unsigned int swdt0_3_pins[] = {50, 51};
320add958ceSSoren Brinkmann static const unsigned int swdt0_4_pins[] = {52, 53};
321add958ceSSoren Brinkmann static const unsigned int gpio0_0_pins[] = {0};
322add958ceSSoren Brinkmann static const unsigned int gpio0_1_pins[] = {1};
323add958ceSSoren Brinkmann static const unsigned int gpio0_2_pins[] = {2};
324add958ceSSoren Brinkmann static const unsigned int gpio0_3_pins[] = {3};
325add958ceSSoren Brinkmann static const unsigned int gpio0_4_pins[] = {4};
326add958ceSSoren Brinkmann static const unsigned int gpio0_5_pins[] = {5};
327add958ceSSoren Brinkmann static const unsigned int gpio0_6_pins[] = {6};
328add958ceSSoren Brinkmann static const unsigned int gpio0_7_pins[] = {7};
329add958ceSSoren Brinkmann static const unsigned int gpio0_8_pins[] = {8};
330add958ceSSoren Brinkmann static const unsigned int gpio0_9_pins[] = {9};
331add958ceSSoren Brinkmann static const unsigned int gpio0_10_pins[] = {10};
332add958ceSSoren Brinkmann static const unsigned int gpio0_11_pins[] = {11};
333add958ceSSoren Brinkmann static const unsigned int gpio0_12_pins[] = {12};
334add958ceSSoren Brinkmann static const unsigned int gpio0_13_pins[] = {13};
335add958ceSSoren Brinkmann static const unsigned int gpio0_14_pins[] = {14};
336add958ceSSoren Brinkmann static const unsigned int gpio0_15_pins[] = {15};
337add958ceSSoren Brinkmann static const unsigned int gpio0_16_pins[] = {16};
338add958ceSSoren Brinkmann static const unsigned int gpio0_17_pins[] = {17};
339add958ceSSoren Brinkmann static const unsigned int gpio0_18_pins[] = {18};
340add958ceSSoren Brinkmann static const unsigned int gpio0_19_pins[] = {19};
341add958ceSSoren Brinkmann static const unsigned int gpio0_20_pins[] = {20};
342add958ceSSoren Brinkmann static const unsigned int gpio0_21_pins[] = {21};
343add958ceSSoren Brinkmann static const unsigned int gpio0_22_pins[] = {22};
344add958ceSSoren Brinkmann static const unsigned int gpio0_23_pins[] = {23};
345add958ceSSoren Brinkmann static const unsigned int gpio0_24_pins[] = {24};
346add958ceSSoren Brinkmann static const unsigned int gpio0_25_pins[] = {25};
347add958ceSSoren Brinkmann static const unsigned int gpio0_26_pins[] = {26};
348add958ceSSoren Brinkmann static const unsigned int gpio0_27_pins[] = {27};
349add958ceSSoren Brinkmann static const unsigned int gpio0_28_pins[] = {28};
350add958ceSSoren Brinkmann static const unsigned int gpio0_29_pins[] = {29};
351add958ceSSoren Brinkmann static const unsigned int gpio0_30_pins[] = {30};
352add958ceSSoren Brinkmann static const unsigned int gpio0_31_pins[] = {31};
353add958ceSSoren Brinkmann static const unsigned int gpio0_32_pins[] = {32};
354add958ceSSoren Brinkmann static const unsigned int gpio0_33_pins[] = {33};
355add958ceSSoren Brinkmann static const unsigned int gpio0_34_pins[] = {34};
356add958ceSSoren Brinkmann static const unsigned int gpio0_35_pins[] = {35};
357add958ceSSoren Brinkmann static const unsigned int gpio0_36_pins[] = {36};
358add958ceSSoren Brinkmann static const unsigned int gpio0_37_pins[] = {37};
359add958ceSSoren Brinkmann static const unsigned int gpio0_38_pins[] = {38};
360add958ceSSoren Brinkmann static const unsigned int gpio0_39_pins[] = {39};
361add958ceSSoren Brinkmann static const unsigned int gpio0_40_pins[] = {40};
362add958ceSSoren Brinkmann static const unsigned int gpio0_41_pins[] = {41};
363add958ceSSoren Brinkmann static const unsigned int gpio0_42_pins[] = {42};
364add958ceSSoren Brinkmann static const unsigned int gpio0_43_pins[] = {43};
365add958ceSSoren Brinkmann static const unsigned int gpio0_44_pins[] = {44};
366add958ceSSoren Brinkmann static const unsigned int gpio0_45_pins[] = {45};
367add958ceSSoren Brinkmann static const unsigned int gpio0_46_pins[] = {46};
368add958ceSSoren Brinkmann static const unsigned int gpio0_47_pins[] = {47};
369add958ceSSoren Brinkmann static const unsigned int gpio0_48_pins[] = {48};
370add958ceSSoren Brinkmann static const unsigned int gpio0_49_pins[] = {49};
371add958ceSSoren Brinkmann static const unsigned int gpio0_50_pins[] = {50};
372add958ceSSoren Brinkmann static const unsigned int gpio0_51_pins[] = {51};
373add958ceSSoren Brinkmann static const unsigned int gpio0_52_pins[] = {52};
374add958ceSSoren Brinkmann static const unsigned int gpio0_53_pins[] = {53};
3758090f791SAndreas Färber static const unsigned int usb0_0_pins[] = {28, 29, 30, 31, 32, 33, 34, 35, 36,
376add958ceSSoren Brinkmann 					   37, 38, 39};
377add958ceSSoren Brinkmann static const unsigned int usb1_0_pins[] = {40, 41, 42, 43, 44, 45, 46, 47, 48,
378add958ceSSoren Brinkmann 					   49, 50, 51};
379add958ceSSoren Brinkmann 
380add958ceSSoren Brinkmann #define DEFINE_ZYNQ_PINCTRL_GRP(nm) \
381add958ceSSoren Brinkmann 	{ \
382add958ceSSoren Brinkmann 		.name = #nm "_grp", \
383add958ceSSoren Brinkmann 		.pins = nm ## _pins, \
384add958ceSSoren Brinkmann 		.npins = ARRAY_SIZE(nm ## _pins), \
385add958ceSSoren Brinkmann 	}
386add958ceSSoren Brinkmann 
3874fd24e22SMasahiro Yamada static const struct zynq_pctrl_group zynq_pctrl_groups[] = {
388add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(ethernet0_0),
389add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(ethernet1_0),
390add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(mdio0_0),
391add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(mdio1_0),
392add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(qspi0_0),
393add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(qspi1_0),
394add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(qspi_fbclk),
395add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(qspi_cs1),
396add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(spi0_0),
39783a21727SHelmut Buchsbaum 	DEFINE_ZYNQ_PINCTRL_GRP(spi0_0_ss0),
39883a21727SHelmut Buchsbaum 	DEFINE_ZYNQ_PINCTRL_GRP(spi0_0_ss1),
39983a21727SHelmut Buchsbaum 	DEFINE_ZYNQ_PINCTRL_GRP(spi0_0_ss2),
400add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(spi0_1),
40183a21727SHelmut Buchsbaum 	DEFINE_ZYNQ_PINCTRL_GRP(spi0_1_ss0),
40283a21727SHelmut Buchsbaum 	DEFINE_ZYNQ_PINCTRL_GRP(spi0_1_ss1),
40383a21727SHelmut Buchsbaum 	DEFINE_ZYNQ_PINCTRL_GRP(spi0_1_ss2),
404add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(spi0_2),
40583a21727SHelmut Buchsbaum 	DEFINE_ZYNQ_PINCTRL_GRP(spi0_2_ss0),
40683a21727SHelmut Buchsbaum 	DEFINE_ZYNQ_PINCTRL_GRP(spi0_2_ss1),
40783a21727SHelmut Buchsbaum 	DEFINE_ZYNQ_PINCTRL_GRP(spi0_2_ss2),
408add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(spi1_0),
40983a21727SHelmut Buchsbaum 	DEFINE_ZYNQ_PINCTRL_GRP(spi1_0_ss0),
41083a21727SHelmut Buchsbaum 	DEFINE_ZYNQ_PINCTRL_GRP(spi1_0_ss1),
41183a21727SHelmut Buchsbaum 	DEFINE_ZYNQ_PINCTRL_GRP(spi1_0_ss2),
412add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(spi1_1),
41383a21727SHelmut Buchsbaum 	DEFINE_ZYNQ_PINCTRL_GRP(spi1_1_ss0),
41483a21727SHelmut Buchsbaum 	DEFINE_ZYNQ_PINCTRL_GRP(spi1_1_ss1),
41583a21727SHelmut Buchsbaum 	DEFINE_ZYNQ_PINCTRL_GRP(spi1_1_ss2),
416add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(spi1_2),
41783a21727SHelmut Buchsbaum 	DEFINE_ZYNQ_PINCTRL_GRP(spi1_2_ss0),
41883a21727SHelmut Buchsbaum 	DEFINE_ZYNQ_PINCTRL_GRP(spi1_2_ss1),
41983a21727SHelmut Buchsbaum 	DEFINE_ZYNQ_PINCTRL_GRP(spi1_2_ss2),
420add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(spi1_3),
42183a21727SHelmut Buchsbaum 	DEFINE_ZYNQ_PINCTRL_GRP(spi1_3_ss0),
42283a21727SHelmut Buchsbaum 	DEFINE_ZYNQ_PINCTRL_GRP(spi1_3_ss1),
42383a21727SHelmut Buchsbaum 	DEFINE_ZYNQ_PINCTRL_GRP(spi1_3_ss2),
424add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(sdio0_0),
425add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(sdio0_1),
426add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(sdio0_2),
427add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(sdio1_0),
428add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(sdio1_1),
429add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(sdio1_2),
430add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(sdio1_3),
431add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(sdio0_emio_wp),
432add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(sdio0_emio_cd),
433add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(sdio1_emio_wp),
434add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(sdio1_emio_cd),
435add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(smc0_nor),
436add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(smc0_nor_cs1),
437add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(smc0_nor_addr25),
438add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(smc0_nand),
439951f033dSJason Gunthorpe 	DEFINE_ZYNQ_PINCTRL_GRP(smc0_nand8),
440add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(can0_0),
441add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(can0_1),
442add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(can0_2),
443add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(can0_3),
444add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(can0_4),
445add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(can0_5),
446add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(can0_6),
447add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(can0_7),
448add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(can0_8),
449add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(can0_9),
450add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(can0_10),
451add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(can1_0),
452add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(can1_1),
453add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(can1_2),
454add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(can1_3),
455add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(can1_4),
456add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(can1_5),
457add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(can1_6),
458add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(can1_7),
459add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(can1_8),
460add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(can1_9),
461add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(can1_10),
462add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(can1_11),
463add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(uart0_0),
464add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(uart0_1),
465add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(uart0_2),
466add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(uart0_3),
467add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(uart0_4),
468add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(uart0_5),
469add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(uart0_6),
470add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(uart0_7),
471add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(uart0_8),
472add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(uart0_9),
473add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(uart0_10),
474add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(uart1_0),
475add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(uart1_1),
476add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(uart1_2),
477add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(uart1_3),
478add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(uart1_4),
479add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(uart1_5),
480add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(uart1_6),
481add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(uart1_7),
482add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(uart1_8),
483add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(uart1_9),
484add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(uart1_10),
485add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(uart1_11),
486add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(i2c0_0),
487add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(i2c0_1),
488add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(i2c0_2),
489add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(i2c0_3),
490add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(i2c0_4),
491add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(i2c0_5),
492add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(i2c0_6),
493add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(i2c0_7),
494add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(i2c0_8),
495add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(i2c0_9),
496add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(i2c0_10),
497add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(i2c1_0),
498add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(i2c1_1),
499add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(i2c1_2),
500add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(i2c1_3),
501add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(i2c1_4),
502add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(i2c1_5),
503add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(i2c1_6),
504add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(i2c1_7),
505add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(i2c1_8),
506add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(i2c1_9),
507add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(i2c1_10),
508add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(ttc0_0),
509add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(ttc0_1),
510add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(ttc0_2),
511add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(ttc1_0),
512add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(ttc1_1),
513add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(ttc1_2),
514add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(swdt0_0),
515add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(swdt0_1),
516add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(swdt0_2),
517add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(swdt0_3),
518add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(swdt0_4),
519add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_0),
520add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_1),
521add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_2),
522add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_3),
523add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_4),
524add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_5),
525add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_6),
526add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_7),
527add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_8),
528add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_9),
529add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_10),
530add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_11),
531add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_12),
532add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_13),
533add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_14),
534add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_15),
535add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_16),
536add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_17),
537add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_18),
538add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_19),
539add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_20),
540add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_21),
541add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_22),
542add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_23),
543add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_24),
544add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_25),
545add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_26),
546add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_27),
547add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_28),
548add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_29),
549add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_30),
550add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_31),
551add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_32),
552add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_33),
553add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_34),
554add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_35),
555add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_36),
556add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_37),
557add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_38),
558add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_39),
559add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_40),
560add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_41),
561add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_42),
562add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_43),
563add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_44),
564add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_45),
565add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_46),
566add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_47),
567add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_48),
568add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_49),
569add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_50),
570add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_51),
571add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_52),
572add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(gpio0_53),
573add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(usb0_0),
574add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINCTRL_GRP(usb1_0),
575add958ceSSoren Brinkmann };
576add958ceSSoren Brinkmann 
577add958ceSSoren Brinkmann /* function groups */
578add958ceSSoren Brinkmann static const char * const ethernet0_groups[] = {"ethernet0_0_grp"};
579add958ceSSoren Brinkmann static const char * const ethernet1_groups[] = {"ethernet1_0_grp"};
580add958ceSSoren Brinkmann static const char * const usb0_groups[] = {"usb0_0_grp"};
581add958ceSSoren Brinkmann static const char * const usb1_groups[] = {"usb1_0_grp"};
582add958ceSSoren Brinkmann static const char * const mdio0_groups[] = {"mdio0_0_grp"};
583add958ceSSoren Brinkmann static const char * const mdio1_groups[] = {"mdio1_0_grp"};
584add958ceSSoren Brinkmann static const char * const qspi0_groups[] = {"qspi0_0_grp"};
58541bd0c52SHelmut Buchsbaum static const char * const qspi1_groups[] = {"qspi1_0_grp"};
586add958ceSSoren Brinkmann static const char * const qspi_fbclk_groups[] = {"qspi_fbclk_grp"};
587add958ceSSoren Brinkmann static const char * const qspi_cs1_groups[] = {"qspi_cs1_grp"};
588add958ceSSoren Brinkmann static const char * const spi0_groups[] = {"spi0_0_grp", "spi0_1_grp",
589add958ceSSoren Brinkmann 					   "spi0_2_grp"};
590add958ceSSoren Brinkmann static const char * const spi1_groups[] = {"spi1_0_grp", "spi1_1_grp",
591add958ceSSoren Brinkmann 					   "spi1_2_grp", "spi1_3_grp"};
59283a21727SHelmut Buchsbaum static const char * const spi0_ss_groups[] = {"spi0_0_ss0_grp",
59383a21727SHelmut Buchsbaum 		"spi0_0_ss1_grp", "spi0_0_ss2_grp", "spi0_1_ss0_grp",
59483a21727SHelmut Buchsbaum 		"spi0_1_ss1_grp", "spi0_1_ss2_grp", "spi0_2_ss0_grp",
59583a21727SHelmut Buchsbaum 		"spi0_2_ss1_grp", "spi0_2_ss2_grp"};
59683a21727SHelmut Buchsbaum static const char * const spi1_ss_groups[] = {"spi1_0_ss0_grp",
59783a21727SHelmut Buchsbaum 		"spi1_0_ss1_grp", "spi1_0_ss2_grp", "spi1_1_ss0_grp",
59883a21727SHelmut Buchsbaum 		"spi1_1_ss1_grp", "spi1_1_ss2_grp", "spi1_2_ss0_grp",
59983a21727SHelmut Buchsbaum 		"spi1_2_ss1_grp", "spi1_2_ss2_grp", "spi1_3_ss0_grp",
60083a21727SHelmut Buchsbaum 		"spi1_3_ss1_grp", "spi1_3_ss2_grp"};
601add958ceSSoren Brinkmann static const char * const sdio0_groups[] = {"sdio0_0_grp", "sdio0_1_grp",
602add958ceSSoren Brinkmann 					    "sdio0_2_grp"};
603add958ceSSoren Brinkmann static const char * const sdio1_groups[] = {"sdio1_0_grp", "sdio1_1_grp",
604add958ceSSoren Brinkmann 					    "sdio1_2_grp", "sdio1_3_grp"};
605add958ceSSoren Brinkmann static const char * const sdio0_pc_groups[] = {"gpio0_0_grp",
606add958ceSSoren Brinkmann 		"gpio0_2_grp", "gpio0_4_grp", "gpio0_6_grp",
607add958ceSSoren Brinkmann 		"gpio0_8_grp", "gpio0_10_grp", "gpio0_12_grp",
608add958ceSSoren Brinkmann 		"gpio0_14_grp", "gpio0_16_grp", "gpio0_18_grp",
609add958ceSSoren Brinkmann 		"gpio0_20_grp", "gpio0_22_grp", "gpio0_24_grp",
610add958ceSSoren Brinkmann 		"gpio0_26_grp", "gpio0_28_grp", "gpio0_30_grp",
611add958ceSSoren Brinkmann 		"gpio0_32_grp", "gpio0_34_grp", "gpio0_36_grp",
612add958ceSSoren Brinkmann 		"gpio0_38_grp", "gpio0_40_grp", "gpio0_42_grp",
613add958ceSSoren Brinkmann 		"gpio0_44_grp", "gpio0_46_grp", "gpio0_48_grp",
614add958ceSSoren Brinkmann 		"gpio0_50_grp", "gpio0_52_grp"};
615add958ceSSoren Brinkmann static const char * const sdio1_pc_groups[] = {"gpio0_1_grp",
616add958ceSSoren Brinkmann 		"gpio0_3_grp", "gpio0_5_grp", "gpio0_7_grp",
617add958ceSSoren Brinkmann 		"gpio0_9_grp", "gpio0_11_grp", "gpio0_13_grp",
618add958ceSSoren Brinkmann 		"gpio0_15_grp", "gpio0_17_grp", "gpio0_19_grp",
619add958ceSSoren Brinkmann 		"gpio0_21_grp", "gpio0_23_grp", "gpio0_25_grp",
620add958ceSSoren Brinkmann 		"gpio0_27_grp", "gpio0_29_grp", "gpio0_31_grp",
621add958ceSSoren Brinkmann 		"gpio0_33_grp", "gpio0_35_grp", "gpio0_37_grp",
622add958ceSSoren Brinkmann 		"gpio0_39_grp", "gpio0_41_grp", "gpio0_43_grp",
623add958ceSSoren Brinkmann 		"gpio0_45_grp", "gpio0_47_grp", "gpio0_49_grp",
624add958ceSSoren Brinkmann 		"gpio0_51_grp", "gpio0_53_grp"};
625add958ceSSoren Brinkmann static const char * const sdio0_cd_groups[] = {"gpio0_0_grp",
626add958ceSSoren Brinkmann 		"gpio0_2_grp", "gpio0_4_grp", "gpio0_6_grp",
627add958ceSSoren Brinkmann 		"gpio0_10_grp", "gpio0_12_grp",
628add958ceSSoren Brinkmann 		"gpio0_14_grp", "gpio0_16_grp", "gpio0_18_grp",
629add958ceSSoren Brinkmann 		"gpio0_20_grp", "gpio0_22_grp", "gpio0_24_grp",
630add958ceSSoren Brinkmann 		"gpio0_26_grp", "gpio0_28_grp", "gpio0_30_grp",
631add958ceSSoren Brinkmann 		"gpio0_32_grp", "gpio0_34_grp", "gpio0_36_grp",
632add958ceSSoren Brinkmann 		"gpio0_38_grp", "gpio0_40_grp", "gpio0_42_grp",
633add958ceSSoren Brinkmann 		"gpio0_44_grp", "gpio0_46_grp", "gpio0_48_grp",
634add958ceSSoren Brinkmann 		"gpio0_50_grp", "gpio0_52_grp", "gpio0_1_grp",
635add958ceSSoren Brinkmann 		"gpio0_3_grp", "gpio0_5_grp",
636add958ceSSoren Brinkmann 		"gpio0_9_grp", "gpio0_11_grp", "gpio0_13_grp",
637add958ceSSoren Brinkmann 		"gpio0_15_grp", "gpio0_17_grp", "gpio0_19_grp",
638add958ceSSoren Brinkmann 		"gpio0_21_grp", "gpio0_23_grp", "gpio0_25_grp",
639add958ceSSoren Brinkmann 		"gpio0_27_grp", "gpio0_29_grp", "gpio0_31_grp",
640add958ceSSoren Brinkmann 		"gpio0_33_grp", "gpio0_35_grp", "gpio0_37_grp",
641add958ceSSoren Brinkmann 		"gpio0_39_grp", "gpio0_41_grp", "gpio0_43_grp",
642add958ceSSoren Brinkmann 		"gpio0_45_grp", "gpio0_47_grp", "gpio0_49_grp",
643add958ceSSoren Brinkmann 		"gpio0_51_grp", "gpio0_53_grp", "sdio0_emio_cd_grp"};
644add958ceSSoren Brinkmann static const char * const sdio0_wp_groups[] = {"gpio0_0_grp",
645add958ceSSoren Brinkmann 		"gpio0_2_grp", "gpio0_4_grp", "gpio0_6_grp",
646add958ceSSoren Brinkmann 		"gpio0_10_grp", "gpio0_12_grp",
647add958ceSSoren Brinkmann 		"gpio0_14_grp", "gpio0_16_grp", "gpio0_18_grp",
648add958ceSSoren Brinkmann 		"gpio0_20_grp", "gpio0_22_grp", "gpio0_24_grp",
649add958ceSSoren Brinkmann 		"gpio0_26_grp", "gpio0_28_grp", "gpio0_30_grp",
650add958ceSSoren Brinkmann 		"gpio0_32_grp", "gpio0_34_grp", "gpio0_36_grp",
651add958ceSSoren Brinkmann 		"gpio0_38_grp", "gpio0_40_grp", "gpio0_42_grp",
652add958ceSSoren Brinkmann 		"gpio0_44_grp", "gpio0_46_grp", "gpio0_48_grp",
653add958ceSSoren Brinkmann 		"gpio0_50_grp", "gpio0_52_grp", "gpio0_1_grp",
654add958ceSSoren Brinkmann 		"gpio0_3_grp", "gpio0_5_grp",
655add958ceSSoren Brinkmann 		"gpio0_9_grp", "gpio0_11_grp", "gpio0_13_grp",
656add958ceSSoren Brinkmann 		"gpio0_15_grp", "gpio0_17_grp", "gpio0_19_grp",
657add958ceSSoren Brinkmann 		"gpio0_21_grp", "gpio0_23_grp", "gpio0_25_grp",
658add958ceSSoren Brinkmann 		"gpio0_27_grp", "gpio0_29_grp", "gpio0_31_grp",
659add958ceSSoren Brinkmann 		"gpio0_33_grp", "gpio0_35_grp", "gpio0_37_grp",
660add958ceSSoren Brinkmann 		"gpio0_39_grp", "gpio0_41_grp", "gpio0_43_grp",
661add958ceSSoren Brinkmann 		"gpio0_45_grp", "gpio0_47_grp", "gpio0_49_grp",
662add958ceSSoren Brinkmann 		"gpio0_51_grp", "gpio0_53_grp", "sdio0_emio_wp_grp"};
663add958ceSSoren Brinkmann static const char * const sdio1_cd_groups[] = {"gpio0_0_grp",
664add958ceSSoren Brinkmann 		"gpio0_2_grp", "gpio0_4_grp", "gpio0_6_grp",
665add958ceSSoren Brinkmann 		"gpio0_10_grp", "gpio0_12_grp",
666add958ceSSoren Brinkmann 		"gpio0_14_grp", "gpio0_16_grp", "gpio0_18_grp",
667add958ceSSoren Brinkmann 		"gpio0_20_grp", "gpio0_22_grp", "gpio0_24_grp",
668add958ceSSoren Brinkmann 		"gpio0_26_grp", "gpio0_28_grp", "gpio0_30_grp",
669add958ceSSoren Brinkmann 		"gpio0_32_grp", "gpio0_34_grp", "gpio0_36_grp",
670add958ceSSoren Brinkmann 		"gpio0_38_grp", "gpio0_40_grp", "gpio0_42_grp",
671add958ceSSoren Brinkmann 		"gpio0_44_grp", "gpio0_46_grp", "gpio0_48_grp",
672add958ceSSoren Brinkmann 		"gpio0_50_grp", "gpio0_52_grp", "gpio0_1_grp",
673add958ceSSoren Brinkmann 		"gpio0_3_grp", "gpio0_5_grp",
674add958ceSSoren Brinkmann 		"gpio0_9_grp", "gpio0_11_grp", "gpio0_13_grp",
675add958ceSSoren Brinkmann 		"gpio0_15_grp", "gpio0_17_grp", "gpio0_19_grp",
676add958ceSSoren Brinkmann 		"gpio0_21_grp", "gpio0_23_grp", "gpio0_25_grp",
677add958ceSSoren Brinkmann 		"gpio0_27_grp", "gpio0_29_grp", "gpio0_31_grp",
678add958ceSSoren Brinkmann 		"gpio0_33_grp", "gpio0_35_grp", "gpio0_37_grp",
679add958ceSSoren Brinkmann 		"gpio0_39_grp", "gpio0_41_grp", "gpio0_43_grp",
680add958ceSSoren Brinkmann 		"gpio0_45_grp", "gpio0_47_grp", "gpio0_49_grp",
681add958ceSSoren Brinkmann 		"gpio0_51_grp", "gpio0_53_grp", "sdio1_emio_cd_grp"};
682add958ceSSoren Brinkmann static const char * const sdio1_wp_groups[] = {"gpio0_0_grp",
683add958ceSSoren Brinkmann 		"gpio0_2_grp", "gpio0_4_grp", "gpio0_6_grp",
684add958ceSSoren Brinkmann 		"gpio0_10_grp", "gpio0_12_grp",
685add958ceSSoren Brinkmann 		"gpio0_14_grp", "gpio0_16_grp", "gpio0_18_grp",
686add958ceSSoren Brinkmann 		"gpio0_20_grp", "gpio0_22_grp", "gpio0_24_grp",
687add958ceSSoren Brinkmann 		"gpio0_26_grp", "gpio0_28_grp", "gpio0_30_grp",
688add958ceSSoren Brinkmann 		"gpio0_32_grp", "gpio0_34_grp", "gpio0_36_grp",
689add958ceSSoren Brinkmann 		"gpio0_38_grp", "gpio0_40_grp", "gpio0_42_grp",
690add958ceSSoren Brinkmann 		"gpio0_44_grp", "gpio0_46_grp", "gpio0_48_grp",
691add958ceSSoren Brinkmann 		"gpio0_50_grp", "gpio0_52_grp", "gpio0_1_grp",
692add958ceSSoren Brinkmann 		"gpio0_3_grp", "gpio0_5_grp",
693add958ceSSoren Brinkmann 		"gpio0_9_grp", "gpio0_11_grp", "gpio0_13_grp",
694add958ceSSoren Brinkmann 		"gpio0_15_grp", "gpio0_17_grp", "gpio0_19_grp",
695add958ceSSoren Brinkmann 		"gpio0_21_grp", "gpio0_23_grp", "gpio0_25_grp",
696add958ceSSoren Brinkmann 		"gpio0_27_grp", "gpio0_29_grp", "gpio0_31_grp",
697add958ceSSoren Brinkmann 		"gpio0_33_grp", "gpio0_35_grp", "gpio0_37_grp",
698add958ceSSoren Brinkmann 		"gpio0_39_grp", "gpio0_41_grp", "gpio0_43_grp",
699add958ceSSoren Brinkmann 		"gpio0_45_grp", "gpio0_47_grp", "gpio0_49_grp",
700add958ceSSoren Brinkmann 		"gpio0_51_grp", "gpio0_53_grp", "sdio1_emio_wp_grp"};
7012fe2918fSMike Looijmans static const char * const smc0_nor_groups[] = {"smc0_nor_grp"};
702add958ceSSoren Brinkmann static const char * const smc0_nor_cs1_groups[] = {"smc0_nor_cs1_grp"};
703add958ceSSoren Brinkmann static const char * const smc0_nor_addr25_groups[] = {"smc0_nor_addr25_grp"};
704951f033dSJason Gunthorpe static const char * const smc0_nand_groups[] = {"smc0_nand_grp",
705951f033dSJason Gunthorpe 		"smc0_nand8_grp"};
706add958ceSSoren Brinkmann static const char * const can0_groups[] = {"can0_0_grp", "can0_1_grp",
707add958ceSSoren Brinkmann 		"can0_2_grp", "can0_3_grp", "can0_4_grp", "can0_5_grp",
708add958ceSSoren Brinkmann 		"can0_6_grp", "can0_7_grp", "can0_8_grp", "can0_9_grp",
709add958ceSSoren Brinkmann 		"can0_10_grp"};
710add958ceSSoren Brinkmann static const char * const can1_groups[] = {"can1_0_grp", "can1_1_grp",
711add958ceSSoren Brinkmann 		"can1_2_grp", "can1_3_grp", "can1_4_grp", "can1_5_grp",
712add958ceSSoren Brinkmann 		"can1_6_grp", "can1_7_grp", "can1_8_grp", "can1_9_grp",
713add958ceSSoren Brinkmann 		"can1_10_grp", "can1_11_grp"};
714add958ceSSoren Brinkmann static const char * const uart0_groups[] = {"uart0_0_grp", "uart0_1_grp",
715add958ceSSoren Brinkmann 		"uart0_2_grp", "uart0_3_grp", "uart0_4_grp", "uart0_5_grp",
716add958ceSSoren Brinkmann 		"uart0_6_grp", "uart0_7_grp", "uart0_8_grp", "uart0_9_grp",
717add958ceSSoren Brinkmann 		"uart0_10_grp"};
718add958ceSSoren Brinkmann static const char * const uart1_groups[] = {"uart1_0_grp", "uart1_1_grp",
719add958ceSSoren Brinkmann 		"uart1_2_grp", "uart1_3_grp", "uart1_4_grp", "uart1_5_grp",
720add958ceSSoren Brinkmann 		"uart1_6_grp", "uart1_7_grp", "uart1_8_grp", "uart1_9_grp",
721add958ceSSoren Brinkmann 		"uart1_10_grp", "uart1_11_grp"};
722add958ceSSoren Brinkmann static const char * const i2c0_groups[] = {"i2c0_0_grp", "i2c0_1_grp",
723add958ceSSoren Brinkmann 		"i2c0_2_grp", "i2c0_3_grp", "i2c0_4_grp", "i2c0_5_grp",
724add958ceSSoren Brinkmann 		"i2c0_6_grp", "i2c0_7_grp", "i2c0_8_grp", "i2c0_9_grp",
725add958ceSSoren Brinkmann 		"i2c0_10_grp"};
726add958ceSSoren Brinkmann static const char * const i2c1_groups[] = {"i2c1_0_grp", "i2c1_1_grp",
727add958ceSSoren Brinkmann 		"i2c1_2_grp", "i2c1_3_grp", "i2c1_4_grp", "i2c1_5_grp",
728add958ceSSoren Brinkmann 		"i2c1_6_grp", "i2c1_7_grp", "i2c1_8_grp", "i2c1_9_grp",
729add958ceSSoren Brinkmann 		"i2c1_10_grp"};
730add958ceSSoren Brinkmann static const char * const ttc0_groups[] = {"ttc0_0_grp", "ttc0_1_grp",
731add958ceSSoren Brinkmann 					   "ttc0_2_grp"};
732add958ceSSoren Brinkmann static const char * const ttc1_groups[] = {"ttc1_0_grp", "ttc1_1_grp",
733add958ceSSoren Brinkmann 					   "ttc1_2_grp"};
734add958ceSSoren Brinkmann static const char * const swdt0_groups[] = {"swdt0_0_grp", "swdt0_1_grp",
735add958ceSSoren Brinkmann 		"swdt0_2_grp", "swdt0_3_grp", "swdt0_4_grp"};
736add958ceSSoren Brinkmann static const char * const gpio0_groups[] = {"gpio0_0_grp",
737add958ceSSoren Brinkmann 		"gpio0_2_grp", "gpio0_4_grp", "gpio0_6_grp",
738add958ceSSoren Brinkmann 		"gpio0_8_grp", "gpio0_10_grp", "gpio0_12_grp",
739add958ceSSoren Brinkmann 		"gpio0_14_grp", "gpio0_16_grp", "gpio0_18_grp",
740add958ceSSoren Brinkmann 		"gpio0_20_grp", "gpio0_22_grp", "gpio0_24_grp",
741add958ceSSoren Brinkmann 		"gpio0_26_grp", "gpio0_28_grp", "gpio0_30_grp",
742add958ceSSoren Brinkmann 		"gpio0_32_grp", "gpio0_34_grp", "gpio0_36_grp",
743add958ceSSoren Brinkmann 		"gpio0_38_grp", "gpio0_40_grp", "gpio0_42_grp",
744add958ceSSoren Brinkmann 		"gpio0_44_grp", "gpio0_46_grp", "gpio0_48_grp",
745add958ceSSoren Brinkmann 		"gpio0_50_grp", "gpio0_52_grp", "gpio0_1_grp",
746add958ceSSoren Brinkmann 		"gpio0_3_grp", "gpio0_5_grp", "gpio0_7_grp",
747add958ceSSoren Brinkmann 		"gpio0_9_grp", "gpio0_11_grp", "gpio0_13_grp",
748add958ceSSoren Brinkmann 		"gpio0_15_grp", "gpio0_17_grp", "gpio0_19_grp",
749add958ceSSoren Brinkmann 		"gpio0_21_grp", "gpio0_23_grp", "gpio0_25_grp",
750add958ceSSoren Brinkmann 		"gpio0_27_grp", "gpio0_29_grp", "gpio0_31_grp",
751add958ceSSoren Brinkmann 		"gpio0_33_grp", "gpio0_35_grp", "gpio0_37_grp",
752add958ceSSoren Brinkmann 		"gpio0_39_grp", "gpio0_41_grp", "gpio0_43_grp",
753add958ceSSoren Brinkmann 		"gpio0_45_grp", "gpio0_47_grp", "gpio0_49_grp",
754add958ceSSoren Brinkmann 		"gpio0_51_grp", "gpio0_53_grp"};
755add958ceSSoren Brinkmann 
756add958ceSSoren Brinkmann #define DEFINE_ZYNQ_PINMUX_FUNCTION(fname, mval)	\
757add958ceSSoren Brinkmann 	[ZYNQ_PMUX_##fname] = {				\
758add958ceSSoren Brinkmann 		.name = #fname,				\
759add958ceSSoren Brinkmann 		.groups = fname##_groups,		\
760add958ceSSoren Brinkmann 		.ngroups = ARRAY_SIZE(fname##_groups),	\
761add958ceSSoren Brinkmann 		.mux_val = mval,			\
762add958ceSSoren Brinkmann 	}
763add958ceSSoren Brinkmann 
7644f652ceaSMasahiro Yamada #define DEFINE_ZYNQ_PINMUX_FUNCTION_MUX(fname, mval, offset, mask, shift)\
765add958ceSSoren Brinkmann 	[ZYNQ_PMUX_##fname] = {				\
766add958ceSSoren Brinkmann 		.name = #fname,				\
767add958ceSSoren Brinkmann 		.groups = fname##_groups,		\
768add958ceSSoren Brinkmann 		.ngroups = ARRAY_SIZE(fname##_groups),	\
769add958ceSSoren Brinkmann 		.mux_val = mval,			\
7704f652ceaSMasahiro Yamada 		.mux = offset,				\
771add958ceSSoren Brinkmann 		.mux_mask = mask,			\
772add958ceSSoren Brinkmann 		.mux_shift = shift,			\
773add958ceSSoren Brinkmann 	}
774add958ceSSoren Brinkmann 
775add958ceSSoren Brinkmann #define ZYNQ_SDIO_WP_SHIFT	0
776add958ceSSoren Brinkmann #define ZYNQ_SDIO_WP_MASK	(0x3f << ZYNQ_SDIO_WP_SHIFT)
777add958ceSSoren Brinkmann #define ZYNQ_SDIO_CD_SHIFT	16
778add958ceSSoren Brinkmann #define ZYNQ_SDIO_CD_MASK	(0x3f << ZYNQ_SDIO_CD_SHIFT)
779add958ceSSoren Brinkmann 
780add958ceSSoren Brinkmann static const struct zynq_pinmux_function zynq_pmux_functions[] = {
781add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(ethernet0, 1),
782add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(ethernet1, 1),
783add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(usb0, 2),
784add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(usb1, 2),
785add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(mdio0, 0x40),
786add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(mdio1, 0x50),
787add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(qspi0, 1),
788add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(qspi1, 1),
789add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(qspi_fbclk, 1),
790add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(qspi_cs1, 1),
791add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(spi0, 0x50),
792add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(spi1, 0x50),
79383a21727SHelmut Buchsbaum 	DEFINE_ZYNQ_PINMUX_FUNCTION(spi0_ss, 0x50),
79483a21727SHelmut Buchsbaum 	DEFINE_ZYNQ_PINMUX_FUNCTION(spi1_ss, 0x50),
795add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(sdio0, 0x40),
796add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(sdio0_pc, 0xc),
7975cf021d5SMasahiro Yamada 	DEFINE_ZYNQ_PINMUX_FUNCTION_MUX(sdio0_wp, 0, 0x130, ZYNQ_SDIO_WP_MASK,
798add958ceSSoren Brinkmann 					ZYNQ_SDIO_WP_SHIFT),
7995cf021d5SMasahiro Yamada 	DEFINE_ZYNQ_PINMUX_FUNCTION_MUX(sdio0_cd, 0, 0x130, ZYNQ_SDIO_CD_MASK,
800add958ceSSoren Brinkmann 					ZYNQ_SDIO_CD_SHIFT),
801add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(sdio1, 0x40),
802add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(sdio1_pc, 0xc),
8035cf021d5SMasahiro Yamada 	DEFINE_ZYNQ_PINMUX_FUNCTION_MUX(sdio1_wp, 0, 0x134, ZYNQ_SDIO_WP_MASK,
804add958ceSSoren Brinkmann 					ZYNQ_SDIO_WP_SHIFT),
8055cf021d5SMasahiro Yamada 	DEFINE_ZYNQ_PINMUX_FUNCTION_MUX(sdio1_cd, 0, 0x134, ZYNQ_SDIO_CD_MASK,
806add958ceSSoren Brinkmann 					ZYNQ_SDIO_CD_SHIFT),
807add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(smc0_nor, 4),
808add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(smc0_nor_cs1, 8),
809add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(smc0_nor_addr25, 4),
810add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(smc0_nand, 8),
811add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(can0, 0x10),
812add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(can1, 0x10),
813add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(uart0, 0x70),
814add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(uart1, 0x70),
815add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(i2c0, 0x20),
816add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(i2c1, 0x20),
817add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(ttc0, 0x60),
818add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(ttc1, 0x60),
819add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(swdt0, 0x30),
820add958ceSSoren Brinkmann 	DEFINE_ZYNQ_PINMUX_FUNCTION(gpio0, 0),
821add958ceSSoren Brinkmann };
822add958ceSSoren Brinkmann 
823add958ceSSoren Brinkmann 
824add958ceSSoren Brinkmann /* pinctrl */
zynq_pctrl_get_groups_count(struct pinctrl_dev * pctldev)825add958ceSSoren Brinkmann static int zynq_pctrl_get_groups_count(struct pinctrl_dev *pctldev)
826add958ceSSoren Brinkmann {
827add958ceSSoren Brinkmann 	struct zynq_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
828add958ceSSoren Brinkmann 
829add958ceSSoren Brinkmann 	return pctrl->ngroups;
830add958ceSSoren Brinkmann }
831add958ceSSoren Brinkmann 
zynq_pctrl_get_group_name(struct pinctrl_dev * pctldev,unsigned int selector)832add958ceSSoren Brinkmann static const char *zynq_pctrl_get_group_name(struct pinctrl_dev *pctldev,
8336c2c9bd2SNava kishore Manne 					     unsigned int selector)
834add958ceSSoren Brinkmann {
835add958ceSSoren Brinkmann 	struct zynq_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
836add958ceSSoren Brinkmann 
837add958ceSSoren Brinkmann 	return pctrl->groups[selector].name;
838add958ceSSoren Brinkmann }
839add958ceSSoren Brinkmann 
zynq_pctrl_get_group_pins(struct pinctrl_dev * pctldev,unsigned int selector,const unsigned int ** pins,unsigned int * num_pins)840add958ceSSoren Brinkmann static int zynq_pctrl_get_group_pins(struct pinctrl_dev *pctldev,
8416c2c9bd2SNava kishore Manne 				     unsigned int selector,
8426c2c9bd2SNava kishore Manne 				     const unsigned int **pins,
8436c2c9bd2SNava kishore Manne 				     unsigned int *num_pins)
844add958ceSSoren Brinkmann {
845add958ceSSoren Brinkmann 	struct zynq_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
846add958ceSSoren Brinkmann 
847add958ceSSoren Brinkmann 	*pins = pctrl->groups[selector].pins;
848add958ceSSoren Brinkmann 	*num_pins = pctrl->groups[selector].npins;
849add958ceSSoren Brinkmann 
850add958ceSSoren Brinkmann 	return 0;
851add958ceSSoren Brinkmann }
852add958ceSSoren Brinkmann 
853add958ceSSoren Brinkmann static const struct pinctrl_ops zynq_pctrl_ops = {
854add958ceSSoren Brinkmann 	.get_groups_count = zynq_pctrl_get_groups_count,
855add958ceSSoren Brinkmann 	.get_group_name = zynq_pctrl_get_group_name,
856add958ceSSoren Brinkmann 	.get_group_pins = zynq_pctrl_get_group_pins,
857add958ceSSoren Brinkmann 	.dt_node_to_map = pinconf_generic_dt_node_to_map_all,
858d32f7fd3SIrina Tirdea 	.dt_free_map = pinctrl_utils_free_map,
859add958ceSSoren Brinkmann };
860add958ceSSoren Brinkmann 
861add958ceSSoren Brinkmann /* pinmux */
zynq_pmux_get_functions_count(struct pinctrl_dev * pctldev)862add958ceSSoren Brinkmann static int zynq_pmux_get_functions_count(struct pinctrl_dev *pctldev)
863add958ceSSoren Brinkmann {
864add958ceSSoren Brinkmann 	struct zynq_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
865add958ceSSoren Brinkmann 
866add958ceSSoren Brinkmann 	return pctrl->nfuncs;
867add958ceSSoren Brinkmann }
868add958ceSSoren Brinkmann 
zynq_pmux_get_function_name(struct pinctrl_dev * pctldev,unsigned int selector)869add958ceSSoren Brinkmann static const char *zynq_pmux_get_function_name(struct pinctrl_dev *pctldev,
8706c2c9bd2SNava kishore Manne 					       unsigned int selector)
871add958ceSSoren Brinkmann {
872add958ceSSoren Brinkmann 	struct zynq_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
873add958ceSSoren Brinkmann 
874add958ceSSoren Brinkmann 	return pctrl->funcs[selector].name;
875add958ceSSoren Brinkmann }
876add958ceSSoren Brinkmann 
zynq_pmux_get_function_groups(struct pinctrl_dev * pctldev,unsigned int selector,const char * const ** groups,unsigned * const num_groups)877add958ceSSoren Brinkmann static int zynq_pmux_get_function_groups(struct pinctrl_dev *pctldev,
8786c2c9bd2SNava kishore Manne 					 unsigned int selector,
879add958ceSSoren Brinkmann 					 const char * const **groups,
880add958ceSSoren Brinkmann 					 unsigned * const num_groups)
881add958ceSSoren Brinkmann {
882add958ceSSoren Brinkmann 	struct zynq_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
883add958ceSSoren Brinkmann 
884add958ceSSoren Brinkmann 	*groups = pctrl->funcs[selector].groups;
885add958ceSSoren Brinkmann 	*num_groups = pctrl->funcs[selector].ngroups;
886add958ceSSoren Brinkmann 	return 0;
887add958ceSSoren Brinkmann }
888add958ceSSoren Brinkmann 
zynq_pinmux_set_mux(struct pinctrl_dev * pctldev,unsigned int function,unsigned int group)889add958ceSSoren Brinkmann static int zynq_pinmux_set_mux(struct pinctrl_dev *pctldev,
8906c2c9bd2SNava kishore Manne 			       unsigned int function,
8916c2c9bd2SNava kishore Manne 			       unsigned int  group)
892add958ceSSoren Brinkmann {
893add958ceSSoren Brinkmann 	int i, ret;
894add958ceSSoren Brinkmann 	struct zynq_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
895add958ceSSoren Brinkmann 	const struct zynq_pctrl_group *pgrp = &pctrl->groups[group];
896add958ceSSoren Brinkmann 	const struct zynq_pinmux_function *func = &pctrl->funcs[function];
897add958ceSSoren Brinkmann 
898add958ceSSoren Brinkmann 	/*
899add958ceSSoren Brinkmann 	 * SD WP & CD are special. They have dedicated registers
900add958ceSSoren Brinkmann 	 * to mux them in
901add958ceSSoren Brinkmann 	 */
902add958ceSSoren Brinkmann 	if (function == ZYNQ_PMUX_sdio0_cd || function == ZYNQ_PMUX_sdio0_wp ||
903add958ceSSoren Brinkmann 			function == ZYNQ_PMUX_sdio1_cd ||
904add958ceSSoren Brinkmann 			function == ZYNQ_PMUX_sdio1_wp) {
905add958ceSSoren Brinkmann 		u32 reg;
906add958ceSSoren Brinkmann 
907add958ceSSoren Brinkmann 		ret = regmap_read(pctrl->syscon,
908add958ceSSoren Brinkmann 				  pctrl->pctrl_offset + func->mux, &reg);
909add958ceSSoren Brinkmann 		if (ret)
910add958ceSSoren Brinkmann 			return ret;
911add958ceSSoren Brinkmann 
912add958ceSSoren Brinkmann 		reg &= ~func->mux_mask;
913add958ceSSoren Brinkmann 		reg |= pgrp->pins[0] << func->mux_shift;
914add958ceSSoren Brinkmann 		ret = regmap_write(pctrl->syscon,
915add958ceSSoren Brinkmann 				   pctrl->pctrl_offset + func->mux, reg);
916add958ceSSoren Brinkmann 		if (ret)
917add958ceSSoren Brinkmann 			return ret;
918add958ceSSoren Brinkmann 	} else {
919add958ceSSoren Brinkmann 		for (i = 0; i < pgrp->npins; i++) {
920add958ceSSoren Brinkmann 			unsigned int pin = pgrp->pins[i];
921add958ceSSoren Brinkmann 			u32 reg, addr = pctrl->pctrl_offset + (4 * pin);
922add958ceSSoren Brinkmann 
923add958ceSSoren Brinkmann 			ret = regmap_read(pctrl->syscon, addr, &reg);
924add958ceSSoren Brinkmann 			if (ret)
925add958ceSSoren Brinkmann 				return ret;
926add958ceSSoren Brinkmann 
927add958ceSSoren Brinkmann 			reg &= ~ZYNQ_PINMUX_MUX_MASK;
928add958ceSSoren Brinkmann 			reg |= func->mux_val << ZYNQ_PINMUX_MUX_SHIFT;
929add958ceSSoren Brinkmann 			ret = regmap_write(pctrl->syscon, addr, reg);
930add958ceSSoren Brinkmann 			if (ret)
931add958ceSSoren Brinkmann 				return ret;
932add958ceSSoren Brinkmann 		}
933add958ceSSoren Brinkmann 	}
934add958ceSSoren Brinkmann 
935add958ceSSoren Brinkmann 	return 0;
936add958ceSSoren Brinkmann }
937add958ceSSoren Brinkmann 
938add958ceSSoren Brinkmann static const struct pinmux_ops zynq_pinmux_ops = {
939add958ceSSoren Brinkmann 	.get_functions_count = zynq_pmux_get_functions_count,
940add958ceSSoren Brinkmann 	.get_function_name = zynq_pmux_get_function_name,
941add958ceSSoren Brinkmann 	.get_function_groups = zynq_pmux_get_function_groups,
942add958ceSSoren Brinkmann 	.set_mux = zynq_pinmux_set_mux,
943add958ceSSoren Brinkmann };
944add958ceSSoren Brinkmann 
945add958ceSSoren Brinkmann /* pinconfig */
946add958ceSSoren Brinkmann #define ZYNQ_PINCONF_TRISTATE		BIT(0)
947add958ceSSoren Brinkmann #define ZYNQ_PINCONF_SPEED		BIT(8)
948add958ceSSoren Brinkmann #define ZYNQ_PINCONF_PULLUP		BIT(12)
949add958ceSSoren Brinkmann #define ZYNQ_PINCONF_DISABLE_RECVR	BIT(13)
950add958ceSSoren Brinkmann 
951add958ceSSoren Brinkmann #define ZYNQ_PINCONF_IOTYPE_SHIFT	9
952add958ceSSoren Brinkmann #define ZYNQ_PINCONF_IOTYPE_MASK	(7 << ZYNQ_PINCONF_IOTYPE_SHIFT)
953add958ceSSoren Brinkmann 
954add958ceSSoren Brinkmann enum zynq_io_standards {
955add958ceSSoren Brinkmann 	zynq_iostd_min,
956add958ceSSoren Brinkmann 	zynq_iostd_lvcmos18,
957add958ceSSoren Brinkmann 	zynq_iostd_lvcmos25,
958add958ceSSoren Brinkmann 	zynq_iostd_lvcmos33,
959add958ceSSoren Brinkmann 	zynq_iostd_hstl,
960add958ceSSoren Brinkmann 	zynq_iostd_max
961add958ceSSoren Brinkmann };
962add958ceSSoren Brinkmann 
963cd8a145aSNathan Chancellor /*
964cd8a145aSNathan Chancellor  * PIN_CONFIG_IOSTANDARD: if the pin can select an IO standard, the argument to
965add958ceSSoren Brinkmann  *	this parameter (on a custom format) tells the driver which alternative
966add958ceSSoren Brinkmann  *	IO standard to use.
967add958ceSSoren Brinkmann  */
968cd8a145aSNathan Chancellor #define PIN_CONFIG_IOSTANDARD		(PIN_CONFIG_END + 1)
969add958ceSSoren Brinkmann 
970f684e4acSLinus Walleij static const struct pinconf_generic_params zynq_dt_params[] = {
971add958ceSSoren Brinkmann 	{"io-standard", PIN_CONFIG_IOSTANDARD, zynq_iostd_lvcmos18},
972add958ceSSoren Brinkmann };
973add958ceSSoren Brinkmann 
9744f06266aSArnd Bergmann #ifdef CONFIG_DEBUG_FS
9756c2c9bd2SNava kishore Manne static const struct pin_config_item zynq_conf_items[ARRAY_SIZE(zynq_dt_params)]
9766c2c9bd2SNava kishore Manne 	= { PCONFDUMP(PIN_CONFIG_IOSTANDARD, "IO-standard", NULL, true),
977add958ceSSoren Brinkmann };
9784f06266aSArnd Bergmann #endif
979add958ceSSoren Brinkmann 
zynq_pinconf_iostd_get(u32 reg)980add958ceSSoren Brinkmann static unsigned int zynq_pinconf_iostd_get(u32 reg)
981add958ceSSoren Brinkmann {
982add958ceSSoren Brinkmann 	return (reg & ZYNQ_PINCONF_IOTYPE_MASK) >> ZYNQ_PINCONF_IOTYPE_SHIFT;
983add958ceSSoren Brinkmann }
984add958ceSSoren Brinkmann 
zynq_pinconf_cfg_get(struct pinctrl_dev * pctldev,unsigned int pin,unsigned long * config)985add958ceSSoren Brinkmann static int zynq_pinconf_cfg_get(struct pinctrl_dev *pctldev,
9866c2c9bd2SNava kishore Manne 				unsigned int pin,
987add958ceSSoren Brinkmann 				unsigned long *config)
988add958ceSSoren Brinkmann {
989add958ceSSoren Brinkmann 	u32 reg;
990add958ceSSoren Brinkmann 	int ret;
991add958ceSSoren Brinkmann 	unsigned int arg = 0;
992add958ceSSoren Brinkmann 	unsigned int param = pinconf_to_config_param(*config);
993add958ceSSoren Brinkmann 	struct zynq_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
994add958ceSSoren Brinkmann 
995add958ceSSoren Brinkmann 	if (pin >= ZYNQ_NUM_MIOS)
996add958ceSSoren Brinkmann 		return -ENOTSUPP;
997add958ceSSoren Brinkmann 
998add958ceSSoren Brinkmann 	ret = regmap_read(pctrl->syscon, pctrl->pctrl_offset + (4 * pin), &reg);
999add958ceSSoren Brinkmann 	if (ret)
1000add958ceSSoren Brinkmann 		return -EIO;
1001add958ceSSoren Brinkmann 
1002add958ceSSoren Brinkmann 	switch (param) {
1003add958ceSSoren Brinkmann 	case PIN_CONFIG_BIAS_PULL_UP:
1004add958ceSSoren Brinkmann 		if (!(reg & ZYNQ_PINCONF_PULLUP))
1005add958ceSSoren Brinkmann 			return -EINVAL;
1006add958ceSSoren Brinkmann 		arg = 1;
1007add958ceSSoren Brinkmann 		break;
1008add958ceSSoren Brinkmann 	case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
1009add958ceSSoren Brinkmann 		if (!(reg & ZYNQ_PINCONF_TRISTATE))
1010add958ceSSoren Brinkmann 			return -EINVAL;
1011add958ceSSoren Brinkmann 		arg = 1;
1012add958ceSSoren Brinkmann 		break;
1013add958ceSSoren Brinkmann 	case PIN_CONFIG_BIAS_DISABLE:
1014add958ceSSoren Brinkmann 		if (reg & ZYNQ_PINCONF_PULLUP || reg & ZYNQ_PINCONF_TRISTATE)
1015add958ceSSoren Brinkmann 			return -EINVAL;
1016add958ceSSoren Brinkmann 		break;
1017add958ceSSoren Brinkmann 	case PIN_CONFIG_SLEW_RATE:
1018add958ceSSoren Brinkmann 		arg = !!(reg & ZYNQ_PINCONF_SPEED);
1019add958ceSSoren Brinkmann 		break;
102031f9a421SAndy Shevchenko 	case PIN_CONFIG_MODE_LOW_POWER:
1021add958ceSSoren Brinkmann 	{
1022add958ceSSoren Brinkmann 		enum zynq_io_standards iostd = zynq_pinconf_iostd_get(reg);
1023add958ceSSoren Brinkmann 
1024add958ceSSoren Brinkmann 		if (iostd != zynq_iostd_hstl)
1025add958ceSSoren Brinkmann 			return -EINVAL;
1026add958ceSSoren Brinkmann 		if (!(reg & ZYNQ_PINCONF_DISABLE_RECVR))
1027add958ceSSoren Brinkmann 			return -EINVAL;
1028add958ceSSoren Brinkmann 		arg = !!(reg & ZYNQ_PINCONF_DISABLE_RECVR);
1029add958ceSSoren Brinkmann 		break;
1030add958ceSSoren Brinkmann 	}
1031add958ceSSoren Brinkmann 	case PIN_CONFIG_IOSTANDARD:
1032cdd57325SSai Krishna Potthuri 	case PIN_CONFIG_POWER_SOURCE:
1033add958ceSSoren Brinkmann 		arg = zynq_pinconf_iostd_get(reg);
1034add958ceSSoren Brinkmann 		break;
1035add958ceSSoren Brinkmann 	default:
1036add958ceSSoren Brinkmann 		return -ENOTSUPP;
1037add958ceSSoren Brinkmann 	}
1038add958ceSSoren Brinkmann 
1039add958ceSSoren Brinkmann 	*config = pinconf_to_config_packed(param, arg);
1040add958ceSSoren Brinkmann 	return 0;
1041add958ceSSoren Brinkmann }
1042add958ceSSoren Brinkmann 
zynq_pinconf_cfg_set(struct pinctrl_dev * pctldev,unsigned int pin,unsigned long * configs,unsigned int num_configs)1043add958ceSSoren Brinkmann static int zynq_pinconf_cfg_set(struct pinctrl_dev *pctldev,
10446c2c9bd2SNava kishore Manne 				unsigned int pin,
1045add958ceSSoren Brinkmann 				unsigned long *configs,
10466c2c9bd2SNava kishore Manne 				unsigned int num_configs)
1047add958ceSSoren Brinkmann {
1048add958ceSSoren Brinkmann 	int i, ret;
1049add958ceSSoren Brinkmann 	u32 reg;
1050add958ceSSoren Brinkmann 	u32 pullup = 0;
1051add958ceSSoren Brinkmann 	u32 tristate = 0;
1052add958ceSSoren Brinkmann 	struct zynq_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
1053add958ceSSoren Brinkmann 
1054add958ceSSoren Brinkmann 	if (pin >= ZYNQ_NUM_MIOS)
1055add958ceSSoren Brinkmann 		return -ENOTSUPP;
1056add958ceSSoren Brinkmann 
1057add958ceSSoren Brinkmann 	ret = regmap_read(pctrl->syscon, pctrl->pctrl_offset + (4 * pin), &reg);
1058add958ceSSoren Brinkmann 	if (ret)
1059add958ceSSoren Brinkmann 		return -EIO;
1060add958ceSSoren Brinkmann 
1061add958ceSSoren Brinkmann 	for (i = 0; i < num_configs; i++) {
1062add958ceSSoren Brinkmann 		unsigned int param = pinconf_to_config_param(configs[i]);
1063add958ceSSoren Brinkmann 		unsigned int arg = pinconf_to_config_argument(configs[i]);
1064add958ceSSoren Brinkmann 
1065add958ceSSoren Brinkmann 		switch (param) {
1066add958ceSSoren Brinkmann 		case PIN_CONFIG_BIAS_PULL_UP:
1067add958ceSSoren Brinkmann 			pullup = ZYNQ_PINCONF_PULLUP;
1068add958ceSSoren Brinkmann 			break;
1069add958ceSSoren Brinkmann 		case PIN_CONFIG_BIAS_HIGH_IMPEDANCE:
1070add958ceSSoren Brinkmann 			tristate = ZYNQ_PINCONF_TRISTATE;
1071add958ceSSoren Brinkmann 			break;
1072add958ceSSoren Brinkmann 		case PIN_CONFIG_BIAS_DISABLE:
1073add958ceSSoren Brinkmann 			reg &= ~(ZYNQ_PINCONF_PULLUP | ZYNQ_PINCONF_TRISTATE);
1074add958ceSSoren Brinkmann 			break;
1075add958ceSSoren Brinkmann 		case PIN_CONFIG_SLEW_RATE:
1076add958ceSSoren Brinkmann 			if (arg)
1077add958ceSSoren Brinkmann 				reg |= ZYNQ_PINCONF_SPEED;
1078add958ceSSoren Brinkmann 			else
1079add958ceSSoren Brinkmann 				reg &= ~ZYNQ_PINCONF_SPEED;
1080add958ceSSoren Brinkmann 
1081add958ceSSoren Brinkmann 			break;
1082add958ceSSoren Brinkmann 		case PIN_CONFIG_IOSTANDARD:
1083cdd57325SSai Krishna Potthuri 		case PIN_CONFIG_POWER_SOURCE:
1084add958ceSSoren Brinkmann 			if (arg <= zynq_iostd_min || arg >= zynq_iostd_max) {
1085add958ceSSoren Brinkmann 				dev_warn(pctldev->dev,
1086add958ceSSoren Brinkmann 					 "unsupported IO standard '%u'\n",
1087add958ceSSoren Brinkmann 					 param);
1088add958ceSSoren Brinkmann 				break;
1089add958ceSSoren Brinkmann 			}
1090add958ceSSoren Brinkmann 			reg &= ~ZYNQ_PINCONF_IOTYPE_MASK;
1091add958ceSSoren Brinkmann 			reg |= arg << ZYNQ_PINCONF_IOTYPE_SHIFT;
1092add958ceSSoren Brinkmann 			break;
109331f9a421SAndy Shevchenko 		case PIN_CONFIG_MODE_LOW_POWER:
1094add958ceSSoren Brinkmann 			if (arg)
1095add958ceSSoren Brinkmann 				reg |= ZYNQ_PINCONF_DISABLE_RECVR;
1096add958ceSSoren Brinkmann 			else
1097add958ceSSoren Brinkmann 				reg &= ~ZYNQ_PINCONF_DISABLE_RECVR;
1098add958ceSSoren Brinkmann 
1099add958ceSSoren Brinkmann 			break;
1100add958ceSSoren Brinkmann 		default:
1101add958ceSSoren Brinkmann 			dev_warn(pctldev->dev,
1102add958ceSSoren Brinkmann 				 "unsupported configuration parameter '%u'\n",
1103add958ceSSoren Brinkmann 				 param);
1104add958ceSSoren Brinkmann 			continue;
1105add958ceSSoren Brinkmann 		}
1106add958ceSSoren Brinkmann 	}
1107add958ceSSoren Brinkmann 
1108add958ceSSoren Brinkmann 	if (tristate || pullup) {
1109add958ceSSoren Brinkmann 		reg &= ~(ZYNQ_PINCONF_PULLUP | ZYNQ_PINCONF_TRISTATE);
1110add958ceSSoren Brinkmann 		reg |= tristate | pullup;
1111add958ceSSoren Brinkmann 	}
1112add958ceSSoren Brinkmann 
1113add958ceSSoren Brinkmann 	ret = regmap_write(pctrl->syscon, pctrl->pctrl_offset + (4 * pin), reg);
1114add958ceSSoren Brinkmann 	if (ret)
1115add958ceSSoren Brinkmann 		return -EIO;
1116add958ceSSoren Brinkmann 
1117add958ceSSoren Brinkmann 	return 0;
1118add958ceSSoren Brinkmann }
1119add958ceSSoren Brinkmann 
zynq_pinconf_group_set(struct pinctrl_dev * pctldev,unsigned int selector,unsigned long * configs,unsigned int num_configs)1120add958ceSSoren Brinkmann static int zynq_pinconf_group_set(struct pinctrl_dev *pctldev,
11216c2c9bd2SNava kishore Manne 				  unsigned int selector,
1122add958ceSSoren Brinkmann 				  unsigned long *configs,
11236c2c9bd2SNava kishore Manne 				  unsigned int  num_configs)
1124add958ceSSoren Brinkmann {
1125add958ceSSoren Brinkmann 	int i, ret;
1126add958ceSSoren Brinkmann 	struct zynq_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
1127add958ceSSoren Brinkmann 	const struct zynq_pctrl_group *pgrp = &pctrl->groups[selector];
1128add958ceSSoren Brinkmann 
1129add958ceSSoren Brinkmann 	for (i = 0; i < pgrp->npins; i++) {
1130add958ceSSoren Brinkmann 		ret = zynq_pinconf_cfg_set(pctldev, pgrp->pins[i], configs,
1131add958ceSSoren Brinkmann 					   num_configs);
1132add958ceSSoren Brinkmann 		if (ret)
1133add958ceSSoren Brinkmann 			return ret;
1134add958ceSSoren Brinkmann 	}
1135add958ceSSoren Brinkmann 
1136add958ceSSoren Brinkmann 	return 0;
1137add958ceSSoren Brinkmann }
1138add958ceSSoren Brinkmann 
1139add958ceSSoren Brinkmann static const struct pinconf_ops zynq_pinconf_ops = {
1140add958ceSSoren Brinkmann 	.is_generic = true,
1141add958ceSSoren Brinkmann 	.pin_config_get = zynq_pinconf_cfg_get,
1142add958ceSSoren Brinkmann 	.pin_config_set = zynq_pinconf_cfg_set,
1143add958ceSSoren Brinkmann 	.pin_config_group_set = zynq_pinconf_group_set,
1144add958ceSSoren Brinkmann };
1145add958ceSSoren Brinkmann 
1146add958ceSSoren Brinkmann static struct pinctrl_desc zynq_desc = {
1147add958ceSSoren Brinkmann 	.name = "zynq_pinctrl",
1148add958ceSSoren Brinkmann 	.pins = zynq_pins,
1149add958ceSSoren Brinkmann 	.npins = ARRAY_SIZE(zynq_pins),
1150add958ceSSoren Brinkmann 	.pctlops = &zynq_pctrl_ops,
1151add958ceSSoren Brinkmann 	.pmxops = &zynq_pinmux_ops,
1152add958ceSSoren Brinkmann 	.confops = &zynq_pinconf_ops,
1153f684e4acSLinus Walleij 	.num_custom_params = ARRAY_SIZE(zynq_dt_params),
1154f684e4acSLinus Walleij 	.custom_params = zynq_dt_params,
11554f06266aSArnd Bergmann #ifdef CONFIG_DEBUG_FS
1156f684e4acSLinus Walleij 	.custom_conf_items = zynq_conf_items,
11574f06266aSArnd Bergmann #endif
1158add958ceSSoren Brinkmann 	.owner = THIS_MODULE,
1159add958ceSSoren Brinkmann };
1160add958ceSSoren Brinkmann 
zynq_pinctrl_probe(struct platform_device * pdev)1161add958ceSSoren Brinkmann static int zynq_pinctrl_probe(struct platform_device *pdev)
1162add958ceSSoren Brinkmann 
1163add958ceSSoren Brinkmann {
1164add958ceSSoren Brinkmann 	struct resource *res;
1165add958ceSSoren Brinkmann 	struct zynq_pinctrl *pctrl;
1166add958ceSSoren Brinkmann 
1167add958ceSSoren Brinkmann 	pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL);
1168add958ceSSoren Brinkmann 	if (!pctrl)
1169add958ceSSoren Brinkmann 		return -ENOMEM;
1170add958ceSSoren Brinkmann 
1171add958ceSSoren Brinkmann 	pctrl->syscon = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
1172add958ceSSoren Brinkmann 							"syscon");
1173add958ceSSoren Brinkmann 	if (IS_ERR(pctrl->syscon)) {
1174add958ceSSoren Brinkmann 		dev_err(&pdev->dev, "unable to get syscon\n");
1175add958ceSSoren Brinkmann 		return PTR_ERR(pctrl->syscon);
1176add958ceSSoren Brinkmann 	}
1177add958ceSSoren Brinkmann 
1178add958ceSSoren Brinkmann 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1179add958ceSSoren Brinkmann 	if (!res) {
1180add958ceSSoren Brinkmann 		dev_err(&pdev->dev, "missing IO resource\n");
1181add958ceSSoren Brinkmann 		return -ENODEV;
1182add958ceSSoren Brinkmann 	}
1183add958ceSSoren Brinkmann 	pctrl->pctrl_offset = res->start;
1184add958ceSSoren Brinkmann 
1185add958ceSSoren Brinkmann 	pctrl->groups = zynq_pctrl_groups;
1186add958ceSSoren Brinkmann 	pctrl->ngroups = ARRAY_SIZE(zynq_pctrl_groups);
1187add958ceSSoren Brinkmann 	pctrl->funcs = zynq_pmux_functions;
1188add958ceSSoren Brinkmann 	pctrl->nfuncs = ARRAY_SIZE(zynq_pmux_functions);
1189add958ceSSoren Brinkmann 
11903024f920SLaxman Dewangan 	pctrl->pctrl = devm_pinctrl_register(&pdev->dev, &zynq_desc, pctrl);
1191323de9efSMasahiro Yamada 	if (IS_ERR(pctrl->pctrl))
1192323de9efSMasahiro Yamada 		return PTR_ERR(pctrl->pctrl);
1193add958ceSSoren Brinkmann 
1194add958ceSSoren Brinkmann 	platform_set_drvdata(pdev, pctrl);
1195add958ceSSoren Brinkmann 
1196add958ceSSoren Brinkmann 	dev_info(&pdev->dev, "zynq pinctrl initialized\n");
1197add958ceSSoren Brinkmann 
1198add958ceSSoren Brinkmann 	return 0;
1199add958ceSSoren Brinkmann }
1200add958ceSSoren Brinkmann 
1201add958ceSSoren Brinkmann static const struct of_device_id zynq_pinctrl_of_match[] = {
1202add958ceSSoren Brinkmann 	{ .compatible = "xlnx,pinctrl-zynq" },
1203add958ceSSoren Brinkmann 	{ }
1204add958ceSSoren Brinkmann };
1205add958ceSSoren Brinkmann 
1206add958ceSSoren Brinkmann static struct platform_driver zynq_pinctrl_driver = {
1207add958ceSSoren Brinkmann 	.driver = {
1208add958ceSSoren Brinkmann 		.name = "zynq-pinctrl",
1209add958ceSSoren Brinkmann 		.of_match_table = zynq_pinctrl_of_match,
1210add958ceSSoren Brinkmann 	},
1211add958ceSSoren Brinkmann 	.probe = zynq_pinctrl_probe,
1212add958ceSSoren Brinkmann };
1213add958ceSSoren Brinkmann 
1214*d5140268SSrinivas Neeli module_platform_driver(zynq_pinctrl_driver);
1215