2 * Driver for the ST Microelectronics SPEAr pinmux
4 * Copyright (C) 2012 ST Microelectronics
5 * Viresh Kumar <vireshk@kernel.org>
8 * - U300 Pinctl drivers
9 * - Tegra Pinctl drivers
11 * This file is licensed under the terms of the GNU General Public
12 * License version 2. This program is licensed "as is" without any
13 * warranty of any kind, whether express or implied.
16 #include <linux/err.h>
17 #include <linux/mfd/syscon.h>
18 #include <linux/module.h>
20 #include <linux/of_address.h>
21 #include <linux/platform_device.h>
22 #include <linux/seq_file.h>
23 #include <linux/slab.h>
25 #include <linux/pinctrl/machine.h>
26 #include <linux/pinctrl/pinctrl.h>
27 #include <linux/pinctrl/pinmux.h>
29 #include "pinctrl-spear.h"
31 #define DRIVER_NAME "spear-pinmux"
33 static void muxregs_endisable(struct spear_pmx
*pmx
,
34 struct spear_muxreg
*muxregs
, u8 count
, bool enable
)
36 struct spear_muxreg
*muxreg
;
39 for (j
= 0; j
< count
; j
++) {
42 val
= pmx_readl(pmx
, muxreg
->reg
);
50 val
|= muxreg
->mask
& temp
;
51 pmx_writel(pmx
, val
, muxreg
->reg
);
55 static int set_mode(struct spear_pmx
*pmx
, int mode
)
57 struct spear_pmx_mode
*pmx_mode
= NULL
;
61 if (!pmx
->machdata
->pmx_modes
|| !pmx
->machdata
->npmx_modes
)
64 for (i
= 0; i
< pmx
->machdata
->npmx_modes
; i
++) {
65 if (pmx
->machdata
->pmx_modes
[i
]->mode
== (1 << mode
)) {
66 pmx_mode
= pmx
->machdata
->pmx_modes
[i
];
74 val
= pmx_readl(pmx
, pmx_mode
->reg
);
75 val
&= ~pmx_mode
->mask
;
77 pmx_writel(pmx
, val
, pmx_mode
->reg
);
79 pmx
->machdata
->mode
= pmx_mode
->mode
;
80 dev_info(pmx
->dev
, "Configured Mode: %s with id: %x\n\n",
81 pmx_mode
->name
? pmx_mode
->name
: "no_name",
87 void pmx_init_gpio_pingroup_addr(struct spear_gpio_pingroup
*gpio_pingroup
,
88 unsigned count
, u16 reg
)
92 for (i
= 0; i
< count
; i
++)
93 for (j
= 0; j
< gpio_pingroup
[i
].nmuxregs
; j
++)
94 gpio_pingroup
[i
].muxregs
[j
].reg
= reg
;
97 void pmx_init_addr(struct spear_pinctrl_machdata
*machdata
, u16 reg
)
99 struct spear_pingroup
*pgroup
;
100 struct spear_modemux
*modemux
;
103 for (group
= 0; group
< machdata
->ngroups
; group
++) {
104 pgroup
= machdata
->groups
[group
];
106 for (i
= 0; i
< pgroup
->nmodemuxs
; i
++) {
107 modemux
= &pgroup
->modemuxs
[i
];
109 for (j
= 0; j
< modemux
->nmuxregs
; j
++)
110 if (modemux
->muxregs
[j
].reg
== 0xFFFF)
111 modemux
->muxregs
[j
].reg
= reg
;
116 static int spear_pinctrl_get_groups_cnt(struct pinctrl_dev
*pctldev
)
118 struct spear_pmx
*pmx
= pinctrl_dev_get_drvdata(pctldev
);
120 return pmx
->machdata
->ngroups
;
123 static const char *spear_pinctrl_get_group_name(struct pinctrl_dev
*pctldev
,
126 struct spear_pmx
*pmx
= pinctrl_dev_get_drvdata(pctldev
);
128 return pmx
->machdata
->groups
[group
]->name
;
131 static int spear_pinctrl_get_group_pins(struct pinctrl_dev
*pctldev
,
132 unsigned group
, const unsigned **pins
, unsigned *num_pins
)
134 struct spear_pmx
*pmx
= pinctrl_dev_get_drvdata(pctldev
);
136 *pins
= pmx
->machdata
->groups
[group
]->pins
;
137 *num_pins
= pmx
->machdata
->groups
[group
]->npins
;
142 static void spear_pinctrl_pin_dbg_show(struct pinctrl_dev
*pctldev
,
143 struct seq_file
*s
, unsigned offset
)
145 seq_printf(s
, " " DRIVER_NAME
);
148 static int spear_pinctrl_dt_node_to_map(struct pinctrl_dev
*pctldev
,
149 struct device_node
*np_config
,
150 struct pinctrl_map
**map
,
153 struct spear_pmx
*pmx
= pinctrl_dev_get_drvdata(pctldev
);
154 struct property
*prop
;
155 const char *function
, *group
;
156 int ret
, index
= 0, count
= 0;
158 /* calculate number of maps required */
159 for_each_child_of_node_scoped(np_config
, np
) {
160 ret
= of_property_read_string(np
, "st,function", &function
);
164 ret
= of_property_count_strings(np
, "st,pins");
172 dev_err(pmx
->dev
, "No child nodes passed via DT\n");
176 *map
= kcalloc(count
, sizeof(**map
), GFP_KERNEL
);
180 for_each_child_of_node_scoped(np_config
, np
) {
181 of_property_read_string(np
, "st,function", &function
);
182 of_property_for_each_string(np
, "st,pins", prop
, group
) {
183 (*map
)[index
].type
= PIN_MAP_TYPE_MUX_GROUP
;
184 (*map
)[index
].data
.mux
.group
= group
;
185 (*map
)[index
].data
.mux
.function
= function
;
195 static void spear_pinctrl_dt_free_map(struct pinctrl_dev
*pctldev
,
196 struct pinctrl_map
*map
,
202 static const struct pinctrl_ops spear_pinctrl_ops
= {
203 .get_groups_count
= spear_pinctrl_get_groups_cnt
,
204 .get_group_name
= spear_pinctrl_get_group_name
,
205 .get_group_pins
= spear_pinctrl_get_group_pins
,
206 .pin_dbg_show
= spear_pinctrl_pin_dbg_show
,
207 .dt_node_to_map
= spear_pinctrl_dt_node_to_map
,
208 .dt_free_map
= spear_pinctrl_dt_free_map
,
211 static int spear_pinctrl_get_funcs_count(struct pinctrl_dev
*pctldev
)
213 struct spear_pmx
*pmx
= pinctrl_dev_get_drvdata(pctldev
);
215 return pmx
->machdata
->nfunctions
;
218 static const char *spear_pinctrl_get_func_name(struct pinctrl_dev
*pctldev
,
221 struct spear_pmx
*pmx
= pinctrl_dev_get_drvdata(pctldev
);
223 return pmx
->machdata
->functions
[function
]->name
;
226 static int spear_pinctrl_get_func_groups(struct pinctrl_dev
*pctldev
,
227 unsigned function
, const char *const **groups
,
228 unsigned * const ngroups
)
230 struct spear_pmx
*pmx
= pinctrl_dev_get_drvdata(pctldev
);
232 *groups
= pmx
->machdata
->functions
[function
]->groups
;
233 *ngroups
= pmx
->machdata
->functions
[function
]->ngroups
;
238 static int spear_pinctrl_endisable(struct pinctrl_dev
*pctldev
,
239 unsigned function
, unsigned group
, bool enable
)
241 struct spear_pmx
*pmx
= pinctrl_dev_get_drvdata(pctldev
);
242 const struct spear_pingroup
*pgroup
;
243 const struct spear_modemux
*modemux
;
247 pgroup
= pmx
->machdata
->groups
[group
];
249 for (i
= 0; i
< pgroup
->nmodemuxs
; i
++) {
250 modemux
= &pgroup
->modemuxs
[i
];
252 /* SoC have any modes */
253 if (pmx
->machdata
->modes_supported
) {
254 if (!(pmx
->machdata
->mode
& modemux
->modes
))
259 muxregs_endisable(pmx
, modemux
->muxregs
, modemux
->nmuxregs
,
264 dev_err(pmx
->dev
, "pinmux group: %s not supported\n",
272 static int spear_pinctrl_set_mux(struct pinctrl_dev
*pctldev
, unsigned function
,
275 return spear_pinctrl_endisable(pctldev
, function
, group
, true);
278 /* gpio with pinmux */
279 static struct spear_gpio_pingroup
*get_gpio_pingroup(struct spear_pmx
*pmx
,
282 struct spear_gpio_pingroup
*gpio_pingroup
;
285 if (!pmx
->machdata
->gpio_pingroups
)
288 for (i
= 0; i
< pmx
->machdata
->ngpio_pingroups
; i
++) {
289 gpio_pingroup
= &pmx
->machdata
->gpio_pingroups
[i
];
291 for (j
= 0; j
< gpio_pingroup
->npins
; j
++) {
292 if (gpio_pingroup
->pins
[j
] == pin
)
293 return gpio_pingroup
;
300 static int gpio_request_endisable(struct pinctrl_dev
*pctldev
,
301 struct pinctrl_gpio_range
*range
, unsigned offset
, bool enable
)
303 struct spear_pmx
*pmx
= pinctrl_dev_get_drvdata(pctldev
);
304 struct spear_pinctrl_machdata
*machdata
= pmx
->machdata
;
305 struct spear_gpio_pingroup
*gpio_pingroup
;
308 * Some SoC have configuration options applicable to group of pins,
309 * rather than a single pin.
311 gpio_pingroup
= get_gpio_pingroup(pmx
, offset
);
313 muxregs_endisable(pmx
, gpio_pingroup
->muxregs
,
314 gpio_pingroup
->nmuxregs
, enable
);
317 * SoC may need some extra configurations, or configurations for single
320 if (machdata
->gpio_request_endisable
)
321 machdata
->gpio_request_endisable(pmx
, offset
, enable
);
326 static int gpio_request_enable(struct pinctrl_dev
*pctldev
,
327 struct pinctrl_gpio_range
*range
, unsigned offset
)
329 return gpio_request_endisable(pctldev
, range
, offset
, true);
332 static void gpio_disable_free(struct pinctrl_dev
*pctldev
,
333 struct pinctrl_gpio_range
*range
, unsigned offset
)
335 gpio_request_endisable(pctldev
, range
, offset
, false);
338 static const struct pinmux_ops spear_pinmux_ops
= {
339 .get_functions_count
= spear_pinctrl_get_funcs_count
,
340 .get_function_name
= spear_pinctrl_get_func_name
,
341 .get_function_groups
= spear_pinctrl_get_func_groups
,
342 .set_mux
= spear_pinctrl_set_mux
,
343 .gpio_request_enable
= gpio_request_enable
,
344 .gpio_disable_free
= gpio_disable_free
,
347 static struct pinctrl_desc spear_pinctrl_desc
= {
349 .pctlops
= &spear_pinctrl_ops
,
350 .pmxops
= &spear_pinmux_ops
,
351 .owner
= THIS_MODULE
,
354 int spear_pinctrl_probe(struct platform_device
*pdev
,
355 struct spear_pinctrl_machdata
*machdata
)
357 struct device_node
*np
= pdev
->dev
.of_node
;
358 struct spear_pmx
*pmx
;
363 pmx
= devm_kzalloc(&pdev
->dev
, sizeof(*pmx
), GFP_KERNEL
);
367 pmx
->regmap
= device_node_to_regmap(np
);
368 if (IS_ERR(pmx
->regmap
)) {
369 dev_err(&pdev
->dev
, "Init regmap failed (%pe).\n",
371 return PTR_ERR(pmx
->regmap
);
374 pmx
->dev
= &pdev
->dev
;
375 pmx
->machdata
= machdata
;
377 /* configure mode, if supported by SoC */
378 if (machdata
->modes_supported
) {
381 if (of_property_read_u32(np
, "st,pinmux-mode", &mode
)) {
382 dev_err(&pdev
->dev
, "OF: pinmux mode not passed\n");
386 if (set_mode(pmx
, mode
)) {
387 dev_err(&pdev
->dev
, "OF: Couldn't configure mode: %x\n",
393 platform_set_drvdata(pdev
, pmx
);
395 spear_pinctrl_desc
.pins
= machdata
->pins
;
396 spear_pinctrl_desc
.npins
= machdata
->npins
;
398 pmx
->pctl
= devm_pinctrl_register(&pdev
->dev
, &spear_pinctrl_desc
, pmx
);
399 if (IS_ERR(pmx
->pctl
)) {
400 dev_err(&pdev
->dev
, "Couldn't register pinctrl driver\n");
401 return PTR_ERR(pmx
->pctl
);