scsi: qla2xxx: Fix recursive mailbox timeout
[linux/fpc-iii.git] / drivers / pinctrl / pinctrl-xway.c
blob93f8bd04e7fe69ab92bb48c2715aa24371d315c3
1 /*
2 * linux/drivers/pinctrl/pinmux-xway.c
3 * based on linux/drivers/pinctrl/pinmux-pxa910.c
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * publishhed by the Free Software Foundation.
9 * Copyright (C) 2012 John Crispin <john@phrozen.org>
10 * Copyright (C) 2015 Martin Schiller <mschiller@tdt.de>
13 #include <linux/err.h>
14 #include <linux/slab.h>
15 #include <linux/module.h>
16 #include <linux/of_platform.h>
17 #include <linux/of_address.h>
18 #include <linux/of_gpio.h>
19 #include <linux/ioport.h>
20 #include <linux/io.h>
21 #include <linux/device.h>
22 #include <linux/platform_device.h>
24 #include "pinctrl-lantiq.h"
26 #include <lantiq_soc.h>
28 /* we have up to 4 banks of 16 bit each */
29 #define PINS 16
30 #define PORT3 3
31 #define PORT(x) (x / PINS)
32 #define PORT_PIN(x) (x % PINS)
34 /* we have 2 mux bits that can be set for each pin */
35 #define MUX_ALT0 0x1
36 #define MUX_ALT1 0x2
39 * each bank has this offset apart from the 4th bank that is mixed into the
40 * other 3 ranges
42 #define REG_OFF 0x30
44 /* these are the offsets to our registers */
45 #define GPIO_BASE(p) (REG_OFF * PORT(p))
46 #define GPIO_OUT(p) GPIO_BASE(p)
47 #define GPIO_IN(p) (GPIO_BASE(p) + 0x04)
48 #define GPIO_DIR(p) (GPIO_BASE(p) + 0x08)
49 #define GPIO_ALT0(p) (GPIO_BASE(p) + 0x0C)
50 #define GPIO_ALT1(p) (GPIO_BASE(p) + 0x10)
51 #define GPIO_OD(p) (GPIO_BASE(p) + 0x14)
52 #define GPIO_PUDSEL(p) (GPIO_BASE(p) + 0x1c)
53 #define GPIO_PUDEN(p) (GPIO_BASE(p) + 0x20)
55 /* the 4th port needs special offsets for some registers */
56 #define GPIO3_OD (GPIO_BASE(0) + 0x24)
57 #define GPIO3_PUDSEL (GPIO_BASE(0) + 0x28)
58 #define GPIO3_PUDEN (GPIO_BASE(0) + 0x2C)
59 #define GPIO3_ALT1 (GPIO_BASE(PINS) + 0x24)
61 /* macros to help us access the registers */
62 #define gpio_getbit(m, r, p) (!!(ltq_r32(m + r) & BIT(p)))
63 #define gpio_setbit(m, r, p) ltq_w32_mask(0, BIT(p), m + r)
64 #define gpio_clearbit(m, r, p) ltq_w32_mask(BIT(p), 0, m + r)
66 #define MFP_XWAY(a, f0, f1, f2, f3) \
67 { \
68 .name = #a, \
69 .pin = a, \
70 .func = { \
71 XWAY_MUX_##f0, \
72 XWAY_MUX_##f1, \
73 XWAY_MUX_##f2, \
74 XWAY_MUX_##f3, \
75 }, \
78 #define GRP_MUX(a, m, p) \
79 { .name = a, .mux = XWAY_MUX_##m, .pins = p, .npins = ARRAY_SIZE(p), }
81 #define FUNC_MUX(f, m) \
82 { .func = f, .mux = XWAY_MUX_##m, }
84 enum xway_mux {
85 XWAY_MUX_GPIO = 0,
86 XWAY_MUX_SPI,
87 XWAY_MUX_ASC,
88 XWAY_MUX_USIF,
89 XWAY_MUX_PCI,
90 XWAY_MUX_CBUS,
91 XWAY_MUX_CGU,
92 XWAY_MUX_EBU,
93 XWAY_MUX_EBU2,
94 XWAY_MUX_JTAG,
95 XWAY_MUX_MCD,
96 XWAY_MUX_EXIN,
97 XWAY_MUX_TDM,
98 XWAY_MUX_STP,
99 XWAY_MUX_SIN,
100 XWAY_MUX_GPT,
101 XWAY_MUX_NMI,
102 XWAY_MUX_MDIO,
103 XWAY_MUX_MII,
104 XWAY_MUX_EPHY,
105 XWAY_MUX_DFE,
106 XWAY_MUX_SDIO,
107 XWAY_MUX_GPHY,
108 XWAY_MUX_SSI,
109 XWAY_MUX_WIFI,
110 XWAY_MUX_NONE = 0xffff,
113 /* --------- DEPRECATED: xr9 related code --------- */
114 /* ---------- use xrx100/xrx200 instead ---------- */
115 #define XR9_MAX_PIN 56
117 static const struct ltq_mfp_pin xway_mfp[] = {
118 /* pin f0 f1 f2 f3 */
119 MFP_XWAY(GPIO0, GPIO, EXIN, NONE, TDM),
120 MFP_XWAY(GPIO1, GPIO, EXIN, NONE, NONE),
121 MFP_XWAY(GPIO2, GPIO, CGU, EXIN, GPHY),
122 MFP_XWAY(GPIO3, GPIO, CGU, NONE, PCI),
123 MFP_XWAY(GPIO4, GPIO, STP, NONE, ASC),
124 MFP_XWAY(GPIO5, GPIO, STP, GPHY, NONE),
125 MFP_XWAY(GPIO6, GPIO, STP, GPT, ASC),
126 MFP_XWAY(GPIO7, GPIO, CGU, PCI, GPHY),
127 MFP_XWAY(GPIO8, GPIO, CGU, NMI, NONE),
128 MFP_XWAY(GPIO9, GPIO, ASC, SPI, EXIN),
129 MFP_XWAY(GPIO10, GPIO, ASC, SPI, NONE),
130 MFP_XWAY(GPIO11, GPIO, ASC, PCI, SPI),
131 MFP_XWAY(GPIO12, GPIO, ASC, NONE, NONE),
132 MFP_XWAY(GPIO13, GPIO, EBU, SPI, NONE),
133 MFP_XWAY(GPIO14, GPIO, CGU, PCI, NONE),
134 MFP_XWAY(GPIO15, GPIO, SPI, JTAG, NONE),
135 MFP_XWAY(GPIO16, GPIO, SPI, NONE, JTAG),
136 MFP_XWAY(GPIO17, GPIO, SPI, NONE, JTAG),
137 MFP_XWAY(GPIO18, GPIO, SPI, NONE, JTAG),
138 MFP_XWAY(GPIO19, GPIO, PCI, NONE, NONE),
139 MFP_XWAY(GPIO20, GPIO, JTAG, NONE, NONE),
140 MFP_XWAY(GPIO21, GPIO, PCI, EBU, GPT),
141 MFP_XWAY(GPIO22, GPIO, SPI, NONE, NONE),
142 MFP_XWAY(GPIO23, GPIO, EBU, PCI, STP),
143 MFP_XWAY(GPIO24, GPIO, EBU, TDM, PCI),
144 MFP_XWAY(GPIO25, GPIO, TDM, NONE, ASC),
145 MFP_XWAY(GPIO26, GPIO, EBU, NONE, TDM),
146 MFP_XWAY(GPIO27, GPIO, TDM, NONE, ASC),
147 MFP_XWAY(GPIO28, GPIO, GPT, NONE, NONE),
148 MFP_XWAY(GPIO29, GPIO, PCI, NONE, NONE),
149 MFP_XWAY(GPIO30, GPIO, PCI, NONE, NONE),
150 MFP_XWAY(GPIO31, GPIO, EBU, PCI, NONE),
151 MFP_XWAY(GPIO32, GPIO, NONE, NONE, EBU),
152 MFP_XWAY(GPIO33, GPIO, NONE, NONE, EBU),
153 MFP_XWAY(GPIO34, GPIO, NONE, NONE, EBU),
154 MFP_XWAY(GPIO35, GPIO, NONE, NONE, EBU),
155 MFP_XWAY(GPIO36, GPIO, SIN, NONE, EBU),
156 MFP_XWAY(GPIO37, GPIO, PCI, NONE, NONE),
157 MFP_XWAY(GPIO38, GPIO, PCI, NONE, NONE),
158 MFP_XWAY(GPIO39, GPIO, EXIN, NONE, NONE),
159 MFP_XWAY(GPIO40, GPIO, NONE, NONE, NONE),
160 MFP_XWAY(GPIO41, GPIO, NONE, NONE, NONE),
161 MFP_XWAY(GPIO42, GPIO, MDIO, NONE, NONE),
162 MFP_XWAY(GPIO43, GPIO, MDIO, NONE, NONE),
163 MFP_XWAY(GPIO44, GPIO, MII, SIN, GPHY),
164 MFP_XWAY(GPIO45, GPIO, NONE, GPHY, SIN),
165 MFP_XWAY(GPIO46, GPIO, NONE, NONE, EXIN),
166 MFP_XWAY(GPIO47, GPIO, MII, GPHY, SIN),
167 MFP_XWAY(GPIO48, GPIO, EBU, NONE, NONE),
168 MFP_XWAY(GPIO49, GPIO, EBU, NONE, NONE),
169 MFP_XWAY(GPIO50, GPIO, NONE, NONE, NONE),
170 MFP_XWAY(GPIO51, GPIO, NONE, NONE, NONE),
171 MFP_XWAY(GPIO52, GPIO, NONE, NONE, NONE),
172 MFP_XWAY(GPIO53, GPIO, NONE, NONE, NONE),
173 MFP_XWAY(GPIO54, GPIO, NONE, NONE, NONE),
174 MFP_XWAY(GPIO55, GPIO, NONE, NONE, NONE),
177 static const unsigned pins_jtag[] = {GPIO15, GPIO16, GPIO17, GPIO19, GPIO35};
178 static const unsigned pins_asc0[] = {GPIO11, GPIO12};
179 static const unsigned pins_asc0_cts_rts[] = {GPIO9, GPIO10};
180 static const unsigned pins_stp[] = {GPIO4, GPIO5, GPIO6};
181 static const unsigned pins_nmi[] = {GPIO8};
182 static const unsigned pins_mdio[] = {GPIO42, GPIO43};
184 static const unsigned pins_gphy0_led0[] = {GPIO5};
185 static const unsigned pins_gphy0_led1[] = {GPIO7};
186 static const unsigned pins_gphy0_led2[] = {GPIO2};
187 static const unsigned pins_gphy1_led0[] = {GPIO44};
188 static const unsigned pins_gphy1_led1[] = {GPIO45};
189 static const unsigned pins_gphy1_led2[] = {GPIO47};
191 static const unsigned pins_ebu_a24[] = {GPIO13};
192 static const unsigned pins_ebu_clk[] = {GPIO21};
193 static const unsigned pins_ebu_cs1[] = {GPIO23};
194 static const unsigned pins_ebu_a23[] = {GPIO24};
195 static const unsigned pins_ebu_wait[] = {GPIO26};
196 static const unsigned pins_ebu_a25[] = {GPIO31};
197 static const unsigned pins_ebu_rdy[] = {GPIO48};
198 static const unsigned pins_ebu_rd[] = {GPIO49};
200 static const unsigned pins_nand_ale[] = {GPIO13};
201 static const unsigned pins_nand_cs1[] = {GPIO23};
202 static const unsigned pins_nand_cle[] = {GPIO24};
203 static const unsigned pins_nand_rdy[] = {GPIO48};
204 static const unsigned pins_nand_rd[] = {GPIO49};
206 static const unsigned xway_exin_pin_map[] = {GPIO0, GPIO1, GPIO2, GPIO39, GPIO46, GPIO9};
208 static const unsigned pins_exin0[] = {GPIO0};
209 static const unsigned pins_exin1[] = {GPIO1};
210 static const unsigned pins_exin2[] = {GPIO2};
211 static const unsigned pins_exin3[] = {GPIO39};
212 static const unsigned pins_exin4[] = {GPIO46};
213 static const unsigned pins_exin5[] = {GPIO9};
215 static const unsigned pins_spi[] = {GPIO16, GPIO17, GPIO18};
216 static const unsigned pins_spi_cs1[] = {GPIO15};
217 static const unsigned pins_spi_cs2[] = {GPIO22};
218 static const unsigned pins_spi_cs3[] = {GPIO13};
219 static const unsigned pins_spi_cs4[] = {GPIO10};
220 static const unsigned pins_spi_cs5[] = {GPIO9};
221 static const unsigned pins_spi_cs6[] = {GPIO11};
223 static const unsigned pins_gpt1[] = {GPIO28};
224 static const unsigned pins_gpt2[] = {GPIO21};
225 static const unsigned pins_gpt3[] = {GPIO6};
227 static const unsigned pins_clkout0[] = {GPIO8};
228 static const unsigned pins_clkout1[] = {GPIO7};
229 static const unsigned pins_clkout2[] = {GPIO3};
230 static const unsigned pins_clkout3[] = {GPIO2};
232 static const unsigned pins_pci_gnt1[] = {GPIO30};
233 static const unsigned pins_pci_gnt2[] = {GPIO23};
234 static const unsigned pins_pci_gnt3[] = {GPIO19};
235 static const unsigned pins_pci_gnt4[] = {GPIO38};
236 static const unsigned pins_pci_req1[] = {GPIO29};
237 static const unsigned pins_pci_req2[] = {GPIO31};
238 static const unsigned pins_pci_req3[] = {GPIO3};
239 static const unsigned pins_pci_req4[] = {GPIO37};
241 static const struct ltq_pin_group xway_grps[] = {
242 GRP_MUX("exin0", EXIN, pins_exin0),
243 GRP_MUX("exin1", EXIN, pins_exin1),
244 GRP_MUX("exin2", EXIN, pins_exin2),
245 GRP_MUX("jtag", JTAG, pins_jtag),
246 GRP_MUX("ebu a23", EBU, pins_ebu_a23),
247 GRP_MUX("ebu a24", EBU, pins_ebu_a24),
248 GRP_MUX("ebu a25", EBU, pins_ebu_a25),
249 GRP_MUX("ebu clk", EBU, pins_ebu_clk),
250 GRP_MUX("ebu cs1", EBU, pins_ebu_cs1),
251 GRP_MUX("ebu wait", EBU, pins_ebu_wait),
252 GRP_MUX("nand ale", EBU, pins_nand_ale),
253 GRP_MUX("nand cs1", EBU, pins_nand_cs1),
254 GRP_MUX("nand cle", EBU, pins_nand_cle),
255 GRP_MUX("spi", SPI, pins_spi),
256 GRP_MUX("spi_cs1", SPI, pins_spi_cs1),
257 GRP_MUX("spi_cs2", SPI, pins_spi_cs2),
258 GRP_MUX("spi_cs3", SPI, pins_spi_cs3),
259 GRP_MUX("spi_cs4", SPI, pins_spi_cs4),
260 GRP_MUX("spi_cs5", SPI, pins_spi_cs5),
261 GRP_MUX("spi_cs6", SPI, pins_spi_cs6),
262 GRP_MUX("asc0", ASC, pins_asc0),
263 GRP_MUX("asc0 cts rts", ASC, pins_asc0_cts_rts),
264 GRP_MUX("stp", STP, pins_stp),
265 GRP_MUX("nmi", NMI, pins_nmi),
266 GRP_MUX("gpt1", GPT, pins_gpt1),
267 GRP_MUX("gpt2", GPT, pins_gpt2),
268 GRP_MUX("gpt3", GPT, pins_gpt3),
269 GRP_MUX("clkout0", CGU, pins_clkout0),
270 GRP_MUX("clkout1", CGU, pins_clkout1),
271 GRP_MUX("clkout2", CGU, pins_clkout2),
272 GRP_MUX("clkout3", CGU, pins_clkout3),
273 GRP_MUX("gnt1", PCI, pins_pci_gnt1),
274 GRP_MUX("gnt2", PCI, pins_pci_gnt2),
275 GRP_MUX("gnt3", PCI, pins_pci_gnt3),
276 GRP_MUX("req1", PCI, pins_pci_req1),
277 GRP_MUX("req2", PCI, pins_pci_req2),
278 GRP_MUX("req3", PCI, pins_pci_req3),
279 /* xrx only */
280 GRP_MUX("nand rdy", EBU, pins_nand_rdy),
281 GRP_MUX("nand rd", EBU, pins_nand_rd),
282 GRP_MUX("exin3", EXIN, pins_exin3),
283 GRP_MUX("exin4", EXIN, pins_exin4),
284 GRP_MUX("exin5", EXIN, pins_exin5),
285 GRP_MUX("gnt4", PCI, pins_pci_gnt4),
286 GRP_MUX("req4", PCI, pins_pci_gnt4),
287 GRP_MUX("mdio", MDIO, pins_mdio),
288 GRP_MUX("gphy0 led0", GPHY, pins_gphy0_led0),
289 GRP_MUX("gphy0 led1", GPHY, pins_gphy0_led1),
290 GRP_MUX("gphy0 led2", GPHY, pins_gphy0_led2),
291 GRP_MUX("gphy1 led0", GPHY, pins_gphy1_led0),
292 GRP_MUX("gphy1 led1", GPHY, pins_gphy1_led1),
293 GRP_MUX("gphy1 led2", GPHY, pins_gphy1_led2),
296 static const char * const xway_pci_grps[] = {"gnt1", "gnt2",
297 "gnt3", "req1",
298 "req2", "req3"};
299 static const char * const xway_spi_grps[] = {"spi", "spi_cs1",
300 "spi_cs2", "spi_cs3",
301 "spi_cs4", "spi_cs5",
302 "spi_cs6"};
303 static const char * const xway_cgu_grps[] = {"clkout0", "clkout1",
304 "clkout2", "clkout3"};
305 static const char * const xway_ebu_grps[] = {"ebu a23", "ebu a24",
306 "ebu a25", "ebu cs1",
307 "ebu wait", "ebu clk",
308 "nand ale", "nand cs1",
309 "nand cle"};
310 static const char * const xway_exin_grps[] = {"exin0", "exin1", "exin2"};
311 static const char * const xway_gpt_grps[] = {"gpt1", "gpt2", "gpt3"};
312 static const char * const xway_asc_grps[] = {"asc0", "asc0 cts rts"};
313 static const char * const xway_jtag_grps[] = {"jtag"};
314 static const char * const xway_stp_grps[] = {"stp"};
315 static const char * const xway_nmi_grps[] = {"nmi"};
317 /* ar9/vr9/gr9 */
318 static const char * const xrx_mdio_grps[] = {"mdio"};
319 static const char * const xrx_gphy_grps[] = {"gphy0 led0", "gphy0 led1",
320 "gphy0 led2", "gphy1 led0",
321 "gphy1 led1", "gphy1 led2"};
322 static const char * const xrx_ebu_grps[] = {"ebu a23", "ebu a24",
323 "ebu a25", "ebu cs1",
324 "ebu wait", "ebu clk",
325 "nand ale", "nand cs1",
326 "nand cle", "nand rdy",
327 "nand rd"};
328 static const char * const xrx_exin_grps[] = {"exin0", "exin1", "exin2",
329 "exin3", "exin4", "exin5"};
330 static const char * const xrx_pci_grps[] = {"gnt1", "gnt2",
331 "gnt3", "gnt4",
332 "req1", "req2",
333 "req3", "req4"};
335 static const struct ltq_pmx_func xrx_funcs[] = {
336 {"spi", ARRAY_AND_SIZE(xway_spi_grps)},
337 {"asc", ARRAY_AND_SIZE(xway_asc_grps)},
338 {"cgu", ARRAY_AND_SIZE(xway_cgu_grps)},
339 {"jtag", ARRAY_AND_SIZE(xway_jtag_grps)},
340 {"exin", ARRAY_AND_SIZE(xrx_exin_grps)},
341 {"stp", ARRAY_AND_SIZE(xway_stp_grps)},
342 {"gpt", ARRAY_AND_SIZE(xway_gpt_grps)},
343 {"nmi", ARRAY_AND_SIZE(xway_nmi_grps)},
344 {"pci", ARRAY_AND_SIZE(xrx_pci_grps)},
345 {"ebu", ARRAY_AND_SIZE(xrx_ebu_grps)},
346 {"mdio", ARRAY_AND_SIZE(xrx_mdio_grps)},
347 {"gphy", ARRAY_AND_SIZE(xrx_gphy_grps)},
350 /* --------- ase related code --------- */
351 #define ASE_MAX_PIN 32
353 static const struct ltq_mfp_pin ase_mfp[] = {
354 /* pin f0 f1 f2 f3 */
355 MFP_XWAY(GPIO0, GPIO, EXIN, MII, TDM),
356 MFP_XWAY(GPIO1, GPIO, STP, DFE, EBU),
357 MFP_XWAY(GPIO2, GPIO, STP, DFE, EPHY),
358 MFP_XWAY(GPIO3, GPIO, STP, EPHY, EBU),
359 MFP_XWAY(GPIO4, GPIO, GPT, EPHY, MII),
360 MFP_XWAY(GPIO5, GPIO, MII, ASC, GPT),
361 MFP_XWAY(GPIO6, GPIO, MII, ASC, EXIN),
362 MFP_XWAY(GPIO7, GPIO, SPI, MII, JTAG),
363 MFP_XWAY(GPIO8, GPIO, SPI, MII, JTAG),
364 MFP_XWAY(GPIO9, GPIO, SPI, MII, JTAG),
365 MFP_XWAY(GPIO10, GPIO, SPI, MII, JTAG),
366 MFP_XWAY(GPIO11, GPIO, EBU, CGU, JTAG),
367 MFP_XWAY(GPIO12, GPIO, EBU, MII, SDIO),
368 MFP_XWAY(GPIO13, GPIO, EBU, MII, CGU),
369 MFP_XWAY(GPIO14, GPIO, EBU, SPI, CGU),
370 MFP_XWAY(GPIO15, GPIO, EBU, SPI, SDIO),
371 MFP_XWAY(GPIO16, GPIO, NONE, NONE, NONE),
372 MFP_XWAY(GPIO17, GPIO, NONE, NONE, NONE),
373 MFP_XWAY(GPIO18, GPIO, NONE, NONE, NONE),
374 MFP_XWAY(GPIO19, GPIO, EBU, MII, SDIO),
375 MFP_XWAY(GPIO20, GPIO, EBU, MII, SDIO),
376 MFP_XWAY(GPIO21, GPIO, EBU, MII, EBU2),
377 MFP_XWAY(GPIO22, GPIO, EBU, MII, CGU),
378 MFP_XWAY(GPIO23, GPIO, EBU, MII, CGU),
379 MFP_XWAY(GPIO24, GPIO, EBU, EBU2, MDIO),
380 MFP_XWAY(GPIO25, GPIO, EBU, MII, GPT),
381 MFP_XWAY(GPIO26, GPIO, EBU, MII, SDIO),
382 MFP_XWAY(GPIO27, GPIO, EBU, NONE, MDIO),
383 MFP_XWAY(GPIO28, GPIO, MII, EBU, SDIO),
384 MFP_XWAY(GPIO29, GPIO, EBU, MII, EXIN),
385 MFP_XWAY(GPIO30, GPIO, NONE, NONE, NONE),
386 MFP_XWAY(GPIO31, GPIO, NONE, NONE, NONE),
389 static const unsigned ase_exin_pin_map[] = {GPIO6, GPIO29, GPIO0};
391 static const unsigned ase_pins_exin0[] = {GPIO6};
392 static const unsigned ase_pins_exin1[] = {GPIO29};
393 static const unsigned ase_pins_exin2[] = {GPIO0};
395 static const unsigned ase_pins_jtag[] = {GPIO7, GPIO8, GPIO9, GPIO10, GPIO11};
396 static const unsigned ase_pins_asc[] = {GPIO5, GPIO6};
397 static const unsigned ase_pins_stp[] = {GPIO1, GPIO2, GPIO3};
398 static const unsigned ase_pins_mdio[] = {GPIO24, GPIO27};
399 static const unsigned ase_pins_ephy_led0[] = {GPIO2};
400 static const unsigned ase_pins_ephy_led1[] = {GPIO3};
401 static const unsigned ase_pins_ephy_led2[] = {GPIO4};
402 static const unsigned ase_pins_dfe_led0[] = {GPIO1};
403 static const unsigned ase_pins_dfe_led1[] = {GPIO2};
405 static const unsigned ase_pins_spi[] = {GPIO8, GPIO9, GPIO10}; /* DEPRECATED */
406 static const unsigned ase_pins_spi_di[] = {GPIO8};
407 static const unsigned ase_pins_spi_do[] = {GPIO9};
408 static const unsigned ase_pins_spi_clk[] = {GPIO10};
409 static const unsigned ase_pins_spi_cs1[] = {GPIO7};
410 static const unsigned ase_pins_spi_cs2[] = {GPIO15};
411 static const unsigned ase_pins_spi_cs3[] = {GPIO14};
413 static const unsigned ase_pins_gpt1[] = {GPIO5};
414 static const unsigned ase_pins_gpt2[] = {GPIO4};
415 static const unsigned ase_pins_gpt3[] = {GPIO25};
417 static const unsigned ase_pins_clkout0[] = {GPIO23};
418 static const unsigned ase_pins_clkout1[] = {GPIO22};
419 static const unsigned ase_pins_clkout2[] = {GPIO14};
421 static const struct ltq_pin_group ase_grps[] = {
422 GRP_MUX("exin0", EXIN, ase_pins_exin0),
423 GRP_MUX("exin1", EXIN, ase_pins_exin1),
424 GRP_MUX("exin2", EXIN, ase_pins_exin2),
425 GRP_MUX("jtag", JTAG, ase_pins_jtag),
426 GRP_MUX("spi", SPI, ase_pins_spi), /* DEPRECATED */
427 GRP_MUX("spi_di", SPI, ase_pins_spi_di),
428 GRP_MUX("spi_do", SPI, ase_pins_spi_do),
429 GRP_MUX("spi_clk", SPI, ase_pins_spi_clk),
430 GRP_MUX("spi_cs1", SPI, ase_pins_spi_cs1),
431 GRP_MUX("spi_cs2", SPI, ase_pins_spi_cs2),
432 GRP_MUX("spi_cs3", SPI, ase_pins_spi_cs3),
433 GRP_MUX("asc", ASC, ase_pins_asc),
434 GRP_MUX("stp", STP, ase_pins_stp),
435 GRP_MUX("gpt1", GPT, ase_pins_gpt1),
436 GRP_MUX("gpt2", GPT, ase_pins_gpt2),
437 GRP_MUX("gpt3", GPT, ase_pins_gpt3),
438 GRP_MUX("clkout0", CGU, ase_pins_clkout0),
439 GRP_MUX("clkout1", CGU, ase_pins_clkout1),
440 GRP_MUX("clkout2", CGU, ase_pins_clkout2),
441 GRP_MUX("mdio", MDIO, ase_pins_mdio),
442 GRP_MUX("dfe led0", DFE, ase_pins_dfe_led0),
443 GRP_MUX("dfe led1", DFE, ase_pins_dfe_led1),
444 GRP_MUX("ephy led0", EPHY, ase_pins_ephy_led0),
445 GRP_MUX("ephy led1", EPHY, ase_pins_ephy_led1),
446 GRP_MUX("ephy led2", EPHY, ase_pins_ephy_led2),
449 static const char * const ase_exin_grps[] = {"exin0", "exin1", "exin2"};
450 static const char * const ase_gpt_grps[] = {"gpt1", "gpt2", "gpt3"};
451 static const char * const ase_cgu_grps[] = {"clkout0", "clkout1",
452 "clkout2"};
453 static const char * const ase_mdio_grps[] = {"mdio"};
454 static const char * const ase_dfe_grps[] = {"dfe led0", "dfe led1"};
455 static const char * const ase_ephy_grps[] = {"ephy led0", "ephy led1",
456 "ephy led2"};
457 static const char * const ase_asc_grps[] = {"asc"};
458 static const char * const ase_jtag_grps[] = {"jtag"};
459 static const char * const ase_stp_grps[] = {"stp"};
460 static const char * const ase_spi_grps[] = {"spi", /* DEPRECATED */
461 "spi_di", "spi_do",
462 "spi_clk", "spi_cs1",
463 "spi_cs2", "spi_cs3"};
465 static const struct ltq_pmx_func ase_funcs[] = {
466 {"spi", ARRAY_AND_SIZE(ase_spi_grps)},
467 {"asc", ARRAY_AND_SIZE(ase_asc_grps)},
468 {"cgu", ARRAY_AND_SIZE(ase_cgu_grps)},
469 {"jtag", ARRAY_AND_SIZE(ase_jtag_grps)},
470 {"exin", ARRAY_AND_SIZE(ase_exin_grps)},
471 {"stp", ARRAY_AND_SIZE(ase_stp_grps)},
472 {"gpt", ARRAY_AND_SIZE(ase_gpt_grps)},
473 {"mdio", ARRAY_AND_SIZE(ase_mdio_grps)},
474 {"ephy", ARRAY_AND_SIZE(ase_ephy_grps)},
475 {"dfe", ARRAY_AND_SIZE(ase_dfe_grps)},
478 /* --------- danube related code --------- */
479 #define DANUBE_MAX_PIN 32
481 static const struct ltq_mfp_pin danube_mfp[] = {
482 /* pin f0 f1 f2 f3 */
483 MFP_XWAY(GPIO0, GPIO, EXIN, SDIO, TDM),
484 MFP_XWAY(GPIO1, GPIO, EXIN, CBUS, MII),
485 MFP_XWAY(GPIO2, GPIO, CGU, EXIN, MII),
486 MFP_XWAY(GPIO3, GPIO, CGU, SDIO, PCI),
487 MFP_XWAY(GPIO4, GPIO, STP, DFE, ASC),
488 MFP_XWAY(GPIO5, GPIO, STP, MII, DFE),
489 MFP_XWAY(GPIO6, GPIO, STP, GPT, ASC),
490 MFP_XWAY(GPIO7, GPIO, CGU, CBUS, MII),
491 MFP_XWAY(GPIO8, GPIO, CGU, NMI, MII),
492 MFP_XWAY(GPIO9, GPIO, ASC, SPI, MII),
493 MFP_XWAY(GPIO10, GPIO, ASC, SPI, MII),
494 MFP_XWAY(GPIO11, GPIO, ASC, CBUS, SPI),
495 MFP_XWAY(GPIO12, GPIO, ASC, CBUS, MCD),
496 MFP_XWAY(GPIO13, GPIO, EBU, SPI, MII),
497 MFP_XWAY(GPIO14, GPIO, CGU, CBUS, MII),
498 MFP_XWAY(GPIO15, GPIO, SPI, SDIO, JTAG),
499 MFP_XWAY(GPIO16, GPIO, SPI, SDIO, JTAG),
500 MFP_XWAY(GPIO17, GPIO, SPI, SDIO, JTAG),
501 MFP_XWAY(GPIO18, GPIO, SPI, SDIO, JTAG),
502 MFP_XWAY(GPIO19, GPIO, PCI, SDIO, MII),
503 MFP_XWAY(GPIO20, GPIO, JTAG, SDIO, MII),
504 MFP_XWAY(GPIO21, GPIO, PCI, EBU, GPT),
505 MFP_XWAY(GPIO22, GPIO, SPI, MCD, MII),
506 MFP_XWAY(GPIO23, GPIO, EBU, PCI, STP),
507 MFP_XWAY(GPIO24, GPIO, EBU, TDM, PCI),
508 MFP_XWAY(GPIO25, GPIO, TDM, SDIO, ASC),
509 MFP_XWAY(GPIO26, GPIO, EBU, TDM, SDIO),
510 MFP_XWAY(GPIO27, GPIO, TDM, SDIO, ASC),
511 MFP_XWAY(GPIO28, GPIO, GPT, MII, SDIO),
512 MFP_XWAY(GPIO29, GPIO, PCI, CBUS, MII),
513 MFP_XWAY(GPIO30, GPIO, PCI, CBUS, MII),
514 MFP_XWAY(GPIO31, GPIO, EBU, PCI, MII),
517 static const unsigned danube_exin_pin_map[] = {GPIO0, GPIO1, GPIO2};
519 static const unsigned danube_pins_exin0[] = {GPIO0};
520 static const unsigned danube_pins_exin1[] = {GPIO1};
521 static const unsigned danube_pins_exin2[] = {GPIO2};
523 static const unsigned danube_pins_jtag[] = {GPIO15, GPIO16, GPIO17, GPIO18, GPIO20};
524 static const unsigned danube_pins_asc0[] = {GPIO11, GPIO12};
525 static const unsigned danube_pins_asc0_cts_rts[] = {GPIO9, GPIO10};
526 static const unsigned danube_pins_stp[] = {GPIO4, GPIO5, GPIO6};
527 static const unsigned danube_pins_nmi[] = {GPIO8};
529 static const unsigned danube_pins_dfe_led0[] = {GPIO4};
530 static const unsigned danube_pins_dfe_led1[] = {GPIO5};
532 static const unsigned danube_pins_ebu_a24[] = {GPIO13};
533 static const unsigned danube_pins_ebu_clk[] = {GPIO21};
534 static const unsigned danube_pins_ebu_cs1[] = {GPIO23};
535 static const unsigned danube_pins_ebu_a23[] = {GPIO24};
536 static const unsigned danube_pins_ebu_wait[] = {GPIO26};
537 static const unsigned danube_pins_ebu_a25[] = {GPIO31};
539 static const unsigned danube_pins_nand_ale[] = {GPIO13};
540 static const unsigned danube_pins_nand_cs1[] = {GPIO23};
541 static const unsigned danube_pins_nand_cle[] = {GPIO24};
543 static const unsigned danube_pins_spi[] = {GPIO16, GPIO17, GPIO18}; /* DEPRECATED */
544 static const unsigned danube_pins_spi_di[] = {GPIO16};
545 static const unsigned danube_pins_spi_do[] = {GPIO17};
546 static const unsigned danube_pins_spi_clk[] = {GPIO18};
547 static const unsigned danube_pins_spi_cs1[] = {GPIO15};
548 static const unsigned danube_pins_spi_cs2[] = {GPIO21};
549 static const unsigned danube_pins_spi_cs3[] = {GPIO13};
550 static const unsigned danube_pins_spi_cs4[] = {GPIO10};
551 static const unsigned danube_pins_spi_cs5[] = {GPIO9};
552 static const unsigned danube_pins_spi_cs6[] = {GPIO11};
554 static const unsigned danube_pins_gpt1[] = {GPIO28};
555 static const unsigned danube_pins_gpt2[] = {GPIO21};
556 static const unsigned danube_pins_gpt3[] = {GPIO6};
558 static const unsigned danube_pins_clkout0[] = {GPIO8};
559 static const unsigned danube_pins_clkout1[] = {GPIO7};
560 static const unsigned danube_pins_clkout2[] = {GPIO3};
561 static const unsigned danube_pins_clkout3[] = {GPIO2};
563 static const unsigned danube_pins_pci_gnt1[] = {GPIO30};
564 static const unsigned danube_pins_pci_gnt2[] = {GPIO23};
565 static const unsigned danube_pins_pci_gnt3[] = {GPIO19};
566 static const unsigned danube_pins_pci_req1[] = {GPIO29};
567 static const unsigned danube_pins_pci_req2[] = {GPIO31};
568 static const unsigned danube_pins_pci_req3[] = {GPIO3};
570 static const struct ltq_pin_group danube_grps[] = {
571 GRP_MUX("exin0", EXIN, danube_pins_exin0),
572 GRP_MUX("exin1", EXIN, danube_pins_exin1),
573 GRP_MUX("exin2", EXIN, danube_pins_exin2),
574 GRP_MUX("jtag", JTAG, danube_pins_jtag),
575 GRP_MUX("ebu a23", EBU, danube_pins_ebu_a23),
576 GRP_MUX("ebu a24", EBU, danube_pins_ebu_a24),
577 GRP_MUX("ebu a25", EBU, danube_pins_ebu_a25),
578 GRP_MUX("ebu clk", EBU, danube_pins_ebu_clk),
579 GRP_MUX("ebu cs1", EBU, danube_pins_ebu_cs1),
580 GRP_MUX("ebu wait", EBU, danube_pins_ebu_wait),
581 GRP_MUX("nand ale", EBU, danube_pins_nand_ale),
582 GRP_MUX("nand cs1", EBU, danube_pins_nand_cs1),
583 GRP_MUX("nand cle", EBU, danube_pins_nand_cle),
584 GRP_MUX("spi", SPI, danube_pins_spi), /* DEPRECATED */
585 GRP_MUX("spi_di", SPI, danube_pins_spi_di),
586 GRP_MUX("spi_do", SPI, danube_pins_spi_do),
587 GRP_MUX("spi_clk", SPI, danube_pins_spi_clk),
588 GRP_MUX("spi_cs1", SPI, danube_pins_spi_cs1),
589 GRP_MUX("spi_cs2", SPI, danube_pins_spi_cs2),
590 GRP_MUX("spi_cs3", SPI, danube_pins_spi_cs3),
591 GRP_MUX("spi_cs4", SPI, danube_pins_spi_cs4),
592 GRP_MUX("spi_cs5", SPI, danube_pins_spi_cs5),
593 GRP_MUX("spi_cs6", SPI, danube_pins_spi_cs6),
594 GRP_MUX("asc0", ASC, danube_pins_asc0),
595 GRP_MUX("asc0 cts rts", ASC, danube_pins_asc0_cts_rts),
596 GRP_MUX("stp", STP, danube_pins_stp),
597 GRP_MUX("nmi", NMI, danube_pins_nmi),
598 GRP_MUX("gpt1", GPT, danube_pins_gpt1),
599 GRP_MUX("gpt2", GPT, danube_pins_gpt2),
600 GRP_MUX("gpt3", GPT, danube_pins_gpt3),
601 GRP_MUX("clkout0", CGU, danube_pins_clkout0),
602 GRP_MUX("clkout1", CGU, danube_pins_clkout1),
603 GRP_MUX("clkout2", CGU, danube_pins_clkout2),
604 GRP_MUX("clkout3", CGU, danube_pins_clkout3),
605 GRP_MUX("gnt1", PCI, danube_pins_pci_gnt1),
606 GRP_MUX("gnt2", PCI, danube_pins_pci_gnt2),
607 GRP_MUX("gnt3", PCI, danube_pins_pci_gnt3),
608 GRP_MUX("req1", PCI, danube_pins_pci_req1),
609 GRP_MUX("req2", PCI, danube_pins_pci_req2),
610 GRP_MUX("req3", PCI, danube_pins_pci_req3),
611 GRP_MUX("dfe led0", DFE, danube_pins_dfe_led0),
612 GRP_MUX("dfe led1", DFE, danube_pins_dfe_led1),
615 static const char * const danube_pci_grps[] = {"gnt1", "gnt2",
616 "gnt3", "req1",
617 "req2", "req3"};
618 static const char * const danube_spi_grps[] = {"spi", /* DEPRECATED */
619 "spi_di", "spi_do",
620 "spi_clk", "spi_cs1",
621 "spi_cs2", "spi_cs3",
622 "spi_cs4", "spi_cs5",
623 "spi_cs6"};
624 static const char * const danube_cgu_grps[] = {"clkout0", "clkout1",
625 "clkout2", "clkout3"};
626 static const char * const danube_ebu_grps[] = {"ebu a23", "ebu a24",
627 "ebu a25", "ebu cs1",
628 "ebu wait", "ebu clk",
629 "nand ale", "nand cs1",
630 "nand cle"};
631 static const char * const danube_dfe_grps[] = {"dfe led0", "dfe led1"};
632 static const char * const danube_exin_grps[] = {"exin0", "exin1", "exin2"};
633 static const char * const danube_gpt_grps[] = {"gpt1", "gpt2", "gpt3"};
634 static const char * const danube_asc_grps[] = {"asc0", "asc0 cts rts"};
635 static const char * const danube_jtag_grps[] = {"jtag"};
636 static const char * const danube_stp_grps[] = {"stp"};
637 static const char * const danube_nmi_grps[] = {"nmi"};
639 static const struct ltq_pmx_func danube_funcs[] = {
640 {"spi", ARRAY_AND_SIZE(danube_spi_grps)},
641 {"asc", ARRAY_AND_SIZE(danube_asc_grps)},
642 {"cgu", ARRAY_AND_SIZE(danube_cgu_grps)},
643 {"jtag", ARRAY_AND_SIZE(danube_jtag_grps)},
644 {"exin", ARRAY_AND_SIZE(danube_exin_grps)},
645 {"stp", ARRAY_AND_SIZE(danube_stp_grps)},
646 {"gpt", ARRAY_AND_SIZE(danube_gpt_grps)},
647 {"nmi", ARRAY_AND_SIZE(danube_nmi_grps)},
648 {"pci", ARRAY_AND_SIZE(danube_pci_grps)},
649 {"ebu", ARRAY_AND_SIZE(danube_ebu_grps)},
650 {"dfe", ARRAY_AND_SIZE(danube_dfe_grps)},
653 /* --------- xrx100 related code --------- */
654 #define XRX100_MAX_PIN 56
656 static const struct ltq_mfp_pin xrx100_mfp[] = {
657 /* pin f0 f1 f2 f3 */
658 MFP_XWAY(GPIO0, GPIO, EXIN, SDIO, TDM),
659 MFP_XWAY(GPIO1, GPIO, EXIN, CBUS, SIN),
660 MFP_XWAY(GPIO2, GPIO, CGU, EXIN, NONE),
661 MFP_XWAY(GPIO3, GPIO, CGU, SDIO, PCI),
662 MFP_XWAY(GPIO4, GPIO, STP, DFE, ASC),
663 MFP_XWAY(GPIO5, GPIO, STP, NONE, DFE),
664 MFP_XWAY(GPIO6, GPIO, STP, GPT, ASC),
665 MFP_XWAY(GPIO7, GPIO, CGU, CBUS, NONE),
666 MFP_XWAY(GPIO8, GPIO, CGU, NMI, NONE),
667 MFP_XWAY(GPIO9, GPIO, ASC, SPI, EXIN),
668 MFP_XWAY(GPIO10, GPIO, ASC, SPI, EXIN),
669 MFP_XWAY(GPIO11, GPIO, ASC, CBUS, SPI),
670 MFP_XWAY(GPIO12, GPIO, ASC, CBUS, MCD),
671 MFP_XWAY(GPIO13, GPIO, EBU, SPI, NONE),
672 MFP_XWAY(GPIO14, GPIO, CGU, NONE, NONE),
673 MFP_XWAY(GPIO15, GPIO, SPI, SDIO, MCD),
674 MFP_XWAY(GPIO16, GPIO, SPI, SDIO, NONE),
675 MFP_XWAY(GPIO17, GPIO, SPI, SDIO, NONE),
676 MFP_XWAY(GPIO18, GPIO, SPI, SDIO, NONE),
677 MFP_XWAY(GPIO19, GPIO, PCI, SDIO, CGU),
678 MFP_XWAY(GPIO20, GPIO, NONE, SDIO, EBU),
679 MFP_XWAY(GPIO21, GPIO, PCI, EBU, GPT),
680 MFP_XWAY(GPIO22, GPIO, SPI, NONE, EBU),
681 MFP_XWAY(GPIO23, GPIO, EBU, PCI, STP),
682 MFP_XWAY(GPIO24, GPIO, EBU, TDM, PCI),
683 MFP_XWAY(GPIO25, GPIO, TDM, SDIO, ASC),
684 MFP_XWAY(GPIO26, GPIO, EBU, TDM, SDIO),
685 MFP_XWAY(GPIO27, GPIO, TDM, SDIO, ASC),
686 MFP_XWAY(GPIO28, GPIO, GPT, NONE, SDIO),
687 MFP_XWAY(GPIO29, GPIO, PCI, CBUS, NONE),
688 MFP_XWAY(GPIO30, GPIO, PCI, CBUS, NONE),
689 MFP_XWAY(GPIO31, GPIO, EBU, PCI, NONE),
690 MFP_XWAY(GPIO32, GPIO, MII, NONE, EBU),
691 MFP_XWAY(GPIO33, GPIO, MII, NONE, EBU),
692 MFP_XWAY(GPIO34, GPIO, SIN, SSI, NONE),
693 MFP_XWAY(GPIO35, GPIO, SIN, SSI, NONE),
694 MFP_XWAY(GPIO36, GPIO, SIN, SSI, NONE),
695 MFP_XWAY(GPIO37, GPIO, PCI, NONE, NONE),
696 MFP_XWAY(GPIO38, GPIO, PCI, NONE, NONE),
697 MFP_XWAY(GPIO39, GPIO, NONE, EXIN, NONE),
698 MFP_XWAY(GPIO40, GPIO, MII, TDM, NONE),
699 MFP_XWAY(GPIO41, GPIO, MII, TDM, NONE),
700 MFP_XWAY(GPIO42, GPIO, MDIO, NONE, NONE),
701 MFP_XWAY(GPIO43, GPIO, MDIO, NONE, NONE),
702 MFP_XWAY(GPIO44, GPIO, MII, SIN, NONE),
703 MFP_XWAY(GPIO45, GPIO, MII, NONE, SIN),
704 MFP_XWAY(GPIO46, GPIO, MII, NONE, EXIN),
705 MFP_XWAY(GPIO47, GPIO, MII, NONE, SIN),
706 MFP_XWAY(GPIO48, GPIO, EBU, NONE, NONE),
707 MFP_XWAY(GPIO49, GPIO, EBU, NONE, NONE),
708 MFP_XWAY(GPIO50, GPIO, NONE, NONE, NONE),
709 MFP_XWAY(GPIO51, GPIO, NONE, NONE, NONE),
710 MFP_XWAY(GPIO52, GPIO, NONE, NONE, NONE),
711 MFP_XWAY(GPIO53, GPIO, NONE, NONE, NONE),
712 MFP_XWAY(GPIO54, GPIO, NONE, NONE, NONE),
713 MFP_XWAY(GPIO55, GPIO, NONE, NONE, NONE),
716 static const unsigned xrx100_exin_pin_map[] = {GPIO0, GPIO1, GPIO2, GPIO39, GPIO10, GPIO9};
718 static const unsigned xrx100_pins_exin0[] = {GPIO0};
719 static const unsigned xrx100_pins_exin1[] = {GPIO1};
720 static const unsigned xrx100_pins_exin2[] = {GPIO2};
721 static const unsigned xrx100_pins_exin3[] = {GPIO39};
722 static const unsigned xrx100_pins_exin4[] = {GPIO10};
723 static const unsigned xrx100_pins_exin5[] = {GPIO9};
725 static const unsigned xrx100_pins_asc0[] = {GPIO11, GPIO12};
726 static const unsigned xrx100_pins_asc0_cts_rts[] = {GPIO9, GPIO10};
727 static const unsigned xrx100_pins_stp[] = {GPIO4, GPIO5, GPIO6};
728 static const unsigned xrx100_pins_nmi[] = {GPIO8};
729 static const unsigned xrx100_pins_mdio[] = {GPIO42, GPIO43};
731 static const unsigned xrx100_pins_dfe_led0[] = {GPIO4};
732 static const unsigned xrx100_pins_dfe_led1[] = {GPIO5};
734 static const unsigned xrx100_pins_ebu_a24[] = {GPIO13};
735 static const unsigned xrx100_pins_ebu_clk[] = {GPIO21};
736 static const unsigned xrx100_pins_ebu_cs1[] = {GPIO23};
737 static const unsigned xrx100_pins_ebu_a23[] = {GPIO24};
738 static const unsigned xrx100_pins_ebu_wait[] = {GPIO26};
739 static const unsigned xrx100_pins_ebu_a25[] = {GPIO31};
741 static const unsigned xrx100_pins_nand_ale[] = {GPIO13};
742 static const unsigned xrx100_pins_nand_cs1[] = {GPIO23};
743 static const unsigned xrx100_pins_nand_cle[] = {GPIO24};
744 static const unsigned xrx100_pins_nand_rdy[] = {GPIO48};
745 static const unsigned xrx100_pins_nand_rd[] = {GPIO49};
747 static const unsigned xrx100_pins_spi_di[] = {GPIO16};
748 static const unsigned xrx100_pins_spi_do[] = {GPIO17};
749 static const unsigned xrx100_pins_spi_clk[] = {GPIO18};
750 static const unsigned xrx100_pins_spi_cs1[] = {GPIO15};
751 static const unsigned xrx100_pins_spi_cs2[] = {GPIO22};
752 static const unsigned xrx100_pins_spi_cs3[] = {GPIO13};
753 static const unsigned xrx100_pins_spi_cs4[] = {GPIO10};
754 static const unsigned xrx100_pins_spi_cs5[] = {GPIO9};
755 static const unsigned xrx100_pins_spi_cs6[] = {GPIO11};
757 static const unsigned xrx100_pins_gpt1[] = {GPIO28};
758 static const unsigned xrx100_pins_gpt2[] = {GPIO21};
759 static const unsigned xrx100_pins_gpt3[] = {GPIO6};
761 static const unsigned xrx100_pins_clkout0[] = {GPIO8};
762 static const unsigned xrx100_pins_clkout1[] = {GPIO7};
763 static const unsigned xrx100_pins_clkout2[] = {GPIO3};
764 static const unsigned xrx100_pins_clkout3[] = {GPIO2};
766 static const unsigned xrx100_pins_pci_gnt1[] = {GPIO30};
767 static const unsigned xrx100_pins_pci_gnt2[] = {GPIO23};
768 static const unsigned xrx100_pins_pci_gnt3[] = {GPIO19};
769 static const unsigned xrx100_pins_pci_gnt4[] = {GPIO38};
770 static const unsigned xrx100_pins_pci_req1[] = {GPIO29};
771 static const unsigned xrx100_pins_pci_req2[] = {GPIO31};
772 static const unsigned xrx100_pins_pci_req3[] = {GPIO3};
773 static const unsigned xrx100_pins_pci_req4[] = {GPIO37};
775 static const struct ltq_pin_group xrx100_grps[] = {
776 GRP_MUX("exin0", EXIN, xrx100_pins_exin0),
777 GRP_MUX("exin1", EXIN, xrx100_pins_exin1),
778 GRP_MUX("exin2", EXIN, xrx100_pins_exin2),
779 GRP_MUX("exin3", EXIN, xrx100_pins_exin3),
780 GRP_MUX("exin4", EXIN, xrx100_pins_exin4),
781 GRP_MUX("exin5", EXIN, xrx100_pins_exin5),
782 GRP_MUX("ebu a23", EBU, xrx100_pins_ebu_a23),
783 GRP_MUX("ebu a24", EBU, xrx100_pins_ebu_a24),
784 GRP_MUX("ebu a25", EBU, xrx100_pins_ebu_a25),
785 GRP_MUX("ebu clk", EBU, xrx100_pins_ebu_clk),
786 GRP_MUX("ebu cs1", EBU, xrx100_pins_ebu_cs1),
787 GRP_MUX("ebu wait", EBU, xrx100_pins_ebu_wait),
788 GRP_MUX("nand ale", EBU, xrx100_pins_nand_ale),
789 GRP_MUX("nand cs1", EBU, xrx100_pins_nand_cs1),
790 GRP_MUX("nand cle", EBU, xrx100_pins_nand_cle),
791 GRP_MUX("nand rdy", EBU, xrx100_pins_nand_rdy),
792 GRP_MUX("nand rd", EBU, xrx100_pins_nand_rd),
793 GRP_MUX("spi_di", SPI, xrx100_pins_spi_di),
794 GRP_MUX("spi_do", SPI, xrx100_pins_spi_do),
795 GRP_MUX("spi_clk", SPI, xrx100_pins_spi_clk),
796 GRP_MUX("spi_cs1", SPI, xrx100_pins_spi_cs1),
797 GRP_MUX("spi_cs2", SPI, xrx100_pins_spi_cs2),
798 GRP_MUX("spi_cs3", SPI, xrx100_pins_spi_cs3),
799 GRP_MUX("spi_cs4", SPI, xrx100_pins_spi_cs4),
800 GRP_MUX("spi_cs5", SPI, xrx100_pins_spi_cs5),
801 GRP_MUX("spi_cs6", SPI, xrx100_pins_spi_cs6),
802 GRP_MUX("asc0", ASC, xrx100_pins_asc0),
803 GRP_MUX("asc0 cts rts", ASC, xrx100_pins_asc0_cts_rts),
804 GRP_MUX("stp", STP, xrx100_pins_stp),
805 GRP_MUX("nmi", NMI, xrx100_pins_nmi),
806 GRP_MUX("gpt1", GPT, xrx100_pins_gpt1),
807 GRP_MUX("gpt2", GPT, xrx100_pins_gpt2),
808 GRP_MUX("gpt3", GPT, xrx100_pins_gpt3),
809 GRP_MUX("clkout0", CGU, xrx100_pins_clkout0),
810 GRP_MUX("clkout1", CGU, xrx100_pins_clkout1),
811 GRP_MUX("clkout2", CGU, xrx100_pins_clkout2),
812 GRP_MUX("clkout3", CGU, xrx100_pins_clkout3),
813 GRP_MUX("gnt1", PCI, xrx100_pins_pci_gnt1),
814 GRP_MUX("gnt2", PCI, xrx100_pins_pci_gnt2),
815 GRP_MUX("gnt3", PCI, xrx100_pins_pci_gnt3),
816 GRP_MUX("gnt4", PCI, xrx100_pins_pci_gnt4),
817 GRP_MUX("req1", PCI, xrx100_pins_pci_req1),
818 GRP_MUX("req2", PCI, xrx100_pins_pci_req2),
819 GRP_MUX("req3", PCI, xrx100_pins_pci_req3),
820 GRP_MUX("req4", PCI, xrx100_pins_pci_req4),
821 GRP_MUX("mdio", MDIO, xrx100_pins_mdio),
822 GRP_MUX("dfe led0", DFE, xrx100_pins_dfe_led0),
823 GRP_MUX("dfe led1", DFE, xrx100_pins_dfe_led1),
826 static const char * const xrx100_pci_grps[] = {"gnt1", "gnt2",
827 "gnt3", "gnt4",
828 "req1", "req2",
829 "req3", "req4"};
830 static const char * const xrx100_spi_grps[] = {"spi_di", "spi_do",
831 "spi_clk", "spi_cs1",
832 "spi_cs2", "spi_cs3",
833 "spi_cs4", "spi_cs5",
834 "spi_cs6"};
835 static const char * const xrx100_cgu_grps[] = {"clkout0", "clkout1",
836 "clkout2", "clkout3"};
837 static const char * const xrx100_ebu_grps[] = {"ebu a23", "ebu a24",
838 "ebu a25", "ebu cs1",
839 "ebu wait", "ebu clk",
840 "nand ale", "nand cs1",
841 "nand cle", "nand rdy",
842 "nand rd"};
843 static const char * const xrx100_exin_grps[] = {"exin0", "exin1", "exin2",
844 "exin3", "exin4", "exin5"};
845 static const char * const xrx100_gpt_grps[] = {"gpt1", "gpt2", "gpt3"};
846 static const char * const xrx100_asc_grps[] = {"asc0", "asc0 cts rts"};
847 static const char * const xrx100_stp_grps[] = {"stp"};
848 static const char * const xrx100_nmi_grps[] = {"nmi"};
849 static const char * const xrx100_mdio_grps[] = {"mdio"};
850 static const char * const xrx100_dfe_grps[] = {"dfe led0", "dfe led1"};
852 static const struct ltq_pmx_func xrx100_funcs[] = {
853 {"spi", ARRAY_AND_SIZE(xrx100_spi_grps)},
854 {"asc", ARRAY_AND_SIZE(xrx100_asc_grps)},
855 {"cgu", ARRAY_AND_SIZE(xrx100_cgu_grps)},
856 {"exin", ARRAY_AND_SIZE(xrx100_exin_grps)},
857 {"stp", ARRAY_AND_SIZE(xrx100_stp_grps)},
858 {"gpt", ARRAY_AND_SIZE(xrx100_gpt_grps)},
859 {"nmi", ARRAY_AND_SIZE(xrx100_nmi_grps)},
860 {"pci", ARRAY_AND_SIZE(xrx100_pci_grps)},
861 {"ebu", ARRAY_AND_SIZE(xrx100_ebu_grps)},
862 {"mdio", ARRAY_AND_SIZE(xrx100_mdio_grps)},
863 {"dfe", ARRAY_AND_SIZE(xrx100_dfe_grps)},
866 /* --------- xrx200 related code --------- */
867 #define XRX200_MAX_PIN 50
869 static const struct ltq_mfp_pin xrx200_mfp[] = {
870 /* pin f0 f1 f2 f3 */
871 MFP_XWAY(GPIO0, GPIO, EXIN, SDIO, TDM),
872 MFP_XWAY(GPIO1, GPIO, EXIN, CBUS, SIN),
873 MFP_XWAY(GPIO2, GPIO, CGU, EXIN, GPHY),
874 MFP_XWAY(GPIO3, GPIO, CGU, SDIO, PCI),
875 MFP_XWAY(GPIO4, GPIO, STP, DFE, USIF),
876 MFP_XWAY(GPIO5, GPIO, STP, GPHY, DFE),
877 MFP_XWAY(GPIO6, GPIO, STP, GPT, USIF),
878 MFP_XWAY(GPIO7, GPIO, CGU, CBUS, GPHY),
879 MFP_XWAY(GPIO8, GPIO, CGU, NMI, NONE),
880 MFP_XWAY(GPIO9, GPIO, USIF, SPI, EXIN),
881 MFP_XWAY(GPIO10, GPIO, USIF, SPI, EXIN),
882 MFP_XWAY(GPIO11, GPIO, USIF, CBUS, SPI),
883 MFP_XWAY(GPIO12, GPIO, USIF, CBUS, MCD),
884 MFP_XWAY(GPIO13, GPIO, EBU, SPI, NONE),
885 MFP_XWAY(GPIO14, GPIO, CGU, CBUS, USIF),
886 MFP_XWAY(GPIO15, GPIO, SPI, SDIO, MCD),
887 MFP_XWAY(GPIO16, GPIO, SPI, SDIO, NONE),
888 MFP_XWAY(GPIO17, GPIO, SPI, SDIO, NONE),
889 MFP_XWAY(GPIO18, GPIO, SPI, SDIO, NONE),
890 MFP_XWAY(GPIO19, GPIO, PCI, SDIO, CGU),
891 MFP_XWAY(GPIO20, GPIO, NONE, SDIO, EBU),
892 MFP_XWAY(GPIO21, GPIO, PCI, EBU, GPT),
893 MFP_XWAY(GPIO22, GPIO, SPI, CGU, EBU),
894 MFP_XWAY(GPIO23, GPIO, EBU, PCI, STP),
895 MFP_XWAY(GPIO24, GPIO, EBU, TDM, PCI),
896 MFP_XWAY(GPIO25, GPIO, TDM, SDIO, USIF),
897 MFP_XWAY(GPIO26, GPIO, EBU, TDM, SDIO),
898 MFP_XWAY(GPIO27, GPIO, TDM, SDIO, USIF),
899 MFP_XWAY(GPIO28, GPIO, GPT, PCI, SDIO),
900 MFP_XWAY(GPIO29, GPIO, PCI, CBUS, EXIN),
901 MFP_XWAY(GPIO30, GPIO, PCI, CBUS, NONE),
902 MFP_XWAY(GPIO31, GPIO, EBU, PCI, NONE),
903 MFP_XWAY(GPIO32, GPIO, MII, NONE, EBU),
904 MFP_XWAY(GPIO33, GPIO, MII, NONE, EBU),
905 MFP_XWAY(GPIO34, GPIO, SIN, SSI, NONE),
906 MFP_XWAY(GPIO35, GPIO, SIN, SSI, NONE),
907 MFP_XWAY(GPIO36, GPIO, SIN, SSI, EXIN),
908 MFP_XWAY(GPIO37, GPIO, USIF, NONE, PCI),
909 MFP_XWAY(GPIO38, GPIO, PCI, USIF, NONE),
910 MFP_XWAY(GPIO39, GPIO, USIF, EXIN, NONE),
911 MFP_XWAY(GPIO40, GPIO, MII, TDM, NONE),
912 MFP_XWAY(GPIO41, GPIO, MII, TDM, NONE),
913 MFP_XWAY(GPIO42, GPIO, MDIO, NONE, NONE),
914 MFP_XWAY(GPIO43, GPIO, MDIO, NONE, NONE),
915 MFP_XWAY(GPIO44, GPIO, MII, SIN, GPHY),
916 MFP_XWAY(GPIO45, GPIO, MII, GPHY, SIN),
917 MFP_XWAY(GPIO46, GPIO, MII, NONE, EXIN),
918 MFP_XWAY(GPIO47, GPIO, MII, GPHY, SIN),
919 MFP_XWAY(GPIO48, GPIO, EBU, NONE, NONE),
920 MFP_XWAY(GPIO49, GPIO, EBU, NONE, NONE),
923 static const unsigned xrx200_exin_pin_map[] = {GPIO0, GPIO1, GPIO2, GPIO39, GPIO10, GPIO9};
925 static const unsigned xrx200_pins_exin0[] = {GPIO0};
926 static const unsigned xrx200_pins_exin1[] = {GPIO1};
927 static const unsigned xrx200_pins_exin2[] = {GPIO2};
928 static const unsigned xrx200_pins_exin3[] = {GPIO39};
929 static const unsigned xrx200_pins_exin4[] = {GPIO10};
930 static const unsigned xrx200_pins_exin5[] = {GPIO9};
932 static const unsigned xrx200_pins_usif_uart_rx[] = {GPIO11};
933 static const unsigned xrx200_pins_usif_uart_tx[] = {GPIO12};
934 static const unsigned xrx200_pins_usif_uart_rts[] = {GPIO9};
935 static const unsigned xrx200_pins_usif_uart_cts[] = {GPIO10};
936 static const unsigned xrx200_pins_usif_uart_dtr[] = {GPIO4};
937 static const unsigned xrx200_pins_usif_uart_dsr[] = {GPIO6};
938 static const unsigned xrx200_pins_usif_uart_dcd[] = {GPIO25};
939 static const unsigned xrx200_pins_usif_uart_ri[] = {GPIO27};
941 static const unsigned xrx200_pins_usif_spi_di[] = {GPIO11};
942 static const unsigned xrx200_pins_usif_spi_do[] = {GPIO12};
943 static const unsigned xrx200_pins_usif_spi_clk[] = {GPIO38};
944 static const unsigned xrx200_pins_usif_spi_cs0[] = {GPIO37};
945 static const unsigned xrx200_pins_usif_spi_cs1[] = {GPIO39};
946 static const unsigned xrx200_pins_usif_spi_cs2[] = {GPIO14};
948 static const unsigned xrx200_pins_stp[] = {GPIO4, GPIO5, GPIO6};
949 static const unsigned xrx200_pins_nmi[] = {GPIO8};
950 static const unsigned xrx200_pins_mdio[] = {GPIO42, GPIO43};
952 static const unsigned xrx200_pins_dfe_led0[] = {GPIO4};
953 static const unsigned xrx200_pins_dfe_led1[] = {GPIO5};
955 static const unsigned xrx200_pins_gphy0_led0[] = {GPIO5};
956 static const unsigned xrx200_pins_gphy0_led1[] = {GPIO7};
957 static const unsigned xrx200_pins_gphy0_led2[] = {GPIO2};
958 static const unsigned xrx200_pins_gphy1_led0[] = {GPIO44};
959 static const unsigned xrx200_pins_gphy1_led1[] = {GPIO45};
960 static const unsigned xrx200_pins_gphy1_led2[] = {GPIO47};
962 static const unsigned xrx200_pins_ebu_a24[] = {GPIO13};
963 static const unsigned xrx200_pins_ebu_clk[] = {GPIO21};
964 static const unsigned xrx200_pins_ebu_cs1[] = {GPIO23};
965 static const unsigned xrx200_pins_ebu_a23[] = {GPIO24};
966 static const unsigned xrx200_pins_ebu_wait[] = {GPIO26};
967 static const unsigned xrx200_pins_ebu_a25[] = {GPIO31};
969 static const unsigned xrx200_pins_nand_ale[] = {GPIO13};
970 static const unsigned xrx200_pins_nand_cs1[] = {GPIO23};
971 static const unsigned xrx200_pins_nand_cle[] = {GPIO24};
972 static const unsigned xrx200_pins_nand_rdy[] = {GPIO48};
973 static const unsigned xrx200_pins_nand_rd[] = {GPIO49};
975 static const unsigned xrx200_pins_spi_di[] = {GPIO16};
976 static const unsigned xrx200_pins_spi_do[] = {GPIO17};
977 static const unsigned xrx200_pins_spi_clk[] = {GPIO18};
978 static const unsigned xrx200_pins_spi_cs1[] = {GPIO15};
979 static const unsigned xrx200_pins_spi_cs2[] = {GPIO22};
980 static const unsigned xrx200_pins_spi_cs3[] = {GPIO13};
981 static const unsigned xrx200_pins_spi_cs4[] = {GPIO10};
982 static const unsigned xrx200_pins_spi_cs5[] = {GPIO9};
983 static const unsigned xrx200_pins_spi_cs6[] = {GPIO11};
985 static const unsigned xrx200_pins_gpt1[] = {GPIO28};
986 static const unsigned xrx200_pins_gpt2[] = {GPIO21};
987 static const unsigned xrx200_pins_gpt3[] = {GPIO6};
989 static const unsigned xrx200_pins_clkout0[] = {GPIO8};
990 static const unsigned xrx200_pins_clkout1[] = {GPIO7};
991 static const unsigned xrx200_pins_clkout2[] = {GPIO3};
992 static const unsigned xrx200_pins_clkout3[] = {GPIO2};
994 static const unsigned xrx200_pins_pci_gnt1[] = {GPIO28};
995 static const unsigned xrx200_pins_pci_gnt2[] = {GPIO23};
996 static const unsigned xrx200_pins_pci_gnt3[] = {GPIO19};
997 static const unsigned xrx200_pins_pci_gnt4[] = {GPIO38};
998 static const unsigned xrx200_pins_pci_req1[] = {GPIO29};
999 static const unsigned xrx200_pins_pci_req2[] = {GPIO31};
1000 static const unsigned xrx200_pins_pci_req3[] = {GPIO3};
1001 static const unsigned xrx200_pins_pci_req4[] = {GPIO37};
1003 static const struct ltq_pin_group xrx200_grps[] = {
1004 GRP_MUX("exin0", EXIN, xrx200_pins_exin0),
1005 GRP_MUX("exin1", EXIN, xrx200_pins_exin1),
1006 GRP_MUX("exin2", EXIN, xrx200_pins_exin2),
1007 GRP_MUX("exin3", EXIN, xrx200_pins_exin3),
1008 GRP_MUX("exin4", EXIN, xrx200_pins_exin4),
1009 GRP_MUX("exin5", EXIN, xrx200_pins_exin5),
1010 GRP_MUX("ebu a23", EBU, xrx200_pins_ebu_a23),
1011 GRP_MUX("ebu a24", EBU, xrx200_pins_ebu_a24),
1012 GRP_MUX("ebu a25", EBU, xrx200_pins_ebu_a25),
1013 GRP_MUX("ebu clk", EBU, xrx200_pins_ebu_clk),
1014 GRP_MUX("ebu cs1", EBU, xrx200_pins_ebu_cs1),
1015 GRP_MUX("ebu wait", EBU, xrx200_pins_ebu_wait),
1016 GRP_MUX("nand ale", EBU, xrx200_pins_nand_ale),
1017 GRP_MUX("nand cs1", EBU, xrx200_pins_nand_cs1),
1018 GRP_MUX("nand cle", EBU, xrx200_pins_nand_cle),
1019 GRP_MUX("nand rdy", EBU, xrx200_pins_nand_rdy),
1020 GRP_MUX("nand rd", EBU, xrx200_pins_nand_rd),
1021 GRP_MUX("spi_di", SPI, xrx200_pins_spi_di),
1022 GRP_MUX("spi_do", SPI, xrx200_pins_spi_do),
1023 GRP_MUX("spi_clk", SPI, xrx200_pins_spi_clk),
1024 GRP_MUX("spi_cs1", SPI, xrx200_pins_spi_cs1),
1025 GRP_MUX("spi_cs2", SPI, xrx200_pins_spi_cs2),
1026 GRP_MUX("spi_cs3", SPI, xrx200_pins_spi_cs3),
1027 GRP_MUX("spi_cs4", SPI, xrx200_pins_spi_cs4),
1028 GRP_MUX("spi_cs5", SPI, xrx200_pins_spi_cs5),
1029 GRP_MUX("spi_cs6", SPI, xrx200_pins_spi_cs6),
1030 GRP_MUX("usif uart_rx", USIF, xrx200_pins_usif_uart_rx),
1031 GRP_MUX("usif uart_tx", USIF, xrx200_pins_usif_uart_tx),
1032 GRP_MUX("usif uart_rts", USIF, xrx200_pins_usif_uart_rts),
1033 GRP_MUX("usif uart_cts", USIF, xrx200_pins_usif_uart_cts),
1034 GRP_MUX("usif uart_dtr", USIF, xrx200_pins_usif_uart_dtr),
1035 GRP_MUX("usif uart_dsr", USIF, xrx200_pins_usif_uart_dsr),
1036 GRP_MUX("usif uart_dcd", USIF, xrx200_pins_usif_uart_dcd),
1037 GRP_MUX("usif uart_ri", USIF, xrx200_pins_usif_uart_ri),
1038 GRP_MUX("usif spi_di", USIF, xrx200_pins_usif_spi_di),
1039 GRP_MUX("usif spi_do", USIF, xrx200_pins_usif_spi_do),
1040 GRP_MUX("usif spi_clk", USIF, xrx200_pins_usif_spi_clk),
1041 GRP_MUX("usif spi_cs0", USIF, xrx200_pins_usif_spi_cs0),
1042 GRP_MUX("usif spi_cs1", USIF, xrx200_pins_usif_spi_cs1),
1043 GRP_MUX("usif spi_cs2", USIF, xrx200_pins_usif_spi_cs2),
1044 GRP_MUX("stp", STP, xrx200_pins_stp),
1045 GRP_MUX("nmi", NMI, xrx200_pins_nmi),
1046 GRP_MUX("gpt1", GPT, xrx200_pins_gpt1),
1047 GRP_MUX("gpt2", GPT, xrx200_pins_gpt2),
1048 GRP_MUX("gpt3", GPT, xrx200_pins_gpt3),
1049 GRP_MUX("clkout0", CGU, xrx200_pins_clkout0),
1050 GRP_MUX("clkout1", CGU, xrx200_pins_clkout1),
1051 GRP_MUX("clkout2", CGU, xrx200_pins_clkout2),
1052 GRP_MUX("clkout3", CGU, xrx200_pins_clkout3),
1053 GRP_MUX("gnt1", PCI, xrx200_pins_pci_gnt1),
1054 GRP_MUX("gnt2", PCI, xrx200_pins_pci_gnt2),
1055 GRP_MUX("gnt3", PCI, xrx200_pins_pci_gnt3),
1056 GRP_MUX("gnt4", PCI, xrx200_pins_pci_gnt4),
1057 GRP_MUX("req1", PCI, xrx200_pins_pci_req1),
1058 GRP_MUX("req2", PCI, xrx200_pins_pci_req2),
1059 GRP_MUX("req3", PCI, xrx200_pins_pci_req3),
1060 GRP_MUX("req4", PCI, xrx200_pins_pci_req4),
1061 GRP_MUX("mdio", MDIO, xrx200_pins_mdio),
1062 GRP_MUX("dfe led0", DFE, xrx200_pins_dfe_led0),
1063 GRP_MUX("dfe led1", DFE, xrx200_pins_dfe_led1),
1064 GRP_MUX("gphy0 led0", GPHY, xrx200_pins_gphy0_led0),
1065 GRP_MUX("gphy0 led1", GPHY, xrx200_pins_gphy0_led1),
1066 GRP_MUX("gphy0 led2", GPHY, xrx200_pins_gphy0_led2),
1067 GRP_MUX("gphy1 led0", GPHY, xrx200_pins_gphy1_led0),
1068 GRP_MUX("gphy1 led1", GPHY, xrx200_pins_gphy1_led1),
1069 GRP_MUX("gphy1 led2", GPHY, xrx200_pins_gphy1_led2),
1072 static const char * const xrx200_pci_grps[] = {"gnt1", "gnt2",
1073 "gnt3", "gnt4",
1074 "req1", "req2",
1075 "req3", "req4"};
1076 static const char * const xrx200_spi_grps[] = {"spi_di", "spi_do",
1077 "spi_clk", "spi_cs1",
1078 "spi_cs2", "spi_cs3",
1079 "spi_cs4", "spi_cs5",
1080 "spi_cs6"};
1081 static const char * const xrx200_cgu_grps[] = {"clkout0", "clkout1",
1082 "clkout2", "clkout3"};
1083 static const char * const xrx200_ebu_grps[] = {"ebu a23", "ebu a24",
1084 "ebu a25", "ebu cs1",
1085 "ebu wait", "ebu clk",
1086 "nand ale", "nand cs1",
1087 "nand cle", "nand rdy",
1088 "nand rd"};
1089 static const char * const xrx200_exin_grps[] = {"exin0", "exin1", "exin2",
1090 "exin3", "exin4", "exin5"};
1091 static const char * const xrx200_gpt_grps[] = {"gpt1", "gpt2", "gpt3"};
1092 static const char * const xrx200_usif_grps[] = {"usif uart_rx", "usif uart_tx",
1093 "usif uart_rts", "usif uart_cts",
1094 "usif uart_dtr", "usif uart_dsr",
1095 "usif uart_dcd", "usif uart_ri",
1096 "usif spi_di", "usif spi_do",
1097 "usif spi_clk", "usif spi_cs0",
1098 "usif spi_cs1", "usif spi_cs2"};
1099 static const char * const xrx200_stp_grps[] = {"stp"};
1100 static const char * const xrx200_nmi_grps[] = {"nmi"};
1101 static const char * const xrx200_mdio_grps[] = {"mdio"};
1102 static const char * const xrx200_dfe_grps[] = {"dfe led0", "dfe led1"};
1103 static const char * const xrx200_gphy_grps[] = {"gphy0 led0", "gphy0 led1",
1104 "gphy0 led2", "gphy1 led0",
1105 "gphy1 led1", "gphy1 led2"};
1107 static const struct ltq_pmx_func xrx200_funcs[] = {
1108 {"spi", ARRAY_AND_SIZE(xrx200_spi_grps)},
1109 {"usif", ARRAY_AND_SIZE(xrx200_usif_grps)},
1110 {"cgu", ARRAY_AND_SIZE(xrx200_cgu_grps)},
1111 {"exin", ARRAY_AND_SIZE(xrx200_exin_grps)},
1112 {"stp", ARRAY_AND_SIZE(xrx200_stp_grps)},
1113 {"gpt", ARRAY_AND_SIZE(xrx200_gpt_grps)},
1114 {"nmi", ARRAY_AND_SIZE(xrx200_nmi_grps)},
1115 {"pci", ARRAY_AND_SIZE(xrx200_pci_grps)},
1116 {"ebu", ARRAY_AND_SIZE(xrx200_ebu_grps)},
1117 {"mdio", ARRAY_AND_SIZE(xrx200_mdio_grps)},
1118 {"dfe", ARRAY_AND_SIZE(xrx200_dfe_grps)},
1119 {"gphy", ARRAY_AND_SIZE(xrx200_gphy_grps)},
1122 /* --------- xrx300 related code --------- */
1123 #define XRX300_MAX_PIN 64
1125 static const struct ltq_mfp_pin xrx300_mfp[] = {
1126 /* pin f0 f1 f2 f3 */
1127 MFP_XWAY(GPIO0, GPIO, EXIN, EPHY, NONE),
1128 MFP_XWAY(GPIO1, GPIO, NONE, EXIN, NONE),
1129 MFP_XWAY(GPIO2, NONE, NONE, NONE, NONE),
1130 MFP_XWAY(GPIO3, GPIO, CGU, NONE, NONE),
1131 MFP_XWAY(GPIO4, GPIO, STP, DFE, NONE),
1132 MFP_XWAY(GPIO5, GPIO, STP, EPHY, DFE),
1133 MFP_XWAY(GPIO6, GPIO, STP, NONE, NONE),
1134 MFP_XWAY(GPIO7, NONE, NONE, NONE, NONE),
1135 MFP_XWAY(GPIO8, GPIO, CGU, GPHY, EPHY),
1136 MFP_XWAY(GPIO9, GPIO, WIFI, NONE, EXIN),
1137 MFP_XWAY(GPIO10, GPIO, USIF, SPI, EXIN),
1138 MFP_XWAY(GPIO11, GPIO, USIF, WIFI, SPI),
1139 MFP_XWAY(GPIO12, NONE, NONE, NONE, NONE),
1140 MFP_XWAY(GPIO13, GPIO, EBU, NONE, NONE),
1141 MFP_XWAY(GPIO14, GPIO, CGU, USIF, EPHY),
1142 MFP_XWAY(GPIO15, GPIO, SPI, NONE, MCD),
1143 MFP_XWAY(GPIO16, GPIO, SPI, EXIN, NONE),
1144 MFP_XWAY(GPIO17, GPIO, SPI, NONE, NONE),
1145 MFP_XWAY(GPIO18, GPIO, SPI, NONE, NONE),
1146 MFP_XWAY(GPIO19, GPIO, USIF, NONE, EPHY),
1147 MFP_XWAY(GPIO20, NONE, NONE, NONE, NONE),
1148 MFP_XWAY(GPIO21, NONE, NONE, NONE, NONE),
1149 MFP_XWAY(GPIO22, NONE, NONE, NONE, NONE),
1150 MFP_XWAY(GPIO23, GPIO, EBU, NONE, NONE),
1151 MFP_XWAY(GPIO24, GPIO, EBU, NONE, NONE),
1152 MFP_XWAY(GPIO25, GPIO, TDM, NONE, NONE),
1153 MFP_XWAY(GPIO26, GPIO, TDM, NONE, NONE),
1154 MFP_XWAY(GPIO27, GPIO, TDM, NONE, NONE),
1155 MFP_XWAY(GPIO28, NONE, NONE, NONE, NONE),
1156 MFP_XWAY(GPIO29, NONE, NONE, NONE, NONE),
1157 MFP_XWAY(GPIO30, NONE, NONE, NONE, NONE),
1158 MFP_XWAY(GPIO31, NONE, NONE, NONE, NONE),
1159 MFP_XWAY(GPIO32, NONE, NONE, NONE, NONE),
1160 MFP_XWAY(GPIO33, NONE, NONE, NONE, NONE),
1161 MFP_XWAY(GPIO34, GPIO, NONE, SSI, NONE),
1162 MFP_XWAY(GPIO35, GPIO, NONE, SSI, NONE),
1163 MFP_XWAY(GPIO36, GPIO, NONE, SSI, NONE),
1164 MFP_XWAY(GPIO37, NONE, NONE, NONE, NONE),
1165 MFP_XWAY(GPIO38, NONE, NONE, NONE, NONE),
1166 MFP_XWAY(GPIO39, NONE, NONE, NONE, NONE),
1167 MFP_XWAY(GPIO40, NONE, NONE, NONE, NONE),
1168 MFP_XWAY(GPIO41, NONE, NONE, NONE, NONE),
1169 MFP_XWAY(GPIO42, GPIO, MDIO, NONE, NONE),
1170 MFP_XWAY(GPIO43, GPIO, MDIO, NONE, NONE),
1171 MFP_XWAY(GPIO44, NONE, NONE, NONE, NONE),
1172 MFP_XWAY(GPIO45, NONE, NONE, NONE, NONE),
1173 MFP_XWAY(GPIO46, NONE, NONE, NONE, NONE),
1174 MFP_XWAY(GPIO47, NONE, NONE, NONE, NONE),
1175 MFP_XWAY(GPIO48, GPIO, EBU, NONE, NONE),
1176 MFP_XWAY(GPIO49, GPIO, EBU, NONE, NONE),
1177 MFP_XWAY(GPIO50, GPIO, EBU, NONE, NONE),
1178 MFP_XWAY(GPIO51, GPIO, EBU, NONE, NONE),
1179 MFP_XWAY(GPIO52, GPIO, EBU, NONE, NONE),
1180 MFP_XWAY(GPIO53, GPIO, EBU, NONE, NONE),
1181 MFP_XWAY(GPIO54, GPIO, EBU, NONE, NONE),
1182 MFP_XWAY(GPIO55, GPIO, EBU, NONE, NONE),
1183 MFP_XWAY(GPIO56, GPIO, EBU, NONE, NONE),
1184 MFP_XWAY(GPIO57, GPIO, EBU, NONE, NONE),
1185 MFP_XWAY(GPIO58, GPIO, EBU, TDM, NONE),
1186 MFP_XWAY(GPIO59, GPIO, EBU, NONE, NONE),
1187 MFP_XWAY(GPIO60, GPIO, EBU, NONE, NONE),
1188 MFP_XWAY(GPIO61, GPIO, EBU, NONE, NONE),
1189 MFP_XWAY(GPIO62, NONE, NONE, NONE, NONE),
1190 MFP_XWAY(GPIO63, NONE, NONE, NONE, NONE),
1193 static const unsigned xrx300_exin_pin_map[] = {GPIO0, GPIO1, GPIO16, GPIO10, GPIO9};
1195 static const unsigned xrx300_pins_exin0[] = {GPIO0};
1196 static const unsigned xrx300_pins_exin1[] = {GPIO1};
1197 static const unsigned xrx300_pins_exin2[] = {GPIO16};
1198 /* EXIN3 is not available on xrX300 */
1199 static const unsigned xrx300_pins_exin4[] = {GPIO10};
1200 static const unsigned xrx300_pins_exin5[] = {GPIO9};
1202 static const unsigned xrx300_pins_usif_uart_rx[] = {GPIO11};
1203 static const unsigned xrx300_pins_usif_uart_tx[] = {GPIO10};
1205 static const unsigned xrx300_pins_usif_spi_di[] = {GPIO11};
1206 static const unsigned xrx300_pins_usif_spi_do[] = {GPIO10};
1207 static const unsigned xrx300_pins_usif_spi_clk[] = {GPIO19};
1208 static const unsigned xrx300_pins_usif_spi_cs0[] = {GPIO14};
1210 static const unsigned xrx300_pins_stp[] = {GPIO4, GPIO5, GPIO6};
1211 static const unsigned xrx300_pins_mdio[] = {GPIO42, GPIO43};
1213 static const unsigned xrx300_pins_dfe_led0[] = {GPIO4};
1214 static const unsigned xrx300_pins_dfe_led1[] = {GPIO5};
1216 static const unsigned xrx300_pins_ephy0_led0[] = {GPIO5};
1217 static const unsigned xrx300_pins_ephy0_led1[] = {GPIO8};
1218 static const unsigned xrx300_pins_ephy1_led0[] = {GPIO14};
1219 static const unsigned xrx300_pins_ephy1_led1[] = {GPIO19};
1221 static const unsigned xrx300_pins_nand_ale[] = {GPIO13};
1222 static const unsigned xrx300_pins_nand_cs1[] = {GPIO23};
1223 static const unsigned xrx300_pins_nand_cle[] = {GPIO24};
1224 static const unsigned xrx300_pins_nand_rdy[] = {GPIO48};
1225 static const unsigned xrx300_pins_nand_rd[] = {GPIO49};
1226 static const unsigned xrx300_pins_nand_d1[] = {GPIO50};
1227 static const unsigned xrx300_pins_nand_d0[] = {GPIO51};
1228 static const unsigned xrx300_pins_nand_d2[] = {GPIO52};
1229 static const unsigned xrx300_pins_nand_d7[] = {GPIO53};
1230 static const unsigned xrx300_pins_nand_d6[] = {GPIO54};
1231 static const unsigned xrx300_pins_nand_d5[] = {GPIO55};
1232 static const unsigned xrx300_pins_nand_d4[] = {GPIO56};
1233 static const unsigned xrx300_pins_nand_d3[] = {GPIO57};
1234 static const unsigned xrx300_pins_nand_cs0[] = {GPIO58};
1235 static const unsigned xrx300_pins_nand_wr[] = {GPIO59};
1236 static const unsigned xrx300_pins_nand_wp[] = {GPIO60};
1237 static const unsigned xrx300_pins_nand_se[] = {GPIO61};
1239 static const unsigned xrx300_pins_spi_di[] = {GPIO16};
1240 static const unsigned xrx300_pins_spi_do[] = {GPIO17};
1241 static const unsigned xrx300_pins_spi_clk[] = {GPIO18};
1242 static const unsigned xrx300_pins_spi_cs1[] = {GPIO15};
1243 /* SPI_CS2 is not available on xrX300 */
1244 /* SPI_CS3 is not available on xrX300 */
1245 static const unsigned xrx300_pins_spi_cs4[] = {GPIO10};
1246 /* SPI_CS5 is not available on xrX300 */
1247 static const unsigned xrx300_pins_spi_cs6[] = {GPIO11};
1249 /* CLKOUT0 is not available on xrX300 */
1250 /* CLKOUT1 is not available on xrX300 */
1251 static const unsigned xrx300_pins_clkout2[] = {GPIO3};
1253 static const struct ltq_pin_group xrx300_grps[] = {
1254 GRP_MUX("exin0", EXIN, xrx300_pins_exin0),
1255 GRP_MUX("exin1", EXIN, xrx300_pins_exin1),
1256 GRP_MUX("exin2", EXIN, xrx300_pins_exin2),
1257 GRP_MUX("exin4", EXIN, xrx300_pins_exin4),
1258 GRP_MUX("exin5", EXIN, xrx300_pins_exin5),
1259 GRP_MUX("nand ale", EBU, xrx300_pins_nand_ale),
1260 GRP_MUX("nand cs1", EBU, xrx300_pins_nand_cs1),
1261 GRP_MUX("nand cle", EBU, xrx300_pins_nand_cle),
1262 GRP_MUX("nand rdy", EBU, xrx300_pins_nand_rdy),
1263 GRP_MUX("nand rd", EBU, xrx300_pins_nand_rd),
1264 GRP_MUX("nand d1", EBU, xrx300_pins_nand_d1),
1265 GRP_MUX("nand d0", EBU, xrx300_pins_nand_d0),
1266 GRP_MUX("nand d2", EBU, xrx300_pins_nand_d2),
1267 GRP_MUX("nand d7", EBU, xrx300_pins_nand_d7),
1268 GRP_MUX("nand d6", EBU, xrx300_pins_nand_d6),
1269 GRP_MUX("nand d5", EBU, xrx300_pins_nand_d5),
1270 GRP_MUX("nand d4", EBU, xrx300_pins_nand_d4),
1271 GRP_MUX("nand d3", EBU, xrx300_pins_nand_d3),
1272 GRP_MUX("nand cs0", EBU, xrx300_pins_nand_cs0),
1273 GRP_MUX("nand wr", EBU, xrx300_pins_nand_wr),
1274 GRP_MUX("nand wp", EBU, xrx300_pins_nand_wp),
1275 GRP_MUX("nand se", EBU, xrx300_pins_nand_se),
1276 GRP_MUX("spi_di", SPI, xrx300_pins_spi_di),
1277 GRP_MUX("spi_do", SPI, xrx300_pins_spi_do),
1278 GRP_MUX("spi_clk", SPI, xrx300_pins_spi_clk),
1279 GRP_MUX("spi_cs1", SPI, xrx300_pins_spi_cs1),
1280 GRP_MUX("spi_cs4", SPI, xrx300_pins_spi_cs4),
1281 GRP_MUX("spi_cs6", SPI, xrx300_pins_spi_cs6),
1282 GRP_MUX("usif uart_rx", USIF, xrx300_pins_usif_uart_rx),
1283 GRP_MUX("usif uart_tx", USIF, xrx300_pins_usif_uart_tx),
1284 GRP_MUX("usif spi_di", USIF, xrx300_pins_usif_spi_di),
1285 GRP_MUX("usif spi_do", USIF, xrx300_pins_usif_spi_do),
1286 GRP_MUX("usif spi_clk", USIF, xrx300_pins_usif_spi_clk),
1287 GRP_MUX("usif spi_cs0", USIF, xrx300_pins_usif_spi_cs0),
1288 GRP_MUX("stp", STP, xrx300_pins_stp),
1289 GRP_MUX("clkout2", CGU, xrx300_pins_clkout2),
1290 GRP_MUX("mdio", MDIO, xrx300_pins_mdio),
1291 GRP_MUX("dfe led0", DFE, xrx300_pins_dfe_led0),
1292 GRP_MUX("dfe led1", DFE, xrx300_pins_dfe_led1),
1293 GRP_MUX("ephy0 led0", GPHY, xrx300_pins_ephy0_led0),
1294 GRP_MUX("ephy0 led1", GPHY, xrx300_pins_ephy0_led1),
1295 GRP_MUX("ephy1 led0", GPHY, xrx300_pins_ephy1_led0),
1296 GRP_MUX("ephy1 led1", GPHY, xrx300_pins_ephy1_led1),
1299 static const char * const xrx300_spi_grps[] = {"spi_di", "spi_do",
1300 "spi_clk", "spi_cs1",
1301 "spi_cs4", "spi_cs6"};
1302 static const char * const xrx300_cgu_grps[] = {"clkout2"};
1303 static const char * const xrx300_ebu_grps[] = {"nand ale", "nand cs1",
1304 "nand cle", "nand rdy",
1305 "nand rd", "nand d1",
1306 "nand d0", "nand d2",
1307 "nand d7", "nand d6",
1308 "nand d5", "nand d4",
1309 "nand d3", "nand cs0",
1310 "nand wr", "nand wp",
1311 "nand se"};
1312 static const char * const xrx300_exin_grps[] = {"exin0", "exin1", "exin2",
1313 "exin4", "exin5"};
1314 static const char * const xrx300_usif_grps[] = {"usif uart_rx", "usif uart_tx",
1315 "usif spi_di", "usif spi_do",
1316 "usif spi_clk", "usif spi_cs0"};
1317 static const char * const xrx300_stp_grps[] = {"stp"};
1318 static const char * const xrx300_mdio_grps[] = {"mdio"};
1319 static const char * const xrx300_dfe_grps[] = {"dfe led0", "dfe led1"};
1320 static const char * const xrx300_gphy_grps[] = {"ephy0 led0", "ephy0 led1",
1321 "ephy1 led0", "ephy1 led1"};
1323 static const struct ltq_pmx_func xrx300_funcs[] = {
1324 {"spi", ARRAY_AND_SIZE(xrx300_spi_grps)},
1325 {"usif", ARRAY_AND_SIZE(xrx300_usif_grps)},
1326 {"cgu", ARRAY_AND_SIZE(xrx300_cgu_grps)},
1327 {"exin", ARRAY_AND_SIZE(xrx300_exin_grps)},
1328 {"stp", ARRAY_AND_SIZE(xrx300_stp_grps)},
1329 {"ebu", ARRAY_AND_SIZE(xrx300_ebu_grps)},
1330 {"mdio", ARRAY_AND_SIZE(xrx300_mdio_grps)},
1331 {"dfe", ARRAY_AND_SIZE(xrx300_dfe_grps)},
1332 {"ephy", ARRAY_AND_SIZE(xrx300_gphy_grps)},
1335 /* --------- pinconf related code --------- */
1336 static int xway_pinconf_get(struct pinctrl_dev *pctldev,
1337 unsigned pin,
1338 unsigned long *config)
1340 struct ltq_pinmux_info *info = pinctrl_dev_get_drvdata(pctldev);
1341 enum ltq_pinconf_param param = LTQ_PINCONF_UNPACK_PARAM(*config);
1342 int port = PORT(pin);
1343 u32 reg;
1345 switch (param) {
1346 case LTQ_PINCONF_PARAM_OPEN_DRAIN:
1347 if (port == PORT3)
1348 reg = GPIO3_OD;
1349 else
1350 reg = GPIO_OD(pin);
1351 *config = LTQ_PINCONF_PACK(param,
1352 !gpio_getbit(info->membase[0], reg, PORT_PIN(pin)));
1353 break;
1355 case LTQ_PINCONF_PARAM_PULL:
1356 if (port == PORT3)
1357 reg = GPIO3_PUDEN;
1358 else
1359 reg = GPIO_PUDEN(pin);
1360 if (!gpio_getbit(info->membase[0], reg, PORT_PIN(pin))) {
1361 *config = LTQ_PINCONF_PACK(param, 0);
1362 break;
1365 if (port == PORT3)
1366 reg = GPIO3_PUDSEL;
1367 else
1368 reg = GPIO_PUDSEL(pin);
1369 if (!gpio_getbit(info->membase[0], reg, PORT_PIN(pin)))
1370 *config = LTQ_PINCONF_PACK(param, 2);
1371 else
1372 *config = LTQ_PINCONF_PACK(param, 1);
1373 break;
1375 case LTQ_PINCONF_PARAM_OUTPUT:
1376 reg = GPIO_DIR(pin);
1377 *config = LTQ_PINCONF_PACK(param,
1378 gpio_getbit(info->membase[0], reg, PORT_PIN(pin)));
1379 break;
1380 default:
1381 dev_err(pctldev->dev, "Invalid config param %04x\n", param);
1382 return -ENOTSUPP;
1384 return 0;
1387 static int xway_pinconf_set(struct pinctrl_dev *pctldev,
1388 unsigned pin,
1389 unsigned long *configs,
1390 unsigned num_configs)
1392 struct ltq_pinmux_info *info = pinctrl_dev_get_drvdata(pctldev);
1393 enum ltq_pinconf_param param;
1394 int arg;
1395 int port = PORT(pin);
1396 u32 reg;
1397 int i;
1399 for (i = 0; i < num_configs; i++) {
1400 param = LTQ_PINCONF_UNPACK_PARAM(configs[i]);
1401 arg = LTQ_PINCONF_UNPACK_ARG(configs[i]);
1403 switch (param) {
1404 case LTQ_PINCONF_PARAM_OPEN_DRAIN:
1405 if (port == PORT3)
1406 reg = GPIO3_OD;
1407 else
1408 reg = GPIO_OD(pin);
1409 if (arg == 0)
1410 gpio_setbit(info->membase[0],
1411 reg,
1412 PORT_PIN(pin));
1413 else
1414 gpio_clearbit(info->membase[0],
1415 reg,
1416 PORT_PIN(pin));
1417 break;
1419 case LTQ_PINCONF_PARAM_PULL:
1420 if (port == PORT3)
1421 reg = GPIO3_PUDEN;
1422 else
1423 reg = GPIO_PUDEN(pin);
1424 if (arg == 0) {
1425 gpio_clearbit(info->membase[0],
1426 reg,
1427 PORT_PIN(pin));
1428 break;
1430 gpio_setbit(info->membase[0], reg, PORT_PIN(pin));
1432 if (port == PORT3)
1433 reg = GPIO3_PUDSEL;
1434 else
1435 reg = GPIO_PUDSEL(pin);
1436 if (arg == 1)
1437 gpio_clearbit(info->membase[0],
1438 reg,
1439 PORT_PIN(pin));
1440 else if (arg == 2)
1441 gpio_setbit(info->membase[0],
1442 reg,
1443 PORT_PIN(pin));
1444 else
1445 dev_err(pctldev->dev,
1446 "Invalid pull value %d\n", arg);
1447 break;
1449 case LTQ_PINCONF_PARAM_OUTPUT:
1450 reg = GPIO_DIR(pin);
1451 if (arg == 0)
1452 gpio_clearbit(info->membase[0],
1453 reg,
1454 PORT_PIN(pin));
1455 else
1456 gpio_setbit(info->membase[0],
1457 reg,
1458 PORT_PIN(pin));
1459 break;
1461 default:
1462 dev_err(pctldev->dev,
1463 "Invalid config param %04x\n", param);
1464 return -ENOTSUPP;
1466 } /* for each config */
1468 return 0;
1471 int xway_pinconf_group_set(struct pinctrl_dev *pctldev,
1472 unsigned selector,
1473 unsigned long *configs,
1474 unsigned num_configs)
1476 struct ltq_pinmux_info *info = pinctrl_dev_get_drvdata(pctldev);
1477 int i, ret = 0;
1479 for (i = 0; i < info->grps[selector].npins && !ret; i++)
1480 ret = xway_pinconf_set(pctldev,
1481 info->grps[selector].pins[i],
1482 configs,
1483 num_configs);
1485 return ret;
1488 static const struct pinconf_ops xway_pinconf_ops = {
1489 .pin_config_get = xway_pinconf_get,
1490 .pin_config_set = xway_pinconf_set,
1491 .pin_config_group_set = xway_pinconf_group_set,
1494 static struct pinctrl_desc xway_pctrl_desc = {
1495 .owner = THIS_MODULE,
1496 .confops = &xway_pinconf_ops,
1499 static inline int xway_mux_apply(struct pinctrl_dev *pctrldev,
1500 int pin, int mux)
1502 struct ltq_pinmux_info *info = pinctrl_dev_get_drvdata(pctrldev);
1503 int port = PORT(pin);
1504 u32 alt1_reg = GPIO_ALT1(pin);
1506 if (port == PORT3)
1507 alt1_reg = GPIO3_ALT1;
1509 if (mux & MUX_ALT0)
1510 gpio_setbit(info->membase[0], GPIO_ALT0(pin), PORT_PIN(pin));
1511 else
1512 gpio_clearbit(info->membase[0], GPIO_ALT0(pin), PORT_PIN(pin));
1514 if (mux & MUX_ALT1)
1515 gpio_setbit(info->membase[0], alt1_reg, PORT_PIN(pin));
1516 else
1517 gpio_clearbit(info->membase[0], alt1_reg, PORT_PIN(pin));
1519 return 0;
1522 static const struct ltq_cfg_param xway_cfg_params[] = {
1523 {"lantiq,pull", LTQ_PINCONF_PARAM_PULL},
1524 {"lantiq,open-drain", LTQ_PINCONF_PARAM_OPEN_DRAIN},
1525 {"lantiq,output", LTQ_PINCONF_PARAM_OUTPUT},
1528 static struct ltq_pinmux_info xway_info = {
1529 .desc = &xway_pctrl_desc,
1530 .apply_mux = xway_mux_apply,
1531 .params = xway_cfg_params,
1532 .num_params = ARRAY_SIZE(xway_cfg_params),
1535 /* --------- gpio_chip related code --------- */
1536 static void xway_gpio_set(struct gpio_chip *chip, unsigned int pin, int val)
1538 struct ltq_pinmux_info *info = dev_get_drvdata(chip->parent);
1540 if (val)
1541 gpio_setbit(info->membase[0], GPIO_OUT(pin), PORT_PIN(pin));
1542 else
1543 gpio_clearbit(info->membase[0], GPIO_OUT(pin), PORT_PIN(pin));
1546 static int xway_gpio_get(struct gpio_chip *chip, unsigned int pin)
1548 struct ltq_pinmux_info *info = dev_get_drvdata(chip->parent);
1550 return !!gpio_getbit(info->membase[0], GPIO_IN(pin), PORT_PIN(pin));
1553 static int xway_gpio_dir_in(struct gpio_chip *chip, unsigned int pin)
1555 struct ltq_pinmux_info *info = dev_get_drvdata(chip->parent);
1557 gpio_clearbit(info->membase[0], GPIO_DIR(pin), PORT_PIN(pin));
1559 return 0;
1562 static int xway_gpio_dir_out(struct gpio_chip *chip, unsigned int pin, int val)
1564 struct ltq_pinmux_info *info = dev_get_drvdata(chip->parent);
1566 if (PORT(pin) == PORT3)
1567 gpio_setbit(info->membase[0], GPIO3_OD, PORT_PIN(pin));
1568 else
1569 gpio_setbit(info->membase[0], GPIO_OD(pin), PORT_PIN(pin));
1570 gpio_setbit(info->membase[0], GPIO_DIR(pin), PORT_PIN(pin));
1571 xway_gpio_set(chip, pin, val);
1573 return 0;
1577 * gpiolib gpiod_to_irq callback function.
1578 * Returns the mapped IRQ (external interrupt) number for a given GPIO pin.
1580 static int xway_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
1582 struct ltq_pinmux_info *info = dev_get_drvdata(chip->parent);
1583 int i;
1585 for (i = 0; i < info->num_exin; i++)
1586 if (info->exin[i] == offset)
1587 return ltq_eiu_get_irq(i);
1589 return -1;
1592 static struct gpio_chip xway_chip = {
1593 .label = "gpio-xway",
1594 .direction_input = xway_gpio_dir_in,
1595 .direction_output = xway_gpio_dir_out,
1596 .get = xway_gpio_get,
1597 .set = xway_gpio_set,
1598 .request = gpiochip_generic_request,
1599 .free = gpiochip_generic_free,
1600 .to_irq = xway_gpio_to_irq,
1601 .base = -1,
1605 /* --------- register the pinctrl layer --------- */
1606 struct pinctrl_xway_soc {
1607 int pin_count;
1608 const struct ltq_mfp_pin *mfp;
1609 const struct ltq_pin_group *grps;
1610 unsigned int num_grps;
1611 const struct ltq_pmx_func *funcs;
1612 unsigned int num_funcs;
1613 const unsigned *exin;
1614 unsigned int num_exin;
1617 /* xway xr9 series (DEPRECATED: Use XWAY xRX100/xRX200 Family) */
1618 static struct pinctrl_xway_soc xr9_pinctrl = {
1619 .pin_count = XR9_MAX_PIN,
1620 .mfp = xway_mfp,
1621 .grps = xway_grps,
1622 .num_grps = ARRAY_SIZE(xway_grps),
1623 .funcs = xrx_funcs,
1624 .num_funcs = ARRAY_SIZE(xrx_funcs),
1625 .exin = xway_exin_pin_map,
1626 .num_exin = 6
1629 /* XWAY AMAZON Family */
1630 static struct pinctrl_xway_soc ase_pinctrl = {
1631 .pin_count = ASE_MAX_PIN,
1632 .mfp = ase_mfp,
1633 .grps = ase_grps,
1634 .num_grps = ARRAY_SIZE(ase_grps),
1635 .funcs = ase_funcs,
1636 .num_funcs = ARRAY_SIZE(ase_funcs),
1637 .exin = ase_exin_pin_map,
1638 .num_exin = 3
1641 /* XWAY DANUBE Family */
1642 static struct pinctrl_xway_soc danube_pinctrl = {
1643 .pin_count = DANUBE_MAX_PIN,
1644 .mfp = danube_mfp,
1645 .grps = danube_grps,
1646 .num_grps = ARRAY_SIZE(danube_grps),
1647 .funcs = danube_funcs,
1648 .num_funcs = ARRAY_SIZE(danube_funcs),
1649 .exin = danube_exin_pin_map,
1650 .num_exin = 3
1653 /* XWAY xRX100 Family */
1654 static struct pinctrl_xway_soc xrx100_pinctrl = {
1655 .pin_count = XRX100_MAX_PIN,
1656 .mfp = xrx100_mfp,
1657 .grps = xrx100_grps,
1658 .num_grps = ARRAY_SIZE(xrx100_grps),
1659 .funcs = xrx100_funcs,
1660 .num_funcs = ARRAY_SIZE(xrx100_funcs),
1661 .exin = xrx100_exin_pin_map,
1662 .num_exin = 6
1665 /* XWAY xRX200 Family */
1666 static struct pinctrl_xway_soc xrx200_pinctrl = {
1667 .pin_count = XRX200_MAX_PIN,
1668 .mfp = xrx200_mfp,
1669 .grps = xrx200_grps,
1670 .num_grps = ARRAY_SIZE(xrx200_grps),
1671 .funcs = xrx200_funcs,
1672 .num_funcs = ARRAY_SIZE(xrx200_funcs),
1673 .exin = xrx200_exin_pin_map,
1674 .num_exin = 6
1677 /* XWAY xRX300 Family */
1678 static struct pinctrl_xway_soc xrx300_pinctrl = {
1679 .pin_count = XRX300_MAX_PIN,
1680 .mfp = xrx300_mfp,
1681 .grps = xrx300_grps,
1682 .num_grps = ARRAY_SIZE(xrx300_grps),
1683 .funcs = xrx300_funcs,
1684 .num_funcs = ARRAY_SIZE(xrx300_funcs),
1685 .exin = xrx300_exin_pin_map,
1686 .num_exin = 5
1689 static struct pinctrl_gpio_range xway_gpio_range = {
1690 .name = "XWAY GPIO",
1691 .gc = &xway_chip,
1694 static const struct of_device_id xway_match[] = {
1695 { .compatible = "lantiq,pinctrl-xway", .data = &danube_pinctrl}, /*DEPRECATED*/
1696 { .compatible = "lantiq,pinctrl-xr9", .data = &xr9_pinctrl}, /*DEPRECATED*/
1697 { .compatible = "lantiq,pinctrl-ase", .data = &ase_pinctrl}, /*DEPRECATED*/
1698 { .compatible = "lantiq,ase-pinctrl", .data = &ase_pinctrl},
1699 { .compatible = "lantiq,danube-pinctrl", .data = &danube_pinctrl},
1700 { .compatible = "lantiq,xrx100-pinctrl", .data = &xrx100_pinctrl},
1701 { .compatible = "lantiq,xrx200-pinctrl", .data = &xrx200_pinctrl},
1702 { .compatible = "lantiq,xrx300-pinctrl", .data = &xrx300_pinctrl},
1705 MODULE_DEVICE_TABLE(of, xway_match);
1707 static int pinmux_xway_probe(struct platform_device *pdev)
1709 const struct of_device_id *match;
1710 const struct pinctrl_xway_soc *xway_soc;
1711 struct resource *res;
1712 int ret, i;
1714 /* get and remap our register range */
1715 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1716 xway_info.membase[0] = devm_ioremap_resource(&pdev->dev, res);
1717 if (IS_ERR(xway_info.membase[0]))
1718 return PTR_ERR(xway_info.membase[0]);
1720 match = of_match_device(xway_match, &pdev->dev);
1721 if (match)
1722 xway_soc = (const struct pinctrl_xway_soc *) match->data;
1723 else
1724 xway_soc = &danube_pinctrl;
1726 /* find out how many pads we have */
1727 xway_chip.ngpio = xway_soc->pin_count;
1729 /* load our pad descriptors */
1730 xway_info.pads = devm_kcalloc(&pdev->dev,
1731 xway_chip.ngpio, sizeof(struct pinctrl_pin_desc),
1732 GFP_KERNEL);
1733 if (!xway_info.pads)
1734 return -ENOMEM;
1736 for (i = 0; i < xway_chip.ngpio; i++) {
1737 /* strlen("ioXY") + 1 = 5 */
1738 char *name = devm_kzalloc(&pdev->dev, 5, GFP_KERNEL);
1740 if (!name)
1741 return -ENOMEM;
1743 snprintf(name, 5, "io%d", i);
1744 xway_info.pads[i].number = GPIO0 + i;
1745 xway_info.pads[i].name = name;
1747 xway_pctrl_desc.pins = xway_info.pads;
1749 /* register the gpio chip */
1750 xway_chip.parent = &pdev->dev;
1751 ret = devm_gpiochip_add_data(&pdev->dev, &xway_chip, NULL);
1752 if (ret) {
1753 dev_err(&pdev->dev, "Failed to register gpio chip\n");
1754 return ret;
1757 /* setup the data needed by pinctrl */
1758 xway_pctrl_desc.name = dev_name(&pdev->dev);
1759 xway_pctrl_desc.npins = xway_chip.ngpio;
1761 xway_info.num_pads = xway_chip.ngpio;
1762 xway_info.num_mfp = xway_chip.ngpio;
1763 xway_info.mfp = xway_soc->mfp;
1764 xway_info.grps = xway_soc->grps;
1765 xway_info.num_grps = xway_soc->num_grps;
1766 xway_info.funcs = xway_soc->funcs;
1767 xway_info.num_funcs = xway_soc->num_funcs;
1768 xway_info.exin = xway_soc->exin;
1769 xway_info.num_exin = xway_soc->num_exin;
1771 /* register with the generic lantiq layer */
1772 ret = ltq_pinctrl_register(pdev, &xway_info);
1773 if (ret) {
1774 dev_err(&pdev->dev, "Failed to register pinctrl driver\n");
1775 return ret;
1778 /* finish with registering the gpio range in pinctrl */
1779 xway_gpio_range.npins = xway_chip.ngpio;
1780 xway_gpio_range.base = xway_chip.base;
1781 pinctrl_add_gpio_range(xway_info.pctrl, &xway_gpio_range);
1782 dev_info(&pdev->dev, "Init done\n");
1783 return 0;
1786 static struct platform_driver pinmux_xway_driver = {
1787 .probe = pinmux_xway_probe,
1788 .driver = {
1789 .name = "pinctrl-xway",
1790 .of_match_table = xway_match,
1794 static int __init pinmux_xway_init(void)
1796 return platform_driver_register(&pinmux_xway_driver);
1799 core_initcall_sync(pinmux_xway_init);