2 * Copyright 2012 Freescale Semiconductor, Inc.
4 * The code contained herein is licensed under the GNU General Public
5 * License. You may obtain a copy of the GNU General Public License
6 * Version 2 or later at the following locations:
8 * http://www.opensource.org/licenses/gpl-license.html
9 * http://www.gnu.org/copyleft/gpl.html
12 #include <linux/err.h>
13 #include <linux/init.h>
15 #include <linux/module.h>
17 #include <linux/of_address.h>
18 #include <linux/pinctrl/machine.h>
19 #include <linux/pinctrl/pinconf.h>
20 #include <linux/pinctrl/pinctrl.h>
21 #include <linux/pinctrl/pinmux.h>
22 #include <linux/platform_device.h>
23 #include <linux/slab.h>
25 #include "pinctrl-mxs.h"
29 struct mxs_pinctrl_data
{
31 struct pinctrl_dev
*pctl
;
33 struct mxs_pinctrl_soc_data
*soc
;
36 static int mxs_get_groups_count(struct pinctrl_dev
*pctldev
)
38 struct mxs_pinctrl_data
*d
= pinctrl_dev_get_drvdata(pctldev
);
40 return d
->soc
->ngroups
;
43 static const char *mxs_get_group_name(struct pinctrl_dev
*pctldev
,
46 struct mxs_pinctrl_data
*d
= pinctrl_dev_get_drvdata(pctldev
);
48 return d
->soc
->groups
[group
].name
;
51 static int mxs_get_group_pins(struct pinctrl_dev
*pctldev
, unsigned group
,
52 const unsigned **pins
, unsigned *num_pins
)
54 struct mxs_pinctrl_data
*d
= pinctrl_dev_get_drvdata(pctldev
);
56 *pins
= d
->soc
->groups
[group
].pins
;
57 *num_pins
= d
->soc
->groups
[group
].npins
;
62 static void mxs_pin_dbg_show(struct pinctrl_dev
*pctldev
, struct seq_file
*s
,
65 seq_printf(s
, " %s", dev_name(pctldev
->dev
));
68 static int mxs_dt_node_to_map(struct pinctrl_dev
*pctldev
,
69 struct device_node
*np
,
70 struct pinctrl_map
**map
, unsigned *num_maps
)
72 struct pinctrl_map
*new_map
;
75 unsigned long config
= 0;
76 unsigned long *pconfig
;
77 int length
= strlen(np
->name
) + SUFFIX_LEN
;
82 /* Check for pin config node which has no 'reg' property */
83 if (of_property_read_u32(np
, "reg", ®
))
86 ret
= of_property_read_u32(np
, "fsl,drive-strength", &val
);
88 config
= val
| MA_PRESENT
;
89 ret
= of_property_read_u32(np
, "fsl,voltage", &val
);
91 config
|= val
<< VOL_SHIFT
| VOL_PRESENT
;
92 ret
= of_property_read_u32(np
, "fsl,pull-up", &val
);
94 config
|= val
<< PULL_SHIFT
| PULL_PRESENT
;
96 /* Check for group node which has both mux and config settings */
97 if (!purecfg
&& config
)
100 new_map
= kzalloc(sizeof(*new_map
) * new_num
, GFP_KERNEL
);
105 new_map
[i
].type
= PIN_MAP_TYPE_MUX_GROUP
;
106 new_map
[i
].data
.mux
.function
= np
->name
;
108 /* Compose group name */
109 group
= kzalloc(length
, GFP_KERNEL
);
114 snprintf(group
, length
, "%s.%d", np
->name
, reg
);
115 new_map
[i
].data
.mux
.group
= group
;
120 pconfig
= kmemdup(&config
, sizeof(config
), GFP_KERNEL
);
126 new_map
[i
].type
= PIN_MAP_TYPE_CONFIGS_GROUP
;
127 new_map
[i
].data
.configs
.group_or_pin
= purecfg
? np
->name
:
129 new_map
[i
].data
.configs
.configs
= pconfig
;
130 new_map
[i
].data
.configs
.num_configs
= 1;
146 static void mxs_dt_free_map(struct pinctrl_dev
*pctldev
,
147 struct pinctrl_map
*map
, unsigned num_maps
)
151 for (i
= 0; i
< num_maps
; i
++) {
152 if (map
[i
].type
== PIN_MAP_TYPE_MUX_GROUP
)
153 kfree(map
[i
].data
.mux
.group
);
154 if (map
[i
].type
== PIN_MAP_TYPE_CONFIGS_GROUP
)
155 kfree(map
[i
].data
.configs
.configs
);
161 static struct pinctrl_ops mxs_pinctrl_ops
= {
162 .get_groups_count
= mxs_get_groups_count
,
163 .get_group_name
= mxs_get_group_name
,
164 .get_group_pins
= mxs_get_group_pins
,
165 .pin_dbg_show
= mxs_pin_dbg_show
,
166 .dt_node_to_map
= mxs_dt_node_to_map
,
167 .dt_free_map
= mxs_dt_free_map
,
170 static int mxs_pinctrl_get_funcs_count(struct pinctrl_dev
*pctldev
)
172 struct mxs_pinctrl_data
*d
= pinctrl_dev_get_drvdata(pctldev
);
174 return d
->soc
->nfunctions
;
177 static const char *mxs_pinctrl_get_func_name(struct pinctrl_dev
*pctldev
,
180 struct mxs_pinctrl_data
*d
= pinctrl_dev_get_drvdata(pctldev
);
182 return d
->soc
->functions
[function
].name
;
185 static int mxs_pinctrl_get_func_groups(struct pinctrl_dev
*pctldev
,
187 const char * const **groups
,
188 unsigned * const num_groups
)
190 struct mxs_pinctrl_data
*d
= pinctrl_dev_get_drvdata(pctldev
);
192 *groups
= d
->soc
->functions
[group
].groups
;
193 *num_groups
= d
->soc
->functions
[group
].ngroups
;
198 static int mxs_pinctrl_enable(struct pinctrl_dev
*pctldev
, unsigned selector
,
201 struct mxs_pinctrl_data
*d
= pinctrl_dev_get_drvdata(pctldev
);
202 struct mxs_group
*g
= &d
->soc
->groups
[group
];
208 for (i
= 0; i
< g
->npins
; i
++) {
209 bank
= PINID_TO_BANK(g
->pins
[i
]);
210 pin
= PINID_TO_PIN(g
->pins
[i
]);
211 reg
= d
->base
+ d
->soc
->regs
->muxsel
;
212 reg
+= bank
* 0x20 + pin
/ 16 * 0x10;
213 shift
= pin
% 16 * 2;
215 writel(0x3 << shift
, reg
+ CLR
);
216 writel(g
->muxsel
[i
] << shift
, reg
+ SET
);
222 static struct pinmux_ops mxs_pinmux_ops
= {
223 .get_functions_count
= mxs_pinctrl_get_funcs_count
,
224 .get_function_name
= mxs_pinctrl_get_func_name
,
225 .get_function_groups
= mxs_pinctrl_get_func_groups
,
226 .enable
= mxs_pinctrl_enable
,
229 static int mxs_pinconf_get(struct pinctrl_dev
*pctldev
,
230 unsigned pin
, unsigned long *config
)
235 static int mxs_pinconf_set(struct pinctrl_dev
*pctldev
,
236 unsigned pin
, unsigned long config
)
241 static int mxs_pinconf_group_get(struct pinctrl_dev
*pctldev
,
242 unsigned group
, unsigned long *config
)
244 struct mxs_pinctrl_data
*d
= pinctrl_dev_get_drvdata(pctldev
);
246 *config
= d
->soc
->groups
[group
].config
;
251 static int mxs_pinconf_group_set(struct pinctrl_dev
*pctldev
,
252 unsigned group
, unsigned long config
)
254 struct mxs_pinctrl_data
*d
= pinctrl_dev_get_drvdata(pctldev
);
255 struct mxs_group
*g
= &d
->soc
->groups
[group
];
257 u8 ma
, vol
, pull
, bank
, shift
;
261 ma
= CONFIG_TO_MA(config
);
262 vol
= CONFIG_TO_VOL(config
);
263 pull
= CONFIG_TO_PULL(config
);
265 for (i
= 0; i
< g
->npins
; i
++) {
266 bank
= PINID_TO_BANK(g
->pins
[i
]);
267 pin
= PINID_TO_PIN(g
->pins
[i
]);
270 reg
= d
->base
+ d
->soc
->regs
->drive
;
271 reg
+= bank
* 0x40 + pin
/ 8 * 0x10;
274 if (config
& MA_PRESENT
) {
276 writel(0x3 << shift
, reg
+ CLR
);
277 writel(ma
<< shift
, reg
+ SET
);
281 if (config
& VOL_PRESENT
) {
282 shift
= pin
% 8 * 4 + 2;
284 writel(1 << shift
, reg
+ SET
);
286 writel(1 << shift
, reg
+ CLR
);
290 if (config
& PULL_PRESENT
) {
291 reg
= d
->base
+ d
->soc
->regs
->pull
;
295 writel(1 << shift
, reg
+ SET
);
297 writel(1 << shift
, reg
+ CLR
);
301 /* cache the config value for mxs_pinconf_group_get() */
307 static void mxs_pinconf_dbg_show(struct pinctrl_dev
*pctldev
,
308 struct seq_file
*s
, unsigned pin
)
313 static void mxs_pinconf_group_dbg_show(struct pinctrl_dev
*pctldev
,
314 struct seq_file
*s
, unsigned group
)
316 unsigned long config
;
318 if (!mxs_pinconf_group_get(pctldev
, group
, &config
))
319 seq_printf(s
, "0x%lx", config
);
322 static struct pinconf_ops mxs_pinconf_ops
= {
323 .pin_config_get
= mxs_pinconf_get
,
324 .pin_config_set
= mxs_pinconf_set
,
325 .pin_config_group_get
= mxs_pinconf_group_get
,
326 .pin_config_group_set
= mxs_pinconf_group_set
,
327 .pin_config_dbg_show
= mxs_pinconf_dbg_show
,
328 .pin_config_group_dbg_show
= mxs_pinconf_group_dbg_show
,
331 static struct pinctrl_desc mxs_pinctrl_desc
= {
332 .pctlops
= &mxs_pinctrl_ops
,
333 .pmxops
= &mxs_pinmux_ops
,
334 .confops
= &mxs_pinconf_ops
,
335 .owner
= THIS_MODULE
,
338 static int mxs_pinctrl_parse_group(struct platform_device
*pdev
,
339 struct device_node
*np
, int idx
,
340 const char **out_name
)
342 struct mxs_pinctrl_data
*d
= platform_get_drvdata(pdev
);
343 struct mxs_group
*g
= &d
->soc
->groups
[idx
];
344 struct property
*prop
;
345 const char *propname
= "fsl,pinmux-ids";
347 int length
= strlen(np
->name
) + SUFFIX_LEN
;
350 group
= devm_kzalloc(&pdev
->dev
, length
, GFP_KERNEL
);
353 if (of_property_read_u32(np
, "reg", &val
))
354 snprintf(group
, length
, "%s", np
->name
);
356 snprintf(group
, length
, "%s.%d", np
->name
, val
);
359 prop
= of_find_property(np
, propname
, &length
);
362 g
->npins
= length
/ sizeof(u32
);
364 g
->pins
= devm_kzalloc(&pdev
->dev
, g
->npins
* sizeof(*g
->pins
),
369 g
->muxsel
= devm_kzalloc(&pdev
->dev
, g
->npins
* sizeof(*g
->muxsel
),
374 of_property_read_u32_array(np
, propname
, g
->pins
, g
->npins
);
375 for (i
= 0; i
< g
->npins
; i
++) {
376 g
->muxsel
[i
] = MUXID_TO_MUXSEL(g
->pins
[i
]);
377 g
->pins
[i
] = MUXID_TO_PINID(g
->pins
[i
]);
386 static int mxs_pinctrl_probe_dt(struct platform_device
*pdev
,
387 struct mxs_pinctrl_data
*d
)
389 struct mxs_pinctrl_soc_data
*soc
= d
->soc
;
390 struct device_node
*np
= pdev
->dev
.of_node
;
391 struct device_node
*child
;
392 struct mxs_function
*f
;
393 const char *gpio_compat
= "fsl,mxs-gpio";
394 const char *fn
, *fnull
= "";
395 int i
= 0, idxf
= 0, idxg
= 0;
399 child
= of_get_next_child(np
, NULL
);
401 dev_err(&pdev
->dev
, "no group is defined\n");
405 /* Count total functions and groups */
407 for_each_child_of_node(np
, child
) {
408 if (of_device_is_compatible(child
, gpio_compat
))
411 /* Skip pure pinconf node */
412 if (of_property_read_u32(child
, "reg", &val
))
414 if (strcmp(fn
, child
->name
)) {
420 soc
->functions
= devm_kzalloc(&pdev
->dev
, soc
->nfunctions
*
421 sizeof(*soc
->functions
), GFP_KERNEL
);
425 soc
->groups
= devm_kzalloc(&pdev
->dev
, soc
->ngroups
*
426 sizeof(*soc
->groups
), GFP_KERNEL
);
430 /* Count groups for each function */
432 f
= &soc
->functions
[idxf
];
433 for_each_child_of_node(np
, child
) {
434 if (of_device_is_compatible(child
, gpio_compat
))
436 if (of_property_read_u32(child
, "reg", &val
))
438 if (strcmp(fn
, child
->name
)) {
439 f
= &soc
->functions
[idxf
++];
440 f
->name
= fn
= child
->name
;
445 /* Get groups for each function */
448 for_each_child_of_node(np
, child
) {
449 if (of_device_is_compatible(child
, gpio_compat
))
451 if (of_property_read_u32(child
, "reg", &val
)) {
452 ret
= mxs_pinctrl_parse_group(pdev
, child
,
459 if (strcmp(fn
, child
->name
)) {
460 f
= &soc
->functions
[idxf
++];
461 f
->groups
= devm_kzalloc(&pdev
->dev
, f
->ngroups
*
469 ret
= mxs_pinctrl_parse_group(pdev
, child
, idxg
++,
478 int mxs_pinctrl_probe(struct platform_device
*pdev
,
479 struct mxs_pinctrl_soc_data
*soc
)
481 struct device_node
*np
= pdev
->dev
.of_node
;
482 struct mxs_pinctrl_data
*d
;
485 d
= devm_kzalloc(&pdev
->dev
, sizeof(*d
), GFP_KERNEL
);
492 d
->base
= of_iomap(np
, 0);
494 return -EADDRNOTAVAIL
;
496 mxs_pinctrl_desc
.pins
= d
->soc
->pins
;
497 mxs_pinctrl_desc
.npins
= d
->soc
->npins
;
498 mxs_pinctrl_desc
.name
= dev_name(&pdev
->dev
);
500 platform_set_drvdata(pdev
, d
);
502 ret
= mxs_pinctrl_probe_dt(pdev
, d
);
504 dev_err(&pdev
->dev
, "dt probe failed: %d\n", ret
);
508 d
->pctl
= pinctrl_register(&mxs_pinctrl_desc
, &pdev
->dev
, d
);
510 dev_err(&pdev
->dev
, "Couldn't register MXS pinctrl driver\n");
518 platform_set_drvdata(pdev
, NULL
);
522 EXPORT_SYMBOL_GPL(mxs_pinctrl_probe
);
524 int mxs_pinctrl_remove(struct platform_device
*pdev
)
526 struct mxs_pinctrl_data
*d
= platform_get_drvdata(pdev
);
528 platform_set_drvdata(pdev
, NULL
);
529 pinctrl_unregister(d
->pctl
);
534 EXPORT_SYMBOL_GPL(mxs_pinctrl_remove
);