2 * Driver for the ST Microelectronics SPEAr3xx pinmux
4 * Copyright (C) 2012 ST Microelectronics
5 * Viresh Kumar <viresh.linux@gmail.com>
7 * This file is licensed under the terms of the GNU General Public
8 * License version 2. This program is licensed "as is" without any
9 * warranty of any kind, whether express or implied.
12 #include <linux/pinctrl/pinctrl.h>
14 #include "pinctrl-spear3xx.h"
17 static const struct pinctrl_pin_desc spear3xx_pins
[] = {
22 static const unsigned firda_pins
[] = { 0, 1 };
23 static struct spear_muxreg firda_muxreg
[] = {
26 .mask
= PMX_FIRDA_MASK
,
27 .val
= PMX_FIRDA_MASK
,
31 static struct spear_modemux firda_modemux
[] = {
34 .muxregs
= firda_muxreg
,
35 .nmuxregs
= ARRAY_SIZE(firda_muxreg
),
39 struct spear_pingroup spear3xx_firda_pingroup
= {
42 .npins
= ARRAY_SIZE(firda_pins
),
43 .modemuxs
= firda_modemux
,
44 .nmodemuxs
= ARRAY_SIZE(firda_modemux
),
47 static const char *const firda_grps
[] = { "firda_grp" };
48 struct spear_function spear3xx_firda_function
= {
51 .ngroups
= ARRAY_SIZE(firda_grps
),
55 static const unsigned i2c_pins
[] = { 4, 5 };
56 static struct spear_muxreg i2c_muxreg
[] = {
64 static struct spear_modemux i2c_modemux
[] = {
67 .muxregs
= i2c_muxreg
,
68 .nmuxregs
= ARRAY_SIZE(i2c_muxreg
),
72 struct spear_pingroup spear3xx_i2c_pingroup
= {
75 .npins
= ARRAY_SIZE(i2c_pins
),
76 .modemuxs
= i2c_modemux
,
77 .nmodemuxs
= ARRAY_SIZE(i2c_modemux
),
80 static const char *const i2c_grps
[] = { "i2c0_grp" };
81 struct spear_function spear3xx_i2c_function
= {
84 .ngroups
= ARRAY_SIZE(i2c_grps
),
88 static const unsigned ssp_cs_pins
[] = { 34, 35, 36 };
89 static struct spear_muxreg ssp_cs_muxreg
[] = {
92 .mask
= PMX_SSP_CS_MASK
,
93 .val
= PMX_SSP_CS_MASK
,
97 static struct spear_modemux ssp_cs_modemux
[] = {
100 .muxregs
= ssp_cs_muxreg
,
101 .nmuxregs
= ARRAY_SIZE(ssp_cs_muxreg
),
105 struct spear_pingroup spear3xx_ssp_cs_pingroup
= {
106 .name
= "ssp_cs_grp",
108 .npins
= ARRAY_SIZE(ssp_cs_pins
),
109 .modemuxs
= ssp_cs_modemux
,
110 .nmodemuxs
= ARRAY_SIZE(ssp_cs_modemux
),
113 static const char *const ssp_cs_grps
[] = { "ssp_cs_grp" };
114 struct spear_function spear3xx_ssp_cs_function
= {
116 .groups
= ssp_cs_grps
,
117 .ngroups
= ARRAY_SIZE(ssp_cs_grps
),
121 static const unsigned ssp_pins
[] = { 6, 7, 8, 9 };
122 static struct spear_muxreg ssp_muxreg
[] = {
125 .mask
= PMX_SSP_MASK
,
130 static struct spear_modemux ssp_modemux
[] = {
133 .muxregs
= ssp_muxreg
,
134 .nmuxregs
= ARRAY_SIZE(ssp_muxreg
),
138 struct spear_pingroup spear3xx_ssp_pingroup
= {
141 .npins
= ARRAY_SIZE(ssp_pins
),
142 .modemuxs
= ssp_modemux
,
143 .nmodemuxs
= ARRAY_SIZE(ssp_modemux
),
146 static const char *const ssp_grps
[] = { "ssp0_grp" };
147 struct spear_function spear3xx_ssp_function
= {
150 .ngroups
= ARRAY_SIZE(ssp_grps
),
154 static const unsigned mii_pins
[] = { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
155 21, 22, 23, 24, 25, 26, 27 };
156 static struct spear_muxreg mii_muxreg
[] = {
159 .mask
= PMX_MII_MASK
,
164 static struct spear_modemux mii_modemux
[] = {
167 .muxregs
= mii_muxreg
,
168 .nmuxregs
= ARRAY_SIZE(mii_muxreg
),
172 struct spear_pingroup spear3xx_mii_pingroup
= {
175 .npins
= ARRAY_SIZE(mii_pins
),
176 .modemuxs
= mii_modemux
,
177 .nmodemuxs
= ARRAY_SIZE(mii_modemux
),
180 static const char *const mii_grps
[] = { "mii0_grp" };
181 struct spear_function spear3xx_mii_function
= {
184 .ngroups
= ARRAY_SIZE(mii_grps
),
187 /* gpio0_pin0_pins */
188 static const unsigned gpio0_pin0_pins
[] = { 28 };
189 static struct spear_muxreg gpio0_pin0_muxreg
[] = {
192 .mask
= PMX_GPIO_PIN0_MASK
,
193 .val
= PMX_GPIO_PIN0_MASK
,
197 static struct spear_modemux gpio0_pin0_modemux
[] = {
200 .muxregs
= gpio0_pin0_muxreg
,
201 .nmuxregs
= ARRAY_SIZE(gpio0_pin0_muxreg
),
205 struct spear_pingroup spear3xx_gpio0_pin0_pingroup
= {
206 .name
= "gpio0_pin0_grp",
207 .pins
= gpio0_pin0_pins
,
208 .npins
= ARRAY_SIZE(gpio0_pin0_pins
),
209 .modemuxs
= gpio0_pin0_modemux
,
210 .nmodemuxs
= ARRAY_SIZE(gpio0_pin0_modemux
),
213 /* gpio0_pin1_pins */
214 static const unsigned gpio0_pin1_pins
[] = { 29 };
215 static struct spear_muxreg gpio0_pin1_muxreg
[] = {
218 .mask
= PMX_GPIO_PIN1_MASK
,
219 .val
= PMX_GPIO_PIN1_MASK
,
223 static struct spear_modemux gpio0_pin1_modemux
[] = {
226 .muxregs
= gpio0_pin1_muxreg
,
227 .nmuxregs
= ARRAY_SIZE(gpio0_pin1_muxreg
),
231 struct spear_pingroup spear3xx_gpio0_pin1_pingroup
= {
232 .name
= "gpio0_pin1_grp",
233 .pins
= gpio0_pin1_pins
,
234 .npins
= ARRAY_SIZE(gpio0_pin1_pins
),
235 .modemuxs
= gpio0_pin1_modemux
,
236 .nmodemuxs
= ARRAY_SIZE(gpio0_pin1_modemux
),
239 /* gpio0_pin2_pins */
240 static const unsigned gpio0_pin2_pins
[] = { 30 };
241 static struct spear_muxreg gpio0_pin2_muxreg
[] = {
244 .mask
= PMX_GPIO_PIN2_MASK
,
245 .val
= PMX_GPIO_PIN2_MASK
,
249 static struct spear_modemux gpio0_pin2_modemux
[] = {
252 .muxregs
= gpio0_pin2_muxreg
,
253 .nmuxregs
= ARRAY_SIZE(gpio0_pin2_muxreg
),
257 struct spear_pingroup spear3xx_gpio0_pin2_pingroup
= {
258 .name
= "gpio0_pin2_grp",
259 .pins
= gpio0_pin2_pins
,
260 .npins
= ARRAY_SIZE(gpio0_pin2_pins
),
261 .modemuxs
= gpio0_pin2_modemux
,
262 .nmodemuxs
= ARRAY_SIZE(gpio0_pin2_modemux
),
265 /* gpio0_pin3_pins */
266 static const unsigned gpio0_pin3_pins
[] = { 31 };
267 static struct spear_muxreg gpio0_pin3_muxreg
[] = {
270 .mask
= PMX_GPIO_PIN3_MASK
,
271 .val
= PMX_GPIO_PIN3_MASK
,
275 static struct spear_modemux gpio0_pin3_modemux
[] = {
278 .muxregs
= gpio0_pin3_muxreg
,
279 .nmuxregs
= ARRAY_SIZE(gpio0_pin3_muxreg
),
283 struct spear_pingroup spear3xx_gpio0_pin3_pingroup
= {
284 .name
= "gpio0_pin3_grp",
285 .pins
= gpio0_pin3_pins
,
286 .npins
= ARRAY_SIZE(gpio0_pin3_pins
),
287 .modemuxs
= gpio0_pin3_modemux
,
288 .nmodemuxs
= ARRAY_SIZE(gpio0_pin3_modemux
),
291 /* gpio0_pin4_pins */
292 static const unsigned gpio0_pin4_pins
[] = { 32 };
293 static struct spear_muxreg gpio0_pin4_muxreg
[] = {
296 .mask
= PMX_GPIO_PIN4_MASK
,
297 .val
= PMX_GPIO_PIN4_MASK
,
301 static struct spear_modemux gpio0_pin4_modemux
[] = {
304 .muxregs
= gpio0_pin4_muxreg
,
305 .nmuxregs
= ARRAY_SIZE(gpio0_pin4_muxreg
),
309 struct spear_pingroup spear3xx_gpio0_pin4_pingroup
= {
310 .name
= "gpio0_pin4_grp",
311 .pins
= gpio0_pin4_pins
,
312 .npins
= ARRAY_SIZE(gpio0_pin4_pins
),
313 .modemuxs
= gpio0_pin4_modemux
,
314 .nmodemuxs
= ARRAY_SIZE(gpio0_pin4_modemux
),
317 /* gpio0_pin5_pins */
318 static const unsigned gpio0_pin5_pins
[] = { 33 };
319 static struct spear_muxreg gpio0_pin5_muxreg
[] = {
322 .mask
= PMX_GPIO_PIN5_MASK
,
323 .val
= PMX_GPIO_PIN5_MASK
,
327 static struct spear_modemux gpio0_pin5_modemux
[] = {
330 .muxregs
= gpio0_pin5_muxreg
,
331 .nmuxregs
= ARRAY_SIZE(gpio0_pin5_muxreg
),
335 struct spear_pingroup spear3xx_gpio0_pin5_pingroup
= {
336 .name
= "gpio0_pin5_grp",
337 .pins
= gpio0_pin5_pins
,
338 .npins
= ARRAY_SIZE(gpio0_pin5_pins
),
339 .modemuxs
= gpio0_pin5_modemux
,
340 .nmodemuxs
= ARRAY_SIZE(gpio0_pin5_modemux
),
343 static const char *const gpio0_grps
[] = { "gpio0_pin0_grp", "gpio0_pin1_grp",
344 "gpio0_pin2_grp", "gpio0_pin3_grp", "gpio0_pin4_grp", "gpio0_pin5_grp",
346 struct spear_function spear3xx_gpio0_function
= {
348 .groups
= gpio0_grps
,
349 .ngroups
= ARRAY_SIZE(gpio0_grps
),
353 static const unsigned uart0_ext_pins
[] = { 37, 38, 39, 40, 41, 42 };
354 static struct spear_muxreg uart0_ext_muxreg
[] = {
357 .mask
= PMX_UART0_MODEM_MASK
,
358 .val
= PMX_UART0_MODEM_MASK
,
362 static struct spear_modemux uart0_ext_modemux
[] = {
365 .muxregs
= uart0_ext_muxreg
,
366 .nmuxregs
= ARRAY_SIZE(uart0_ext_muxreg
),
370 struct spear_pingroup spear3xx_uart0_ext_pingroup
= {
371 .name
= "uart0_ext_grp",
372 .pins
= uart0_ext_pins
,
373 .npins
= ARRAY_SIZE(uart0_ext_pins
),
374 .modemuxs
= uart0_ext_modemux
,
375 .nmodemuxs
= ARRAY_SIZE(uart0_ext_modemux
),
378 static const char *const uart0_ext_grps
[] = { "uart0_ext_grp" };
379 struct spear_function spear3xx_uart0_ext_function
= {
381 .groups
= uart0_ext_grps
,
382 .ngroups
= ARRAY_SIZE(uart0_ext_grps
),
386 static const unsigned uart0_pins
[] = { 2, 3 };
387 static struct spear_muxreg uart0_muxreg
[] = {
390 .mask
= PMX_UART0_MASK
,
391 .val
= PMX_UART0_MASK
,
395 static struct spear_modemux uart0_modemux
[] = {
398 .muxregs
= uart0_muxreg
,
399 .nmuxregs
= ARRAY_SIZE(uart0_muxreg
),
403 struct spear_pingroup spear3xx_uart0_pingroup
= {
406 .npins
= ARRAY_SIZE(uart0_pins
),
407 .modemuxs
= uart0_modemux
,
408 .nmodemuxs
= ARRAY_SIZE(uart0_modemux
),
411 static const char *const uart0_grps
[] = { "uart0_grp" };
412 struct spear_function spear3xx_uart0_function
= {
414 .groups
= uart0_grps
,
415 .ngroups
= ARRAY_SIZE(uart0_grps
),
419 static const unsigned timer_0_1_pins
[] = { 43, 44, 47, 48 };
420 static struct spear_muxreg timer_0_1_muxreg
[] = {
423 .mask
= PMX_TIMER_0_1_MASK
,
424 .val
= PMX_TIMER_0_1_MASK
,
428 static struct spear_modemux timer_0_1_modemux
[] = {
431 .muxregs
= timer_0_1_muxreg
,
432 .nmuxregs
= ARRAY_SIZE(timer_0_1_muxreg
),
436 struct spear_pingroup spear3xx_timer_0_1_pingroup
= {
437 .name
= "timer_0_1_grp",
438 .pins
= timer_0_1_pins
,
439 .npins
= ARRAY_SIZE(timer_0_1_pins
),
440 .modemuxs
= timer_0_1_modemux
,
441 .nmodemuxs
= ARRAY_SIZE(timer_0_1_modemux
),
444 static const char *const timer_0_1_grps
[] = { "timer_0_1_grp" };
445 struct spear_function spear3xx_timer_0_1_function
= {
447 .groups
= timer_0_1_grps
,
448 .ngroups
= ARRAY_SIZE(timer_0_1_grps
),
452 static const unsigned timer_2_3_pins
[] = { 45, 46, 49, 50 };
453 static struct spear_muxreg timer_2_3_muxreg
[] = {
456 .mask
= PMX_TIMER_2_3_MASK
,
457 .val
= PMX_TIMER_2_3_MASK
,
461 static struct spear_modemux timer_2_3_modemux
[] = {
464 .muxregs
= timer_2_3_muxreg
,
465 .nmuxregs
= ARRAY_SIZE(timer_2_3_muxreg
),
469 struct spear_pingroup spear3xx_timer_2_3_pingroup
= {
470 .name
= "timer_2_3_grp",
471 .pins
= timer_2_3_pins
,
472 .npins
= ARRAY_SIZE(timer_2_3_pins
),
473 .modemuxs
= timer_2_3_modemux
,
474 .nmodemuxs
= ARRAY_SIZE(timer_2_3_modemux
),
477 static const char *const timer_2_3_grps
[] = { "timer_2_3_grp" };
478 struct spear_function spear3xx_timer_2_3_function
= {
480 .groups
= timer_2_3_grps
,
481 .ngroups
= ARRAY_SIZE(timer_2_3_grps
),
484 /* Define muxreg arrays */
485 DEFINE_MUXREG(firda_pins
, 0, PMX_FIRDA_MASK
, 0);
486 DEFINE_MUXREG(i2c_pins
, 0, PMX_I2C_MASK
, 0);
487 DEFINE_MUXREG(ssp_cs_pins
, 0, PMX_SSP_CS_MASK
, 0);
488 DEFINE_MUXREG(ssp_pins
, 0, PMX_SSP_MASK
, 0);
489 DEFINE_MUXREG(mii_pins
, 0, PMX_MII_MASK
, 0);
490 DEFINE_MUXREG(gpio0_pin0_pins
, 0, PMX_GPIO_PIN0_MASK
, 0);
491 DEFINE_MUXREG(gpio0_pin1_pins
, 0, PMX_GPIO_PIN1_MASK
, 0);
492 DEFINE_MUXREG(gpio0_pin2_pins
, 0, PMX_GPIO_PIN2_MASK
, 0);
493 DEFINE_MUXREG(gpio0_pin3_pins
, 0, PMX_GPIO_PIN3_MASK
, 0);
494 DEFINE_MUXREG(gpio0_pin4_pins
, 0, PMX_GPIO_PIN4_MASK
, 0);
495 DEFINE_MUXREG(gpio0_pin5_pins
, 0, PMX_GPIO_PIN5_MASK
, 0);
496 DEFINE_MUXREG(uart0_ext_pins
, 0, PMX_UART0_MODEM_MASK
, 0);
497 DEFINE_MUXREG(uart0_pins
, 0, PMX_UART0_MASK
, 0);
498 DEFINE_MUXREG(timer_0_1_pins
, 0, PMX_TIMER_0_1_MASK
, 0);
499 DEFINE_MUXREG(timer_2_3_pins
, 0, PMX_TIMER_2_3_MASK
, 0);
501 static struct spear_gpio_pingroup spear3xx_gpio_pingroup
[] = {
502 GPIO_PINGROUP(firda_pins
),
503 GPIO_PINGROUP(i2c_pins
),
504 GPIO_PINGROUP(ssp_cs_pins
),
505 GPIO_PINGROUP(ssp_pins
),
506 GPIO_PINGROUP(mii_pins
),
507 GPIO_PINGROUP(gpio0_pin0_pins
),
508 GPIO_PINGROUP(gpio0_pin1_pins
),
509 GPIO_PINGROUP(gpio0_pin2_pins
),
510 GPIO_PINGROUP(gpio0_pin3_pins
),
511 GPIO_PINGROUP(gpio0_pin4_pins
),
512 GPIO_PINGROUP(gpio0_pin5_pins
),
513 GPIO_PINGROUP(uart0_ext_pins
),
514 GPIO_PINGROUP(uart0_pins
),
515 GPIO_PINGROUP(timer_0_1_pins
),
516 GPIO_PINGROUP(timer_2_3_pins
),
519 struct spear_pinctrl_machdata spear3xx_machdata
= {
520 .pins
= spear3xx_pins
,
521 .npins
= ARRAY_SIZE(spear3xx_pins
),
522 .gpio_pingroups
= spear3xx_gpio_pingroup
,
523 .ngpio_pingroups
= ARRAY_SIZE(spear3xx_gpio_pingroup
),