2 * Driver for the ST Microelectronics SPEAr pinmux
4 * Copyright (C) 2012 ST Microelectronics
5 * Viresh Kumar <viresh.linux@gmail.com>
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>
18 #include <linux/module.h>
20 #include <linux/of_address.h>
21 #include <linux/pinctrl/machine.h>
22 #include <linux/pinctrl/pinctrl.h>
23 #include <linux/pinctrl/pinmux.h>
24 #include <linux/platform_device.h>
25 #include <linux/slab.h>
27 #include "pinctrl-spear.h"
29 #define DRIVER_NAME "spear-pinmux"
31 static inline u32
pmx_readl(struct spear_pmx
*pmx
, u32 reg
)
33 return readl_relaxed(pmx
->vbase
+ reg
);
36 static inline void pmx_writel(struct spear_pmx
*pmx
, u32 val
, u32 reg
)
38 writel_relaxed(val
, pmx
->vbase
+ reg
);
41 static int set_mode(struct spear_pmx
*pmx
, int mode
)
43 struct spear_pmx_mode
*pmx_mode
= NULL
;
47 if (!pmx
->machdata
->pmx_modes
|| !pmx
->machdata
->npmx_modes
)
50 for (i
= 0; i
< pmx
->machdata
->npmx_modes
; i
++) {
51 if (pmx
->machdata
->pmx_modes
[i
]->mode
== (1 << mode
)) {
52 pmx_mode
= pmx
->machdata
->pmx_modes
[i
];
60 val
= pmx_readl(pmx
, pmx_mode
->reg
);
61 val
&= ~pmx_mode
->mask
;
63 pmx_writel(pmx
, val
, pmx_mode
->reg
);
65 pmx
->machdata
->mode
= pmx_mode
->mode
;
66 dev_info(pmx
->dev
, "Configured Mode: %s with id: %x\n\n",
67 pmx_mode
->name
? pmx_mode
->name
: "no_name",
73 void __devinit
pmx_init_addr(struct spear_pinctrl_machdata
*machdata
, u16 reg
)
75 struct spear_pingroup
*pgroup
;
76 struct spear_modemux
*modemux
;
79 for (group
= 0; group
< machdata
->ngroups
; group
++) {
80 pgroup
= machdata
->groups
[group
];
82 for (i
= 0; i
< pgroup
->nmodemuxs
; i
++) {
83 modemux
= &pgroup
->modemuxs
[i
];
85 for (j
= 0; j
< modemux
->nmuxregs
; j
++)
86 if (modemux
->muxregs
[j
].reg
== 0xFFFF)
87 modemux
->muxregs
[j
].reg
= reg
;
92 static int spear_pinctrl_get_groups_cnt(struct pinctrl_dev
*pctldev
)
94 struct spear_pmx
*pmx
= pinctrl_dev_get_drvdata(pctldev
);
96 return pmx
->machdata
->ngroups
;
99 static const char *spear_pinctrl_get_group_name(struct pinctrl_dev
*pctldev
,
102 struct spear_pmx
*pmx
= pinctrl_dev_get_drvdata(pctldev
);
104 return pmx
->machdata
->groups
[group
]->name
;
107 static int spear_pinctrl_get_group_pins(struct pinctrl_dev
*pctldev
,
108 unsigned group
, const unsigned **pins
, unsigned *num_pins
)
110 struct spear_pmx
*pmx
= pinctrl_dev_get_drvdata(pctldev
);
112 *pins
= pmx
->machdata
->groups
[group
]->pins
;
113 *num_pins
= pmx
->machdata
->groups
[group
]->npins
;
118 static void spear_pinctrl_pin_dbg_show(struct pinctrl_dev
*pctldev
,
119 struct seq_file
*s
, unsigned offset
)
121 seq_printf(s
, " " DRIVER_NAME
);
124 int spear_pinctrl_dt_node_to_map(struct pinctrl_dev
*pctldev
,
125 struct device_node
*np_config
,
126 struct pinctrl_map
**map
, unsigned *num_maps
)
128 struct spear_pmx
*pmx
= pinctrl_dev_get_drvdata(pctldev
);
129 struct device_node
*np
;
130 struct property
*prop
;
131 const char *function
, *group
;
132 int ret
, index
= 0, count
= 0;
134 /* calculate number of maps required */
135 for_each_child_of_node(np_config
, np
) {
136 ret
= of_property_read_string(np
, "st,function", &function
);
140 ret
= of_property_count_strings(np
, "st,pins");
148 dev_err(pmx
->dev
, "No child nodes passed via DT\n");
152 *map
= kzalloc(sizeof(**map
) * count
, GFP_KERNEL
);
156 for_each_child_of_node(np_config
, np
) {
157 of_property_read_string(np
, "st,function", &function
);
158 of_property_for_each_string(np
, "st,pins", prop
, group
) {
159 (*map
)[index
].type
= PIN_MAP_TYPE_MUX_GROUP
;
160 (*map
)[index
].data
.mux
.group
= group
;
161 (*map
)[index
].data
.mux
.function
= function
;
171 void spear_pinctrl_dt_free_map(struct pinctrl_dev
*pctldev
,
172 struct pinctrl_map
*map
, unsigned num_maps
)
177 static struct pinctrl_ops spear_pinctrl_ops
= {
178 .get_groups_count
= spear_pinctrl_get_groups_cnt
,
179 .get_group_name
= spear_pinctrl_get_group_name
,
180 .get_group_pins
= spear_pinctrl_get_group_pins
,
181 .pin_dbg_show
= spear_pinctrl_pin_dbg_show
,
182 .dt_node_to_map
= spear_pinctrl_dt_node_to_map
,
183 .dt_free_map
= spear_pinctrl_dt_free_map
,
186 static int spear_pinctrl_get_funcs_count(struct pinctrl_dev
*pctldev
)
188 struct spear_pmx
*pmx
= pinctrl_dev_get_drvdata(pctldev
);
190 return pmx
->machdata
->nfunctions
;
193 static const char *spear_pinctrl_get_func_name(struct pinctrl_dev
*pctldev
,
196 struct spear_pmx
*pmx
= pinctrl_dev_get_drvdata(pctldev
);
198 return pmx
->machdata
->functions
[function
]->name
;
201 static int spear_pinctrl_get_func_groups(struct pinctrl_dev
*pctldev
,
202 unsigned function
, const char *const **groups
,
203 unsigned * const ngroups
)
205 struct spear_pmx
*pmx
= pinctrl_dev_get_drvdata(pctldev
);
207 *groups
= pmx
->machdata
->functions
[function
]->groups
;
208 *ngroups
= pmx
->machdata
->functions
[function
]->ngroups
;
213 static int spear_pinctrl_endisable(struct pinctrl_dev
*pctldev
,
214 unsigned function
, unsigned group
, bool enable
)
216 struct spear_pmx
*pmx
= pinctrl_dev_get_drvdata(pctldev
);
217 const struct spear_pingroup
*pgroup
;
218 const struct spear_modemux
*modemux
;
219 struct spear_muxreg
*muxreg
;
224 pgroup
= pmx
->machdata
->groups
[group
];
226 for (i
= 0; i
< pgroup
->nmodemuxs
; i
++) {
227 modemux
= &pgroup
->modemuxs
[i
];
229 /* SoC have any modes */
230 if (pmx
->machdata
->modes_supported
) {
231 if (!(pmx
->machdata
->mode
& modemux
->modes
))
236 for (j
= 0; j
< modemux
->nmuxregs
; j
++) {
237 muxreg
= &modemux
->muxregs
[j
];
239 val
= pmx_readl(pmx
, muxreg
->reg
);
240 val
&= ~muxreg
->mask
;
248 pmx_writel(pmx
, val
, muxreg
->reg
);
253 dev_err(pmx
->dev
, "pinmux group: %s not supported\n",
261 static int spear_pinctrl_enable(struct pinctrl_dev
*pctldev
, unsigned function
,
264 return spear_pinctrl_endisable(pctldev
, function
, group
, true);
267 static void spear_pinctrl_disable(struct pinctrl_dev
*pctldev
,
268 unsigned function
, unsigned group
)
270 spear_pinctrl_endisable(pctldev
, function
, group
, false);
273 static struct pinmux_ops spear_pinmux_ops
= {
274 .get_functions_count
= spear_pinctrl_get_funcs_count
,
275 .get_function_name
= spear_pinctrl_get_func_name
,
276 .get_function_groups
= spear_pinctrl_get_func_groups
,
277 .enable
= spear_pinctrl_enable
,
278 .disable
= spear_pinctrl_disable
,
281 static struct pinctrl_desc spear_pinctrl_desc
= {
283 .pctlops
= &spear_pinctrl_ops
,
284 .pmxops
= &spear_pinmux_ops
,
285 .owner
= THIS_MODULE
,
288 int __devinit
spear_pinctrl_probe(struct platform_device
*pdev
,
289 struct spear_pinctrl_machdata
*machdata
)
291 struct device_node
*np
= pdev
->dev
.of_node
;
292 struct resource
*res
;
293 struct spear_pmx
*pmx
;
298 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
302 pmx
= devm_kzalloc(&pdev
->dev
, sizeof(*pmx
), GFP_KERNEL
);
304 dev_err(&pdev
->dev
, "Can't alloc spear_pmx\n");
308 pmx
->vbase
= devm_ioremap(&pdev
->dev
, res
->start
, resource_size(res
));
310 dev_err(&pdev
->dev
, "Couldn't ioremap at index 0\n");
314 pmx
->dev
= &pdev
->dev
;
315 pmx
->machdata
= machdata
;
317 /* configure mode, if supported by SoC */
318 if (machdata
->modes_supported
) {
321 if (of_property_read_u32(np
, "st,pinmux-mode", &mode
)) {
322 dev_err(&pdev
->dev
, "OF: pinmux mode not passed\n");
326 if (set_mode(pmx
, mode
)) {
327 dev_err(&pdev
->dev
, "OF: Couldn't configure mode: %x\n",
333 platform_set_drvdata(pdev
, pmx
);
335 spear_pinctrl_desc
.pins
= machdata
->pins
;
336 spear_pinctrl_desc
.npins
= machdata
->npins
;
338 pmx
->pctl
= pinctrl_register(&spear_pinctrl_desc
, &pdev
->dev
, pmx
);
340 dev_err(&pdev
->dev
, "Couldn't register pinctrl driver\n");
347 int __devexit
spear_pinctrl_remove(struct platform_device
*pdev
)
349 struct spear_pmx
*pmx
= platform_get_drvdata(pdev
);
351 pinctrl_unregister(pmx
->pctl
);