11d0ea069SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
23f8c50c9SJohn Crispin /*
33f8c50c9SJohn Crispin * linux/drivers/pinctrl/pinmux-xway.c
43f8c50c9SJohn Crispin * based on linux/drivers/pinctrl/pinmux-pxa910.c
53f8c50c9SJohn Crispin *
655e40950SJohn Crispin * Copyright (C) 2012 John Crispin <john@phrozen.org>
7be14811cSMartin Schiller * Copyright (C) 2015 Martin Schiller <mschiller@tdt.de>
83f8c50c9SJohn Crispin */
93f8c50c9SJohn Crispin
109e0c1fb2SThierry Reding #include <linux/err.h>
11c8b68d52SAndy Shevchenko #include <linux/gpio/driver.h>
123f8c50c9SJohn Crispin #include <linux/slab.h>
133f8c50c9SJohn Crispin #include <linux/module.h>
14*ccc7cdf4SRob Herring #include <linux/of.h>
153f8c50c9SJohn Crispin #include <linux/ioport.h>
163f8c50c9SJohn Crispin #include <linux/io.h>
173f8c50c9SJohn Crispin #include <linux/device.h>
183f8c50c9SJohn Crispin #include <linux/platform_device.h>
19*ccc7cdf4SRob Herring #include <linux/property.h>
203f8c50c9SJohn Crispin
213f8c50c9SJohn Crispin #include "pinctrl-lantiq.h"
223f8c50c9SJohn Crispin
233f8c50c9SJohn Crispin #include <lantiq_soc.h>
243f8c50c9SJohn Crispin
25be14811cSMartin Schiller /* we have up to 4 banks of 16 bit each */
263f8c50c9SJohn Crispin #define PINS 16
273f8c50c9SJohn Crispin #define PORT3 3
283f8c50c9SJohn Crispin #define PORT(x) (x / PINS)
293f8c50c9SJohn Crispin #define PORT_PIN(x) (x % PINS)
303f8c50c9SJohn Crispin
313f8c50c9SJohn Crispin /* we have 2 mux bits that can be set for each pin */
323f8c50c9SJohn Crispin #define MUX_ALT0 0x1
333f8c50c9SJohn Crispin #define MUX_ALT1 0x2
343f8c50c9SJohn Crispin
353f8c50c9SJohn Crispin /*
36be14811cSMartin Schiller * each bank has this offset apart from the 4th bank that is mixed into the
373f8c50c9SJohn Crispin * other 3 ranges
383f8c50c9SJohn Crispin */
393f8c50c9SJohn Crispin #define REG_OFF 0x30
403f8c50c9SJohn Crispin
413f8c50c9SJohn Crispin /* these are the offsets to our registers */
423f8c50c9SJohn Crispin #define GPIO_BASE(p) (REG_OFF * PORT(p))
433f8c50c9SJohn Crispin #define GPIO_OUT(p) GPIO_BASE(p)
443f8c50c9SJohn Crispin #define GPIO_IN(p) (GPIO_BASE(p) + 0x04)
453f8c50c9SJohn Crispin #define GPIO_DIR(p) (GPIO_BASE(p) + 0x08)
463f8c50c9SJohn Crispin #define GPIO_ALT0(p) (GPIO_BASE(p) + 0x0C)
473f8c50c9SJohn Crispin #define GPIO_ALT1(p) (GPIO_BASE(p) + 0x10)
483f8c50c9SJohn Crispin #define GPIO_OD(p) (GPIO_BASE(p) + 0x14)
493f8c50c9SJohn Crispin #define GPIO_PUDSEL(p) (GPIO_BASE(p) + 0x1c)
503f8c50c9SJohn Crispin #define GPIO_PUDEN(p) (GPIO_BASE(p) + 0x20)
513f8c50c9SJohn Crispin
52be14811cSMartin Schiller /* the 4th port needs special offsets for some registers */
533f8c50c9SJohn Crispin #define GPIO3_OD (GPIO_BASE(0) + 0x24)
543f8c50c9SJohn Crispin #define GPIO3_PUDSEL (GPIO_BASE(0) + 0x28)
553f8c50c9SJohn Crispin #define GPIO3_PUDEN (GPIO_BASE(0) + 0x2C)
563f8c50c9SJohn Crispin #define GPIO3_ALT1 (GPIO_BASE(PINS) + 0x24)
573f8c50c9SJohn Crispin
583f8c50c9SJohn Crispin /* macros to help us access the registers */
593f8c50c9SJohn Crispin #define gpio_getbit(m, r, p) (!!(ltq_r32(m + r) & BIT(p)))
603f8c50c9SJohn Crispin #define gpio_setbit(m, r, p) ltq_w32_mask(0, BIT(p), m + r)
613f8c50c9SJohn Crispin #define gpio_clearbit(m, r, p) ltq_w32_mask(BIT(p), 0, m + r)
623f8c50c9SJohn Crispin
633f8c50c9SJohn Crispin #define MFP_XWAY(a, f0, f1, f2, f3) \
643f8c50c9SJohn Crispin { \
653f8c50c9SJohn Crispin .name = #a, \
663f8c50c9SJohn Crispin .pin = a, \
673f8c50c9SJohn Crispin .func = { \
683f8c50c9SJohn Crispin XWAY_MUX_##f0, \
693f8c50c9SJohn Crispin XWAY_MUX_##f1, \
703f8c50c9SJohn Crispin XWAY_MUX_##f2, \
713f8c50c9SJohn Crispin XWAY_MUX_##f3, \
723f8c50c9SJohn Crispin }, \
733f8c50c9SJohn Crispin }
743f8c50c9SJohn Crispin
753f8c50c9SJohn Crispin #define GRP_MUX(a, m, p) \
763f8c50c9SJohn Crispin { .name = a, .mux = XWAY_MUX_##m, .pins = p, .npins = ARRAY_SIZE(p), }
773f8c50c9SJohn Crispin
783f8c50c9SJohn Crispin #define FUNC_MUX(f, m) \
793f8c50c9SJohn Crispin { .func = f, .mux = XWAY_MUX_##m, }
803f8c50c9SJohn Crispin
813f8c50c9SJohn Crispin enum xway_mux {
823f8c50c9SJohn Crispin XWAY_MUX_GPIO = 0,
833f8c50c9SJohn Crispin XWAY_MUX_SPI,
843f8c50c9SJohn Crispin XWAY_MUX_ASC,
85be14811cSMartin Schiller XWAY_MUX_USIF,
863f8c50c9SJohn Crispin XWAY_MUX_PCI,
87be14811cSMartin Schiller XWAY_MUX_CBUS,
883f8c50c9SJohn Crispin XWAY_MUX_CGU,
893f8c50c9SJohn Crispin XWAY_MUX_EBU,
90be14811cSMartin Schiller XWAY_MUX_EBU2,
913f8c50c9SJohn Crispin XWAY_MUX_JTAG,
92be14811cSMartin Schiller XWAY_MUX_MCD,
933f8c50c9SJohn Crispin XWAY_MUX_EXIN,
943f8c50c9SJohn Crispin XWAY_MUX_TDM,
953f8c50c9SJohn Crispin XWAY_MUX_STP,
963f8c50c9SJohn Crispin XWAY_MUX_SIN,
973f8c50c9SJohn Crispin XWAY_MUX_GPT,
983f8c50c9SJohn Crispin XWAY_MUX_NMI,
993f8c50c9SJohn Crispin XWAY_MUX_MDIO,
1003f8c50c9SJohn Crispin XWAY_MUX_MII,
1013f8c50c9SJohn Crispin XWAY_MUX_EPHY,
1023f8c50c9SJohn Crispin XWAY_MUX_DFE,
1033f8c50c9SJohn Crispin XWAY_MUX_SDIO,
1040fabc835SJohn Crispin XWAY_MUX_GPHY,
105be14811cSMartin Schiller XWAY_MUX_SSI,
106be14811cSMartin Schiller XWAY_MUX_WIFI,
1073f8c50c9SJohn Crispin XWAY_MUX_NONE = 0xffff,
1083f8c50c9SJohn Crispin };
1093f8c50c9SJohn Crispin
110be14811cSMartin Schiller /* --------- ase related code --------- */
111be14811cSMartin Schiller #define ASE_MAX_PIN 32
112be14811cSMartin Schiller
113be14811cSMartin Schiller static const struct ltq_mfp_pin ase_mfp[] = {
114be14811cSMartin Schiller /* pin f0 f1 f2 f3 */
115be14811cSMartin Schiller MFP_XWAY(GPIO0, GPIO, EXIN, MII, TDM),
116be14811cSMartin Schiller MFP_XWAY(GPIO1, GPIO, STP, DFE, EBU),
117be14811cSMartin Schiller MFP_XWAY(GPIO2, GPIO, STP, DFE, EPHY),
118be14811cSMartin Schiller MFP_XWAY(GPIO3, GPIO, STP, EPHY, EBU),
119be14811cSMartin Schiller MFP_XWAY(GPIO4, GPIO, GPT, EPHY, MII),
120be14811cSMartin Schiller MFP_XWAY(GPIO5, GPIO, MII, ASC, GPT),
121be14811cSMartin Schiller MFP_XWAY(GPIO6, GPIO, MII, ASC, EXIN),
122be14811cSMartin Schiller MFP_XWAY(GPIO7, GPIO, SPI, MII, JTAG),
123be14811cSMartin Schiller MFP_XWAY(GPIO8, GPIO, SPI, MII, JTAG),
124be14811cSMartin Schiller MFP_XWAY(GPIO9, GPIO, SPI, MII, JTAG),
125be14811cSMartin Schiller MFP_XWAY(GPIO10, GPIO, SPI, MII, JTAG),
126be14811cSMartin Schiller MFP_XWAY(GPIO11, GPIO, EBU, CGU, JTAG),
127be14811cSMartin Schiller MFP_XWAY(GPIO12, GPIO, EBU, MII, SDIO),
128be14811cSMartin Schiller MFP_XWAY(GPIO13, GPIO, EBU, MII, CGU),
129be14811cSMartin Schiller MFP_XWAY(GPIO14, GPIO, EBU, SPI, CGU),
130be14811cSMartin Schiller MFP_XWAY(GPIO15, GPIO, EBU, SPI, SDIO),
131be14811cSMartin Schiller MFP_XWAY(GPIO16, GPIO, NONE, NONE, NONE),
132be14811cSMartin Schiller MFP_XWAY(GPIO17, GPIO, NONE, NONE, NONE),
133be14811cSMartin Schiller MFP_XWAY(GPIO18, GPIO, NONE, NONE, NONE),
134be14811cSMartin Schiller MFP_XWAY(GPIO19, GPIO, EBU, MII, SDIO),
135be14811cSMartin Schiller MFP_XWAY(GPIO20, GPIO, EBU, MII, SDIO),
136be14811cSMartin Schiller MFP_XWAY(GPIO21, GPIO, EBU, MII, EBU2),
137be14811cSMartin Schiller MFP_XWAY(GPIO22, GPIO, EBU, MII, CGU),
138be14811cSMartin Schiller MFP_XWAY(GPIO23, GPIO, EBU, MII, CGU),
139be14811cSMartin Schiller MFP_XWAY(GPIO24, GPIO, EBU, EBU2, MDIO),
140be14811cSMartin Schiller MFP_XWAY(GPIO25, GPIO, EBU, MII, GPT),
141be14811cSMartin Schiller MFP_XWAY(GPIO26, GPIO, EBU, MII, SDIO),
142be14811cSMartin Schiller MFP_XWAY(GPIO27, GPIO, EBU, NONE, MDIO),
143be14811cSMartin Schiller MFP_XWAY(GPIO28, GPIO, MII, EBU, SDIO),
144be14811cSMartin Schiller MFP_XWAY(GPIO29, GPIO, EBU, MII, EXIN),
145be14811cSMartin Schiller MFP_XWAY(GPIO30, GPIO, NONE, NONE, NONE),
146be14811cSMartin Schiller MFP_XWAY(GPIO31, GPIO, NONE, NONE, NONE),
147be14811cSMartin Schiller };
148be14811cSMartin Schiller
149be14811cSMartin Schiller static const unsigned ase_exin_pin_map[] = {GPIO6, GPIO29, GPIO0};
150be14811cSMartin Schiller
151be14811cSMartin Schiller static const unsigned ase_pins_exin0[] = {GPIO6};
152be14811cSMartin Schiller static const unsigned ase_pins_exin1[] = {GPIO29};
153be14811cSMartin Schiller static const unsigned ase_pins_exin2[] = {GPIO0};
154be14811cSMartin Schiller
155be14811cSMartin Schiller static const unsigned ase_pins_jtag[] = {GPIO7, GPIO8, GPIO9, GPIO10, GPIO11};
156be14811cSMartin Schiller static const unsigned ase_pins_asc[] = {GPIO5, GPIO6};
157be14811cSMartin Schiller static const unsigned ase_pins_stp[] = {GPIO1, GPIO2, GPIO3};
158be14811cSMartin Schiller static const unsigned ase_pins_mdio[] = {GPIO24, GPIO27};
159be14811cSMartin Schiller static const unsigned ase_pins_ephy_led0[] = {GPIO2};
160be14811cSMartin Schiller static const unsigned ase_pins_ephy_led1[] = {GPIO3};
161be14811cSMartin Schiller static const unsigned ase_pins_ephy_led2[] = {GPIO4};
162be14811cSMartin Schiller static const unsigned ase_pins_dfe_led0[] = {GPIO1};
163be14811cSMartin Schiller static const unsigned ase_pins_dfe_led1[] = {GPIO2};
164be14811cSMartin Schiller
165be14811cSMartin Schiller static const unsigned ase_pins_spi[] = {GPIO8, GPIO9, GPIO10}; /* DEPRECATED */
166be14811cSMartin Schiller static const unsigned ase_pins_spi_di[] = {GPIO8};
167be14811cSMartin Schiller static const unsigned ase_pins_spi_do[] = {GPIO9};
168be14811cSMartin Schiller static const unsigned ase_pins_spi_clk[] = {GPIO10};
169be14811cSMartin Schiller static const unsigned ase_pins_spi_cs1[] = {GPIO7};
170be14811cSMartin Schiller static const unsigned ase_pins_spi_cs2[] = {GPIO15};
171be14811cSMartin Schiller static const unsigned ase_pins_spi_cs3[] = {GPIO14};
172be14811cSMartin Schiller
173be14811cSMartin Schiller static const unsigned ase_pins_gpt1[] = {GPIO5};
174be14811cSMartin Schiller static const unsigned ase_pins_gpt2[] = {GPIO4};
175be14811cSMartin Schiller static const unsigned ase_pins_gpt3[] = {GPIO25};
176be14811cSMartin Schiller
177be14811cSMartin Schiller static const unsigned ase_pins_clkout0[] = {GPIO23};
178be14811cSMartin Schiller static const unsigned ase_pins_clkout1[] = {GPIO22};
179be14811cSMartin Schiller static const unsigned ase_pins_clkout2[] = {GPIO14};
180be14811cSMartin Schiller
181be14811cSMartin Schiller static const struct ltq_pin_group ase_grps[] = {
182be14811cSMartin Schiller GRP_MUX("exin0", EXIN, ase_pins_exin0),
183be14811cSMartin Schiller GRP_MUX("exin1", EXIN, ase_pins_exin1),
184be14811cSMartin Schiller GRP_MUX("exin2", EXIN, ase_pins_exin2),
185be14811cSMartin Schiller GRP_MUX("jtag", JTAG, ase_pins_jtag),
186be14811cSMartin Schiller GRP_MUX("spi", SPI, ase_pins_spi), /* DEPRECATED */
187be14811cSMartin Schiller GRP_MUX("spi_di", SPI, ase_pins_spi_di),
188be14811cSMartin Schiller GRP_MUX("spi_do", SPI, ase_pins_spi_do),
189be14811cSMartin Schiller GRP_MUX("spi_clk", SPI, ase_pins_spi_clk),
190be14811cSMartin Schiller GRP_MUX("spi_cs1", SPI, ase_pins_spi_cs1),
191be14811cSMartin Schiller GRP_MUX("spi_cs2", SPI, ase_pins_spi_cs2),
192be14811cSMartin Schiller GRP_MUX("spi_cs3", SPI, ase_pins_spi_cs3),
193be14811cSMartin Schiller GRP_MUX("asc", ASC, ase_pins_asc),
194be14811cSMartin Schiller GRP_MUX("stp", STP, ase_pins_stp),
195be14811cSMartin Schiller GRP_MUX("gpt1", GPT, ase_pins_gpt1),
196be14811cSMartin Schiller GRP_MUX("gpt2", GPT, ase_pins_gpt2),
197be14811cSMartin Schiller GRP_MUX("gpt3", GPT, ase_pins_gpt3),
198be14811cSMartin Schiller GRP_MUX("clkout0", CGU, ase_pins_clkout0),
199be14811cSMartin Schiller GRP_MUX("clkout1", CGU, ase_pins_clkout1),
200be14811cSMartin Schiller GRP_MUX("clkout2", CGU, ase_pins_clkout2),
201be14811cSMartin Schiller GRP_MUX("mdio", MDIO, ase_pins_mdio),
202be14811cSMartin Schiller GRP_MUX("dfe led0", DFE, ase_pins_dfe_led0),
203be14811cSMartin Schiller GRP_MUX("dfe led1", DFE, ase_pins_dfe_led1),
204be14811cSMartin Schiller GRP_MUX("ephy led0", EPHY, ase_pins_ephy_led0),
205be14811cSMartin Schiller GRP_MUX("ephy led1", EPHY, ase_pins_ephy_led1),
206be14811cSMartin Schiller GRP_MUX("ephy led2", EPHY, ase_pins_ephy_led2),
207be14811cSMartin Schiller };
208be14811cSMartin Schiller
209be14811cSMartin Schiller static const char * const ase_exin_grps[] = {"exin0", "exin1", "exin2"};
210be14811cSMartin Schiller static const char * const ase_gpt_grps[] = {"gpt1", "gpt2", "gpt3"};
211be14811cSMartin Schiller static const char * const ase_cgu_grps[] = {"clkout0", "clkout1",
212be14811cSMartin Schiller "clkout2"};
213be14811cSMartin Schiller static const char * const ase_mdio_grps[] = {"mdio"};
214be14811cSMartin Schiller static const char * const ase_dfe_grps[] = {"dfe led0", "dfe led1"};
215be14811cSMartin Schiller static const char * const ase_ephy_grps[] = {"ephy led0", "ephy led1",
216be14811cSMartin Schiller "ephy led2"};
217be14811cSMartin Schiller static const char * const ase_asc_grps[] = {"asc"};
218be14811cSMartin Schiller static const char * const ase_jtag_grps[] = {"jtag"};
219be14811cSMartin Schiller static const char * const ase_stp_grps[] = {"stp"};
220be14811cSMartin Schiller static const char * const ase_spi_grps[] = {"spi", /* DEPRECATED */
221be14811cSMartin Schiller "spi_di", "spi_do",
222be14811cSMartin Schiller "spi_clk", "spi_cs1",
223be14811cSMartin Schiller "spi_cs2", "spi_cs3"};
224be14811cSMartin Schiller
2253f8c50c9SJohn Crispin static const struct ltq_pmx_func ase_funcs[] = {
2263f8c50c9SJohn Crispin {"spi", ARRAY_AND_SIZE(ase_spi_grps)},
2273f8c50c9SJohn Crispin {"asc", ARRAY_AND_SIZE(ase_asc_grps)},
228be14811cSMartin Schiller {"cgu", ARRAY_AND_SIZE(ase_cgu_grps)},
2293f8c50c9SJohn Crispin {"jtag", ARRAY_AND_SIZE(ase_jtag_grps)},
2303f8c50c9SJohn Crispin {"exin", ARRAY_AND_SIZE(ase_exin_grps)},
2313f8c50c9SJohn Crispin {"stp", ARRAY_AND_SIZE(ase_stp_grps)},
2323f8c50c9SJohn Crispin {"gpt", ARRAY_AND_SIZE(ase_gpt_grps)},
233be14811cSMartin Schiller {"mdio", ARRAY_AND_SIZE(ase_mdio_grps)},
2343f8c50c9SJohn Crispin {"ephy", ARRAY_AND_SIZE(ase_ephy_grps)},
2353f8c50c9SJohn Crispin {"dfe", ARRAY_AND_SIZE(ase_dfe_grps)},
2363f8c50c9SJohn Crispin };
2373f8c50c9SJohn Crispin
238be14811cSMartin Schiller /* --------- danube related code --------- */
239be14811cSMartin Schiller #define DANUBE_MAX_PIN 32
240be14811cSMartin Schiller
241be14811cSMartin Schiller static const struct ltq_mfp_pin danube_mfp[] = {
242be14811cSMartin Schiller /* pin f0 f1 f2 f3 */
243be14811cSMartin Schiller MFP_XWAY(GPIO0, GPIO, EXIN, SDIO, TDM),
244be14811cSMartin Schiller MFP_XWAY(GPIO1, GPIO, EXIN, CBUS, MII),
245be14811cSMartin Schiller MFP_XWAY(GPIO2, GPIO, CGU, EXIN, MII),
246be14811cSMartin Schiller MFP_XWAY(GPIO3, GPIO, CGU, SDIO, PCI),
247be14811cSMartin Schiller MFP_XWAY(GPIO4, GPIO, STP, DFE, ASC),
248be14811cSMartin Schiller MFP_XWAY(GPIO5, GPIO, STP, MII, DFE),
249be14811cSMartin Schiller MFP_XWAY(GPIO6, GPIO, STP, GPT, ASC),
250be14811cSMartin Schiller MFP_XWAY(GPIO7, GPIO, CGU, CBUS, MII),
251be14811cSMartin Schiller MFP_XWAY(GPIO8, GPIO, CGU, NMI, MII),
252be14811cSMartin Schiller MFP_XWAY(GPIO9, GPIO, ASC, SPI, MII),
253be14811cSMartin Schiller MFP_XWAY(GPIO10, GPIO, ASC, SPI, MII),
254be14811cSMartin Schiller MFP_XWAY(GPIO11, GPIO, ASC, CBUS, SPI),
255be14811cSMartin Schiller MFP_XWAY(GPIO12, GPIO, ASC, CBUS, MCD),
256be14811cSMartin Schiller MFP_XWAY(GPIO13, GPIO, EBU, SPI, MII),
257be14811cSMartin Schiller MFP_XWAY(GPIO14, GPIO, CGU, CBUS, MII),
258be14811cSMartin Schiller MFP_XWAY(GPIO15, GPIO, SPI, SDIO, JTAG),
259be14811cSMartin Schiller MFP_XWAY(GPIO16, GPIO, SPI, SDIO, JTAG),
260be14811cSMartin Schiller MFP_XWAY(GPIO17, GPIO, SPI, SDIO, JTAG),
261be14811cSMartin Schiller MFP_XWAY(GPIO18, GPIO, SPI, SDIO, JTAG),
262be14811cSMartin Schiller MFP_XWAY(GPIO19, GPIO, PCI, SDIO, MII),
263be14811cSMartin Schiller MFP_XWAY(GPIO20, GPIO, JTAG, SDIO, MII),
264be14811cSMartin Schiller MFP_XWAY(GPIO21, GPIO, PCI, EBU, GPT),
265be14811cSMartin Schiller MFP_XWAY(GPIO22, GPIO, SPI, MCD, MII),
266be14811cSMartin Schiller MFP_XWAY(GPIO23, GPIO, EBU, PCI, STP),
267be14811cSMartin Schiller MFP_XWAY(GPIO24, GPIO, EBU, TDM, PCI),
268be14811cSMartin Schiller MFP_XWAY(GPIO25, GPIO, TDM, SDIO, ASC),
269be14811cSMartin Schiller MFP_XWAY(GPIO26, GPIO, EBU, TDM, SDIO),
270be14811cSMartin Schiller MFP_XWAY(GPIO27, GPIO, TDM, SDIO, ASC),
271be14811cSMartin Schiller MFP_XWAY(GPIO28, GPIO, GPT, MII, SDIO),
272be14811cSMartin Schiller MFP_XWAY(GPIO29, GPIO, PCI, CBUS, MII),
273be14811cSMartin Schiller MFP_XWAY(GPIO30, GPIO, PCI, CBUS, MII),
274be14811cSMartin Schiller MFP_XWAY(GPIO31, GPIO, EBU, PCI, MII),
275be14811cSMartin Schiller };
276be14811cSMartin Schiller
277be14811cSMartin Schiller static const unsigned danube_exin_pin_map[] = {GPIO0, GPIO1, GPIO2};
278be14811cSMartin Schiller
279be14811cSMartin Schiller static const unsigned danube_pins_exin0[] = {GPIO0};
280be14811cSMartin Schiller static const unsigned danube_pins_exin1[] = {GPIO1};
281be14811cSMartin Schiller static const unsigned danube_pins_exin2[] = {GPIO2};
282be14811cSMartin Schiller
283be14811cSMartin Schiller static const unsigned danube_pins_jtag[] = {GPIO15, GPIO16, GPIO17, GPIO18, GPIO20};
284be14811cSMartin Schiller static const unsigned danube_pins_asc0[] = {GPIO11, GPIO12};
285be14811cSMartin Schiller static const unsigned danube_pins_asc0_cts_rts[] = {GPIO9, GPIO10};
286be14811cSMartin Schiller static const unsigned danube_pins_stp[] = {GPIO4, GPIO5, GPIO6};
287be14811cSMartin Schiller static const unsigned danube_pins_nmi[] = {GPIO8};
288be14811cSMartin Schiller
289be14811cSMartin Schiller static const unsigned danube_pins_dfe_led0[] = {GPIO4};
290be14811cSMartin Schiller static const unsigned danube_pins_dfe_led1[] = {GPIO5};
291be14811cSMartin Schiller
292be14811cSMartin Schiller static const unsigned danube_pins_ebu_a24[] = {GPIO13};
293be14811cSMartin Schiller static const unsigned danube_pins_ebu_clk[] = {GPIO21};
294be14811cSMartin Schiller static const unsigned danube_pins_ebu_cs1[] = {GPIO23};
295be14811cSMartin Schiller static const unsigned danube_pins_ebu_a23[] = {GPIO24};
296be14811cSMartin Schiller static const unsigned danube_pins_ebu_wait[] = {GPIO26};
297be14811cSMartin Schiller static const unsigned danube_pins_ebu_a25[] = {GPIO31};
298be14811cSMartin Schiller
299be14811cSMartin Schiller static const unsigned danube_pins_nand_ale[] = {GPIO13};
300be14811cSMartin Schiller static const unsigned danube_pins_nand_cs1[] = {GPIO23};
301be14811cSMartin Schiller static const unsigned danube_pins_nand_cle[] = {GPIO24};
302be14811cSMartin Schiller
303be14811cSMartin Schiller static const unsigned danube_pins_spi[] = {GPIO16, GPIO17, GPIO18}; /* DEPRECATED */
304be14811cSMartin Schiller static const unsigned danube_pins_spi_di[] = {GPIO16};
305be14811cSMartin Schiller static const unsigned danube_pins_spi_do[] = {GPIO17};
306be14811cSMartin Schiller static const unsigned danube_pins_spi_clk[] = {GPIO18};
307be14811cSMartin Schiller static const unsigned danube_pins_spi_cs1[] = {GPIO15};
308be14811cSMartin Schiller static const unsigned danube_pins_spi_cs2[] = {GPIO21};
309be14811cSMartin Schiller static const unsigned danube_pins_spi_cs3[] = {GPIO13};
310be14811cSMartin Schiller static const unsigned danube_pins_spi_cs4[] = {GPIO10};
311be14811cSMartin Schiller static const unsigned danube_pins_spi_cs5[] = {GPIO9};
312be14811cSMartin Schiller static const unsigned danube_pins_spi_cs6[] = {GPIO11};
313be14811cSMartin Schiller
314be14811cSMartin Schiller static const unsigned danube_pins_gpt1[] = {GPIO28};
315be14811cSMartin Schiller static const unsigned danube_pins_gpt2[] = {GPIO21};
316be14811cSMartin Schiller static const unsigned danube_pins_gpt3[] = {GPIO6};
317be14811cSMartin Schiller
318be14811cSMartin Schiller static const unsigned danube_pins_clkout0[] = {GPIO8};
319be14811cSMartin Schiller static const unsigned danube_pins_clkout1[] = {GPIO7};
320be14811cSMartin Schiller static const unsigned danube_pins_clkout2[] = {GPIO3};
321be14811cSMartin Schiller static const unsigned danube_pins_clkout3[] = {GPIO2};
322be14811cSMartin Schiller
323be14811cSMartin Schiller static const unsigned danube_pins_pci_gnt1[] = {GPIO30};
324be14811cSMartin Schiller static const unsigned danube_pins_pci_gnt2[] = {GPIO23};
325be14811cSMartin Schiller static const unsigned danube_pins_pci_gnt3[] = {GPIO19};
326be14811cSMartin Schiller static const unsigned danube_pins_pci_req1[] = {GPIO29};
327be14811cSMartin Schiller static const unsigned danube_pins_pci_req2[] = {GPIO31};
328be14811cSMartin Schiller static const unsigned danube_pins_pci_req3[] = {GPIO3};
329be14811cSMartin Schiller
330be14811cSMartin Schiller static const struct ltq_pin_group danube_grps[] = {
331be14811cSMartin Schiller GRP_MUX("exin0", EXIN, danube_pins_exin0),
332be14811cSMartin Schiller GRP_MUX("exin1", EXIN, danube_pins_exin1),
333be14811cSMartin Schiller GRP_MUX("exin2", EXIN, danube_pins_exin2),
334be14811cSMartin Schiller GRP_MUX("jtag", JTAG, danube_pins_jtag),
335be14811cSMartin Schiller GRP_MUX("ebu a23", EBU, danube_pins_ebu_a23),
336be14811cSMartin Schiller GRP_MUX("ebu a24", EBU, danube_pins_ebu_a24),
337be14811cSMartin Schiller GRP_MUX("ebu a25", EBU, danube_pins_ebu_a25),
338be14811cSMartin Schiller GRP_MUX("ebu clk", EBU, danube_pins_ebu_clk),
339be14811cSMartin Schiller GRP_MUX("ebu cs1", EBU, danube_pins_ebu_cs1),
340be14811cSMartin Schiller GRP_MUX("ebu wait", EBU, danube_pins_ebu_wait),
341be14811cSMartin Schiller GRP_MUX("nand ale", EBU, danube_pins_nand_ale),
342be14811cSMartin Schiller GRP_MUX("nand cs1", EBU, danube_pins_nand_cs1),
343be14811cSMartin Schiller GRP_MUX("nand cle", EBU, danube_pins_nand_cle),
344be14811cSMartin Schiller GRP_MUX("spi", SPI, danube_pins_spi), /* DEPRECATED */
345be14811cSMartin Schiller GRP_MUX("spi_di", SPI, danube_pins_spi_di),
346be14811cSMartin Schiller GRP_MUX("spi_do", SPI, danube_pins_spi_do),
347be14811cSMartin Schiller GRP_MUX("spi_clk", SPI, danube_pins_spi_clk),
348be14811cSMartin Schiller GRP_MUX("spi_cs1", SPI, danube_pins_spi_cs1),
349be14811cSMartin Schiller GRP_MUX("spi_cs2", SPI, danube_pins_spi_cs2),
350be14811cSMartin Schiller GRP_MUX("spi_cs3", SPI, danube_pins_spi_cs3),
351be14811cSMartin Schiller GRP_MUX("spi_cs4", SPI, danube_pins_spi_cs4),
352be14811cSMartin Schiller GRP_MUX("spi_cs5", SPI, danube_pins_spi_cs5),
353be14811cSMartin Schiller GRP_MUX("spi_cs6", SPI, danube_pins_spi_cs6),
354be14811cSMartin Schiller GRP_MUX("asc0", ASC, danube_pins_asc0),
355be14811cSMartin Schiller GRP_MUX("asc0 cts rts", ASC, danube_pins_asc0_cts_rts),
356be14811cSMartin Schiller GRP_MUX("stp", STP, danube_pins_stp),
357be14811cSMartin Schiller GRP_MUX("nmi", NMI, danube_pins_nmi),
358be14811cSMartin Schiller GRP_MUX("gpt1", GPT, danube_pins_gpt1),
359be14811cSMartin Schiller GRP_MUX("gpt2", GPT, danube_pins_gpt2),
360be14811cSMartin Schiller GRP_MUX("gpt3", GPT, danube_pins_gpt3),
361be14811cSMartin Schiller GRP_MUX("clkout0", CGU, danube_pins_clkout0),
362be14811cSMartin Schiller GRP_MUX("clkout1", CGU, danube_pins_clkout1),
363be14811cSMartin Schiller GRP_MUX("clkout2", CGU, danube_pins_clkout2),
364be14811cSMartin Schiller GRP_MUX("clkout3", CGU, danube_pins_clkout3),
365be14811cSMartin Schiller GRP_MUX("gnt1", PCI, danube_pins_pci_gnt1),
366be14811cSMartin Schiller GRP_MUX("gnt2", PCI, danube_pins_pci_gnt2),
367be14811cSMartin Schiller GRP_MUX("gnt3", PCI, danube_pins_pci_gnt3),
368be14811cSMartin Schiller GRP_MUX("req1", PCI, danube_pins_pci_req1),
369be14811cSMartin Schiller GRP_MUX("req2", PCI, danube_pins_pci_req2),
370be14811cSMartin Schiller GRP_MUX("req3", PCI, danube_pins_pci_req3),
371be14811cSMartin Schiller GRP_MUX("dfe led0", DFE, danube_pins_dfe_led0),
372be14811cSMartin Schiller GRP_MUX("dfe led1", DFE, danube_pins_dfe_led1),
373be14811cSMartin Schiller };
374be14811cSMartin Schiller
375be14811cSMartin Schiller static const char * const danube_pci_grps[] = {"gnt1", "gnt2",
376be14811cSMartin Schiller "gnt3", "req1",
377be14811cSMartin Schiller "req2", "req3"};
378be14811cSMartin Schiller static const char * const danube_spi_grps[] = {"spi", /* DEPRECATED */
379be14811cSMartin Schiller "spi_di", "spi_do",
380be14811cSMartin Schiller "spi_clk", "spi_cs1",
381be14811cSMartin Schiller "spi_cs2", "spi_cs3",
382be14811cSMartin Schiller "spi_cs4", "spi_cs5",
383be14811cSMartin Schiller "spi_cs6"};
384be14811cSMartin Schiller static const char * const danube_cgu_grps[] = {"clkout0", "clkout1",
385be14811cSMartin Schiller "clkout2", "clkout3"};
386be14811cSMartin Schiller static const char * const danube_ebu_grps[] = {"ebu a23", "ebu a24",
387be14811cSMartin Schiller "ebu a25", "ebu cs1",
388be14811cSMartin Schiller "ebu wait", "ebu clk",
389be14811cSMartin Schiller "nand ale", "nand cs1",
390be14811cSMartin Schiller "nand cle"};
391be14811cSMartin Schiller static const char * const danube_dfe_grps[] = {"dfe led0", "dfe led1"};
392be14811cSMartin Schiller static const char * const danube_exin_grps[] = {"exin0", "exin1", "exin2"};
393be14811cSMartin Schiller static const char * const danube_gpt_grps[] = {"gpt1", "gpt2", "gpt3"};
394be14811cSMartin Schiller static const char * const danube_asc_grps[] = {"asc0", "asc0 cts rts"};
395be14811cSMartin Schiller static const char * const danube_jtag_grps[] = {"jtag"};
396be14811cSMartin Schiller static const char * const danube_stp_grps[] = {"stp"};
397be14811cSMartin Schiller static const char * const danube_nmi_grps[] = {"nmi"};
398be14811cSMartin Schiller
399be14811cSMartin Schiller static const struct ltq_pmx_func danube_funcs[] = {
400be14811cSMartin Schiller {"spi", ARRAY_AND_SIZE(danube_spi_grps)},
401be14811cSMartin Schiller {"asc", ARRAY_AND_SIZE(danube_asc_grps)},
402be14811cSMartin Schiller {"cgu", ARRAY_AND_SIZE(danube_cgu_grps)},
403be14811cSMartin Schiller {"jtag", ARRAY_AND_SIZE(danube_jtag_grps)},
404be14811cSMartin Schiller {"exin", ARRAY_AND_SIZE(danube_exin_grps)},
405be14811cSMartin Schiller {"stp", ARRAY_AND_SIZE(danube_stp_grps)},
406be14811cSMartin Schiller {"gpt", ARRAY_AND_SIZE(danube_gpt_grps)},
407be14811cSMartin Schiller {"nmi", ARRAY_AND_SIZE(danube_nmi_grps)},
408be14811cSMartin Schiller {"pci", ARRAY_AND_SIZE(danube_pci_grps)},
409be14811cSMartin Schiller {"ebu", ARRAY_AND_SIZE(danube_ebu_grps)},
410be14811cSMartin Schiller {"dfe", ARRAY_AND_SIZE(danube_dfe_grps)},
411be14811cSMartin Schiller };
412be14811cSMartin Schiller
413be14811cSMartin Schiller /* --------- xrx100 related code --------- */
414be14811cSMartin Schiller #define XRX100_MAX_PIN 56
415be14811cSMartin Schiller
416be14811cSMartin Schiller static const struct ltq_mfp_pin xrx100_mfp[] = {
417be14811cSMartin Schiller /* pin f0 f1 f2 f3 */
418be14811cSMartin Schiller MFP_XWAY(GPIO0, GPIO, EXIN, SDIO, TDM),
419be14811cSMartin Schiller MFP_XWAY(GPIO1, GPIO, EXIN, CBUS, SIN),
420be14811cSMartin Schiller MFP_XWAY(GPIO2, GPIO, CGU, EXIN, NONE),
421be14811cSMartin Schiller MFP_XWAY(GPIO3, GPIO, CGU, SDIO, PCI),
422be14811cSMartin Schiller MFP_XWAY(GPIO4, GPIO, STP, DFE, ASC),
423be14811cSMartin Schiller MFP_XWAY(GPIO5, GPIO, STP, NONE, DFE),
424be14811cSMartin Schiller MFP_XWAY(GPIO6, GPIO, STP, GPT, ASC),
425be14811cSMartin Schiller MFP_XWAY(GPIO7, GPIO, CGU, CBUS, NONE),
426be14811cSMartin Schiller MFP_XWAY(GPIO8, GPIO, CGU, NMI, NONE),
427be14811cSMartin Schiller MFP_XWAY(GPIO9, GPIO, ASC, SPI, EXIN),
428be14811cSMartin Schiller MFP_XWAY(GPIO10, GPIO, ASC, SPI, EXIN),
429be14811cSMartin Schiller MFP_XWAY(GPIO11, GPIO, ASC, CBUS, SPI),
430be14811cSMartin Schiller MFP_XWAY(GPIO12, GPIO, ASC, CBUS, MCD),
431be14811cSMartin Schiller MFP_XWAY(GPIO13, GPIO, EBU, SPI, NONE),
432be14811cSMartin Schiller MFP_XWAY(GPIO14, GPIO, CGU, NONE, NONE),
433be14811cSMartin Schiller MFP_XWAY(GPIO15, GPIO, SPI, SDIO, MCD),
434be14811cSMartin Schiller MFP_XWAY(GPIO16, GPIO, SPI, SDIO, NONE),
435be14811cSMartin Schiller MFP_XWAY(GPIO17, GPIO, SPI, SDIO, NONE),
436be14811cSMartin Schiller MFP_XWAY(GPIO18, GPIO, SPI, SDIO, NONE),
437be14811cSMartin Schiller MFP_XWAY(GPIO19, GPIO, PCI, SDIO, CGU),
438be14811cSMartin Schiller MFP_XWAY(GPIO20, GPIO, NONE, SDIO, EBU),
439be14811cSMartin Schiller MFP_XWAY(GPIO21, GPIO, PCI, EBU, GPT),
440be14811cSMartin Schiller MFP_XWAY(GPIO22, GPIO, SPI, NONE, EBU),
441be14811cSMartin Schiller MFP_XWAY(GPIO23, GPIO, EBU, PCI, STP),
442be14811cSMartin Schiller MFP_XWAY(GPIO24, GPIO, EBU, TDM, PCI),
443be14811cSMartin Schiller MFP_XWAY(GPIO25, GPIO, TDM, SDIO, ASC),
444be14811cSMartin Schiller MFP_XWAY(GPIO26, GPIO, EBU, TDM, SDIO),
445be14811cSMartin Schiller MFP_XWAY(GPIO27, GPIO, TDM, SDIO, ASC),
446be14811cSMartin Schiller MFP_XWAY(GPIO28, GPIO, GPT, NONE, SDIO),
447be14811cSMartin Schiller MFP_XWAY(GPIO29, GPIO, PCI, CBUS, NONE),
448be14811cSMartin Schiller MFP_XWAY(GPIO30, GPIO, PCI, CBUS, NONE),
449be14811cSMartin Schiller MFP_XWAY(GPIO31, GPIO, EBU, PCI, NONE),
450be14811cSMartin Schiller MFP_XWAY(GPIO32, GPIO, MII, NONE, EBU),
451be14811cSMartin Schiller MFP_XWAY(GPIO33, GPIO, MII, NONE, EBU),
452be14811cSMartin Schiller MFP_XWAY(GPIO34, GPIO, SIN, SSI, NONE),
453be14811cSMartin Schiller MFP_XWAY(GPIO35, GPIO, SIN, SSI, NONE),
454be14811cSMartin Schiller MFP_XWAY(GPIO36, GPIO, SIN, SSI, NONE),
455be14811cSMartin Schiller MFP_XWAY(GPIO37, GPIO, PCI, NONE, NONE),
456be14811cSMartin Schiller MFP_XWAY(GPIO38, GPIO, PCI, NONE, NONE),
457be14811cSMartin Schiller MFP_XWAY(GPIO39, GPIO, NONE, EXIN, NONE),
458be14811cSMartin Schiller MFP_XWAY(GPIO40, GPIO, MII, TDM, NONE),
459be14811cSMartin Schiller MFP_XWAY(GPIO41, GPIO, MII, TDM, NONE),
460be14811cSMartin Schiller MFP_XWAY(GPIO42, GPIO, MDIO, NONE, NONE),
461be14811cSMartin Schiller MFP_XWAY(GPIO43, GPIO, MDIO, NONE, NONE),
462be14811cSMartin Schiller MFP_XWAY(GPIO44, GPIO, MII, SIN, NONE),
463be14811cSMartin Schiller MFP_XWAY(GPIO45, GPIO, MII, NONE, SIN),
464be14811cSMartin Schiller MFP_XWAY(GPIO46, GPIO, MII, NONE, EXIN),
465be14811cSMartin Schiller MFP_XWAY(GPIO47, GPIO, MII, NONE, SIN),
466be14811cSMartin Schiller MFP_XWAY(GPIO48, GPIO, EBU, NONE, NONE),
467be14811cSMartin Schiller MFP_XWAY(GPIO49, GPIO, EBU, NONE, NONE),
468be14811cSMartin Schiller MFP_XWAY(GPIO50, GPIO, NONE, NONE, NONE),
469be14811cSMartin Schiller MFP_XWAY(GPIO51, GPIO, NONE, NONE, NONE),
470be14811cSMartin Schiller MFP_XWAY(GPIO52, GPIO, NONE, NONE, NONE),
471be14811cSMartin Schiller MFP_XWAY(GPIO53, GPIO, NONE, NONE, NONE),
472be14811cSMartin Schiller MFP_XWAY(GPIO54, GPIO, NONE, NONE, NONE),
473be14811cSMartin Schiller MFP_XWAY(GPIO55, GPIO, NONE, NONE, NONE),
474be14811cSMartin Schiller };
475be14811cSMartin Schiller
476be14811cSMartin Schiller static const unsigned xrx100_exin_pin_map[] = {GPIO0, GPIO1, GPIO2, GPIO39, GPIO10, GPIO9};
477be14811cSMartin Schiller
478be14811cSMartin Schiller static const unsigned xrx100_pins_exin0[] = {GPIO0};
479be14811cSMartin Schiller static const unsigned xrx100_pins_exin1[] = {GPIO1};
480be14811cSMartin Schiller static const unsigned xrx100_pins_exin2[] = {GPIO2};
481be14811cSMartin Schiller static const unsigned xrx100_pins_exin3[] = {GPIO39};
482be14811cSMartin Schiller static const unsigned xrx100_pins_exin4[] = {GPIO10};
483be14811cSMartin Schiller static const unsigned xrx100_pins_exin5[] = {GPIO9};
484be14811cSMartin Schiller
485be14811cSMartin Schiller static const unsigned xrx100_pins_asc0[] = {GPIO11, GPIO12};
486be14811cSMartin Schiller static const unsigned xrx100_pins_asc0_cts_rts[] = {GPIO9, GPIO10};
487be14811cSMartin Schiller static const unsigned xrx100_pins_stp[] = {GPIO4, GPIO5, GPIO6};
488be14811cSMartin Schiller static const unsigned xrx100_pins_nmi[] = {GPIO8};
489be14811cSMartin Schiller static const unsigned xrx100_pins_mdio[] = {GPIO42, GPIO43};
490be14811cSMartin Schiller
491be14811cSMartin Schiller static const unsigned xrx100_pins_dfe_led0[] = {GPIO4};
492be14811cSMartin Schiller static const unsigned xrx100_pins_dfe_led1[] = {GPIO5};
493be14811cSMartin Schiller
494be14811cSMartin Schiller static const unsigned xrx100_pins_ebu_a24[] = {GPIO13};
495be14811cSMartin Schiller static const unsigned xrx100_pins_ebu_clk[] = {GPIO21};
496be14811cSMartin Schiller static const unsigned xrx100_pins_ebu_cs1[] = {GPIO23};
497be14811cSMartin Schiller static const unsigned xrx100_pins_ebu_a23[] = {GPIO24};
498be14811cSMartin Schiller static const unsigned xrx100_pins_ebu_wait[] = {GPIO26};
499be14811cSMartin Schiller static const unsigned xrx100_pins_ebu_a25[] = {GPIO31};
500be14811cSMartin Schiller
501be14811cSMartin Schiller static const unsigned xrx100_pins_nand_ale[] = {GPIO13};
502be14811cSMartin Schiller static const unsigned xrx100_pins_nand_cs1[] = {GPIO23};
503be14811cSMartin Schiller static const unsigned xrx100_pins_nand_cle[] = {GPIO24};
504be14811cSMartin Schiller static const unsigned xrx100_pins_nand_rdy[] = {GPIO48};
505be14811cSMartin Schiller static const unsigned xrx100_pins_nand_rd[] = {GPIO49};
506be14811cSMartin Schiller
507be14811cSMartin Schiller static const unsigned xrx100_pins_spi_di[] = {GPIO16};
508be14811cSMartin Schiller static const unsigned xrx100_pins_spi_do[] = {GPIO17};
509be14811cSMartin Schiller static const unsigned xrx100_pins_spi_clk[] = {GPIO18};
510be14811cSMartin Schiller static const unsigned xrx100_pins_spi_cs1[] = {GPIO15};
511be14811cSMartin Schiller static const unsigned xrx100_pins_spi_cs2[] = {GPIO22};
512be14811cSMartin Schiller static const unsigned xrx100_pins_spi_cs3[] = {GPIO13};
513be14811cSMartin Schiller static const unsigned xrx100_pins_spi_cs4[] = {GPIO10};
514be14811cSMartin Schiller static const unsigned xrx100_pins_spi_cs5[] = {GPIO9};
515be14811cSMartin Schiller static const unsigned xrx100_pins_spi_cs6[] = {GPIO11};
516be14811cSMartin Schiller
517be14811cSMartin Schiller static const unsigned xrx100_pins_gpt1[] = {GPIO28};
518be14811cSMartin Schiller static const unsigned xrx100_pins_gpt2[] = {GPIO21};
519be14811cSMartin Schiller static const unsigned xrx100_pins_gpt3[] = {GPIO6};
520be14811cSMartin Schiller
521be14811cSMartin Schiller static const unsigned xrx100_pins_clkout0[] = {GPIO8};
522be14811cSMartin Schiller static const unsigned xrx100_pins_clkout1[] = {GPIO7};
523be14811cSMartin Schiller static const unsigned xrx100_pins_clkout2[] = {GPIO3};
524be14811cSMartin Schiller static const unsigned xrx100_pins_clkout3[] = {GPIO2};
525be14811cSMartin Schiller
526be14811cSMartin Schiller static const unsigned xrx100_pins_pci_gnt1[] = {GPIO30};
527be14811cSMartin Schiller static const unsigned xrx100_pins_pci_gnt2[] = {GPIO23};
528be14811cSMartin Schiller static const unsigned xrx100_pins_pci_gnt3[] = {GPIO19};
529be14811cSMartin Schiller static const unsigned xrx100_pins_pci_gnt4[] = {GPIO38};
530be14811cSMartin Schiller static const unsigned xrx100_pins_pci_req1[] = {GPIO29};
531be14811cSMartin Schiller static const unsigned xrx100_pins_pci_req2[] = {GPIO31};
532be14811cSMartin Schiller static const unsigned xrx100_pins_pci_req3[] = {GPIO3};
533be14811cSMartin Schiller static const unsigned xrx100_pins_pci_req4[] = {GPIO37};
534be14811cSMartin Schiller
535be14811cSMartin Schiller static const struct ltq_pin_group xrx100_grps[] = {
536be14811cSMartin Schiller GRP_MUX("exin0", EXIN, xrx100_pins_exin0),
537be14811cSMartin Schiller GRP_MUX("exin1", EXIN, xrx100_pins_exin1),
538be14811cSMartin Schiller GRP_MUX("exin2", EXIN, xrx100_pins_exin2),
539be14811cSMartin Schiller GRP_MUX("exin3", EXIN, xrx100_pins_exin3),
540be14811cSMartin Schiller GRP_MUX("exin4", EXIN, xrx100_pins_exin4),
541be14811cSMartin Schiller GRP_MUX("exin5", EXIN, xrx100_pins_exin5),
542be14811cSMartin Schiller GRP_MUX("ebu a23", EBU, xrx100_pins_ebu_a23),
543be14811cSMartin Schiller GRP_MUX("ebu a24", EBU, xrx100_pins_ebu_a24),
544be14811cSMartin Schiller GRP_MUX("ebu a25", EBU, xrx100_pins_ebu_a25),
545be14811cSMartin Schiller GRP_MUX("ebu clk", EBU, xrx100_pins_ebu_clk),
546be14811cSMartin Schiller GRP_MUX("ebu cs1", EBU, xrx100_pins_ebu_cs1),
547be14811cSMartin Schiller GRP_MUX("ebu wait", EBU, xrx100_pins_ebu_wait),
548be14811cSMartin Schiller GRP_MUX("nand ale", EBU, xrx100_pins_nand_ale),
549be14811cSMartin Schiller GRP_MUX("nand cs1", EBU, xrx100_pins_nand_cs1),
550be14811cSMartin Schiller GRP_MUX("nand cle", EBU, xrx100_pins_nand_cle),
551be14811cSMartin Schiller GRP_MUX("nand rdy", EBU, xrx100_pins_nand_rdy),
552be14811cSMartin Schiller GRP_MUX("nand rd", EBU, xrx100_pins_nand_rd),
553be14811cSMartin Schiller GRP_MUX("spi_di", SPI, xrx100_pins_spi_di),
554be14811cSMartin Schiller GRP_MUX("spi_do", SPI, xrx100_pins_spi_do),
555be14811cSMartin Schiller GRP_MUX("spi_clk", SPI, xrx100_pins_spi_clk),
556be14811cSMartin Schiller GRP_MUX("spi_cs1", SPI, xrx100_pins_spi_cs1),
557be14811cSMartin Schiller GRP_MUX("spi_cs2", SPI, xrx100_pins_spi_cs2),
558be14811cSMartin Schiller GRP_MUX("spi_cs3", SPI, xrx100_pins_spi_cs3),
559be14811cSMartin Schiller GRP_MUX("spi_cs4", SPI, xrx100_pins_spi_cs4),
560be14811cSMartin Schiller GRP_MUX("spi_cs5", SPI, xrx100_pins_spi_cs5),
561be14811cSMartin Schiller GRP_MUX("spi_cs6", SPI, xrx100_pins_spi_cs6),
562be14811cSMartin Schiller GRP_MUX("asc0", ASC, xrx100_pins_asc0),
563be14811cSMartin Schiller GRP_MUX("asc0 cts rts", ASC, xrx100_pins_asc0_cts_rts),
564be14811cSMartin Schiller GRP_MUX("stp", STP, xrx100_pins_stp),
565be14811cSMartin Schiller GRP_MUX("nmi", NMI, xrx100_pins_nmi),
566be14811cSMartin Schiller GRP_MUX("gpt1", GPT, xrx100_pins_gpt1),
567be14811cSMartin Schiller GRP_MUX("gpt2", GPT, xrx100_pins_gpt2),
568be14811cSMartin Schiller GRP_MUX("gpt3", GPT, xrx100_pins_gpt3),
569be14811cSMartin Schiller GRP_MUX("clkout0", CGU, xrx100_pins_clkout0),
570be14811cSMartin Schiller GRP_MUX("clkout1", CGU, xrx100_pins_clkout1),
571be14811cSMartin Schiller GRP_MUX("clkout2", CGU, xrx100_pins_clkout2),
572be14811cSMartin Schiller GRP_MUX("clkout3", CGU, xrx100_pins_clkout3),
573be14811cSMartin Schiller GRP_MUX("gnt1", PCI, xrx100_pins_pci_gnt1),
574be14811cSMartin Schiller GRP_MUX("gnt2", PCI, xrx100_pins_pci_gnt2),
575be14811cSMartin Schiller GRP_MUX("gnt3", PCI, xrx100_pins_pci_gnt3),
576be14811cSMartin Schiller GRP_MUX("gnt4", PCI, xrx100_pins_pci_gnt4),
577be14811cSMartin Schiller GRP_MUX("req1", PCI, xrx100_pins_pci_req1),
578be14811cSMartin Schiller GRP_MUX("req2", PCI, xrx100_pins_pci_req2),
579be14811cSMartin Schiller GRP_MUX("req3", PCI, xrx100_pins_pci_req3),
580be14811cSMartin Schiller GRP_MUX("req4", PCI, xrx100_pins_pci_req4),
581be14811cSMartin Schiller GRP_MUX("mdio", MDIO, xrx100_pins_mdio),
582be14811cSMartin Schiller GRP_MUX("dfe led0", DFE, xrx100_pins_dfe_led0),
583be14811cSMartin Schiller GRP_MUX("dfe led1", DFE, xrx100_pins_dfe_led1),
584be14811cSMartin Schiller };
585be14811cSMartin Schiller
586be14811cSMartin Schiller static const char * const xrx100_pci_grps[] = {"gnt1", "gnt2",
587be14811cSMartin Schiller "gnt3", "gnt4",
588be14811cSMartin Schiller "req1", "req2",
589be14811cSMartin Schiller "req3", "req4"};
590be14811cSMartin Schiller static const char * const xrx100_spi_grps[] = {"spi_di", "spi_do",
591be14811cSMartin Schiller "spi_clk", "spi_cs1",
592be14811cSMartin Schiller "spi_cs2", "spi_cs3",
593be14811cSMartin Schiller "spi_cs4", "spi_cs5",
594be14811cSMartin Schiller "spi_cs6"};
595be14811cSMartin Schiller static const char * const xrx100_cgu_grps[] = {"clkout0", "clkout1",
596be14811cSMartin Schiller "clkout2", "clkout3"};
597be14811cSMartin Schiller static const char * const xrx100_ebu_grps[] = {"ebu a23", "ebu a24",
598be14811cSMartin Schiller "ebu a25", "ebu cs1",
599be14811cSMartin Schiller "ebu wait", "ebu clk",
600be14811cSMartin Schiller "nand ale", "nand cs1",
601be14811cSMartin Schiller "nand cle", "nand rdy",
602be14811cSMartin Schiller "nand rd"};
603be14811cSMartin Schiller static const char * const xrx100_exin_grps[] = {"exin0", "exin1", "exin2",
604be14811cSMartin Schiller "exin3", "exin4", "exin5"};
605be14811cSMartin Schiller static const char * const xrx100_gpt_grps[] = {"gpt1", "gpt2", "gpt3"};
606be14811cSMartin Schiller static const char * const xrx100_asc_grps[] = {"asc0", "asc0 cts rts"};
607be14811cSMartin Schiller static const char * const xrx100_stp_grps[] = {"stp"};
608be14811cSMartin Schiller static const char * const xrx100_nmi_grps[] = {"nmi"};
609be14811cSMartin Schiller static const char * const xrx100_mdio_grps[] = {"mdio"};
610be14811cSMartin Schiller static const char * const xrx100_dfe_grps[] = {"dfe led0", "dfe led1"};
611be14811cSMartin Schiller
612be14811cSMartin Schiller static const struct ltq_pmx_func xrx100_funcs[] = {
613be14811cSMartin Schiller {"spi", ARRAY_AND_SIZE(xrx100_spi_grps)},
614be14811cSMartin Schiller {"asc", ARRAY_AND_SIZE(xrx100_asc_grps)},
615be14811cSMartin Schiller {"cgu", ARRAY_AND_SIZE(xrx100_cgu_grps)},
616be14811cSMartin Schiller {"exin", ARRAY_AND_SIZE(xrx100_exin_grps)},
617be14811cSMartin Schiller {"stp", ARRAY_AND_SIZE(xrx100_stp_grps)},
618be14811cSMartin Schiller {"gpt", ARRAY_AND_SIZE(xrx100_gpt_grps)},
619be14811cSMartin Schiller {"nmi", ARRAY_AND_SIZE(xrx100_nmi_grps)},
620be14811cSMartin Schiller {"pci", ARRAY_AND_SIZE(xrx100_pci_grps)},
621be14811cSMartin Schiller {"ebu", ARRAY_AND_SIZE(xrx100_ebu_grps)},
622be14811cSMartin Schiller {"mdio", ARRAY_AND_SIZE(xrx100_mdio_grps)},
623be14811cSMartin Schiller {"dfe", ARRAY_AND_SIZE(xrx100_dfe_grps)},
624be14811cSMartin Schiller };
625be14811cSMartin Schiller
626be14811cSMartin Schiller /* --------- xrx200 related code --------- */
627be14811cSMartin Schiller #define XRX200_MAX_PIN 50
628be14811cSMartin Schiller
629be14811cSMartin Schiller static const struct ltq_mfp_pin xrx200_mfp[] = {
630be14811cSMartin Schiller /* pin f0 f1 f2 f3 */
631be14811cSMartin Schiller MFP_XWAY(GPIO0, GPIO, EXIN, SDIO, TDM),
632be14811cSMartin Schiller MFP_XWAY(GPIO1, GPIO, EXIN, CBUS, SIN),
633be14811cSMartin Schiller MFP_XWAY(GPIO2, GPIO, CGU, EXIN, GPHY),
634be14811cSMartin Schiller MFP_XWAY(GPIO3, GPIO, CGU, SDIO, PCI),
635be14811cSMartin Schiller MFP_XWAY(GPIO4, GPIO, STP, DFE, USIF),
636be14811cSMartin Schiller MFP_XWAY(GPIO5, GPIO, STP, GPHY, DFE),
637be14811cSMartin Schiller MFP_XWAY(GPIO6, GPIO, STP, GPT, USIF),
638be14811cSMartin Schiller MFP_XWAY(GPIO7, GPIO, CGU, CBUS, GPHY),
639be14811cSMartin Schiller MFP_XWAY(GPIO8, GPIO, CGU, NMI, NONE),
640be14811cSMartin Schiller MFP_XWAY(GPIO9, GPIO, USIF, SPI, EXIN),
641be14811cSMartin Schiller MFP_XWAY(GPIO10, GPIO, USIF, SPI, EXIN),
642be14811cSMartin Schiller MFP_XWAY(GPIO11, GPIO, USIF, CBUS, SPI),
643be14811cSMartin Schiller MFP_XWAY(GPIO12, GPIO, USIF, CBUS, MCD),
644be14811cSMartin Schiller MFP_XWAY(GPIO13, GPIO, EBU, SPI, NONE),
645be14811cSMartin Schiller MFP_XWAY(GPIO14, GPIO, CGU, CBUS, USIF),
646be14811cSMartin Schiller MFP_XWAY(GPIO15, GPIO, SPI, SDIO, MCD),
647be14811cSMartin Schiller MFP_XWAY(GPIO16, GPIO, SPI, SDIO, NONE),
648be14811cSMartin Schiller MFP_XWAY(GPIO17, GPIO, SPI, SDIO, NONE),
649be14811cSMartin Schiller MFP_XWAY(GPIO18, GPIO, SPI, SDIO, NONE),
650be14811cSMartin Schiller MFP_XWAY(GPIO19, GPIO, PCI, SDIO, CGU),
651be14811cSMartin Schiller MFP_XWAY(GPIO20, GPIO, NONE, SDIO, EBU),
652be14811cSMartin Schiller MFP_XWAY(GPIO21, GPIO, PCI, EBU, GPT),
653be14811cSMartin Schiller MFP_XWAY(GPIO22, GPIO, SPI, CGU, EBU),
654be14811cSMartin Schiller MFP_XWAY(GPIO23, GPIO, EBU, PCI, STP),
655be14811cSMartin Schiller MFP_XWAY(GPIO24, GPIO, EBU, TDM, PCI),
656be14811cSMartin Schiller MFP_XWAY(GPIO25, GPIO, TDM, SDIO, USIF),
657be14811cSMartin Schiller MFP_XWAY(GPIO26, GPIO, EBU, TDM, SDIO),
658be14811cSMartin Schiller MFP_XWAY(GPIO27, GPIO, TDM, SDIO, USIF),
659be14811cSMartin Schiller MFP_XWAY(GPIO28, GPIO, GPT, PCI, SDIO),
660be14811cSMartin Schiller MFP_XWAY(GPIO29, GPIO, PCI, CBUS, EXIN),
661be14811cSMartin Schiller MFP_XWAY(GPIO30, GPIO, PCI, CBUS, NONE),
662be14811cSMartin Schiller MFP_XWAY(GPIO31, GPIO, EBU, PCI, NONE),
663be14811cSMartin Schiller MFP_XWAY(GPIO32, GPIO, MII, NONE, EBU),
664be14811cSMartin Schiller MFP_XWAY(GPIO33, GPIO, MII, NONE, EBU),
665be14811cSMartin Schiller MFP_XWAY(GPIO34, GPIO, SIN, SSI, NONE),
666be14811cSMartin Schiller MFP_XWAY(GPIO35, GPIO, SIN, SSI, NONE),
667be14811cSMartin Schiller MFP_XWAY(GPIO36, GPIO, SIN, SSI, EXIN),
668be14811cSMartin Schiller MFP_XWAY(GPIO37, GPIO, USIF, NONE, PCI),
669be14811cSMartin Schiller MFP_XWAY(GPIO38, GPIO, PCI, USIF, NONE),
670be14811cSMartin Schiller MFP_XWAY(GPIO39, GPIO, USIF, EXIN, NONE),
671be14811cSMartin Schiller MFP_XWAY(GPIO40, GPIO, MII, TDM, NONE),
672be14811cSMartin Schiller MFP_XWAY(GPIO41, GPIO, MII, TDM, NONE),
673be14811cSMartin Schiller MFP_XWAY(GPIO42, GPIO, MDIO, NONE, NONE),
674be14811cSMartin Schiller MFP_XWAY(GPIO43, GPIO, MDIO, NONE, NONE),
675be14811cSMartin Schiller MFP_XWAY(GPIO44, GPIO, MII, SIN, GPHY),
676be14811cSMartin Schiller MFP_XWAY(GPIO45, GPIO, MII, GPHY, SIN),
677be14811cSMartin Schiller MFP_XWAY(GPIO46, GPIO, MII, NONE, EXIN),
678be14811cSMartin Schiller MFP_XWAY(GPIO47, GPIO, MII, GPHY, SIN),
679be14811cSMartin Schiller MFP_XWAY(GPIO48, GPIO, EBU, NONE, NONE),
680be14811cSMartin Schiller MFP_XWAY(GPIO49, GPIO, EBU, NONE, NONE),
681be14811cSMartin Schiller };
682be14811cSMartin Schiller
683be14811cSMartin Schiller static const unsigned xrx200_exin_pin_map[] = {GPIO0, GPIO1, GPIO2, GPIO39, GPIO10, GPIO9};
684be14811cSMartin Schiller
685be14811cSMartin Schiller static const unsigned xrx200_pins_exin0[] = {GPIO0};
686be14811cSMartin Schiller static const unsigned xrx200_pins_exin1[] = {GPIO1};
687be14811cSMartin Schiller static const unsigned xrx200_pins_exin2[] = {GPIO2};
688be14811cSMartin Schiller static const unsigned xrx200_pins_exin3[] = {GPIO39};
689be14811cSMartin Schiller static const unsigned xrx200_pins_exin4[] = {GPIO10};
690be14811cSMartin Schiller static const unsigned xrx200_pins_exin5[] = {GPIO9};
691be14811cSMartin Schiller
692be14811cSMartin Schiller static const unsigned xrx200_pins_usif_uart_rx[] = {GPIO11};
693be14811cSMartin Schiller static const unsigned xrx200_pins_usif_uart_tx[] = {GPIO12};
694be14811cSMartin Schiller static const unsigned xrx200_pins_usif_uart_rts[] = {GPIO9};
695be14811cSMartin Schiller static const unsigned xrx200_pins_usif_uart_cts[] = {GPIO10};
696be14811cSMartin Schiller static const unsigned xrx200_pins_usif_uart_dtr[] = {GPIO4};
697be14811cSMartin Schiller static const unsigned xrx200_pins_usif_uart_dsr[] = {GPIO6};
698be14811cSMartin Schiller static const unsigned xrx200_pins_usif_uart_dcd[] = {GPIO25};
699be14811cSMartin Schiller static const unsigned xrx200_pins_usif_uart_ri[] = {GPIO27};
700be14811cSMartin Schiller
701be14811cSMartin Schiller static const unsigned xrx200_pins_usif_spi_di[] = {GPIO11};
702be14811cSMartin Schiller static const unsigned xrx200_pins_usif_spi_do[] = {GPIO12};
703be14811cSMartin Schiller static const unsigned xrx200_pins_usif_spi_clk[] = {GPIO38};
704be14811cSMartin Schiller static const unsigned xrx200_pins_usif_spi_cs0[] = {GPIO37};
705be14811cSMartin Schiller static const unsigned xrx200_pins_usif_spi_cs1[] = {GPIO39};
706be14811cSMartin Schiller static const unsigned xrx200_pins_usif_spi_cs2[] = {GPIO14};
707be14811cSMartin Schiller
708be14811cSMartin Schiller static const unsigned xrx200_pins_stp[] = {GPIO4, GPIO5, GPIO6};
709be14811cSMartin Schiller static const unsigned xrx200_pins_nmi[] = {GPIO8};
710be14811cSMartin Schiller static const unsigned xrx200_pins_mdio[] = {GPIO42, GPIO43};
711be14811cSMartin Schiller
712be14811cSMartin Schiller static const unsigned xrx200_pins_dfe_led0[] = {GPIO4};
713be14811cSMartin Schiller static const unsigned xrx200_pins_dfe_led1[] = {GPIO5};
714be14811cSMartin Schiller
715be14811cSMartin Schiller static const unsigned xrx200_pins_gphy0_led0[] = {GPIO5};
716be14811cSMartin Schiller static const unsigned xrx200_pins_gphy0_led1[] = {GPIO7};
717be14811cSMartin Schiller static const unsigned xrx200_pins_gphy0_led2[] = {GPIO2};
718be14811cSMartin Schiller static const unsigned xrx200_pins_gphy1_led0[] = {GPIO44};
719be14811cSMartin Schiller static const unsigned xrx200_pins_gphy1_led1[] = {GPIO45};
720be14811cSMartin Schiller static const unsigned xrx200_pins_gphy1_led2[] = {GPIO47};
721be14811cSMartin Schiller
722be14811cSMartin Schiller static const unsigned xrx200_pins_ebu_a24[] = {GPIO13};
723be14811cSMartin Schiller static const unsigned xrx200_pins_ebu_clk[] = {GPIO21};
724be14811cSMartin Schiller static const unsigned xrx200_pins_ebu_cs1[] = {GPIO23};
725be14811cSMartin Schiller static const unsigned xrx200_pins_ebu_a23[] = {GPIO24};
726be14811cSMartin Schiller static const unsigned xrx200_pins_ebu_wait[] = {GPIO26};
727be14811cSMartin Schiller static const unsigned xrx200_pins_ebu_a25[] = {GPIO31};
728be14811cSMartin Schiller
729be14811cSMartin Schiller static const unsigned xrx200_pins_nand_ale[] = {GPIO13};
730be14811cSMartin Schiller static const unsigned xrx200_pins_nand_cs1[] = {GPIO23};
731be14811cSMartin Schiller static const unsigned xrx200_pins_nand_cle[] = {GPIO24};
732be14811cSMartin Schiller static const unsigned xrx200_pins_nand_rdy[] = {GPIO48};
733be14811cSMartin Schiller static const unsigned xrx200_pins_nand_rd[] = {GPIO49};
734be14811cSMartin Schiller
735be14811cSMartin Schiller static const unsigned xrx200_pins_spi_di[] = {GPIO16};
736be14811cSMartin Schiller static const unsigned xrx200_pins_spi_do[] = {GPIO17};
737be14811cSMartin Schiller static const unsigned xrx200_pins_spi_clk[] = {GPIO18};
738be14811cSMartin Schiller static const unsigned xrx200_pins_spi_cs1[] = {GPIO15};
739be14811cSMartin Schiller static const unsigned xrx200_pins_spi_cs2[] = {GPIO22};
740be14811cSMartin Schiller static const unsigned xrx200_pins_spi_cs3[] = {GPIO13};
741be14811cSMartin Schiller static const unsigned xrx200_pins_spi_cs4[] = {GPIO10};
742be14811cSMartin Schiller static const unsigned xrx200_pins_spi_cs5[] = {GPIO9};
743be14811cSMartin Schiller static const unsigned xrx200_pins_spi_cs6[] = {GPIO11};
744be14811cSMartin Schiller
745be14811cSMartin Schiller static const unsigned xrx200_pins_gpt1[] = {GPIO28};
746be14811cSMartin Schiller static const unsigned xrx200_pins_gpt2[] = {GPIO21};
747be14811cSMartin Schiller static const unsigned xrx200_pins_gpt3[] = {GPIO6};
748be14811cSMartin Schiller
749be14811cSMartin Schiller static const unsigned xrx200_pins_clkout0[] = {GPIO8};
750be14811cSMartin Schiller static const unsigned xrx200_pins_clkout1[] = {GPIO7};
751be14811cSMartin Schiller static const unsigned xrx200_pins_clkout2[] = {GPIO3};
752be14811cSMartin Schiller static const unsigned xrx200_pins_clkout3[] = {GPIO2};
753be14811cSMartin Schiller
754be14811cSMartin Schiller static const unsigned xrx200_pins_pci_gnt1[] = {GPIO28};
755be14811cSMartin Schiller static const unsigned xrx200_pins_pci_gnt2[] = {GPIO23};
756be14811cSMartin Schiller static const unsigned xrx200_pins_pci_gnt3[] = {GPIO19};
757be14811cSMartin Schiller static const unsigned xrx200_pins_pci_gnt4[] = {GPIO38};
758be14811cSMartin Schiller static const unsigned xrx200_pins_pci_req1[] = {GPIO29};
759be14811cSMartin Schiller static const unsigned xrx200_pins_pci_req2[] = {GPIO31};
760be14811cSMartin Schiller static const unsigned xrx200_pins_pci_req3[] = {GPIO3};
761be14811cSMartin Schiller static const unsigned xrx200_pins_pci_req4[] = {GPIO37};
762be14811cSMartin Schiller
763be14811cSMartin Schiller static const struct ltq_pin_group xrx200_grps[] = {
764be14811cSMartin Schiller GRP_MUX("exin0", EXIN, xrx200_pins_exin0),
765be14811cSMartin Schiller GRP_MUX("exin1", EXIN, xrx200_pins_exin1),
766be14811cSMartin Schiller GRP_MUX("exin2", EXIN, xrx200_pins_exin2),
767be14811cSMartin Schiller GRP_MUX("exin3", EXIN, xrx200_pins_exin3),
768be14811cSMartin Schiller GRP_MUX("exin4", EXIN, xrx200_pins_exin4),
769be14811cSMartin Schiller GRP_MUX("exin5", EXIN, xrx200_pins_exin5),
770be14811cSMartin Schiller GRP_MUX("ebu a23", EBU, xrx200_pins_ebu_a23),
771be14811cSMartin Schiller GRP_MUX("ebu a24", EBU, xrx200_pins_ebu_a24),
772be14811cSMartin Schiller GRP_MUX("ebu a25", EBU, xrx200_pins_ebu_a25),
773be14811cSMartin Schiller GRP_MUX("ebu clk", EBU, xrx200_pins_ebu_clk),
774be14811cSMartin Schiller GRP_MUX("ebu cs1", EBU, xrx200_pins_ebu_cs1),
775be14811cSMartin Schiller GRP_MUX("ebu wait", EBU, xrx200_pins_ebu_wait),
776be14811cSMartin Schiller GRP_MUX("nand ale", EBU, xrx200_pins_nand_ale),
777be14811cSMartin Schiller GRP_MUX("nand cs1", EBU, xrx200_pins_nand_cs1),
778be14811cSMartin Schiller GRP_MUX("nand cle", EBU, xrx200_pins_nand_cle),
779be14811cSMartin Schiller GRP_MUX("nand rdy", EBU, xrx200_pins_nand_rdy),
780be14811cSMartin Schiller GRP_MUX("nand rd", EBU, xrx200_pins_nand_rd),
781be14811cSMartin Schiller GRP_MUX("spi_di", SPI, xrx200_pins_spi_di),
782be14811cSMartin Schiller GRP_MUX("spi_do", SPI, xrx200_pins_spi_do),
783be14811cSMartin Schiller GRP_MUX("spi_clk", SPI, xrx200_pins_spi_clk),
784be14811cSMartin Schiller GRP_MUX("spi_cs1", SPI, xrx200_pins_spi_cs1),
785be14811cSMartin Schiller GRP_MUX("spi_cs2", SPI, xrx200_pins_spi_cs2),
786be14811cSMartin Schiller GRP_MUX("spi_cs3", SPI, xrx200_pins_spi_cs3),
787be14811cSMartin Schiller GRP_MUX("spi_cs4", SPI, xrx200_pins_spi_cs4),
788be14811cSMartin Schiller GRP_MUX("spi_cs5", SPI, xrx200_pins_spi_cs5),
789be14811cSMartin Schiller GRP_MUX("spi_cs6", SPI, xrx200_pins_spi_cs6),
790be14811cSMartin Schiller GRP_MUX("usif uart_rx", USIF, xrx200_pins_usif_uart_rx),
7914196be5bSMartin Schiller GRP_MUX("usif uart_tx", USIF, xrx200_pins_usif_uart_tx),
792be14811cSMartin Schiller GRP_MUX("usif uart_rts", USIF, xrx200_pins_usif_uart_rts),
793be14811cSMartin Schiller GRP_MUX("usif uart_cts", USIF, xrx200_pins_usif_uart_cts),
794be14811cSMartin Schiller GRP_MUX("usif uart_dtr", USIF, xrx200_pins_usif_uart_dtr),
795be14811cSMartin Schiller GRP_MUX("usif uart_dsr", USIF, xrx200_pins_usif_uart_dsr),
796be14811cSMartin Schiller GRP_MUX("usif uart_dcd", USIF, xrx200_pins_usif_uart_dcd),
797be14811cSMartin Schiller GRP_MUX("usif uart_ri", USIF, xrx200_pins_usif_uart_ri),
798be14811cSMartin Schiller GRP_MUX("usif spi_di", USIF, xrx200_pins_usif_spi_di),
799be14811cSMartin Schiller GRP_MUX("usif spi_do", USIF, xrx200_pins_usif_spi_do),
800be14811cSMartin Schiller GRP_MUX("usif spi_clk", USIF, xrx200_pins_usif_spi_clk),
801be14811cSMartin Schiller GRP_MUX("usif spi_cs0", USIF, xrx200_pins_usif_spi_cs0),
802be14811cSMartin Schiller GRP_MUX("usif spi_cs1", USIF, xrx200_pins_usif_spi_cs1),
803be14811cSMartin Schiller GRP_MUX("usif spi_cs2", USIF, xrx200_pins_usif_spi_cs2),
804be14811cSMartin Schiller GRP_MUX("stp", STP, xrx200_pins_stp),
805be14811cSMartin Schiller GRP_MUX("nmi", NMI, xrx200_pins_nmi),
806be14811cSMartin Schiller GRP_MUX("gpt1", GPT, xrx200_pins_gpt1),
807be14811cSMartin Schiller GRP_MUX("gpt2", GPT, xrx200_pins_gpt2),
808be14811cSMartin Schiller GRP_MUX("gpt3", GPT, xrx200_pins_gpt3),
809be14811cSMartin Schiller GRP_MUX("clkout0", CGU, xrx200_pins_clkout0),
810be14811cSMartin Schiller GRP_MUX("clkout1", CGU, xrx200_pins_clkout1),
811be14811cSMartin Schiller GRP_MUX("clkout2", CGU, xrx200_pins_clkout2),
812be14811cSMartin Schiller GRP_MUX("clkout3", CGU, xrx200_pins_clkout3),
813be14811cSMartin Schiller GRP_MUX("gnt1", PCI, xrx200_pins_pci_gnt1),
814be14811cSMartin Schiller GRP_MUX("gnt2", PCI, xrx200_pins_pci_gnt2),
815be14811cSMartin Schiller GRP_MUX("gnt3", PCI, xrx200_pins_pci_gnt3),
816be14811cSMartin Schiller GRP_MUX("gnt4", PCI, xrx200_pins_pci_gnt4),
817be14811cSMartin Schiller GRP_MUX("req1", PCI, xrx200_pins_pci_req1),
818be14811cSMartin Schiller GRP_MUX("req2", PCI, xrx200_pins_pci_req2),
819be14811cSMartin Schiller GRP_MUX("req3", PCI, xrx200_pins_pci_req3),
820be14811cSMartin Schiller GRP_MUX("req4", PCI, xrx200_pins_pci_req4),
821be14811cSMartin Schiller GRP_MUX("mdio", MDIO, xrx200_pins_mdio),
822be14811cSMartin Schiller GRP_MUX("dfe led0", DFE, xrx200_pins_dfe_led0),
823be14811cSMartin Schiller GRP_MUX("dfe led1", DFE, xrx200_pins_dfe_led1),
824be14811cSMartin Schiller GRP_MUX("gphy0 led0", GPHY, xrx200_pins_gphy0_led0),
825be14811cSMartin Schiller GRP_MUX("gphy0 led1", GPHY, xrx200_pins_gphy0_led1),
826be14811cSMartin Schiller GRP_MUX("gphy0 led2", GPHY, xrx200_pins_gphy0_led2),
827be14811cSMartin Schiller GRP_MUX("gphy1 led0", GPHY, xrx200_pins_gphy1_led0),
828be14811cSMartin Schiller GRP_MUX("gphy1 led1", GPHY, xrx200_pins_gphy1_led1),
829be14811cSMartin Schiller GRP_MUX("gphy1 led2", GPHY, xrx200_pins_gphy1_led2),
830be14811cSMartin Schiller };
831be14811cSMartin Schiller
832be14811cSMartin Schiller static const char * const xrx200_pci_grps[] = {"gnt1", "gnt2",
833be14811cSMartin Schiller "gnt3", "gnt4",
834be14811cSMartin Schiller "req1", "req2",
835be14811cSMartin Schiller "req3", "req4"};
836be14811cSMartin Schiller static const char * const xrx200_spi_grps[] = {"spi_di", "spi_do",
837be14811cSMartin Schiller "spi_clk", "spi_cs1",
838be14811cSMartin Schiller "spi_cs2", "spi_cs3",
839be14811cSMartin Schiller "spi_cs4", "spi_cs5",
840be14811cSMartin Schiller "spi_cs6"};
841be14811cSMartin Schiller static const char * const xrx200_cgu_grps[] = {"clkout0", "clkout1",
842be14811cSMartin Schiller "clkout2", "clkout3"};
843be14811cSMartin Schiller static const char * const xrx200_ebu_grps[] = {"ebu a23", "ebu a24",
844be14811cSMartin Schiller "ebu a25", "ebu cs1",
845be14811cSMartin Schiller "ebu wait", "ebu clk",
846be14811cSMartin Schiller "nand ale", "nand cs1",
847be14811cSMartin Schiller "nand cle", "nand rdy",
848be14811cSMartin Schiller "nand rd"};
849be14811cSMartin Schiller static const char * const xrx200_exin_grps[] = {"exin0", "exin1", "exin2",
850be14811cSMartin Schiller "exin3", "exin4", "exin5"};
851be14811cSMartin Schiller static const char * const xrx200_gpt_grps[] = {"gpt1", "gpt2", "gpt3"};
852be14811cSMartin Schiller static const char * const xrx200_usif_grps[] = {"usif uart_rx", "usif uart_tx",
853be14811cSMartin Schiller "usif uart_rts", "usif uart_cts",
854be14811cSMartin Schiller "usif uart_dtr", "usif uart_dsr",
855be14811cSMartin Schiller "usif uart_dcd", "usif uart_ri",
856be14811cSMartin Schiller "usif spi_di", "usif spi_do",
857be14811cSMartin Schiller "usif spi_clk", "usif spi_cs0",
858be14811cSMartin Schiller "usif spi_cs1", "usif spi_cs2"};
859be14811cSMartin Schiller static const char * const xrx200_stp_grps[] = {"stp"};
860be14811cSMartin Schiller static const char * const xrx200_nmi_grps[] = {"nmi"};
861be14811cSMartin Schiller static const char * const xrx200_mdio_grps[] = {"mdio"};
862be14811cSMartin Schiller static const char * const xrx200_dfe_grps[] = {"dfe led0", "dfe led1"};
863be14811cSMartin Schiller static const char * const xrx200_gphy_grps[] = {"gphy0 led0", "gphy0 led1",
864be14811cSMartin Schiller "gphy0 led2", "gphy1 led0",
865be14811cSMartin Schiller "gphy1 led1", "gphy1 led2"};
866be14811cSMartin Schiller
867be14811cSMartin Schiller static const struct ltq_pmx_func xrx200_funcs[] = {
868be14811cSMartin Schiller {"spi", ARRAY_AND_SIZE(xrx200_spi_grps)},
869be14811cSMartin Schiller {"usif", ARRAY_AND_SIZE(xrx200_usif_grps)},
870be14811cSMartin Schiller {"cgu", ARRAY_AND_SIZE(xrx200_cgu_grps)},
871be14811cSMartin Schiller {"exin", ARRAY_AND_SIZE(xrx200_exin_grps)},
872be14811cSMartin Schiller {"stp", ARRAY_AND_SIZE(xrx200_stp_grps)},
873be14811cSMartin Schiller {"gpt", ARRAY_AND_SIZE(xrx200_gpt_grps)},
874be14811cSMartin Schiller {"nmi", ARRAY_AND_SIZE(xrx200_nmi_grps)},
875be14811cSMartin Schiller {"pci", ARRAY_AND_SIZE(xrx200_pci_grps)},
876be14811cSMartin Schiller {"ebu", ARRAY_AND_SIZE(xrx200_ebu_grps)},
877be14811cSMartin Schiller {"mdio", ARRAY_AND_SIZE(xrx200_mdio_grps)},
878be14811cSMartin Schiller {"dfe", ARRAY_AND_SIZE(xrx200_dfe_grps)},
879be14811cSMartin Schiller {"gphy", ARRAY_AND_SIZE(xrx200_gphy_grps)},
880be14811cSMartin Schiller };
881be14811cSMartin Schiller
882be14811cSMartin Schiller /* --------- xrx300 related code --------- */
883be14811cSMartin Schiller #define XRX300_MAX_PIN 64
884be14811cSMartin Schiller
885be14811cSMartin Schiller static const struct ltq_mfp_pin xrx300_mfp[] = {
886be14811cSMartin Schiller /* pin f0 f1 f2 f3 */
887be14811cSMartin Schiller MFP_XWAY(GPIO0, GPIO, EXIN, EPHY, NONE),
888be14811cSMartin Schiller MFP_XWAY(GPIO1, GPIO, NONE, EXIN, NONE),
889be14811cSMartin Schiller MFP_XWAY(GPIO2, NONE, NONE, NONE, NONE),
890be14811cSMartin Schiller MFP_XWAY(GPIO3, GPIO, CGU, NONE, NONE),
891be14811cSMartin Schiller MFP_XWAY(GPIO4, GPIO, STP, DFE, NONE),
892be14811cSMartin Schiller MFP_XWAY(GPIO5, GPIO, STP, EPHY, DFE),
893be14811cSMartin Schiller MFP_XWAY(GPIO6, GPIO, STP, NONE, NONE),
894be14811cSMartin Schiller MFP_XWAY(GPIO7, NONE, NONE, NONE, NONE),
895be14811cSMartin Schiller MFP_XWAY(GPIO8, GPIO, CGU, GPHY, EPHY),
896be14811cSMartin Schiller MFP_XWAY(GPIO9, GPIO, WIFI, NONE, EXIN),
897be14811cSMartin Schiller MFP_XWAY(GPIO10, GPIO, USIF, SPI, EXIN),
898be14811cSMartin Schiller MFP_XWAY(GPIO11, GPIO, USIF, WIFI, SPI),
899be14811cSMartin Schiller MFP_XWAY(GPIO12, NONE, NONE, NONE, NONE),
900be14811cSMartin Schiller MFP_XWAY(GPIO13, GPIO, EBU, NONE, NONE),
901be14811cSMartin Schiller MFP_XWAY(GPIO14, GPIO, CGU, USIF, EPHY),
902be14811cSMartin Schiller MFP_XWAY(GPIO15, GPIO, SPI, NONE, MCD),
903be14811cSMartin Schiller MFP_XWAY(GPIO16, GPIO, SPI, EXIN, NONE),
904be14811cSMartin Schiller MFP_XWAY(GPIO17, GPIO, SPI, NONE, NONE),
905be14811cSMartin Schiller MFP_XWAY(GPIO18, GPIO, SPI, NONE, NONE),
906be14811cSMartin Schiller MFP_XWAY(GPIO19, GPIO, USIF, NONE, EPHY),
907be14811cSMartin Schiller MFP_XWAY(GPIO20, NONE, NONE, NONE, NONE),
908be14811cSMartin Schiller MFP_XWAY(GPIO21, NONE, NONE, NONE, NONE),
909be14811cSMartin Schiller MFP_XWAY(GPIO22, NONE, NONE, NONE, NONE),
910be14811cSMartin Schiller MFP_XWAY(GPIO23, GPIO, EBU, NONE, NONE),
911be14811cSMartin Schiller MFP_XWAY(GPIO24, GPIO, EBU, NONE, NONE),
912be14811cSMartin Schiller MFP_XWAY(GPIO25, GPIO, TDM, NONE, NONE),
913be14811cSMartin Schiller MFP_XWAY(GPIO26, GPIO, TDM, NONE, NONE),
914be14811cSMartin Schiller MFP_XWAY(GPIO27, GPIO, TDM, NONE, NONE),
915be14811cSMartin Schiller MFP_XWAY(GPIO28, NONE, NONE, NONE, NONE),
916be14811cSMartin Schiller MFP_XWAY(GPIO29, NONE, NONE, NONE, NONE),
917be14811cSMartin Schiller MFP_XWAY(GPIO30, NONE, NONE, NONE, NONE),
918be14811cSMartin Schiller MFP_XWAY(GPIO31, NONE, NONE, NONE, NONE),
919be14811cSMartin Schiller MFP_XWAY(GPIO32, NONE, NONE, NONE, NONE),
920be14811cSMartin Schiller MFP_XWAY(GPIO33, NONE, NONE, NONE, NONE),
921be14811cSMartin Schiller MFP_XWAY(GPIO34, GPIO, NONE, SSI, NONE),
922be14811cSMartin Schiller MFP_XWAY(GPIO35, GPIO, NONE, SSI, NONE),
923be14811cSMartin Schiller MFP_XWAY(GPIO36, GPIO, NONE, SSI, NONE),
924be14811cSMartin Schiller MFP_XWAY(GPIO37, NONE, NONE, NONE, NONE),
925be14811cSMartin Schiller MFP_XWAY(GPIO38, NONE, NONE, NONE, NONE),
926be14811cSMartin Schiller MFP_XWAY(GPIO39, NONE, NONE, NONE, NONE),
927be14811cSMartin Schiller MFP_XWAY(GPIO40, NONE, NONE, NONE, NONE),
928be14811cSMartin Schiller MFP_XWAY(GPIO41, NONE, NONE, NONE, NONE),
929be14811cSMartin Schiller MFP_XWAY(GPIO42, GPIO, MDIO, NONE, NONE),
930be14811cSMartin Schiller MFP_XWAY(GPIO43, GPIO, MDIO, NONE, NONE),
931be14811cSMartin Schiller MFP_XWAY(GPIO44, NONE, NONE, NONE, NONE),
932be14811cSMartin Schiller MFP_XWAY(GPIO45, NONE, NONE, NONE, NONE),
933be14811cSMartin Schiller MFP_XWAY(GPIO46, NONE, NONE, NONE, NONE),
934be14811cSMartin Schiller MFP_XWAY(GPIO47, NONE, NONE, NONE, NONE),
935be14811cSMartin Schiller MFP_XWAY(GPIO48, GPIO, EBU, NONE, NONE),
936be14811cSMartin Schiller MFP_XWAY(GPIO49, GPIO, EBU, NONE, NONE),
937be14811cSMartin Schiller MFP_XWAY(GPIO50, GPIO, EBU, NONE, NONE),
938be14811cSMartin Schiller MFP_XWAY(GPIO51, GPIO, EBU, NONE, NONE),
939be14811cSMartin Schiller MFP_XWAY(GPIO52, GPIO, EBU, NONE, NONE),
940be14811cSMartin Schiller MFP_XWAY(GPIO53, GPIO, EBU, NONE, NONE),
941be14811cSMartin Schiller MFP_XWAY(GPIO54, GPIO, EBU, NONE, NONE),
942be14811cSMartin Schiller MFP_XWAY(GPIO55, GPIO, EBU, NONE, NONE),
943be14811cSMartin Schiller MFP_XWAY(GPIO56, GPIO, EBU, NONE, NONE),
944be14811cSMartin Schiller MFP_XWAY(GPIO57, GPIO, EBU, NONE, NONE),
945be14811cSMartin Schiller MFP_XWAY(GPIO58, GPIO, EBU, TDM, NONE),
946be14811cSMartin Schiller MFP_XWAY(GPIO59, GPIO, EBU, NONE, NONE),
947be14811cSMartin Schiller MFP_XWAY(GPIO60, GPIO, EBU, NONE, NONE),
948be14811cSMartin Schiller MFP_XWAY(GPIO61, GPIO, EBU, NONE, NONE),
949be14811cSMartin Schiller MFP_XWAY(GPIO62, NONE, NONE, NONE, NONE),
950be14811cSMartin Schiller MFP_XWAY(GPIO63, NONE, NONE, NONE, NONE),
951be14811cSMartin Schiller };
952be14811cSMartin Schiller
953be14811cSMartin Schiller static const unsigned xrx300_exin_pin_map[] = {GPIO0, GPIO1, GPIO16, GPIO10, GPIO9};
954be14811cSMartin Schiller
955be14811cSMartin Schiller static const unsigned xrx300_pins_exin0[] = {GPIO0};
956be14811cSMartin Schiller static const unsigned xrx300_pins_exin1[] = {GPIO1};
957be14811cSMartin Schiller static const unsigned xrx300_pins_exin2[] = {GPIO16};
958be14811cSMartin Schiller /* EXIN3 is not available on xrX300 */
959be14811cSMartin Schiller static const unsigned xrx300_pins_exin4[] = {GPIO10};
960be14811cSMartin Schiller static const unsigned xrx300_pins_exin5[] = {GPIO9};
961be14811cSMartin Schiller
962be14811cSMartin Schiller static const unsigned xrx300_pins_usif_uart_rx[] = {GPIO11};
963be14811cSMartin Schiller static const unsigned xrx300_pins_usif_uart_tx[] = {GPIO10};
964be14811cSMartin Schiller
965be14811cSMartin Schiller static const unsigned xrx300_pins_usif_spi_di[] = {GPIO11};
966be14811cSMartin Schiller static const unsigned xrx300_pins_usif_spi_do[] = {GPIO10};
967be14811cSMartin Schiller static const unsigned xrx300_pins_usif_spi_clk[] = {GPIO19};
968be14811cSMartin Schiller static const unsigned xrx300_pins_usif_spi_cs0[] = {GPIO14};
969be14811cSMartin Schiller
970be14811cSMartin Schiller static const unsigned xrx300_pins_stp[] = {GPIO4, GPIO5, GPIO6};
971be14811cSMartin Schiller static const unsigned xrx300_pins_mdio[] = {GPIO42, GPIO43};
972be14811cSMartin Schiller
973be14811cSMartin Schiller static const unsigned xrx300_pins_dfe_led0[] = {GPIO4};
974be14811cSMartin Schiller static const unsigned xrx300_pins_dfe_led1[] = {GPIO5};
975be14811cSMartin Schiller
976be14811cSMartin Schiller static const unsigned xrx300_pins_ephy0_led0[] = {GPIO5};
977be14811cSMartin Schiller static const unsigned xrx300_pins_ephy0_led1[] = {GPIO8};
978be14811cSMartin Schiller static const unsigned xrx300_pins_ephy1_led0[] = {GPIO14};
979be14811cSMartin Schiller static const unsigned xrx300_pins_ephy1_led1[] = {GPIO19};
980be14811cSMartin Schiller
981be14811cSMartin Schiller static const unsigned xrx300_pins_nand_ale[] = {GPIO13};
982be14811cSMartin Schiller static const unsigned xrx300_pins_nand_cs1[] = {GPIO23};
983be14811cSMartin Schiller static const unsigned xrx300_pins_nand_cle[] = {GPIO24};
984be14811cSMartin Schiller static const unsigned xrx300_pins_nand_rdy[] = {GPIO48};
985be14811cSMartin Schiller static const unsigned xrx300_pins_nand_rd[] = {GPIO49};
986be14811cSMartin Schiller static const unsigned xrx300_pins_nand_d1[] = {GPIO50};
987be14811cSMartin Schiller static const unsigned xrx300_pins_nand_d0[] = {GPIO51};
988be14811cSMartin Schiller static const unsigned xrx300_pins_nand_d2[] = {GPIO52};
989be14811cSMartin Schiller static const unsigned xrx300_pins_nand_d7[] = {GPIO53};
990be14811cSMartin Schiller static const unsigned xrx300_pins_nand_d6[] = {GPIO54};
991be14811cSMartin Schiller static const unsigned xrx300_pins_nand_d5[] = {GPIO55};
992be14811cSMartin Schiller static const unsigned xrx300_pins_nand_d4[] = {GPIO56};
993be14811cSMartin Schiller static const unsigned xrx300_pins_nand_d3[] = {GPIO57};
994be14811cSMartin Schiller static const unsigned xrx300_pins_nand_cs0[] = {GPIO58};
995be14811cSMartin Schiller static const unsigned xrx300_pins_nand_wr[] = {GPIO59};
996be14811cSMartin Schiller static const unsigned xrx300_pins_nand_wp[] = {GPIO60};
997be14811cSMartin Schiller static const unsigned xrx300_pins_nand_se[] = {GPIO61};
998be14811cSMartin Schiller
999be14811cSMartin Schiller static const unsigned xrx300_pins_spi_di[] = {GPIO16};
1000be14811cSMartin Schiller static const unsigned xrx300_pins_spi_do[] = {GPIO17};
1001be14811cSMartin Schiller static const unsigned xrx300_pins_spi_clk[] = {GPIO18};
1002be14811cSMartin Schiller static const unsigned xrx300_pins_spi_cs1[] = {GPIO15};
1003be14811cSMartin Schiller /* SPI_CS2 is not available on xrX300 */
1004be14811cSMartin Schiller /* SPI_CS3 is not available on xrX300 */
1005be14811cSMartin Schiller static const unsigned xrx300_pins_spi_cs4[] = {GPIO10};
1006be14811cSMartin Schiller /* SPI_CS5 is not available on xrX300 */
1007be14811cSMartin Schiller static const unsigned xrx300_pins_spi_cs6[] = {GPIO11};
1008be14811cSMartin Schiller
1009be14811cSMartin Schiller /* CLKOUT0 is not available on xrX300 */
1010be14811cSMartin Schiller /* CLKOUT1 is not available on xrX300 */
1011be14811cSMartin Schiller static const unsigned xrx300_pins_clkout2[] = {GPIO3};
1012be14811cSMartin Schiller
1013be14811cSMartin Schiller static const struct ltq_pin_group xrx300_grps[] = {
1014be14811cSMartin Schiller GRP_MUX("exin0", EXIN, xrx300_pins_exin0),
1015be14811cSMartin Schiller GRP_MUX("exin1", EXIN, xrx300_pins_exin1),
1016be14811cSMartin Schiller GRP_MUX("exin2", EXIN, xrx300_pins_exin2),
1017be14811cSMartin Schiller GRP_MUX("exin4", EXIN, xrx300_pins_exin4),
1018be14811cSMartin Schiller GRP_MUX("exin5", EXIN, xrx300_pins_exin5),
1019be14811cSMartin Schiller GRP_MUX("nand ale", EBU, xrx300_pins_nand_ale),
1020be14811cSMartin Schiller GRP_MUX("nand cs1", EBU, xrx300_pins_nand_cs1),
1021be14811cSMartin Schiller GRP_MUX("nand cle", EBU, xrx300_pins_nand_cle),
1022be14811cSMartin Schiller GRP_MUX("nand rdy", EBU, xrx300_pins_nand_rdy),
1023be14811cSMartin Schiller GRP_MUX("nand rd", EBU, xrx300_pins_nand_rd),
1024be14811cSMartin Schiller GRP_MUX("nand d1", EBU, xrx300_pins_nand_d1),
1025be14811cSMartin Schiller GRP_MUX("nand d0", EBU, xrx300_pins_nand_d0),
1026be14811cSMartin Schiller GRP_MUX("nand d2", EBU, xrx300_pins_nand_d2),
1027be14811cSMartin Schiller GRP_MUX("nand d7", EBU, xrx300_pins_nand_d7),
1028be14811cSMartin Schiller GRP_MUX("nand d6", EBU, xrx300_pins_nand_d6),
1029be14811cSMartin Schiller GRP_MUX("nand d5", EBU, xrx300_pins_nand_d5),
1030be14811cSMartin Schiller GRP_MUX("nand d4", EBU, xrx300_pins_nand_d4),
1031be14811cSMartin Schiller GRP_MUX("nand d3", EBU, xrx300_pins_nand_d3),
1032be14811cSMartin Schiller GRP_MUX("nand cs0", EBU, xrx300_pins_nand_cs0),
1033be14811cSMartin Schiller GRP_MUX("nand wr", EBU, xrx300_pins_nand_wr),
1034be14811cSMartin Schiller GRP_MUX("nand wp", EBU, xrx300_pins_nand_wp),
1035be14811cSMartin Schiller GRP_MUX("nand se", EBU, xrx300_pins_nand_se),
1036be14811cSMartin Schiller GRP_MUX("spi_di", SPI, xrx300_pins_spi_di),
1037be14811cSMartin Schiller GRP_MUX("spi_do", SPI, xrx300_pins_spi_do),
1038be14811cSMartin Schiller GRP_MUX("spi_clk", SPI, xrx300_pins_spi_clk),
1039be14811cSMartin Schiller GRP_MUX("spi_cs1", SPI, xrx300_pins_spi_cs1),
1040be14811cSMartin Schiller GRP_MUX("spi_cs4", SPI, xrx300_pins_spi_cs4),
1041be14811cSMartin Schiller GRP_MUX("spi_cs6", SPI, xrx300_pins_spi_cs6),
1042be14811cSMartin Schiller GRP_MUX("usif uart_rx", USIF, xrx300_pins_usif_uart_rx),
1043be14811cSMartin Schiller GRP_MUX("usif uart_tx", USIF, xrx300_pins_usif_uart_tx),
1044be14811cSMartin Schiller GRP_MUX("usif spi_di", USIF, xrx300_pins_usif_spi_di),
1045be14811cSMartin Schiller GRP_MUX("usif spi_do", USIF, xrx300_pins_usif_spi_do),
1046be14811cSMartin Schiller GRP_MUX("usif spi_clk", USIF, xrx300_pins_usif_spi_clk),
1047be14811cSMartin Schiller GRP_MUX("usif spi_cs0", USIF, xrx300_pins_usif_spi_cs0),
1048be14811cSMartin Schiller GRP_MUX("stp", STP, xrx300_pins_stp),
1049be14811cSMartin Schiller GRP_MUX("clkout2", CGU, xrx300_pins_clkout2),
1050be14811cSMartin Schiller GRP_MUX("mdio", MDIO, xrx300_pins_mdio),
1051be14811cSMartin Schiller GRP_MUX("dfe led0", DFE, xrx300_pins_dfe_led0),
1052be14811cSMartin Schiller GRP_MUX("dfe led1", DFE, xrx300_pins_dfe_led1),
1053be14811cSMartin Schiller GRP_MUX("ephy0 led0", GPHY, xrx300_pins_ephy0_led0),
1054be14811cSMartin Schiller GRP_MUX("ephy0 led1", GPHY, xrx300_pins_ephy0_led1),
1055be14811cSMartin Schiller GRP_MUX("ephy1 led0", GPHY, xrx300_pins_ephy1_led0),
1056be14811cSMartin Schiller GRP_MUX("ephy1 led1", GPHY, xrx300_pins_ephy1_led1),
1057be14811cSMartin Schiller };
1058be14811cSMartin Schiller
1059be14811cSMartin Schiller static const char * const xrx300_spi_grps[] = {"spi_di", "spi_do",
1060be14811cSMartin Schiller "spi_clk", "spi_cs1",
1061be14811cSMartin Schiller "spi_cs4", "spi_cs6"};
1062be14811cSMartin Schiller static const char * const xrx300_cgu_grps[] = {"clkout2"};
1063be14811cSMartin Schiller static const char * const xrx300_ebu_grps[] = {"nand ale", "nand cs1",
1064be14811cSMartin Schiller "nand cle", "nand rdy",
1065be14811cSMartin Schiller "nand rd", "nand d1",
1066be14811cSMartin Schiller "nand d0", "nand d2",
1067be14811cSMartin Schiller "nand d7", "nand d6",
1068be14811cSMartin Schiller "nand d5", "nand d4",
1069be14811cSMartin Schiller "nand d3", "nand cs0",
1070be14811cSMartin Schiller "nand wr", "nand wp",
1071be14811cSMartin Schiller "nand se"};
1072be14811cSMartin Schiller static const char * const xrx300_exin_grps[] = {"exin0", "exin1", "exin2",
1073be14811cSMartin Schiller "exin4", "exin5"};
1074be14811cSMartin Schiller static const char * const xrx300_usif_grps[] = {"usif uart_rx", "usif uart_tx",
1075be14811cSMartin Schiller "usif spi_di", "usif spi_do",
1076be14811cSMartin Schiller "usif spi_clk", "usif spi_cs0"};
1077be14811cSMartin Schiller static const char * const xrx300_stp_grps[] = {"stp"};
1078be14811cSMartin Schiller static const char * const xrx300_mdio_grps[] = {"mdio"};
1079be14811cSMartin Schiller static const char * const xrx300_dfe_grps[] = {"dfe led0", "dfe led1"};
1080be14811cSMartin Schiller static const char * const xrx300_gphy_grps[] = {"ephy0 led0", "ephy0 led1",
1081be14811cSMartin Schiller "ephy1 led0", "ephy1 led1"};
1082be14811cSMartin Schiller
1083be14811cSMartin Schiller static const struct ltq_pmx_func xrx300_funcs[] = {
1084be14811cSMartin Schiller {"spi", ARRAY_AND_SIZE(xrx300_spi_grps)},
1085be14811cSMartin Schiller {"usif", ARRAY_AND_SIZE(xrx300_usif_grps)},
1086be14811cSMartin Schiller {"cgu", ARRAY_AND_SIZE(xrx300_cgu_grps)},
1087be14811cSMartin Schiller {"exin", ARRAY_AND_SIZE(xrx300_exin_grps)},
1088be14811cSMartin Schiller {"stp", ARRAY_AND_SIZE(xrx300_stp_grps)},
1089be14811cSMartin Schiller {"ebu", ARRAY_AND_SIZE(xrx300_ebu_grps)},
1090be14811cSMartin Schiller {"mdio", ARRAY_AND_SIZE(xrx300_mdio_grps)},
1091be14811cSMartin Schiller {"dfe", ARRAY_AND_SIZE(xrx300_dfe_grps)},
1092be14811cSMartin Schiller {"ephy", ARRAY_AND_SIZE(xrx300_gphy_grps)},
1093be14811cSMartin Schiller };
1094be14811cSMartin Schiller
10953f8c50c9SJohn Crispin /* --------- pinconf related code --------- */
xway_pinconf_get(struct pinctrl_dev * pctldev,unsigned pin,unsigned long * config)10963f8c50c9SJohn Crispin static int xway_pinconf_get(struct pinctrl_dev *pctldev,
10973f8c50c9SJohn Crispin unsigned pin,
10983f8c50c9SJohn Crispin unsigned long *config)
10993f8c50c9SJohn Crispin {
11003f8c50c9SJohn Crispin struct ltq_pinmux_info *info = pinctrl_dev_get_drvdata(pctldev);
11013f8c50c9SJohn Crispin enum ltq_pinconf_param param = LTQ_PINCONF_UNPACK_PARAM(*config);
11023f8c50c9SJohn Crispin int port = PORT(pin);
11033f8c50c9SJohn Crispin u32 reg;
11043f8c50c9SJohn Crispin
11053f8c50c9SJohn Crispin switch (param) {
11063f8c50c9SJohn Crispin case LTQ_PINCONF_PARAM_OPEN_DRAIN:
11073f8c50c9SJohn Crispin if (port == PORT3)
11083f8c50c9SJohn Crispin reg = GPIO3_OD;
11093f8c50c9SJohn Crispin else
1110362ba3cfSJohn Crispin reg = GPIO_OD(pin);
11113f8c50c9SJohn Crispin *config = LTQ_PINCONF_PACK(param,
11127541083fSJohn Crispin !gpio_getbit(info->membase[0], reg, PORT_PIN(pin)));
11133f8c50c9SJohn Crispin break;
11143f8c50c9SJohn Crispin
11153f8c50c9SJohn Crispin case LTQ_PINCONF_PARAM_PULL:
11163f8c50c9SJohn Crispin if (port == PORT3)
11173f8c50c9SJohn Crispin reg = GPIO3_PUDEN;
11183f8c50c9SJohn Crispin else
1119362ba3cfSJohn Crispin reg = GPIO_PUDEN(pin);
1120362ba3cfSJohn Crispin if (!gpio_getbit(info->membase[0], reg, PORT_PIN(pin))) {
11213f8c50c9SJohn Crispin *config = LTQ_PINCONF_PACK(param, 0);
11223f8c50c9SJohn Crispin break;
11233f8c50c9SJohn Crispin }
11243f8c50c9SJohn Crispin
11253f8c50c9SJohn Crispin if (port == PORT3)
11263f8c50c9SJohn Crispin reg = GPIO3_PUDSEL;
11273f8c50c9SJohn Crispin else
1128362ba3cfSJohn Crispin reg = GPIO_PUDSEL(pin);
1129362ba3cfSJohn Crispin if (!gpio_getbit(info->membase[0], reg, PORT_PIN(pin)))
11303f8c50c9SJohn Crispin *config = LTQ_PINCONF_PACK(param, 2);
11313f8c50c9SJohn Crispin else
11323f8c50c9SJohn Crispin *config = LTQ_PINCONF_PACK(param, 1);
11333f8c50c9SJohn Crispin break;
11343f8c50c9SJohn Crispin
11356360350cSJohn Crispin case LTQ_PINCONF_PARAM_OUTPUT:
11366360350cSJohn Crispin reg = GPIO_DIR(pin);
11376360350cSJohn Crispin *config = LTQ_PINCONF_PACK(param,
11386360350cSJohn Crispin gpio_getbit(info->membase[0], reg, PORT_PIN(pin)));
11396360350cSJohn Crispin break;
11403f8c50c9SJohn Crispin default:
11413f8c50c9SJohn Crispin dev_err(pctldev->dev, "Invalid config param %04x\n", param);
11423f8c50c9SJohn Crispin return -ENOTSUPP;
11433f8c50c9SJohn Crispin }
11443f8c50c9SJohn Crispin return 0;
11453f8c50c9SJohn Crispin }
11463f8c50c9SJohn Crispin
xway_pinconf_set(struct pinctrl_dev * pctldev,unsigned pin,unsigned long * configs,unsigned num_configs)11473f8c50c9SJohn Crispin static int xway_pinconf_set(struct pinctrl_dev *pctldev,
11483f8c50c9SJohn Crispin unsigned pin,
114903b054e9SSherman Yin unsigned long *configs,
115003b054e9SSherman Yin unsigned num_configs)
11513f8c50c9SJohn Crispin {
11523f8c50c9SJohn Crispin struct ltq_pinmux_info *info = pinctrl_dev_get_drvdata(pctldev);
115303b054e9SSherman Yin enum ltq_pinconf_param param;
115403b054e9SSherman Yin int arg;
11553f8c50c9SJohn Crispin int port = PORT(pin);
11563f8c50c9SJohn Crispin u32 reg;
115703b054e9SSherman Yin int i;
115803b054e9SSherman Yin
115903b054e9SSherman Yin for (i = 0; i < num_configs; i++) {
116003b054e9SSherman Yin param = LTQ_PINCONF_UNPACK_PARAM(configs[i]);
116103b054e9SSherman Yin arg = LTQ_PINCONF_UNPACK_ARG(configs[i]);
11623f8c50c9SJohn Crispin
11633f8c50c9SJohn Crispin switch (param) {
11643f8c50c9SJohn Crispin case LTQ_PINCONF_PARAM_OPEN_DRAIN:
11653f8c50c9SJohn Crispin if (port == PORT3)
11663f8c50c9SJohn Crispin reg = GPIO3_OD;
11673f8c50c9SJohn Crispin else
1168362ba3cfSJohn Crispin reg = GPIO_OD(pin);
116993386287SJohn Crispin if (arg == 0)
117003b054e9SSherman Yin gpio_setbit(info->membase[0],
117103b054e9SSherman Yin reg,
117203b054e9SSherman Yin PORT_PIN(pin));
117393386287SJohn Crispin else
117403b054e9SSherman Yin gpio_clearbit(info->membase[0],
117503b054e9SSherman Yin reg,
117603b054e9SSherman Yin PORT_PIN(pin));
11773f8c50c9SJohn Crispin break;
11783f8c50c9SJohn Crispin
11793f8c50c9SJohn Crispin case LTQ_PINCONF_PARAM_PULL:
11803f8c50c9SJohn Crispin if (port == PORT3)
11813f8c50c9SJohn Crispin reg = GPIO3_PUDEN;
11823f8c50c9SJohn Crispin else
1183362ba3cfSJohn Crispin reg = GPIO_PUDEN(pin);
11843f8c50c9SJohn Crispin if (arg == 0) {
118503b054e9SSherman Yin gpio_clearbit(info->membase[0],
118603b054e9SSherman Yin reg,
118703b054e9SSherman Yin PORT_PIN(pin));
11883f8c50c9SJohn Crispin break;
11893f8c50c9SJohn Crispin }
1190362ba3cfSJohn Crispin gpio_setbit(info->membase[0], reg, PORT_PIN(pin));
11913f8c50c9SJohn Crispin
11923f8c50c9SJohn Crispin if (port == PORT3)
11933f8c50c9SJohn Crispin reg = GPIO3_PUDSEL;
11943f8c50c9SJohn Crispin else
1195362ba3cfSJohn Crispin reg = GPIO_PUDSEL(pin);
11963f8c50c9SJohn Crispin if (arg == 1)
119703b054e9SSherman Yin gpio_clearbit(info->membase[0],
119803b054e9SSherman Yin reg,
119903b054e9SSherman Yin PORT_PIN(pin));
12003f8c50c9SJohn Crispin else if (arg == 2)
120103b054e9SSherman Yin gpio_setbit(info->membase[0],
120203b054e9SSherman Yin reg,
120303b054e9SSherman Yin PORT_PIN(pin));
12043f8c50c9SJohn Crispin else
120503b054e9SSherman Yin dev_err(pctldev->dev,
120603b054e9SSherman Yin "Invalid pull value %d\n", arg);
12073f8c50c9SJohn Crispin break;
12083f8c50c9SJohn Crispin
12096360350cSJohn Crispin case LTQ_PINCONF_PARAM_OUTPUT:
12106360350cSJohn Crispin reg = GPIO_DIR(pin);
12116360350cSJohn Crispin if (arg == 0)
121203b054e9SSherman Yin gpio_clearbit(info->membase[0],
121303b054e9SSherman Yin reg,
121403b054e9SSherman Yin PORT_PIN(pin));
12156360350cSJohn Crispin else
121603b054e9SSherman Yin gpio_setbit(info->membase[0],
121703b054e9SSherman Yin reg,
121803b054e9SSherman Yin PORT_PIN(pin));
12196360350cSJohn Crispin break;
12206360350cSJohn Crispin
12213f8c50c9SJohn Crispin default:
122203b054e9SSherman Yin dev_err(pctldev->dev,
122303b054e9SSherman Yin "Invalid config param %04x\n", param);
12243f8c50c9SJohn Crispin return -ENOTSUPP;
12253f8c50c9SJohn Crispin }
122603b054e9SSherman Yin } /* for each config */
122703b054e9SSherman Yin
12283f8c50c9SJohn Crispin return 0;
12293f8c50c9SJohn Crispin }
12303f8c50c9SJohn Crispin
xway_pinconf_group_set(struct pinctrl_dev * pctldev,unsigned selector,unsigned long * configs,unsigned num_configs)12313a6b04caSJohn Crispin int xway_pinconf_group_set(struct pinctrl_dev *pctldev,
12323a6b04caSJohn Crispin unsigned selector,
123303b054e9SSherman Yin unsigned long *configs,
123403b054e9SSherman Yin unsigned num_configs)
12353a6b04caSJohn Crispin {
12363a6b04caSJohn Crispin struct ltq_pinmux_info *info = pinctrl_dev_get_drvdata(pctldev);
12373a6b04caSJohn Crispin int i, ret = 0;
12383a6b04caSJohn Crispin
12393a6b04caSJohn Crispin for (i = 0; i < info->grps[selector].npins && !ret; i++)
12403a6b04caSJohn Crispin ret = xway_pinconf_set(pctldev,
124103b054e9SSherman Yin info->grps[selector].pins[i],
124203b054e9SSherman Yin configs,
124303b054e9SSherman Yin num_configs);
12443a6b04caSJohn Crispin
12453a6b04caSJohn Crispin return ret;
12463a6b04caSJohn Crispin }
12473a6b04caSJohn Crispin
1248022ab148SLaurent Pinchart static const struct pinconf_ops xway_pinconf_ops = {
12493f8c50c9SJohn Crispin .pin_config_get = xway_pinconf_get,
12503f8c50c9SJohn Crispin .pin_config_set = xway_pinconf_set,
12513a6b04caSJohn Crispin .pin_config_group_set = xway_pinconf_group_set,
12523f8c50c9SJohn Crispin };
12533f8c50c9SJohn Crispin
12543f8c50c9SJohn Crispin static struct pinctrl_desc xway_pctrl_desc = {
12553f8c50c9SJohn Crispin .owner = THIS_MODULE,
12563f8c50c9SJohn Crispin .confops = &xway_pinconf_ops,
12573f8c50c9SJohn Crispin };
12583f8c50c9SJohn Crispin
xway_mux_apply(struct pinctrl_dev * pctrldev,int pin,int mux)12593f8c50c9SJohn Crispin static inline int xway_mux_apply(struct pinctrl_dev *pctrldev,
12603f8c50c9SJohn Crispin int pin, int mux)
12613f8c50c9SJohn Crispin {
12623f8c50c9SJohn Crispin struct ltq_pinmux_info *info = pinctrl_dev_get_drvdata(pctrldev);
12633f8c50c9SJohn Crispin int port = PORT(pin);
12643f8c50c9SJohn Crispin u32 alt1_reg = GPIO_ALT1(pin);
12653f8c50c9SJohn Crispin
12663f8c50c9SJohn Crispin if (port == PORT3)
12673f8c50c9SJohn Crispin alt1_reg = GPIO3_ALT1;
12683f8c50c9SJohn Crispin
12693f8c50c9SJohn Crispin if (mux & MUX_ALT0)
12703f8c50c9SJohn Crispin gpio_setbit(info->membase[0], GPIO_ALT0(pin), PORT_PIN(pin));
12713f8c50c9SJohn Crispin else
12723f8c50c9SJohn Crispin gpio_clearbit(info->membase[0], GPIO_ALT0(pin), PORT_PIN(pin));
12733f8c50c9SJohn Crispin
12743f8c50c9SJohn Crispin if (mux & MUX_ALT1)
12753f8c50c9SJohn Crispin gpio_setbit(info->membase[0], alt1_reg, PORT_PIN(pin));
12763f8c50c9SJohn Crispin else
12773f8c50c9SJohn Crispin gpio_clearbit(info->membase[0], alt1_reg, PORT_PIN(pin));
12783f8c50c9SJohn Crispin
12793f8c50c9SJohn Crispin return 0;
12803f8c50c9SJohn Crispin }
12813f8c50c9SJohn Crispin
12823f8c50c9SJohn Crispin static const struct ltq_cfg_param xway_cfg_params[] = {
12833f8c50c9SJohn Crispin {"lantiq,pull", LTQ_PINCONF_PARAM_PULL},
12843f8c50c9SJohn Crispin {"lantiq,open-drain", LTQ_PINCONF_PARAM_OPEN_DRAIN},
12856360350cSJohn Crispin {"lantiq,output", LTQ_PINCONF_PARAM_OUTPUT},
12863f8c50c9SJohn Crispin };
12873f8c50c9SJohn Crispin
12883f8c50c9SJohn Crispin static struct ltq_pinmux_info xway_info = {
12893f8c50c9SJohn Crispin .desc = &xway_pctrl_desc,
12903f8c50c9SJohn Crispin .apply_mux = xway_mux_apply,
12913f8c50c9SJohn Crispin .params = xway_cfg_params,
12923f8c50c9SJohn Crispin .num_params = ARRAY_SIZE(xway_cfg_params),
12933f8c50c9SJohn Crispin };
12943f8c50c9SJohn Crispin
12953f8c50c9SJohn Crispin /* --------- gpio_chip related code --------- */
xway_gpio_set(struct gpio_chip * chip,unsigned int pin,int val)12963f8c50c9SJohn Crispin static void xway_gpio_set(struct gpio_chip *chip, unsigned int pin, int val)
12973f8c50c9SJohn Crispin {
129858383c78SLinus Walleij struct ltq_pinmux_info *info = dev_get_drvdata(chip->parent);
12993f8c50c9SJohn Crispin
13003f8c50c9SJohn Crispin if (val)
13013f8c50c9SJohn Crispin gpio_setbit(info->membase[0], GPIO_OUT(pin), PORT_PIN(pin));
13023f8c50c9SJohn Crispin else
13033f8c50c9SJohn Crispin gpio_clearbit(info->membase[0], GPIO_OUT(pin), PORT_PIN(pin));
13043f8c50c9SJohn Crispin }
13053f8c50c9SJohn Crispin
xway_gpio_get(struct gpio_chip * chip,unsigned int pin)13063f8c50c9SJohn Crispin static int xway_gpio_get(struct gpio_chip *chip, unsigned int pin)
13073f8c50c9SJohn Crispin {
130858383c78SLinus Walleij struct ltq_pinmux_info *info = dev_get_drvdata(chip->parent);
13093f8c50c9SJohn Crispin
1310e1573697SLinus Walleij return !!gpio_getbit(info->membase[0], GPIO_IN(pin), PORT_PIN(pin));
13113f8c50c9SJohn Crispin }
13123f8c50c9SJohn Crispin
xway_gpio_dir_in(struct gpio_chip * chip,unsigned int pin)13133f8c50c9SJohn Crispin static int xway_gpio_dir_in(struct gpio_chip *chip, unsigned int pin)
13143f8c50c9SJohn Crispin {
131558383c78SLinus Walleij struct ltq_pinmux_info *info = dev_get_drvdata(chip->parent);
13163f8c50c9SJohn Crispin
13173f8c50c9SJohn Crispin gpio_clearbit(info->membase[0], GPIO_DIR(pin), PORT_PIN(pin));
13183f8c50c9SJohn Crispin
13193f8c50c9SJohn Crispin return 0;
13203f8c50c9SJohn Crispin }
13213f8c50c9SJohn Crispin
xway_gpio_dir_out(struct gpio_chip * chip,unsigned int pin,int val)13223f8c50c9SJohn Crispin static int xway_gpio_dir_out(struct gpio_chip *chip, unsigned int pin, int val)
13233f8c50c9SJohn Crispin {
132458383c78SLinus Walleij struct ltq_pinmux_info *info = dev_get_drvdata(chip->parent);
13253f8c50c9SJohn Crispin
132657b588c9SJohn Crispin if (PORT(pin) == PORT3)
132757b588c9SJohn Crispin gpio_setbit(info->membase[0], GPIO3_OD, PORT_PIN(pin));
132857b588c9SJohn Crispin else
132957b588c9SJohn Crispin gpio_setbit(info->membase[0], GPIO_OD(pin), PORT_PIN(pin));
13303f8c50c9SJohn Crispin gpio_setbit(info->membase[0], GPIO_DIR(pin), PORT_PIN(pin));
13313f8c50c9SJohn Crispin xway_gpio_set(chip, pin, val);
13323f8c50c9SJohn Crispin
13333f8c50c9SJohn Crispin return 0;
13343f8c50c9SJohn Crispin }
13353f8c50c9SJohn Crispin
1336e1641c9dSLinus Walleij /*
1337e1641c9dSLinus Walleij * gpiolib gpiod_to_irq callback function.
1338e1641c9dSLinus Walleij * Returns the mapped IRQ (external interrupt) number for a given GPIO pin.
1339e1641c9dSLinus Walleij */
xway_gpio_to_irq(struct gpio_chip * chip,unsigned offset)1340e1641c9dSLinus Walleij static int xway_gpio_to_irq(struct gpio_chip *chip, unsigned offset)
1341e1641c9dSLinus Walleij {
1342e1641c9dSLinus Walleij struct ltq_pinmux_info *info = dev_get_drvdata(chip->parent);
1343e1641c9dSLinus Walleij int i;
1344e1641c9dSLinus Walleij
1345e1641c9dSLinus Walleij for (i = 0; i < info->num_exin; i++)
1346e1641c9dSLinus Walleij if (info->exin[i] == offset)
1347e1641c9dSLinus Walleij return ltq_eiu_get_irq(i);
1348e1641c9dSLinus Walleij
1349e1641c9dSLinus Walleij return -1;
1350e1641c9dSLinus Walleij }
1351e1641c9dSLinus Walleij
13523f8c50c9SJohn Crispin static struct gpio_chip xway_chip = {
13533f8c50c9SJohn Crispin .label = "gpio-xway",
13543f8c50c9SJohn Crispin .direction_input = xway_gpio_dir_in,
13553f8c50c9SJohn Crispin .direction_output = xway_gpio_dir_out,
13563f8c50c9SJohn Crispin .get = xway_gpio_get,
13573f8c50c9SJohn Crispin .set = xway_gpio_set,
135898c85d58SJonas Gorski .request = gpiochip_generic_request,
135998c85d58SJonas Gorski .free = gpiochip_generic_free,
1360e1641c9dSLinus Walleij .to_irq = xway_gpio_to_irq,
13613f8c50c9SJohn Crispin .base = -1,
13623f8c50c9SJohn Crispin };
13633f8c50c9SJohn Crispin
13643f8c50c9SJohn Crispin
13653f8c50c9SJohn Crispin /* --------- register the pinctrl layer --------- */
1366be14811cSMartin Schiller struct pinctrl_xway_soc {
13673f8c50c9SJohn Crispin int pin_count;
13683f8c50c9SJohn Crispin const struct ltq_mfp_pin *mfp;
13693f8c50c9SJohn Crispin const struct ltq_pin_group *grps;
13703f8c50c9SJohn Crispin unsigned int num_grps;
13713f8c50c9SJohn Crispin const struct ltq_pmx_func *funcs;
13723f8c50c9SJohn Crispin unsigned int num_funcs;
13733f8c50c9SJohn Crispin const unsigned *exin;
13743f8c50c9SJohn Crispin unsigned int num_exin;
1375be14811cSMartin Schiller };
1376be14811cSMartin Schiller
1377be14811cSMartin Schiller /* XWAY AMAZON Family */
1378be14811cSMartin Schiller static struct pinctrl_xway_soc ase_pinctrl = {
13796b4316aeSAmitoj Kaur Chawla .pin_count = ASE_MAX_PIN,
13806b4316aeSAmitoj Kaur Chawla .mfp = ase_mfp,
13816b4316aeSAmitoj Kaur Chawla .grps = ase_grps,
13826b4316aeSAmitoj Kaur Chawla .num_grps = ARRAY_SIZE(ase_grps),
13836b4316aeSAmitoj Kaur Chawla .funcs = ase_funcs,
13846b4316aeSAmitoj Kaur Chawla .num_funcs = ARRAY_SIZE(ase_funcs),
13856b4316aeSAmitoj Kaur Chawla .exin = ase_exin_pin_map,
13866b4316aeSAmitoj Kaur Chawla .num_exin = 3
1387be14811cSMartin Schiller };
1388be14811cSMartin Schiller
1389be14811cSMartin Schiller /* XWAY DANUBE Family */
1390be14811cSMartin Schiller static struct pinctrl_xway_soc danube_pinctrl = {
13916b4316aeSAmitoj Kaur Chawla .pin_count = DANUBE_MAX_PIN,
13926b4316aeSAmitoj Kaur Chawla .mfp = danube_mfp,
13936b4316aeSAmitoj Kaur Chawla .grps = danube_grps,
13946b4316aeSAmitoj Kaur Chawla .num_grps = ARRAY_SIZE(danube_grps),
13956b4316aeSAmitoj Kaur Chawla .funcs = danube_funcs,
13966b4316aeSAmitoj Kaur Chawla .num_funcs = ARRAY_SIZE(danube_funcs),
13976b4316aeSAmitoj Kaur Chawla .exin = danube_exin_pin_map,
1398728cf744SLinus Walleij .num_exin = 3
1399be14811cSMartin Schiller };
1400be14811cSMartin Schiller
1401be14811cSMartin Schiller /* XWAY xRX100 Family */
1402be14811cSMartin Schiller static struct pinctrl_xway_soc xrx100_pinctrl = {
14036b4316aeSAmitoj Kaur Chawla .pin_count = XRX100_MAX_PIN,
14046b4316aeSAmitoj Kaur Chawla .mfp = xrx100_mfp,
14056b4316aeSAmitoj Kaur Chawla .grps = xrx100_grps,
14066b4316aeSAmitoj Kaur Chawla .num_grps = ARRAY_SIZE(xrx100_grps),
14076b4316aeSAmitoj Kaur Chawla .funcs = xrx100_funcs,
14086b4316aeSAmitoj Kaur Chawla .num_funcs = ARRAY_SIZE(xrx100_funcs),
14096b4316aeSAmitoj Kaur Chawla .exin = xrx100_exin_pin_map,
14106b4316aeSAmitoj Kaur Chawla .num_exin = 6
1411be14811cSMartin Schiller };
1412be14811cSMartin Schiller
1413be14811cSMartin Schiller /* XWAY xRX200 Family */
1414be14811cSMartin Schiller static struct pinctrl_xway_soc xrx200_pinctrl = {
14156b4316aeSAmitoj Kaur Chawla .pin_count = XRX200_MAX_PIN,
14166b4316aeSAmitoj Kaur Chawla .mfp = xrx200_mfp,
14176b4316aeSAmitoj Kaur Chawla .grps = xrx200_grps,
14186b4316aeSAmitoj Kaur Chawla .num_grps = ARRAY_SIZE(xrx200_grps),
14196b4316aeSAmitoj Kaur Chawla .funcs = xrx200_funcs,
14206b4316aeSAmitoj Kaur Chawla .num_funcs = ARRAY_SIZE(xrx200_funcs),
14216b4316aeSAmitoj Kaur Chawla .exin = xrx200_exin_pin_map,
14226b4316aeSAmitoj Kaur Chawla .num_exin = 6
1423be14811cSMartin Schiller };
1424be14811cSMartin Schiller
1425be14811cSMartin Schiller /* XWAY xRX300 Family */
1426be14811cSMartin Schiller static struct pinctrl_xway_soc xrx300_pinctrl = {
14276b4316aeSAmitoj Kaur Chawla .pin_count = XRX300_MAX_PIN,
14286b4316aeSAmitoj Kaur Chawla .mfp = xrx300_mfp,
14296b4316aeSAmitoj Kaur Chawla .grps = xrx300_grps,
14306b4316aeSAmitoj Kaur Chawla .num_grps = ARRAY_SIZE(xrx300_grps),
14316b4316aeSAmitoj Kaur Chawla .funcs = xrx300_funcs,
14326b4316aeSAmitoj Kaur Chawla .num_funcs = ARRAY_SIZE(xrx300_funcs),
14336b4316aeSAmitoj Kaur Chawla .exin = xrx300_exin_pin_map,
14346b4316aeSAmitoj Kaur Chawla .num_exin = 5
14353f8c50c9SJohn Crispin };
14363f8c50c9SJohn Crispin
14373f8c50c9SJohn Crispin static struct pinctrl_gpio_range xway_gpio_range = {
14383f8c50c9SJohn Crispin .name = "XWAY GPIO",
14393f8c50c9SJohn Crispin .gc = &xway_chip,
14403f8c50c9SJohn Crispin };
14413f8c50c9SJohn Crispin
14423f8c50c9SJohn Crispin static const struct of_device_id xway_match[] = {
1443be14811cSMartin Schiller { .compatible = "lantiq,ase-pinctrl", .data = &ase_pinctrl},
1444be14811cSMartin Schiller { .compatible = "lantiq,danube-pinctrl", .data = &danube_pinctrl},
1445be14811cSMartin Schiller { .compatible = "lantiq,xrx100-pinctrl", .data = &xrx100_pinctrl},
1446be14811cSMartin Schiller { .compatible = "lantiq,xrx200-pinctrl", .data = &xrx200_pinctrl},
1447be14811cSMartin Schiller { .compatible = "lantiq,xrx300-pinctrl", .data = &xrx300_pinctrl},
14483f8c50c9SJohn Crispin {},
14493f8c50c9SJohn Crispin };
14503f8c50c9SJohn Crispin MODULE_DEVICE_TABLE(of, xway_match);
14513f8c50c9SJohn Crispin
pinmux_xway_probe(struct platform_device * pdev)1452150632b0SGreg Kroah-Hartman static int pinmux_xway_probe(struct platform_device *pdev)
14533f8c50c9SJohn Crispin {
14543f8c50c9SJohn Crispin const struct pinctrl_xway_soc *xway_soc;
14553f8c50c9SJohn Crispin int ret, i;
14563f8c50c9SJohn Crispin
14573f8c50c9SJohn Crispin /* get and remap our register range */
14584b024225SYueHaibing xway_info.membase[0] = devm_platform_ioremap_resource(pdev, 0);
14599e0c1fb2SThierry Reding if (IS_ERR(xway_info.membase[0]))
14609e0c1fb2SThierry Reding return PTR_ERR(xway_info.membase[0]);
14613f8c50c9SJohn Crispin
1462*ccc7cdf4SRob Herring xway_soc = device_get_match_data(&pdev->dev);
1463*ccc7cdf4SRob Herring if (!xway_soc)
1464be14811cSMartin Schiller xway_soc = &danube_pinctrl;
14653f8c50c9SJohn Crispin
14663f8c50c9SJohn Crispin /* find out how many pads we have */
14673f8c50c9SJohn Crispin xway_chip.ngpio = xway_soc->pin_count;
14683f8c50c9SJohn Crispin
14693f8c50c9SJohn Crispin /* load our pad descriptors */
1470a86854d0SKees Cook xway_info.pads = devm_kcalloc(&pdev->dev,
1471a86854d0SKees Cook xway_chip.ngpio, sizeof(struct pinctrl_pin_desc),
14723f8c50c9SJohn Crispin GFP_KERNEL);
1473e423f0ceSMarkus Elfring if (!xway_info.pads)
14743f8c50c9SJohn Crispin return -ENOMEM;
1475e423f0ceSMarkus Elfring
14763f8c50c9SJohn Crispin for (i = 0; i < xway_chip.ngpio; i++) {
1477d55b7fddSGeert Uytterhoeven char *name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "io%d", i);
14783f8c50c9SJohn Crispin
1479e423f0ceSMarkus Elfring if (!name)
14803f8c50c9SJohn Crispin return -ENOMEM;
1481e423f0ceSMarkus Elfring
14823f8c50c9SJohn Crispin xway_info.pads[i].number = GPIO0 + i;
14833f8c50c9SJohn Crispin xway_info.pads[i].name = name;
14843f8c50c9SJohn Crispin }
14853f8c50c9SJohn Crispin xway_pctrl_desc.pins = xway_info.pads;
14863f8c50c9SJohn Crispin
14873f8c50c9SJohn Crispin /* setup the data needed by pinctrl */
14883f8c50c9SJohn Crispin xway_pctrl_desc.name = dev_name(&pdev->dev);
14893f8c50c9SJohn Crispin xway_pctrl_desc.npins = xway_chip.ngpio;
14903f8c50c9SJohn Crispin
14913f8c50c9SJohn Crispin xway_info.num_pads = xway_chip.ngpio;
14923f8c50c9SJohn Crispin xway_info.num_mfp = xway_chip.ngpio;
14933f8c50c9SJohn Crispin xway_info.mfp = xway_soc->mfp;
14943f8c50c9SJohn Crispin xway_info.grps = xway_soc->grps;
14953f8c50c9SJohn Crispin xway_info.num_grps = xway_soc->num_grps;
14963f8c50c9SJohn Crispin xway_info.funcs = xway_soc->funcs;
14973f8c50c9SJohn Crispin xway_info.num_funcs = xway_soc->num_funcs;
14983f8c50c9SJohn Crispin xway_info.exin = xway_soc->exin;
14993f8c50c9SJohn Crispin xway_info.num_exin = xway_soc->num_exin;
15003f8c50c9SJohn Crispin
15013f8c50c9SJohn Crispin /* register with the generic lantiq layer */
15023f8c50c9SJohn Crispin ret = ltq_pinctrl_register(pdev, &xway_info);
15033f8c50c9SJohn Crispin if (ret) {
15043f8c50c9SJohn Crispin dev_err(&pdev->dev, "Failed to register pinctrl driver\n");
15053f8c50c9SJohn Crispin return ret;
15063f8c50c9SJohn Crispin }
15073f8c50c9SJohn Crispin
15089b4924daSMartin Schiller /* register the gpio chip */
15099b4924daSMartin Schiller xway_chip.parent = &pdev->dev;
15109b4924daSMartin Schiller xway_chip.owner = THIS_MODULE;
15119b4924daSMartin Schiller ret = devm_gpiochip_add_data(&pdev->dev, &xway_chip, NULL);
15129b4924daSMartin Schiller if (ret) {
15139b4924daSMartin Schiller dev_err(&pdev->dev, "Failed to register gpio chip\n");
15149b4924daSMartin Schiller return ret;
15159b4924daSMartin Schiller }
15169b4924daSMartin Schiller
15179b4924daSMartin Schiller /*
15189b4924daSMartin Schiller * For DeviceTree-supported systems, the gpio core checks the
15199b4924daSMartin Schiller * pinctrl's device node for the "gpio-ranges" property.
15209b4924daSMartin Schiller * If it is present, it takes care of adding the pin ranges
15219b4924daSMartin Schiller * for the driver. In this case the driver can skip ahead.
15229b4924daSMartin Schiller *
15239b4924daSMartin Schiller * In order to remain compatible with older, existing DeviceTree
15249b4924daSMartin Schiller * files which don't set the "gpio-ranges" property or systems that
15259b4924daSMartin Schiller * utilize ACPI the driver has to call gpiochip_add_pin_range().
15269b4924daSMartin Schiller */
15279b4924daSMartin Schiller if (!of_property_read_bool(pdev->dev.of_node, "gpio-ranges")) {
15283f8c50c9SJohn Crispin /* finish with registering the gpio range in pinctrl */
15293f8c50c9SJohn Crispin xway_gpio_range.npins = xway_chip.ngpio;
15303f8c50c9SJohn Crispin xway_gpio_range.base = xway_chip.base;
15313f8c50c9SJohn Crispin pinctrl_add_gpio_range(xway_info.pctrl, &xway_gpio_range);
15329b4924daSMartin Schiller }
15339b4924daSMartin Schiller
15343f8c50c9SJohn Crispin dev_info(&pdev->dev, "Init done\n");
15353f8c50c9SJohn Crispin return 0;
15363f8c50c9SJohn Crispin }
15373f8c50c9SJohn Crispin
15383f8c50c9SJohn Crispin static struct platform_driver pinmux_xway_driver = {
15393f8c50c9SJohn Crispin .probe = pinmux_xway_probe,
15403f8c50c9SJohn Crispin .driver = {
15413f8c50c9SJohn Crispin .name = "pinctrl-xway",
15423f8c50c9SJohn Crispin .of_match_table = xway_match,
15433f8c50c9SJohn Crispin },
15443f8c50c9SJohn Crispin };
15453f8c50c9SJohn Crispin
pinmux_xway_init(void)15463f8c50c9SJohn Crispin static int __init pinmux_xway_init(void)
15473f8c50c9SJohn Crispin {
15483f8c50c9SJohn Crispin return platform_driver_register(&pinmux_xway_driver);
15493f8c50c9SJohn Crispin }
15503f8c50c9SJohn Crispin
15513f8c50c9SJohn Crispin core_initcall_sync(pinmux_xway_init);
1552