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