1 // SPDX-License-Identifier: GPL-2.0-only
3 * linux/drivers/pinctrl/pinmux-falcon.c
4 * based on linux/drivers/pinctrl/pinmux-pxa910.c
6 * Copyright (C) 2012 Thomas Langer <thomas.langer@lantiq.com>
7 * Copyright (C) 2012 John Crispin <john@phrozen.org>
10 #include <linux/gpio/driver.h>
11 #include <linux/interrupt.h>
12 #include <linux/slab.h>
13 #include <linux/export.h>
14 #include <linux/err.h>
15 #include <linux/module.h>
17 #include <linux/of_platform.h>
18 #include <linux/of_address.h>
19 #include <linux/of_gpio.h>
20 #include <linux/platform_device.h>
22 #include "pinctrl-lantiq.h"
24 #include <lantiq_soc.h>
26 /* Multiplexer Control Register */
27 #define LTQ_PADC_MUX(x) (x * 0x4)
28 /* Pull Up Enable Register */
29 #define LTQ_PADC_PUEN 0x80
30 /* Pull Down Enable Register */
31 #define LTQ_PADC_PDEN 0x84
32 /* Slew Rate Control Register */
33 #define LTQ_PADC_SRC 0x88
34 /* Drive Current Control Register */
35 #define LTQ_PADC_DCC 0x8C
36 /* Pad Control Availability Register */
37 #define LTQ_PADC_AVAIL 0xF0
39 #define pad_r32(p, reg) ltq_r32(p + reg)
40 #define pad_w32(p, val, reg) ltq_w32(val, p + reg)
41 #define pad_w32_mask(c, clear, set, reg) \
42 pad_w32(c, (pad_r32(c, reg) & ~(clear)) | (set), reg)
44 #define pad_getbit(m, r, p) (!!(ltq_r32(m + r) & (1 << p)))
48 #define PORT(x) (x / PINS)
49 #define PORT_PIN(x) (x % PINS)
51 #define MFP_FALCON(a, f0, f1, f2, f3) \
63 #define GRP_MUX(a, m, p) \
66 .mux = FALCON_MUX_##m, \
68 .npins = ARRAY_SIZE(p), \
87 FALCON_MUX_NONE
= 0xffff,
90 static struct pinctrl_pin_desc falcon_pads
[PORTS
* PINS
];
91 static int pad_count
[PORTS
];
93 static void lantiq_load_pin_desc(struct pinctrl_pin_desc
*d
, int bank
, int len
)
95 int base
= bank
* PINS
;
98 for (i
= 0; i
< len
; i
++) {
99 /* strlen("ioXYZ") + 1 = 6 */
100 char *name
= kzalloc(6, GFP_KERNEL
);
102 snprintf(name
, 6, "io%d", base
+ i
);
103 d
[i
].number
= base
+ i
;
106 pad_count
[bank
] = len
;
109 static struct ltq_mfp_pin falcon_mfp
[] = {
110 /* pin f0 f1 f2 f3 */
111 MFP_FALCON(GPIO0
, RST
, GPIO
, NONE
, NONE
),
112 MFP_FALCON(GPIO1
, GPIO
, GPIO
, NONE
, NONE
),
113 MFP_FALCON(GPIO2
, GPIO
, GPIO
, NONE
, NONE
),
114 MFP_FALCON(GPIO3
, GPIO
, GPIO
, NONE
, NONE
),
115 MFP_FALCON(GPIO4
, NTR
, GPIO
, NONE
, NONE
),
116 MFP_FALCON(GPIO5
, NTR
, GPIO
, PPS
, NONE
),
117 MFP_FALCON(GPIO6
, RST
, GPIO
, NONE
, NONE
),
118 MFP_FALCON(GPIO7
, MDIO
, GPIO
, NONE
, NONE
),
119 MFP_FALCON(GPIO8
, MDIO
, GPIO
, NONE
, NONE
),
120 MFP_FALCON(GPIO9
, LED
, GPIO
, NONE
, NONE
),
121 MFP_FALCON(GPIO10
, LED
, GPIO
, NONE
, NONE
),
122 MFP_FALCON(GPIO11
, LED
, GPIO
, NONE
, NONE
),
123 MFP_FALCON(GPIO12
, LED
, GPIO
, NONE
, NONE
),
124 MFP_FALCON(GPIO13
, LED
, GPIO
, NONE
, NONE
),
125 MFP_FALCON(GPIO14
, LED
, GPIO
, NONE
, NONE
),
126 MFP_FALCON(GPIO32
, ASC
, GPIO
, NONE
, NONE
),
127 MFP_FALCON(GPIO33
, ASC
, GPIO
, NONE
, NONE
),
128 MFP_FALCON(GPIO34
, SPI
, GPIO
, NONE
, NONE
),
129 MFP_FALCON(GPIO35
, SPI
, GPIO
, NONE
, NONE
),
130 MFP_FALCON(GPIO36
, SPI
, GPIO
, NONE
, NONE
),
131 MFP_FALCON(GPIO37
, SPI
, GPIO
, NONE
, NONE
),
132 MFP_FALCON(GPIO38
, SPI
, GPIO
, NONE
, NONE
),
133 MFP_FALCON(GPIO39
, I2C
, GPIO
, NONE
, NONE
),
134 MFP_FALCON(GPIO40
, I2C
, GPIO
, NONE
, NONE
),
135 MFP_FALCON(GPIO41
, HOSTIF
, GPIO
, HOSTIF
, JTAG
),
136 MFP_FALCON(GPIO42
, HOSTIF
, GPIO
, HOSTIF
, NONE
),
137 MFP_FALCON(GPIO43
, SLIC
, GPIO
, NONE
, NONE
),
138 MFP_FALCON(GPIO44
, SLIC
, GPIO
, PCM
, ASC
),
139 MFP_FALCON(GPIO45
, SLIC
, GPIO
, PCM
, ASC
),
140 MFP_FALCON(GPIO64
, MII
, GPIO
, NONE
, NONE
),
141 MFP_FALCON(GPIO65
, MII
, GPIO
, NONE
, NONE
),
142 MFP_FALCON(GPIO66
, MII
, GPIO
, NONE
, NONE
),
143 MFP_FALCON(GPIO67
, MII
, GPIO
, NONE
, NONE
),
144 MFP_FALCON(GPIO68
, MII
, GPIO
, NONE
, NONE
),
145 MFP_FALCON(GPIO69
, MII
, GPIO
, NONE
, NONE
),
146 MFP_FALCON(GPIO70
, MII
, GPIO
, NONE
, NONE
),
147 MFP_FALCON(GPIO71
, MII
, GPIO
, NONE
, NONE
),
148 MFP_FALCON(GPIO72
, MII
, GPIO
, NONE
, NONE
),
149 MFP_FALCON(GPIO73
, MII
, GPIO
, NONE
, NONE
),
150 MFP_FALCON(GPIO74
, MII
, GPIO
, NONE
, NONE
),
151 MFP_FALCON(GPIO75
, MII
, GPIO
, NONE
, NONE
),
152 MFP_FALCON(GPIO76
, MII
, GPIO
, NONE
, NONE
),
153 MFP_FALCON(GPIO77
, MII
, GPIO
, NONE
, NONE
),
154 MFP_FALCON(GPIO78
, MII
, GPIO
, NONE
, NONE
),
155 MFP_FALCON(GPIO79
, MII
, GPIO
, NONE
, NONE
),
156 MFP_FALCON(GPIO80
, MII
, GPIO
, NONE
, NONE
),
157 MFP_FALCON(GPIO81
, MII
, GPIO
, NONE
, NONE
),
158 MFP_FALCON(GPIO82
, MII
, GPIO
, NONE
, NONE
),
159 MFP_FALCON(GPIO83
, MII
, GPIO
, NONE
, NONE
),
160 MFP_FALCON(GPIO84
, MII
, GPIO
, NONE
, NONE
),
161 MFP_FALCON(GPIO85
, MII
, GPIO
, NONE
, NONE
),
162 MFP_FALCON(GPIO86
, MII
, GPIO
, NONE
, NONE
),
163 MFP_FALCON(GPIO87
, MII
, GPIO
, NONE
, NONE
),
164 MFP_FALCON(GPIO88
, PHY
, GPIO
, NONE
, NONE
),
167 static const unsigned pins_por
[] = {GPIO0
};
168 static const unsigned pins_ntr
[] = {GPIO4
};
169 static const unsigned pins_ntr8k
[] = {GPIO5
};
170 static const unsigned pins_pps
[] = {GPIO5
};
171 static const unsigned pins_hrst
[] = {GPIO6
};
172 static const unsigned pins_mdio
[] = {GPIO7
, GPIO8
};
173 static const unsigned pins_bled
[] = {GPIO9
, GPIO10
, GPIO11
,
174 GPIO12
, GPIO13
, GPIO14
};
175 static const unsigned pins_asc0
[] = {GPIO32
, GPIO33
};
176 static const unsigned pins_spi
[] = {GPIO34
, GPIO35
, GPIO36
};
177 static const unsigned pins_spi_cs0
[] = {GPIO37
};
178 static const unsigned pins_spi_cs1
[] = {GPIO38
};
179 static const unsigned pins_i2c
[] = {GPIO39
, GPIO40
};
180 static const unsigned pins_jtag
[] = {GPIO41
};
181 static const unsigned pins_slic
[] = {GPIO43
, GPIO44
, GPIO45
};
182 static const unsigned pins_pcm
[] = {GPIO44
, GPIO45
};
183 static const unsigned pins_asc1
[] = {GPIO44
, GPIO45
};
185 static struct ltq_pin_group falcon_grps
[] = {
186 GRP_MUX("por", RST
, pins_por
),
187 GRP_MUX("ntr", NTR
, pins_ntr
),
188 GRP_MUX("ntr8k", NTR
, pins_ntr8k
),
189 GRP_MUX("pps", PPS
, pins_pps
),
190 GRP_MUX("hrst", RST
, pins_hrst
),
191 GRP_MUX("mdio", MDIO
, pins_mdio
),
192 GRP_MUX("bootled", LED
, pins_bled
),
193 GRP_MUX("asc0", ASC
, pins_asc0
),
194 GRP_MUX("spi", SPI
, pins_spi
),
195 GRP_MUX("spi cs0", SPI
, pins_spi_cs0
),
196 GRP_MUX("spi cs1", SPI
, pins_spi_cs1
),
197 GRP_MUX("i2c", I2C
, pins_i2c
),
198 GRP_MUX("jtag", JTAG
, pins_jtag
),
199 GRP_MUX("slic", SLIC
, pins_slic
),
200 GRP_MUX("pcm", PCM
, pins_pcm
),
201 GRP_MUX("asc1", ASC
, pins_asc1
),
204 static const char * const ltq_rst_grps
[] = {"por", "hrst"};
205 static const char * const ltq_ntr_grps
[] = {"ntr", "ntr8k", "pps"};
206 static const char * const ltq_mdio_grps
[] = {"mdio"};
207 static const char * const ltq_bled_grps
[] = {"bootled"};
208 static const char * const ltq_asc_grps
[] = {"asc0", "asc1"};
209 static const char * const ltq_spi_grps
[] = {"spi", "spi cs0", "spi cs1"};
210 static const char * const ltq_i2c_grps
[] = {"i2c"};
211 static const char * const ltq_jtag_grps
[] = {"jtag"};
212 static const char * const ltq_slic_grps
[] = {"slic"};
213 static const char * const ltq_pcm_grps
[] = {"pcm"};
215 static struct ltq_pmx_func falcon_funcs
[] = {
216 {"rst", ARRAY_AND_SIZE(ltq_rst_grps
)},
217 {"ntr", ARRAY_AND_SIZE(ltq_ntr_grps
)},
218 {"mdio", ARRAY_AND_SIZE(ltq_mdio_grps
)},
219 {"led", ARRAY_AND_SIZE(ltq_bled_grps
)},
220 {"asc", ARRAY_AND_SIZE(ltq_asc_grps
)},
221 {"spi", ARRAY_AND_SIZE(ltq_spi_grps
)},
222 {"i2c", ARRAY_AND_SIZE(ltq_i2c_grps
)},
223 {"jtag", ARRAY_AND_SIZE(ltq_jtag_grps
)},
224 {"slic", ARRAY_AND_SIZE(ltq_slic_grps
)},
225 {"pcm", ARRAY_AND_SIZE(ltq_pcm_grps
)},
231 /* --------- pinconf related code --------- */
232 static int falcon_pinconf_group_get(struct pinctrl_dev
*pctrldev
,
233 unsigned group
, unsigned long *config
)
238 static int falcon_pinconf_group_set(struct pinctrl_dev
*pctrldev
,
239 unsigned group
, unsigned long *configs
,
240 unsigned num_configs
)
245 static int falcon_pinconf_get(struct pinctrl_dev
*pctrldev
,
246 unsigned pin
, unsigned long *config
)
248 struct ltq_pinmux_info
*info
= pinctrl_dev_get_drvdata(pctrldev
);
249 enum ltq_pinconf_param param
= LTQ_PINCONF_UNPACK_PARAM(*config
);
250 void __iomem
*mem
= info
->membase
[PORT(pin
)];
253 case LTQ_PINCONF_PARAM_DRIVE_CURRENT
:
254 *config
= LTQ_PINCONF_PACK(param
,
255 !!pad_getbit(mem
, LTQ_PADC_DCC
, PORT_PIN(pin
)));
258 case LTQ_PINCONF_PARAM_SLEW_RATE
:
259 *config
= LTQ_PINCONF_PACK(param
,
260 !!pad_getbit(mem
, LTQ_PADC_SRC
, PORT_PIN(pin
)));
263 case LTQ_PINCONF_PARAM_PULL
:
264 if (pad_getbit(mem
, LTQ_PADC_PDEN
, PORT_PIN(pin
)))
265 *config
= LTQ_PINCONF_PACK(param
, 1);
266 else if (pad_getbit(mem
, LTQ_PADC_PUEN
, PORT_PIN(pin
)))
267 *config
= LTQ_PINCONF_PACK(param
, 2);
269 *config
= LTQ_PINCONF_PACK(param
, 0);
280 static int falcon_pinconf_set(struct pinctrl_dev
*pctrldev
,
281 unsigned pin
, unsigned long *configs
,
282 unsigned num_configs
)
284 enum ltq_pinconf_param param
;
286 struct ltq_pinmux_info
*info
= pinctrl_dev_get_drvdata(pctrldev
);
287 void __iomem
*mem
= info
->membase
[PORT(pin
)];
291 for (i
= 0; i
< num_configs
; i
++) {
292 param
= LTQ_PINCONF_UNPACK_PARAM(configs
[i
]);
293 arg
= LTQ_PINCONF_UNPACK_ARG(configs
[i
]);
296 case LTQ_PINCONF_PARAM_DRIVE_CURRENT
:
300 case LTQ_PINCONF_PARAM_SLEW_RATE
:
304 case LTQ_PINCONF_PARAM_PULL
:
312 pr_err("%s: Invalid config param %04x\n",
313 pinctrl_dev_get_name(pctrldev
), param
);
317 pad_w32(mem
, BIT(PORT_PIN(pin
)), reg
);
318 if (!(pad_r32(mem
, reg
) & BIT(PORT_PIN(pin
))))
320 } /* for each config */
325 static void falcon_pinconf_dbg_show(struct pinctrl_dev
*pctrldev
,
326 struct seq_file
*s
, unsigned offset
)
328 unsigned long config
;
329 struct pin_desc
*desc
;
331 struct ltq_pinmux_info
*info
= pinctrl_dev_get_drvdata(pctrldev
);
332 int port
= PORT(offset
);
334 seq_printf(s
, " (port %d) mux %d -- ", port
,
335 pad_r32(info
->membase
[port
], LTQ_PADC_MUX(PORT_PIN(offset
))));
337 config
= LTQ_PINCONF_PACK(LTQ_PINCONF_PARAM_PULL
, 0);
338 if (!falcon_pinconf_get(pctrldev
, offset
, &config
))
339 seq_printf(s
, "pull %d ",
340 (int)LTQ_PINCONF_UNPACK_ARG(config
));
342 config
= LTQ_PINCONF_PACK(LTQ_PINCONF_PARAM_DRIVE_CURRENT
, 0);
343 if (!falcon_pinconf_get(pctrldev
, offset
, &config
))
344 seq_printf(s
, "drive-current %d ",
345 (int)LTQ_PINCONF_UNPACK_ARG(config
));
347 config
= LTQ_PINCONF_PACK(LTQ_PINCONF_PARAM_SLEW_RATE
, 0);
348 if (!falcon_pinconf_get(pctrldev
, offset
, &config
))
349 seq_printf(s
, "slew-rate %d ",
350 (int)LTQ_PINCONF_UNPACK_ARG(config
));
352 desc
= pin_desc_get(pctrldev
, offset
);
354 if (desc
->gpio_owner
)
355 seq_printf(s
, " owner: %s", desc
->gpio_owner
);
357 seq_printf(s
, " not registered");
361 static void falcon_pinconf_group_dbg_show(struct pinctrl_dev
*pctrldev
,
362 struct seq_file
*s
, unsigned selector
)
366 static const struct pinconf_ops falcon_pinconf_ops
= {
367 .pin_config_get
= falcon_pinconf_get
,
368 .pin_config_set
= falcon_pinconf_set
,
369 .pin_config_group_get
= falcon_pinconf_group_get
,
370 .pin_config_group_set
= falcon_pinconf_group_set
,
371 .pin_config_dbg_show
= falcon_pinconf_dbg_show
,
372 .pin_config_group_dbg_show
= falcon_pinconf_group_dbg_show
,
375 static struct pinctrl_desc falcon_pctrl_desc
= {
376 .owner
= THIS_MODULE
,
378 .confops
= &falcon_pinconf_ops
,
381 static inline int falcon_mux_apply(struct pinctrl_dev
*pctrldev
,
384 struct ltq_pinmux_info
*info
= pinctrl_dev_get_drvdata(pctrldev
);
385 int port
= PORT(info
->mfp
[mfp
].pin
);
387 if ((port
>= PORTS
) || (!info
->membase
[port
]))
390 pad_w32(info
->membase
[port
], mux
,
391 LTQ_PADC_MUX(PORT_PIN(info
->mfp
[mfp
].pin
)));
395 static const struct ltq_cfg_param falcon_cfg_params
[] = {
396 {"lantiq,pull", LTQ_PINCONF_PARAM_PULL
},
397 {"lantiq,drive-current", LTQ_PINCONF_PARAM_DRIVE_CURRENT
},
398 {"lantiq,slew-rate", LTQ_PINCONF_PARAM_SLEW_RATE
},
401 static struct ltq_pinmux_info falcon_info
= {
402 .desc
= &falcon_pctrl_desc
,
403 .apply_mux
= falcon_mux_apply
,
404 .params
= falcon_cfg_params
,
405 .num_params
= ARRAY_SIZE(falcon_cfg_params
),
411 /* --------- register the pinctrl layer --------- */
413 int pinctrl_falcon_get_range_size(int id
)
417 if ((id
>= PORTS
) || (!falcon_info
.membase
[id
]))
420 avail
= pad_r32(falcon_info
.membase
[id
], LTQ_PADC_AVAIL
);
425 void pinctrl_falcon_add_gpio_range(struct pinctrl_gpio_range
*range
)
427 pinctrl_add_gpio_range(falcon_info
.pctrl
, range
);
430 static int pinctrl_falcon_probe(struct platform_device
*pdev
)
432 struct device_node
*np
;
436 /* load and remap the pad resources of the different banks */
437 for_each_compatible_node(np
, NULL
, "lantiq,pad-falcon") {
438 struct platform_device
*ppdev
= of_find_device_by_node(np
);
439 const __be32
*bank
= of_get_property(np
, "lantiq,bank", NULL
);
444 if (!of_device_is_available(np
))
448 dev_err(&pdev
->dev
, "failed to find pad pdev\n");
451 if (!bank
|| *bank
>= PORTS
)
453 if (of_address_to_resource(np
, 0, &res
))
455 falcon_info
.clk
[*bank
] = clk_get(&ppdev
->dev
, NULL
);
456 if (IS_ERR(falcon_info
.clk
[*bank
])) {
457 dev_err(&ppdev
->dev
, "failed to get clock\n");
458 return PTR_ERR(falcon_info
.clk
[*bank
]);
460 falcon_info
.membase
[*bank
] = devm_ioremap_resource(&pdev
->dev
,
462 if (IS_ERR(falcon_info
.membase
[*bank
]))
463 return PTR_ERR(falcon_info
.membase
[*bank
]);
465 avail
= pad_r32(falcon_info
.membase
[*bank
],
468 lantiq_load_pin_desc(&falcon_pads
[pad_count
], *bank
, pins
);
470 clk_enable(falcon_info
.clk
[*bank
]);
471 dev_dbg(&pdev
->dev
, "found %s with %d pads\n",
474 dev_dbg(&pdev
->dev
, "found a total of %d pads\n", pad_count
);
475 falcon_pctrl_desc
.name
= dev_name(&pdev
->dev
);
476 falcon_pctrl_desc
.npins
= pad_count
;
478 falcon_info
.mfp
= falcon_mfp
;
479 falcon_info
.num_mfp
= ARRAY_SIZE(falcon_mfp
);
480 falcon_info
.grps
= falcon_grps
;
481 falcon_info
.num_grps
= ARRAY_SIZE(falcon_grps
);
482 falcon_info
.funcs
= falcon_funcs
;
483 falcon_info
.num_funcs
= ARRAY_SIZE(falcon_funcs
);
485 ret
= ltq_pinctrl_register(pdev
, &falcon_info
);
487 dev_info(&pdev
->dev
, "Init done\n");
491 static const struct of_device_id falcon_match
[] = {
492 { .compatible
= "lantiq,pinctrl-falcon" },
495 MODULE_DEVICE_TABLE(of
, falcon_match
);
497 static struct platform_driver pinctrl_falcon_driver
= {
498 .probe
= pinctrl_falcon_probe
,
500 .name
= "pinctrl-falcon",
501 .of_match_table
= falcon_match
,
505 int __init
pinctrl_falcon_init(void)
507 return platform_driver_register(&pinctrl_falcon_driver
);
510 core_initcall_sync(pinctrl_falcon_init
);