xref: /openbmc/linux/drivers/pinctrl/mvebu/pinctrl-armada-cp110.c (revision 7f2e85840871f199057e65232ebde846192ed989)
1 /*
2  * Marvell Armada CP110 pinctrl driver based on mvebu pinctrl core
3  *
4  * Copyright (C) 2017 Marvell
5  *
6  * Hanna Hawa <hannah@marvell.com>
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  */
13 
14 #include <linux/err.h>
15 #include <linux/init.h>
16 #include <linux/io.h>
17 #include <linux/mfd/syscon.h>
18 #include <linux/of.h>
19 #include <linux/of_device.h>
20 #include <linux/pinctrl/pinctrl.h>
21 #include <linux/platform_device.h>
22 
23 #include "pinctrl-mvebu.h"
24 
25 /*
26  * Even if the pin controller is the same the MMP available depend on the SoC
27  * integration.
28  *  - In Armada7K (single CP) almost all the MPPs are available (except the
29  *    MMP 39 to 43)
30  *  - In Armada8K (dual CP) the MPPs are split into 2 parts, MPPs 0-31 from
31  *    CPS, and MPPs 32-62 from CPM, the below flags (V_ARMADA_8K_CPM,
32  *    V_ARMADA_8K_CPS) set which MPP is available to the CPx.
33  * The x_PLUS enum mean that the MPP available for CPx and for Armada70x0
34  */
35 enum {
36 	V_ARMADA_7K = BIT(0),
37 	V_ARMADA_8K_CPM = BIT(1),
38 	V_ARMADA_8K_CPS = BIT(2),
39 	V_ARMADA_7K_8K_CPM = (V_ARMADA_7K | V_ARMADA_8K_CPM),
40 	V_ARMADA_7K_8K_CPS = (V_ARMADA_7K | V_ARMADA_8K_CPS),
41 };
42 
43 static struct mvebu_mpp_mode armada_cp110_mpp_modes[] = {
44 	MPP_MODE(0,
45 		 MPP_FUNCTION(0,	"gpio",		NULL),
46 		 MPP_FUNCTION(1,	"dev",		"ale1"),
47 		 MPP_FUNCTION(2,	"au",		"i2smclk"),
48 		 MPP_FUNCTION(3,	"ge0",		"rxd3"),
49 		 MPP_FUNCTION(4,	"tdm",		"pclk"),
50 		 MPP_FUNCTION(6,	"ptp",		"pulse"),
51 		 MPP_FUNCTION(7,	"mss_i2c",	"sda"),
52 		 MPP_FUNCTION(8,	"uart0",	"rxd"),
53 		 MPP_FUNCTION(9,	"sata0",	"present_act"),
54 		 MPP_FUNCTION(10,	"ge",		"mdio")),
55 	MPP_MODE(1,
56 		 MPP_FUNCTION(0,	"gpio",		NULL),
57 		 MPP_FUNCTION(1,	"dev",		"ale0"),
58 		 MPP_FUNCTION(2,	"au",		"i2sdo_spdifo"),
59 		 MPP_FUNCTION(3,	"ge0",		"rxd2"),
60 		 MPP_FUNCTION(4,	"tdm",		"drx"),
61 		 MPP_FUNCTION(6,	"ptp",		"clk"),
62 		 MPP_FUNCTION(7,	"mss_i2c",	"sck"),
63 		 MPP_FUNCTION(8,	"uart0",	"txd"),
64 		 MPP_FUNCTION(9,	"sata1",	"present_act"),
65 		 MPP_FUNCTION(10,	"ge",		"mdc")),
66 	MPP_MODE(2,
67 		 MPP_FUNCTION(0,	"gpio",		NULL),
68 		 MPP_FUNCTION(1,	"dev",		"ad15"),
69 		 MPP_FUNCTION(2,	"au",		"i2sextclk"),
70 		 MPP_FUNCTION(3,	"ge0",		"rxd1"),
71 		 MPP_FUNCTION(4,	"tdm",		"dtx"),
72 		 MPP_FUNCTION(5,	"mss_uart",	"rxd"),
73 		 MPP_FUNCTION(6,	"ptp",		"pclk_out"),
74 		 MPP_FUNCTION(7,	"i2c1",		"sck"),
75 		 MPP_FUNCTION(8,	"uart1",	"rxd"),
76 		 MPP_FUNCTION(9,	"sata0",	"present_act"),
77 		 MPP_FUNCTION(10,	"xg",		"mdc")),
78 	MPP_MODE(3,
79 		 MPP_FUNCTION(0,	"gpio",		NULL),
80 		 MPP_FUNCTION(1,	"dev",		"ad14"),
81 		 MPP_FUNCTION(2,	"au",		"i2slrclk"),
82 		 MPP_FUNCTION(3,	"ge0",		"rxd0"),
83 		 MPP_FUNCTION(4,	"tdm",		"fsync"),
84 		 MPP_FUNCTION(5,	"mss_uart",	"txd"),
85 		 MPP_FUNCTION(6,	"pcie",		"rstoutn"),
86 		 MPP_FUNCTION(7,	"i2c1",		"sda"),
87 		 MPP_FUNCTION(8,	"uart1",	"txd"),
88 		 MPP_FUNCTION(9,	"sata1",	"present_act"),
89 		 MPP_FUNCTION(10,	"xg",		"mdio")),
90 	MPP_MODE(4,
91 		 MPP_FUNCTION(0,	"gpio",		NULL),
92 		 MPP_FUNCTION(1,	"dev",		"ad13"),
93 		 MPP_FUNCTION(2,	"au",		"i2sbclk"),
94 		 MPP_FUNCTION(3,	"ge0",		"rxctl"),
95 		 MPP_FUNCTION(4,	"tdm",		"rstn"),
96 		 MPP_FUNCTION(5,	"mss_uart",	"rxd"),
97 		 MPP_FUNCTION(6,	"uart1",	"cts"),
98 		 MPP_FUNCTION(7,	"pcie0",	"clkreq"),
99 		 MPP_FUNCTION(8,	"uart3",	"rxd"),
100 		 MPP_FUNCTION(10,	"ge",		"mdc")),
101 	MPP_MODE(5,
102 		 MPP_FUNCTION(0,	"gpio",		NULL),
103 		 MPP_FUNCTION(1,	"dev",		"ad12"),
104 		 MPP_FUNCTION(2,	"au",		"i2sdi"),
105 		 MPP_FUNCTION(3,	"ge0",		"rxclk"),
106 		 MPP_FUNCTION(4,	"tdm",		"intn"),
107 		 MPP_FUNCTION(5,	"mss_uart",	"txd"),
108 		 MPP_FUNCTION(6,	"uart1",	"rts"),
109 		 MPP_FUNCTION(7,	"pcie1",	"clkreq"),
110 		 MPP_FUNCTION(8,	"uart3",	"txd"),
111 		 MPP_FUNCTION(10,	"ge",		"mdio")),
112 	MPP_MODE(6,
113 		 MPP_FUNCTION(0,	"gpio",		NULL),
114 		 MPP_FUNCTION(1,	"dev",		"ad11"),
115 		 MPP_FUNCTION(3,	"ge0",		"txd3"),
116 		 MPP_FUNCTION(4,	"spi0",		"csn2"),
117 		 MPP_FUNCTION(5,	"au",		"i2sextclk"),
118 		 MPP_FUNCTION(6,	"sata1",	"present_act"),
119 		 MPP_FUNCTION(7,	"pcie2",	"clkreq"),
120 		 MPP_FUNCTION(8,	"uart0",	"rxd"),
121 		 MPP_FUNCTION(9,	"ptp",		"pulse")),
122 	MPP_MODE(7,
123 		 MPP_FUNCTION(0,	"gpio",		NULL),
124 		 MPP_FUNCTION(1,	"dev",		"ad10"),
125 		 MPP_FUNCTION(3,	"ge0",		"txd2"),
126 		 MPP_FUNCTION(4,	"spi0",		"csn1"),
127 		 MPP_FUNCTION(5,	"spi1",		"csn1"),
128 		 MPP_FUNCTION(6,	"sata0",	"present_act"),
129 		 MPP_FUNCTION(7,	"led",		"data"),
130 		 MPP_FUNCTION(8,	"uart0",	"txd"),
131 		 MPP_FUNCTION(9,	"ptp",		"clk")),
132 	MPP_MODE(8,
133 		 MPP_FUNCTION(0,	"gpio",		NULL),
134 		 MPP_FUNCTION(1,	"dev",		"ad9"),
135 		 MPP_FUNCTION(3,	"ge0",		"txd1"),
136 		 MPP_FUNCTION(4,	"spi0",		"csn0"),
137 		 MPP_FUNCTION(5,	"spi1",		"csn0"),
138 		 MPP_FUNCTION(6,	"uart0",	"cts"),
139 		 MPP_FUNCTION(7,	"led",		"stb"),
140 		 MPP_FUNCTION(8,	"uart2",	"rxd"),
141 		 MPP_FUNCTION(9,	"ptp",		"pclk_out"),
142 		 MPP_FUNCTION(10,	"synce1",	"clk")),
143 	MPP_MODE(9,
144 		 MPP_FUNCTION(0,	"gpio",		NULL),
145 		 MPP_FUNCTION(1,	"dev",		"ad8"),
146 		 MPP_FUNCTION(3,	"ge0",		"txd0"),
147 		 MPP_FUNCTION(4,	"spi0",		"mosi"),
148 		 MPP_FUNCTION(5,	"spi1",		"mosi"),
149 		 MPP_FUNCTION(7,	"pcie",		"rstoutn"),
150 		 MPP_FUNCTION(10,	"synce2",	"clk")),
151 	MPP_MODE(10,
152 		 MPP_FUNCTION(0,	"gpio",		NULL),
153 		 MPP_FUNCTION(1,	"dev",		"readyn"),
154 		 MPP_FUNCTION(3,	"ge0",		"txctl"),
155 		 MPP_FUNCTION(4,	"spi0",		"miso"),
156 		 MPP_FUNCTION(5,	"spi1",		"miso"),
157 		 MPP_FUNCTION(6,	"uart0",	"cts"),
158 		 MPP_FUNCTION(7,	"sata1",	"present_act")),
159 	MPP_MODE(11,
160 		 MPP_FUNCTION(0,	"gpio",		NULL),
161 		 MPP_FUNCTION(1,	"dev",		"wen1"),
162 		 MPP_FUNCTION(3,	"ge0",		"txclkout"),
163 		 MPP_FUNCTION(4,	"spi0",		"clk"),
164 		 MPP_FUNCTION(5,	"spi1",		"clk"),
165 		 MPP_FUNCTION(6,	"uart0",	"rts"),
166 		 MPP_FUNCTION(7,	"led",		"clk"),
167 		 MPP_FUNCTION(8,	"uart2",	"txd"),
168 		 MPP_FUNCTION(9,	"sata0",	"present_act")),
169 	MPP_MODE(12,
170 		 MPP_FUNCTION(0,	"gpio",		NULL),
171 		 MPP_FUNCTION(1,	"dev",		"clk_out"),
172 		 MPP_FUNCTION(2,	"nf",		"rbn1"),
173 		 MPP_FUNCTION(3,	"spi1",		"csn1"),
174 		 MPP_FUNCTION(4,	"ge0",		"rxclk")),
175 	MPP_MODE(13,
176 		 MPP_FUNCTION(0,	"gpio",		NULL),
177 		 MPP_FUNCTION(1,	"dev",		"burstn"),
178 		 MPP_FUNCTION(2,	"nf",		"rbn0"),
179 		 MPP_FUNCTION(3,	"spi1",		"miso"),
180 		 MPP_FUNCTION(4,	"ge0",		"rxctl"),
181 		 MPP_FUNCTION(8,	"mss_spi",	"miso")),
182 	MPP_MODE(14,
183 		 MPP_FUNCTION(0,	"gpio",		NULL),
184 		 MPP_FUNCTION(1,	"dev",		"bootcsn"),
185 		 MPP_FUNCTION(2,	"dev",		"csn0"),
186 		 MPP_FUNCTION(3,	"spi1",		"csn0"),
187 		 MPP_FUNCTION(4,	"spi0",		"csn3"),
188 		 MPP_FUNCTION(5,	"au",		"i2sextclk"),
189 		 MPP_FUNCTION(6,	"spi0",		"miso"),
190 		 MPP_FUNCTION(7,	"sata0",	"present_act"),
191 		 MPP_FUNCTION(8,	"mss_spi",	"csn")),
192 	MPP_MODE(15,
193 		 MPP_FUNCTION(0,	"gpio",		NULL),
194 		 MPP_FUNCTION(1,	"dev",		"ad7"),
195 		 MPP_FUNCTION(3,	"spi1",		"mosi"),
196 		 MPP_FUNCTION(6,	"spi0",		"mosi"),
197 		 MPP_FUNCTION(8,	"mss_spi",	"mosi"),
198 		 MPP_FUNCTION(11,	"ptp",		"pulse_cp2cp")),
199 	MPP_MODE(16,
200 		 MPP_FUNCTION(0,	"gpio",		NULL),
201 		 MPP_FUNCTION(1,	"dev",		"ad6"),
202 		 MPP_FUNCTION(3,	"spi1",		"clk"),
203 		 MPP_FUNCTION(8,	"mss_spi",	"clk")),
204 	MPP_MODE(17,
205 		 MPP_FUNCTION(0,	"gpio",		NULL),
206 		 MPP_FUNCTION(1,	"dev",		"ad5"),
207 		 MPP_FUNCTION(4,	"ge0",		"txd3")),
208 	MPP_MODE(18,
209 		 MPP_FUNCTION(0,	"gpio",		NULL),
210 		 MPP_FUNCTION(1,	"dev",		"ad4"),
211 		 MPP_FUNCTION(4,	"ge0",		"txd2"),
212 		 MPP_FUNCTION(11,	"ptp",		"clk_cp2cp")),
213 	MPP_MODE(19,
214 		 MPP_FUNCTION(0,	"gpio",		NULL),
215 		 MPP_FUNCTION(1,	"dev",		"ad3"),
216 		 MPP_FUNCTION(4,	"ge0",		"txd1"),
217 		 MPP_FUNCTION(11,	"wakeup",	"out_cp2cp")),
218 	MPP_MODE(20,
219 		 MPP_FUNCTION(0,	"gpio",		NULL),
220 		 MPP_FUNCTION(1,	"dev",		"ad2"),
221 		 MPP_FUNCTION(4,	"ge0",		"txd0")),
222 	MPP_MODE(21,
223 		 MPP_FUNCTION(0,	"gpio",		NULL),
224 		 MPP_FUNCTION(1,	"dev",		"ad1"),
225 		 MPP_FUNCTION(4,	"ge0",		"txctl"),
226 		 MPP_FUNCTION(11,	"sei",		"in_cp2cp")),
227 	MPP_MODE(22,
228 		 MPP_FUNCTION(0,	"gpio",		NULL),
229 		 MPP_FUNCTION(1,	"dev",		"ad0"),
230 		 MPP_FUNCTION(4,	"ge0",		"txclkout"),
231 		 MPP_FUNCTION(11,	"wakeup",	"in_cp2cp")),
232 	MPP_MODE(23,
233 		 MPP_FUNCTION(0,	"gpio",		NULL),
234 		 MPP_FUNCTION(1,	"dev",		"a1"),
235 		 MPP_FUNCTION(5,	"au",		"i2smclk"),
236 		 MPP_FUNCTION(11,	"link",		"rd_in_cp2cp")),
237 	MPP_MODE(24,
238 		 MPP_FUNCTION(0,	"gpio",		NULL),
239 		 MPP_FUNCTION(1,	"dev",		"a0"),
240 		 MPP_FUNCTION(5,	"au",		"i2slrclk")),
241 	MPP_MODE(25,
242 		 MPP_FUNCTION(0,	"gpio",		NULL),
243 		 MPP_FUNCTION(1,	"dev",		"oen"),
244 		 MPP_FUNCTION(5,	"au",		"i2sdo_spdifo")),
245 	MPP_MODE(26,
246 		 MPP_FUNCTION(0,	"gpio",		NULL),
247 		 MPP_FUNCTION(1,	"dev",		"wen0"),
248 		 MPP_FUNCTION(5,	"au",		"i2sbclk")),
249 	MPP_MODE(27,
250 		 MPP_FUNCTION(0,	"gpio",		NULL),
251 		 MPP_FUNCTION(1,	"dev",		"csn0"),
252 		 MPP_FUNCTION(2,	"spi1",		"miso"),
253 		 MPP_FUNCTION(3,	"mss_gpio4",	NULL),
254 		 MPP_FUNCTION(4,	"ge0",		"rxd3"),
255 		 MPP_FUNCTION(5,	"spi0",		"csn4"),
256 		 MPP_FUNCTION(8,	"ge",		"mdio"),
257 		 MPP_FUNCTION(9,	"sata0",	"present_act"),
258 		 MPP_FUNCTION(10,	"uart0",	"rts"),
259 		 MPP_FUNCTION(11,	"rei",		"in_cp2cp")),
260 	MPP_MODE(28,
261 		 MPP_FUNCTION(0,	"gpio",		NULL),
262 		 MPP_FUNCTION(1,	"dev",		"csn1"),
263 		 MPP_FUNCTION(2,	"spi1",		"csn0"),
264 		 MPP_FUNCTION(3,	"mss_gpio5",	NULL),
265 		 MPP_FUNCTION(4,	"ge0",		"rxd2"),
266 		 MPP_FUNCTION(5,	"spi0",		"csn5"),
267 		 MPP_FUNCTION(6,	"pcie2",	"clkreq"),
268 		 MPP_FUNCTION(7,	"ptp",		"pulse"),
269 		 MPP_FUNCTION(8,	"ge",		"mdc"),
270 		 MPP_FUNCTION(9,	"sata1",	"present_act"),
271 		 MPP_FUNCTION(10,	"uart0",	"cts"),
272 		 MPP_FUNCTION(11,	"led",		"data")),
273 	MPP_MODE(29,
274 		 MPP_FUNCTION(0,	"gpio",		NULL),
275 		 MPP_FUNCTION(1,	"dev",		"csn2"),
276 		 MPP_FUNCTION(2,	"spi1",		"mosi"),
277 		 MPP_FUNCTION(3,	"mss_gpio6",	NULL),
278 		 MPP_FUNCTION(4,	"ge0",		"rxd1"),
279 		 MPP_FUNCTION(5,	"spi0",		"csn6"),
280 		 MPP_FUNCTION(6,	"pcie1",	"clkreq"),
281 		 MPP_FUNCTION(7,	"ptp",		"clk"),
282 		 MPP_FUNCTION(8,	"mss_i2c",	"sda"),
283 		 MPP_FUNCTION(9,	"sata0",	"present_act"),
284 		 MPP_FUNCTION(10,	"uart0",	"rxd"),
285 		 MPP_FUNCTION(11,	"led",		"stb")),
286 	MPP_MODE(30,
287 		 MPP_FUNCTION(0,	"gpio",		NULL),
288 		 MPP_FUNCTION(1,	"dev",		"csn3"),
289 		 MPP_FUNCTION(2,	"spi1",		"clk"),
290 		 MPP_FUNCTION(3,	"mss_gpio7",	NULL),
291 		 MPP_FUNCTION(4,	"ge0",		"rxd0"),
292 		 MPP_FUNCTION(5,	"spi0",		"csn7"),
293 		 MPP_FUNCTION(6,	"pcie0",	"clkreq"),
294 		 MPP_FUNCTION(7,	"ptp",		"pclk_out"),
295 		 MPP_FUNCTION(8,	"mss_i2c",	"sck"),
296 		 MPP_FUNCTION(9,	"sata1",	"present_act"),
297 		 MPP_FUNCTION(10,	"uart0",	"txd"),
298 		 MPP_FUNCTION(11,	"led",		"clk")),
299 	MPP_MODE(31,
300 		 MPP_FUNCTION(0,	"gpio",		NULL),
301 		 MPP_FUNCTION(1,	"dev",		"a2"),
302 		 MPP_FUNCTION(3,	"mss_gpio4",	NULL),
303 		 MPP_FUNCTION(6,	"pcie",		"rstoutn"),
304 		 MPP_FUNCTION(8,	"ge",		"mdc")),
305 	MPP_MODE(32,
306 		 MPP_FUNCTION(0,	"gpio",		NULL),
307 		 MPP_FUNCTION(1,	"mii",		"col"),
308 		 MPP_FUNCTION(2,	"mii",		"txerr"),
309 		 MPP_FUNCTION(3,	"mss_spi",	"miso"),
310 		 MPP_FUNCTION(4,	"tdm",		"drx"),
311 		 MPP_FUNCTION(5,	"au",		"i2sextclk"),
312 		 MPP_FUNCTION(6,	"au",		"i2sdi"),
313 		 MPP_FUNCTION(7,	"ge",		"mdio"),
314 		 MPP_FUNCTION(8,	"sdio",		"v18_en"),
315 		 MPP_FUNCTION(9,	"pcie1",	"clkreq"),
316 		 MPP_FUNCTION(10,	"mss_gpio0",	NULL)),
317 	MPP_MODE(33,
318 		 MPP_FUNCTION(0,	"gpio",		NULL),
319 		 MPP_FUNCTION(1,	"mii",		"txclk"),
320 		 MPP_FUNCTION(2,	"sdio",		"pwr10"),
321 		 MPP_FUNCTION(3,	"mss_spi",	"csn"),
322 		 MPP_FUNCTION(4,	"tdm",		"fsync"),
323 		 MPP_FUNCTION(5,	"au",		"i2smclk"),
324 		 MPP_FUNCTION(6,	"sdio",		"bus_pwr"),
325 		 MPP_FUNCTION(8,	"xg",		"mdio"),
326 		 MPP_FUNCTION(9,	"pcie2",	"clkreq"),
327 		 MPP_FUNCTION(10,	"mss_gpio1",	NULL)),
328 	MPP_MODE(34,
329 		 MPP_FUNCTION(0,	"gpio",		NULL),
330 		 MPP_FUNCTION(1,	"mii",		"rxerr"),
331 		 MPP_FUNCTION(2,	"sdio",		"pwr11"),
332 		 MPP_FUNCTION(3,	"mss_spi",	"mosi"),
333 		 MPP_FUNCTION(4,	"tdm",		"dtx"),
334 		 MPP_FUNCTION(5,	"au",		"i2slrclk"),
335 		 MPP_FUNCTION(6,	"sdio",		"wr_protect"),
336 		 MPP_FUNCTION(7,	"ge",		"mdc"),
337 		 MPP_FUNCTION(9,	"pcie0",	"clkreq"),
338 		 MPP_FUNCTION(10,	"mss_gpio2",	NULL)),
339 	MPP_MODE(35,
340 		 MPP_FUNCTION(0,	"gpio",		NULL),
341 		 MPP_FUNCTION(1,	"sata1",	"present_act"),
342 		 MPP_FUNCTION(2,	"i2c1",		"sda"),
343 		 MPP_FUNCTION(3,	"mss_spi",	"clk"),
344 		 MPP_FUNCTION(4,	"tdm",		"pclk"),
345 		 MPP_FUNCTION(5,	"au",		"i2sdo_spdifo"),
346 		 MPP_FUNCTION(6,	"sdio",		"card_detect"),
347 		 MPP_FUNCTION(7,	"xg",		"mdio"),
348 		 MPP_FUNCTION(8,	"ge",		"mdio"),
349 		 MPP_FUNCTION(9,	"pcie",		"rstoutn"),
350 		 MPP_FUNCTION(10,	"mss_gpio3",	NULL)),
351 	MPP_MODE(36,
352 		 MPP_FUNCTION(0,	"gpio",		NULL),
353 		 MPP_FUNCTION(1,	"synce2",	"clk"),
354 		 MPP_FUNCTION(2,	"i2c1",		"sck"),
355 		 MPP_FUNCTION(3,	"ptp",		"clk"),
356 		 MPP_FUNCTION(4,	"synce1",	"clk"),
357 		 MPP_FUNCTION(5,	"au",		"i2sbclk"),
358 		 MPP_FUNCTION(6,	"sata0",	"present_act"),
359 		 MPP_FUNCTION(7,	"xg",		"mdc"),
360 		 MPP_FUNCTION(8,	"ge",		"mdc"),
361 		 MPP_FUNCTION(9,	"pcie2",	"clkreq"),
362 		 MPP_FUNCTION(10,	"mss_gpio5",	NULL)),
363 	MPP_MODE(37,
364 		 MPP_FUNCTION(0,	"gpio",		NULL),
365 		 MPP_FUNCTION(1,	"uart2",	"rxd"),
366 		 MPP_FUNCTION(2,	"i2c0",		"sck"),
367 		 MPP_FUNCTION(3,	"ptp",		"pclk_out"),
368 		 MPP_FUNCTION(4,	"tdm",		"intn"),
369 		 MPP_FUNCTION(5,	"mss_i2c",	"sck"),
370 		 MPP_FUNCTION(6,	"sata1",	"present_act"),
371 		 MPP_FUNCTION(7,	"ge",		"mdc"),
372 		 MPP_FUNCTION(8,	"xg",		"mdc"),
373 		 MPP_FUNCTION(9,	"pcie1",	"clkreq"),
374 		 MPP_FUNCTION(10,	"mss_gpio6",	NULL),
375 		 MPP_FUNCTION(11,	"link",		"rd_out_cp2cp")),
376 	MPP_MODE(38,
377 		 MPP_FUNCTION(0,	"gpio",		NULL),
378 		 MPP_FUNCTION(1,	"uart2",	"txd"),
379 		 MPP_FUNCTION(2,	"i2c0",		"sda"),
380 		 MPP_FUNCTION(3,	"ptp",		"pulse"),
381 		 MPP_FUNCTION(4,	"tdm",		"rstn"),
382 		 MPP_FUNCTION(5,	"mss_i2c",	"sda"),
383 		 MPP_FUNCTION(6,	"sata0",	"present_act"),
384 		 MPP_FUNCTION(7,	"ge",		"mdio"),
385 		 MPP_FUNCTION(8,	"xg",		"mdio"),
386 		 MPP_FUNCTION(9,	"au",		"i2sextclk"),
387 		 MPP_FUNCTION(10,	"mss_gpio7",	NULL),
388 		 MPP_FUNCTION(11,	"ptp",		"pulse_cp2cp")),
389 	MPP_MODE(39,
390 		 MPP_FUNCTION(0,	"gpio",		NULL),
391 		 MPP_FUNCTION(1,	"sdio",		"wr_protect"),
392 		 MPP_FUNCTION(4,	"au",		"i2sbclk"),
393 		 MPP_FUNCTION(5,	"ptp",		"clk"),
394 		 MPP_FUNCTION(6,	"spi0",		"csn1"),
395 		 MPP_FUNCTION(9,	"sata1",	"present_act"),
396 		 MPP_FUNCTION(10,	"mss_gpio0",	NULL)),
397 	MPP_MODE(40,
398 		 MPP_FUNCTION(0,	"gpio",		NULL),
399 		 MPP_FUNCTION(1,	"sdio",		"pwr11"),
400 		 MPP_FUNCTION(2,	"synce1",	"clk"),
401 		 MPP_FUNCTION(3,	"mss_i2c",	"sda"),
402 		 MPP_FUNCTION(4,	"au",		"i2sdo_spdifo"),
403 		 MPP_FUNCTION(5,	"ptp",		"pclk_out"),
404 		 MPP_FUNCTION(6,	"spi0",		"clk"),
405 		 MPP_FUNCTION(7,	"uart1",	"txd"),
406 		 MPP_FUNCTION(8,	"ge",		"mdio"),
407 		 MPP_FUNCTION(9,	"sata0",	"present_act"),
408 		 MPP_FUNCTION(10,	"mss_gpio1",	NULL)),
409 	MPP_MODE(41,
410 		 MPP_FUNCTION(0,	"gpio",		NULL),
411 		 MPP_FUNCTION(1,	"sdio",		"pwr10"),
412 		 MPP_FUNCTION(2,	"sdio",		"bus_pwr"),
413 		 MPP_FUNCTION(3,	"mss_i2c",	"sck"),
414 		 MPP_FUNCTION(4,	"au",		"i2slrclk"),
415 		 MPP_FUNCTION(5,	"ptp",		"pulse"),
416 		 MPP_FUNCTION(6,	"spi0",		"mosi"),
417 		 MPP_FUNCTION(7,	"uart1",	"rxd"),
418 		 MPP_FUNCTION(8,	"ge",		"mdc"),
419 		 MPP_FUNCTION(9,	"sata1",	"present_act"),
420 		 MPP_FUNCTION(10,	"mss_gpio2",	NULL),
421 		 MPP_FUNCTION(11,	"rei",		"out_cp2cp")),
422 	MPP_MODE(42,
423 		 MPP_FUNCTION(0,	"gpio",		NULL),
424 		 MPP_FUNCTION(1,	"sdio",		"v18_en"),
425 		 MPP_FUNCTION(2,	"sdio",		"wr_protect"),
426 		 MPP_FUNCTION(3,	"synce2",	"clk"),
427 		 MPP_FUNCTION(4,	"au",		"i2smclk"),
428 		 MPP_FUNCTION(5,	"mss_uart",	"txd"),
429 		 MPP_FUNCTION(6,	"spi0",		"miso"),
430 		 MPP_FUNCTION(7,	"uart1",	"cts"),
431 		 MPP_FUNCTION(8,	"xg",		"mdc"),
432 		 MPP_FUNCTION(9,	"sata0",	"present_act"),
433 		 MPP_FUNCTION(10,	"mss_gpio4",	NULL)),
434 	MPP_MODE(43,
435 		 MPP_FUNCTION(0,	"gpio",		NULL),
436 		 MPP_FUNCTION(1,	"sdio",		"card_detect"),
437 		 MPP_FUNCTION(3,	"synce1",	"clk"),
438 		 MPP_FUNCTION(4,	"au",		"i2sextclk"),
439 		 MPP_FUNCTION(5,	"mss_uart",	"rxd"),
440 		 MPP_FUNCTION(6,	"spi0",		"csn0"),
441 		 MPP_FUNCTION(7,	"uart1",	"rts"),
442 		 MPP_FUNCTION(8,	"xg",		"mdio"),
443 		 MPP_FUNCTION(9,	"sata1",	"present_act"),
444 		 MPP_FUNCTION(10,	"mss_gpio5",	NULL),
445 		 MPP_FUNCTION(11,	"wakeup",	"out_cp2cp")),
446 	MPP_MODE(44,
447 		 MPP_FUNCTION(0,	"gpio",		NULL),
448 		 MPP_FUNCTION(1,	"ge1",		"txd2"),
449 		 MPP_FUNCTION(7,	"uart0",	"rts"),
450 		 MPP_FUNCTION(11,	"ptp",		"clk_cp2cp")),
451 	MPP_MODE(45,
452 		 MPP_FUNCTION(0,	"gpio",		NULL),
453 		 MPP_FUNCTION(1,	"ge1",		"txd3"),
454 		 MPP_FUNCTION(7,	"uart0",	"txd"),
455 		 MPP_FUNCTION(9,	"pcie",		"rstoutn")),
456 	MPP_MODE(46,
457 		 MPP_FUNCTION(0,	"gpio",		NULL),
458 		 MPP_FUNCTION(1,	"ge1",		"txd1"),
459 		 MPP_FUNCTION(7,	"uart1",	"rts")),
460 	MPP_MODE(47,
461 		 MPP_FUNCTION(0,	"gpio",		NULL),
462 		 MPP_FUNCTION(1,	"ge1",		"txd0"),
463 		 MPP_FUNCTION(5,	"spi1",		"clk"),
464 		 MPP_FUNCTION(7,	"uart1",	"txd"),
465 		 MPP_FUNCTION(8,	"ge",		"mdc")),
466 	MPP_MODE(48,
467 		 MPP_FUNCTION(0,	"gpio",		NULL),
468 		 MPP_FUNCTION(1,	"ge1",		"txctl_txen"),
469 		 MPP_FUNCTION(5,	"spi1",		"mosi"),
470 		 MPP_FUNCTION(8,	"xg",		"mdc"),
471 		 MPP_FUNCTION(11,	"wakeup",	"in_cp2cp")),
472 	MPP_MODE(49,
473 		 MPP_FUNCTION(0,	"gpio",		NULL),
474 		 MPP_FUNCTION(1,	"ge1",		"txclkout"),
475 		 MPP_FUNCTION(2,	"mii",		"crs"),
476 		 MPP_FUNCTION(5,	"spi1",		"miso"),
477 		 MPP_FUNCTION(7,	"uart1",	"rxd"),
478 		 MPP_FUNCTION(8,	"ge",		"mdio"),
479 		 MPP_FUNCTION(9,	"pcie0",	"clkreq"),
480 		 MPP_FUNCTION(10,	"sdio",		"v18_en"),
481 		 MPP_FUNCTION(11,	"sei",		"out_cp2cp")),
482 	MPP_MODE(50,
483 		 MPP_FUNCTION(0,	"gpio",		NULL),
484 		 MPP_FUNCTION(1,	"ge1",		"rxclk"),
485 		 MPP_FUNCTION(2,	"mss_i2c",	"sda"),
486 		 MPP_FUNCTION(5,	"spi1",		"csn0"),
487 		 MPP_FUNCTION(6,	"uart2",	"txd"),
488 		 MPP_FUNCTION(7,	"uart0",	"rxd"),
489 		 MPP_FUNCTION(8,	"xg",		"mdio"),
490 		 MPP_FUNCTION(10,	"sdio",		"pwr11")),
491 	MPP_MODE(51,
492 		 MPP_FUNCTION(0,	"gpio",		NULL),
493 		 MPP_FUNCTION(1,	"ge1",		"rxd0"),
494 		 MPP_FUNCTION(2,	"mss_i2c",	"sck"),
495 		 MPP_FUNCTION(5,	"spi1",		"csn1"),
496 		 MPP_FUNCTION(6,	"uart2",	"rxd"),
497 		 MPP_FUNCTION(7,	"uart0",	"cts"),
498 		 MPP_FUNCTION(10,	"sdio",		"pwr10")),
499 	MPP_MODE(52,
500 		 MPP_FUNCTION(0,	"gpio",		NULL),
501 		 MPP_FUNCTION(1,	"ge1",		"rxd1"),
502 		 MPP_FUNCTION(2,	"synce1",	"clk"),
503 		 MPP_FUNCTION(4,	"synce2",	"clk"),
504 		 MPP_FUNCTION(5,	"spi1",		"csn2"),
505 		 MPP_FUNCTION(7,	"uart1",	"cts"),
506 		 MPP_FUNCTION(8,	"led",		"clk"),
507 		 MPP_FUNCTION(9,	"pcie",		"rstoutn"),
508 		 MPP_FUNCTION(10,	"pcie0",	"clkreq")),
509 	MPP_MODE(53,
510 		 MPP_FUNCTION(0,	"gpio",		NULL),
511 		 MPP_FUNCTION(1,	"ge1",		"rxd2"),
512 		 MPP_FUNCTION(3,	"ptp",		"clk"),
513 		 MPP_FUNCTION(5,	"spi1",		"csn3"),
514 		 MPP_FUNCTION(7,	"uart1",	"rxd"),
515 		 MPP_FUNCTION(8,	"led",		"stb"),
516 		 MPP_FUNCTION(11,	"sdio",		"led")),
517 	MPP_MODE(54,
518 		 MPP_FUNCTION(0,	"gpio",		NULL),
519 		 MPP_FUNCTION(1,	"ge1",		"rxd3"),
520 		 MPP_FUNCTION(2,	"synce2",	"clk"),
521 		 MPP_FUNCTION(3,	"ptp",		"pclk_out"),
522 		 MPP_FUNCTION(4,	"synce1",	"clk"),
523 		 MPP_FUNCTION(8,	"led",		"data"),
524 		 MPP_FUNCTION(10,	"sdio",		"hw_rst"),
525 		 MPP_FUNCTION(11,	"sdio",		"wr_protect")),
526 	MPP_MODE(55,
527 		 MPP_FUNCTION(0,	"gpio",		NULL),
528 		 MPP_FUNCTION(1,	"ge1",		"rxctl_rxdv"),
529 		 MPP_FUNCTION(3,	"ptp",		"pulse"),
530 		 MPP_FUNCTION(10,	"sdio",		"led"),
531 		 MPP_FUNCTION(11,	"sdio",		"card_detect")),
532 	MPP_MODE(56,
533 		 MPP_FUNCTION(0,	"gpio",		NULL),
534 		 MPP_FUNCTION(4,	"tdm",		"drx"),
535 		 MPP_FUNCTION(5,	"au",		"i2sdo_spdifo"),
536 		 MPP_FUNCTION(6,	"spi0",		"clk"),
537 		 MPP_FUNCTION(7,	"uart1",	"rxd"),
538 		 MPP_FUNCTION(9,	"sata1",	"present_act"),
539 		 MPP_FUNCTION(14,	"sdio",		"clk")),
540 	MPP_MODE(57,
541 		 MPP_FUNCTION(0,	"gpio",		NULL),
542 		 MPP_FUNCTION(2,	"mss_i2c",	"sda"),
543 		 MPP_FUNCTION(3,	"ptp",		"pclk_out"),
544 		 MPP_FUNCTION(4,	"tdm",		"intn"),
545 		 MPP_FUNCTION(5,	"au",		"i2sbclk"),
546 		 MPP_FUNCTION(6,	"spi0",		"mosi"),
547 		 MPP_FUNCTION(7,	"uart1",	"txd"),
548 		 MPP_FUNCTION(9,	"sata0",	"present_act"),
549 		 MPP_FUNCTION(14,	"sdio",		"cmd")),
550 	MPP_MODE(58,
551 		 MPP_FUNCTION(0,	"gpio",		NULL),
552 		 MPP_FUNCTION(2,	"mss_i2c",	"sck"),
553 		 MPP_FUNCTION(3,	"ptp",		"clk"),
554 		 MPP_FUNCTION(4,	"tdm",		"rstn"),
555 		 MPP_FUNCTION(5,	"au",		"i2sdi"),
556 		 MPP_FUNCTION(6,	"spi0",		"miso"),
557 		 MPP_FUNCTION(7,	"uart1",	"cts"),
558 		 MPP_FUNCTION(8,	"led",		"clk"),
559 		 MPP_FUNCTION(14,	"sdio",		"d0")),
560 	MPP_MODE(59,
561 		 MPP_FUNCTION(0,	"gpio",		NULL),
562 		 MPP_FUNCTION(1,	"mss_gpio7",	NULL),
563 		 MPP_FUNCTION(2,	"synce2",	"clk"),
564 		 MPP_FUNCTION(4,	"tdm",		"fsync"),
565 		 MPP_FUNCTION(5,	"au",		"i2slrclk"),
566 		 MPP_FUNCTION(6,	"spi0",		"csn0"),
567 		 MPP_FUNCTION(7,	"uart0",	"cts"),
568 		 MPP_FUNCTION(8,	"led",		"stb"),
569 		 MPP_FUNCTION(9,	"uart1",	"txd"),
570 		 MPP_FUNCTION(14,	"sdio",		"d1")),
571 	MPP_MODE(60,
572 		 MPP_FUNCTION(0,	"gpio",		NULL),
573 		 MPP_FUNCTION(1,	"mss_gpio6",	NULL),
574 		 MPP_FUNCTION(3,	"ptp",		"pulse"),
575 		 MPP_FUNCTION(4,	"tdm",		"dtx"),
576 		 MPP_FUNCTION(5,	"au",		"i2smclk"),
577 		 MPP_FUNCTION(6,	"spi0",		"csn1"),
578 		 MPP_FUNCTION(7,	"uart0",	"rts"),
579 		 MPP_FUNCTION(8,	"led",		"data"),
580 		 MPP_FUNCTION(9,	"uart1",	"rxd"),
581 		 MPP_FUNCTION(14,	"sdio",		"d2")),
582 	MPP_MODE(61,
583 		 MPP_FUNCTION(0,	"gpio",		NULL),
584 		 MPP_FUNCTION(1,	"mss_gpio5",	NULL),
585 		 MPP_FUNCTION(3,	"ptp",		"clk"),
586 		 MPP_FUNCTION(4,	"tdm",		"pclk"),
587 		 MPP_FUNCTION(5,	"au",		"i2sextclk"),
588 		 MPP_FUNCTION(6,	"spi0",		"csn2"),
589 		 MPP_FUNCTION(7,	"uart0",	"txd"),
590 		 MPP_FUNCTION(8,	"uart2",	"txd"),
591 		 MPP_FUNCTION(9,	"sata1",	"present_act"),
592 		 MPP_FUNCTION(10,	"ge",		"mdio"),
593 		 MPP_FUNCTION(14,	"sdio",		"d3")),
594 	MPP_MODE(62,
595 		 MPP_FUNCTION(0,	"gpio",		NULL),
596 		 MPP_FUNCTION(1,	"mss_gpio4",	NULL),
597 		 MPP_FUNCTION(2,	"synce1",	"clk"),
598 		 MPP_FUNCTION(3,	"ptp",		"pclk_out"),
599 		 MPP_FUNCTION(5,	"sata1",	"present_act"),
600 		 MPP_FUNCTION(6,	"spi0",		"csn3"),
601 		 MPP_FUNCTION(7,	"uart0",	"rxd"),
602 		 MPP_FUNCTION(8,	"uart2",	"rxd"),
603 		 MPP_FUNCTION(9,	"sata0",	"present_act"),
604 		 MPP_FUNCTION(10,	"ge",		"mdc")),
605 };
606 
607 static const struct of_device_id armada_cp110_pinctrl_of_match[] = {
608 	{
609 		.compatible	= "marvell,armada-7k-pinctrl",
610 		.data		= (void *) V_ARMADA_7K,
611 	},
612 	{
613 		.compatible	= "marvell,armada-8k-cpm-pinctrl",
614 		.data		= (void *) V_ARMADA_8K_CPM,
615 	},
616 	{
617 		.compatible	= "marvell,armada-8k-cps-pinctrl",
618 		.data		= (void *) V_ARMADA_8K_CPS,
619 	},
620 	{ },
621 };
622 
623 static const struct mvebu_mpp_ctrl armada_cp110_mpp_controls[] = {
624 	MPP_FUNC_CTRL(0, 62, NULL, mvebu_regmap_mpp_ctrl),
625 };
626 
627 static void mvebu_pinctrl_assign_variant(struct mvebu_mpp_mode *m,
628 					 u8 variant)
629 {
630 	struct mvebu_mpp_ctrl_setting *s;
631 
632 	for (s = m->settings ; s->name ; s++)
633 		s->variant = variant;
634 }
635 
636 static int armada_cp110_pinctrl_probe(struct platform_device *pdev)
637 {
638 	struct mvebu_pinctrl_soc_info *soc;
639 	const struct of_device_id *match =
640 		of_match_device(armada_cp110_pinctrl_of_match, &pdev->dev);
641 	int i;
642 
643 	if (!pdev->dev.parent)
644 		return -ENODEV;
645 
646 	soc = devm_kzalloc(&pdev->dev,
647 			   sizeof(struct mvebu_pinctrl_soc_info), GFP_KERNEL);
648 	if (!soc)
649 		return -ENOMEM;
650 
651 	soc->variant = (unsigned long) match->data & 0xff;
652 	soc->controls = armada_cp110_mpp_controls;
653 	soc->ncontrols = ARRAY_SIZE(armada_cp110_mpp_controls);
654 	soc->modes = armada_cp110_mpp_modes;
655 	soc->nmodes = ARRAY_SIZE(armada_cp110_mpp_modes);
656 	for (i = 0; i < ARRAY_SIZE(armada_cp110_mpp_modes); i++) {
657 		struct mvebu_mpp_mode *m = &armada_cp110_mpp_modes[i];
658 
659 		switch (i) {
660 		case 0 ... 31:
661 			mvebu_pinctrl_assign_variant(m, V_ARMADA_7K_8K_CPS);
662 			break;
663 		case 32 ... 38:
664 			mvebu_pinctrl_assign_variant(m, V_ARMADA_7K_8K_CPM);
665 			break;
666 		case 39 ... 43:
667 			mvebu_pinctrl_assign_variant(m, V_ARMADA_8K_CPM);
668 			break;
669 		case 44 ... 62:
670 			mvebu_pinctrl_assign_variant(m, V_ARMADA_7K_8K_CPM);
671 			break;
672 		}
673 	}
674 	pdev->dev.platform_data = soc;
675 
676 	return mvebu_pinctrl_simple_regmap_probe(pdev, pdev->dev.parent, 0);
677 }
678 
679 static struct platform_driver armada_cp110_pinctrl_driver = {
680 	.driver = {
681 		.name = "armada-cp110-pinctrl",
682 		.of_match_table = of_match_ptr(armada_cp110_pinctrl_of_match),
683 	},
684 	.probe = armada_cp110_pinctrl_probe,
685 };
686 
687 builtin_platform_driver(armada_cp110_pinctrl_driver);
688