xref: /linux/drivers/pinctrl/mvebu/pinctrl-mvebu.c (revision c6bd5bcc4983f1a2d2f87a3769bf309482ee8c04)
1 /*
2  * Marvell MVEBU pinctrl core driver
3  *
4  * Authors: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
5  *          Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  */
12 
13 #include <linux/platform_device.h>
14 #include <linux/module.h>
15 #include <linux/slab.h>
16 #include <linux/io.h>
17 #include <linux/of.h>
18 #include <linux/of_address.h>
19 #include <linux/of_platform.h>
20 #include <linux/err.h>
21 #include <linux/gpio.h>
22 #include <linux/pinctrl/machine.h>
23 #include <linux/pinctrl/pinconf.h>
24 #include <linux/pinctrl/pinctrl.h>
25 #include <linux/pinctrl/pinmux.h>
26 
27 #include "pinctrl-mvebu.h"
28 
29 #define MPPS_PER_REG	8
30 #define MPP_BITS	4
31 #define MPP_MASK	0xf
32 
33 struct mvebu_pinctrl_function {
34 	const char *name;
35 	const char **groups;
36 	unsigned num_groups;
37 };
38 
39 struct mvebu_pinctrl_group {
40 	const char *name;
41 	struct mvebu_mpp_ctrl *ctrl;
42 	struct mvebu_mpp_ctrl_setting *settings;
43 	unsigned num_settings;
44 	unsigned gid;
45 	unsigned *pins;
46 	unsigned npins;
47 };
48 
49 struct mvebu_pinctrl {
50 	struct device *dev;
51 	struct pinctrl_dev *pctldev;
52 	struct pinctrl_desc desc;
53 	void __iomem *base;
54 	struct mvebu_pinctrl_group *groups;
55 	unsigned num_groups;
56 	struct mvebu_pinctrl_function *functions;
57 	unsigned num_functions;
58 	u8 variant;
59 };
60 
61 static struct mvebu_pinctrl_group *mvebu_pinctrl_find_group_by_pid(
62 	struct mvebu_pinctrl *pctl, unsigned pid)
63 {
64 	unsigned n;
65 	for (n = 0; n < pctl->num_groups; n++) {
66 		if (pid >= pctl->groups[n].pins[0] &&
67 		    pid < pctl->groups[n].pins[0] +
68 			pctl->groups[n].npins)
69 			return &pctl->groups[n];
70 	}
71 	return NULL;
72 }
73 
74 static struct mvebu_pinctrl_group *mvebu_pinctrl_find_group_by_name(
75 	struct mvebu_pinctrl *pctl, const char *name)
76 {
77 	unsigned n;
78 	for (n = 0; n < pctl->num_groups; n++) {
79 		if (strcmp(name, pctl->groups[n].name) == 0)
80 			return &pctl->groups[n];
81 	}
82 	return NULL;
83 }
84 
85 static struct mvebu_mpp_ctrl_setting *mvebu_pinctrl_find_setting_by_val(
86 	struct mvebu_pinctrl *pctl, struct mvebu_pinctrl_group *grp,
87 	unsigned long config)
88 {
89 	unsigned n;
90 	for (n = 0; n < grp->num_settings; n++) {
91 		if (config == grp->settings[n].val) {
92 			if (!pctl->variant || (pctl->variant &
93 					       grp->settings[n].variant))
94 				return &grp->settings[n];
95 		}
96 	}
97 	return NULL;
98 }
99 
100 static struct mvebu_mpp_ctrl_setting *mvebu_pinctrl_find_setting_by_name(
101 	struct mvebu_pinctrl *pctl, struct mvebu_pinctrl_group *grp,
102 	const char *name)
103 {
104 	unsigned n;
105 	for (n = 0; n < grp->num_settings; n++) {
106 		if (strcmp(name, grp->settings[n].name) == 0) {
107 			if (!pctl->variant || (pctl->variant &
108 					       grp->settings[n].variant))
109 				return &grp->settings[n];
110 		}
111 	}
112 	return NULL;
113 }
114 
115 static struct mvebu_mpp_ctrl_setting *mvebu_pinctrl_find_gpio_setting(
116 	struct mvebu_pinctrl *pctl, struct mvebu_pinctrl_group *grp)
117 {
118 	unsigned n;
119 	for (n = 0; n < grp->num_settings; n++) {
120 		if (grp->settings[n].flags &
121 			(MVEBU_SETTING_GPO | MVEBU_SETTING_GPI)) {
122 			if (!pctl->variant || (pctl->variant &
123 						grp->settings[n].variant))
124 				return &grp->settings[n];
125 		}
126 	}
127 	return NULL;
128 }
129 
130 static struct mvebu_pinctrl_function *mvebu_pinctrl_find_function_by_name(
131 	struct mvebu_pinctrl *pctl, const char *name)
132 {
133 	unsigned n;
134 	for (n = 0; n < pctl->num_functions; n++) {
135 		if (strcmp(name, pctl->functions[n].name) == 0)
136 			return &pctl->functions[n];
137 	}
138 	return NULL;
139 }
140 
141 /*
142  * Common mpp pin configuration registers on MVEBU are
143  * registers of eight 4-bit values for each mpp setting.
144  * Register offset and bit mask are calculated accordingly below.
145  */
146 static int mvebu_common_mpp_get(struct mvebu_pinctrl *pctl,
147 				struct mvebu_pinctrl_group *grp,
148 				unsigned long *config)
149 {
150 	unsigned pin = grp->gid;
151 	unsigned off = (pin / MPPS_PER_REG) * MPP_BITS;
152 	unsigned shift = (pin % MPPS_PER_REG) * MPP_BITS;
153 
154 	*config = readl(pctl->base + off);
155 	*config >>= shift;
156 	*config &= MPP_MASK;
157 
158 	return 0;
159 }
160 
161 static int mvebu_common_mpp_set(struct mvebu_pinctrl *pctl,
162 				struct mvebu_pinctrl_group *grp,
163 				unsigned long config)
164 {
165 	unsigned pin = grp->gid;
166 	unsigned off = (pin / MPPS_PER_REG) * MPP_BITS;
167 	unsigned shift = (pin % MPPS_PER_REG) * MPP_BITS;
168 	unsigned long reg;
169 
170 	reg = readl(pctl->base + off);
171 	reg &= ~(MPP_MASK << shift);
172 	reg |= (config << shift);
173 	writel(reg, pctl->base + off);
174 
175 	return 0;
176 }
177 
178 static int mvebu_pinconf_group_get(struct pinctrl_dev *pctldev,
179 				unsigned gid, unsigned long *config)
180 {
181 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
182 	struct mvebu_pinctrl_group *grp = &pctl->groups[gid];
183 
184 	if (!grp->ctrl)
185 		return -EINVAL;
186 
187 	if (grp->ctrl->mpp_get)
188 		return grp->ctrl->mpp_get(grp->ctrl, config);
189 
190 	return mvebu_common_mpp_get(pctl, grp, config);
191 }
192 
193 static int mvebu_pinconf_group_set(struct pinctrl_dev *pctldev,
194 				unsigned gid, unsigned long config)
195 {
196 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
197 	struct mvebu_pinctrl_group *grp = &pctl->groups[gid];
198 
199 	if (!grp->ctrl)
200 		return -EINVAL;
201 
202 	if (grp->ctrl->mpp_set)
203 		return grp->ctrl->mpp_set(grp->ctrl, config);
204 
205 	return mvebu_common_mpp_set(pctl, grp, config);
206 }
207 
208 static void mvebu_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
209 					struct seq_file *s, unsigned gid)
210 {
211 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
212 	struct mvebu_pinctrl_group *grp = &pctl->groups[gid];
213 	struct mvebu_mpp_ctrl_setting *curr;
214 	unsigned long config;
215 	unsigned n;
216 
217 	if (mvebu_pinconf_group_get(pctldev, gid, &config))
218 		return;
219 
220 	curr = mvebu_pinctrl_find_setting_by_val(pctl, grp, config);
221 
222 	if (curr) {
223 		seq_printf(s, "current: %s", curr->name);
224 		if (curr->subname)
225 			seq_printf(s, "(%s)", curr->subname);
226 		if (curr->flags & (MVEBU_SETTING_GPO | MVEBU_SETTING_GPI)) {
227 			seq_printf(s, "(");
228 			if (curr->flags & MVEBU_SETTING_GPI)
229 				seq_printf(s, "i");
230 			if (curr->flags & MVEBU_SETTING_GPO)
231 				seq_printf(s, "o");
232 			seq_printf(s, ")");
233 		}
234 	} else
235 		seq_printf(s, "current: UNKNOWN");
236 
237 	if (grp->num_settings > 1) {
238 		seq_printf(s, ", available = [");
239 		for (n = 0; n < grp->num_settings; n++) {
240 			if (curr == &grp->settings[n])
241 				continue;
242 
243 			/* skip unsupported settings for this variant */
244 			if (pctl->variant &&
245 			    !(pctl->variant & grp->settings[n].variant))
246 				continue;
247 
248 			seq_printf(s, " %s", grp->settings[n].name);
249 			if (grp->settings[n].subname)
250 				seq_printf(s, "(%s)", grp->settings[n].subname);
251 			if (grp->settings[n].flags &
252 				(MVEBU_SETTING_GPO | MVEBU_SETTING_GPI)) {
253 				seq_printf(s, "(");
254 				if (grp->settings[n].flags & MVEBU_SETTING_GPI)
255 					seq_printf(s, "i");
256 				if (grp->settings[n].flags & MVEBU_SETTING_GPO)
257 					seq_printf(s, "o");
258 				seq_printf(s, ")");
259 			}
260 		}
261 		seq_printf(s, " ]");
262 	}
263 	return;
264 }
265 
266 static struct pinconf_ops mvebu_pinconf_ops = {
267 	.pin_config_group_get = mvebu_pinconf_group_get,
268 	.pin_config_group_set = mvebu_pinconf_group_set,
269 	.pin_config_group_dbg_show = mvebu_pinconf_group_dbg_show,
270 };
271 
272 static int mvebu_pinmux_get_funcs_count(struct pinctrl_dev *pctldev)
273 {
274 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
275 
276 	return pctl->num_functions;
277 }
278 
279 static const char *mvebu_pinmux_get_func_name(struct pinctrl_dev *pctldev,
280 					unsigned fid)
281 {
282 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
283 
284 	return pctl->functions[fid].name;
285 }
286 
287 static int mvebu_pinmux_get_groups(struct pinctrl_dev *pctldev, unsigned fid,
288 				const char * const **groups,
289 				unsigned * const num_groups)
290 {
291 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
292 
293 	*groups = pctl->functions[fid].groups;
294 	*num_groups = pctl->functions[fid].num_groups;
295 	return 0;
296 }
297 
298 static int mvebu_pinmux_enable(struct pinctrl_dev *pctldev, unsigned fid,
299 			unsigned gid)
300 {
301 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
302 	struct mvebu_pinctrl_function *func = &pctl->functions[fid];
303 	struct mvebu_pinctrl_group *grp = &pctl->groups[gid];
304 	struct mvebu_mpp_ctrl_setting *setting;
305 	int ret;
306 
307 	setting = mvebu_pinctrl_find_setting_by_name(pctl, grp,
308 						     func->name);
309 	if (!setting) {
310 		dev_err(pctl->dev,
311 			"unable to find setting %s in group %s\n",
312 			func->name, func->groups[gid]);
313 		return -EINVAL;
314 	}
315 
316 	ret = mvebu_pinconf_group_set(pctldev, grp->gid, setting->val);
317 	if (ret) {
318 		dev_err(pctl->dev, "cannot set group %s to %s\n",
319 			func->groups[gid], func->name);
320 		return ret;
321 	}
322 
323 	return 0;
324 }
325 
326 static int mvebu_pinmux_gpio_request_enable(struct pinctrl_dev *pctldev,
327 			struct pinctrl_gpio_range *range, unsigned offset)
328 {
329 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
330 	struct mvebu_pinctrl_group *grp;
331 	struct mvebu_mpp_ctrl_setting *setting;
332 
333 	grp = mvebu_pinctrl_find_group_by_pid(pctl, offset);
334 	if (!grp)
335 		return -EINVAL;
336 
337 	if (grp->ctrl->mpp_gpio_req)
338 		return grp->ctrl->mpp_gpio_req(grp->ctrl, offset);
339 
340 	setting = mvebu_pinctrl_find_gpio_setting(pctl, grp);
341 	if (!setting)
342 		return -ENOTSUPP;
343 
344 	return mvebu_pinconf_group_set(pctldev, grp->gid, setting->val);
345 }
346 
347 static int mvebu_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,
348 	   struct pinctrl_gpio_range *range, unsigned offset, bool input)
349 {
350 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
351 	struct mvebu_pinctrl_group *grp;
352 	struct mvebu_mpp_ctrl_setting *setting;
353 
354 	grp = mvebu_pinctrl_find_group_by_pid(pctl, offset);
355 	if (!grp)
356 		return -EINVAL;
357 
358 	if (grp->ctrl->mpp_gpio_dir)
359 		return grp->ctrl->mpp_gpio_dir(grp->ctrl, offset, input);
360 
361 	setting = mvebu_pinctrl_find_gpio_setting(pctl, grp);
362 	if (!setting)
363 		return -ENOTSUPP;
364 
365 	if ((input && (setting->flags & MVEBU_SETTING_GPI)) ||
366 	    (!input && (setting->flags & MVEBU_SETTING_GPO)))
367 		return 0;
368 
369 	return -ENOTSUPP;
370 }
371 
372 static struct pinmux_ops mvebu_pinmux_ops = {
373 	.get_functions_count = mvebu_pinmux_get_funcs_count,
374 	.get_function_name = mvebu_pinmux_get_func_name,
375 	.get_function_groups = mvebu_pinmux_get_groups,
376 	.gpio_request_enable = mvebu_pinmux_gpio_request_enable,
377 	.gpio_set_direction = mvebu_pinmux_gpio_set_direction,
378 	.enable = mvebu_pinmux_enable,
379 };
380 
381 static int mvebu_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
382 {
383 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
384 	return pctl->num_groups;
385 }
386 
387 static const char *mvebu_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
388 						unsigned gid)
389 {
390 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
391 	return pctl->groups[gid].name;
392 }
393 
394 static int mvebu_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
395 					unsigned gid, const unsigned **pins,
396 					unsigned *num_pins)
397 {
398 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
399 	*pins = pctl->groups[gid].pins;
400 	*num_pins = pctl->groups[gid].npins;
401 	return 0;
402 }
403 
404 static int mvebu_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
405 					struct device_node *np,
406 					struct pinctrl_map **map,
407 					unsigned *num_maps)
408 {
409 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
410 	struct property *prop;
411 	const char *function;
412 	const char *group;
413 	int ret, nmaps, n;
414 
415 	*map = NULL;
416 	*num_maps = 0;
417 
418 	ret = of_property_read_string(np, "marvell,function", &function);
419 	if (ret) {
420 		dev_err(pctl->dev,
421 			"missing marvell,function in node %s\n", np->name);
422 		return 0;
423 	}
424 
425 	nmaps = of_property_count_strings(np, "marvell,pins");
426 	if (nmaps < 0) {
427 		dev_err(pctl->dev,
428 			"missing marvell,pins in node %s\n", np->name);
429 		return 0;
430 	}
431 
432 	*map = kmalloc(nmaps * sizeof(struct pinctrl_map), GFP_KERNEL);
433 	if (map == NULL) {
434 		dev_err(pctl->dev,
435 			"cannot allocate pinctrl_map memory for %s\n",
436 			np->name);
437 		return -ENOMEM;
438 	}
439 
440 	n = 0;
441 	of_property_for_each_string(np, "marvell,pins", prop, group) {
442 		struct mvebu_pinctrl_group *grp =
443 			mvebu_pinctrl_find_group_by_name(pctl, group);
444 
445 		if (!grp) {
446 			dev_err(pctl->dev, "unknown pin %s", group);
447 			continue;
448 		}
449 
450 		if (!mvebu_pinctrl_find_setting_by_name(pctl, grp, function)) {
451 			dev_err(pctl->dev, "unsupported function %s on pin %s",
452 				function, group);
453 			continue;
454 		}
455 
456 		(*map)[n].type = PIN_MAP_TYPE_MUX_GROUP;
457 		(*map)[n].data.mux.group = group;
458 		(*map)[n].data.mux.function = function;
459 		n++;
460 	}
461 
462 	*num_maps = nmaps;
463 
464 	return 0;
465 }
466 
467 static void mvebu_pinctrl_dt_free_map(struct pinctrl_dev *pctldev,
468 				struct pinctrl_map *map, unsigned num_maps)
469 {
470 	kfree(map);
471 }
472 
473 static struct pinctrl_ops mvebu_pinctrl_ops = {
474 	.get_groups_count = mvebu_pinctrl_get_groups_count,
475 	.get_group_name = mvebu_pinctrl_get_group_name,
476 	.get_group_pins = mvebu_pinctrl_get_group_pins,
477 	.dt_node_to_map = mvebu_pinctrl_dt_node_to_map,
478 	.dt_free_map = mvebu_pinctrl_dt_free_map,
479 };
480 
481 static int __devinit _add_function(struct mvebu_pinctrl_function *funcs,
482 				   const char *name)
483 {
484 	while (funcs->num_groups) {
485 		/* function already there */
486 		if (strcmp(funcs->name, name) == 0) {
487 			funcs->num_groups++;
488 			return -EEXIST;
489 		}
490 		funcs++;
491 	}
492 	funcs->name = name;
493 	funcs->num_groups = 1;
494 	return 0;
495 }
496 
497 static int __devinit mvebu_pinctrl_build_functions(struct platform_device *pdev,
498 						   struct mvebu_pinctrl *pctl)
499 {
500 	struct mvebu_pinctrl_function *funcs;
501 	int num = 0;
502 	int n, s;
503 
504 	/* we allocate functions for number of pins and hope
505 	 * there are less unique functions than pins available */
506 	funcs = devm_kzalloc(&pdev->dev, pctl->desc.npins *
507 			     sizeof(struct mvebu_pinctrl_function), GFP_KERNEL);
508 	if (!funcs)
509 		return -ENOMEM;
510 
511 	for (n = 0; n < pctl->num_groups; n++) {
512 		struct mvebu_pinctrl_group *grp = &pctl->groups[n];
513 		for (s = 0; s < grp->num_settings; s++) {
514 			/* skip unsupported settings on this variant */
515 			if (pctl->variant &&
516 			    !(pctl->variant & grp->settings[s].variant))
517 				continue;
518 
519 			/* check for unique functions and count groups */
520 			if (_add_function(funcs, grp->settings[s].name))
521 				continue;
522 
523 			num++;
524 		}
525 	}
526 
527 	/* with the number of unique functions and it's groups known,
528 	   reallocate functions and assign group names */
529 	funcs = krealloc(funcs, num * sizeof(struct mvebu_pinctrl_function),
530 			 GFP_KERNEL);
531 	if (!funcs)
532 		return -ENOMEM;
533 
534 	pctl->num_functions = num;
535 	pctl->functions = funcs;
536 
537 	for (n = 0; n < pctl->num_groups; n++) {
538 		struct mvebu_pinctrl_group *grp = &pctl->groups[n];
539 		for (s = 0; s < grp->num_settings; s++) {
540 			struct mvebu_pinctrl_function *f;
541 			const char **groups;
542 
543 			/* skip unsupported settings on this variant */
544 			if (pctl->variant &&
545 			    !(pctl->variant & grp->settings[s].variant))
546 				continue;
547 
548 			f = mvebu_pinctrl_find_function_by_name(pctl,
549 							grp->settings[s].name);
550 
551 			/* allocate group name array if not done already */
552 			if (!f->groups) {
553 				f->groups = devm_kzalloc(&pdev->dev,
554 						 f->num_groups * sizeof(char *),
555 						 GFP_KERNEL);
556 				if (!f->groups)
557 					return -ENOMEM;
558 			}
559 
560 			/* find next free group name and assign current name */
561 			groups = f->groups;
562 			while (*groups)
563 				groups++;
564 			*groups = grp->name;
565 		}
566 	}
567 
568 	return 0;
569 }
570 
571 int __devinit mvebu_pinctrl_probe(struct platform_device *pdev)
572 {
573 	struct mvebu_pinctrl_soc_info *soc = dev_get_platdata(&pdev->dev);
574 	struct device_node *np = pdev->dev.of_node;
575 	struct mvebu_pinctrl *pctl;
576 	void __iomem *base;
577 	struct pinctrl_pin_desc *pdesc;
578 	unsigned gid, n, k;
579 	int ret;
580 
581 	if (!soc || !soc->controls || !soc->modes) {
582 		dev_err(&pdev->dev, "wrong pinctrl soc info\n");
583 		return -EINVAL;
584 	}
585 
586 	base = of_iomap(np, 0);
587 	if (!base) {
588 		dev_err(&pdev->dev, "unable to get base address\n");
589 		return -ENODEV;
590 	}
591 
592 	pctl = devm_kzalloc(&pdev->dev, sizeof(struct mvebu_pinctrl),
593 			GFP_KERNEL);
594 	if (!pctl) {
595 		dev_err(&pdev->dev, "unable to alloc driver\n");
596 		return -ENOMEM;
597 	}
598 
599 	pctl->desc.name = dev_name(&pdev->dev);
600 	pctl->desc.owner = THIS_MODULE;
601 	pctl->desc.pctlops = &mvebu_pinctrl_ops;
602 	pctl->desc.pmxops = &mvebu_pinmux_ops;
603 	pctl->desc.confops = &mvebu_pinconf_ops;
604 	pctl->variant = soc->variant;
605 	pctl->base = base;
606 	pctl->dev = &pdev->dev;
607 	platform_set_drvdata(pdev, pctl);
608 
609 	/* count controls and create names for mvebu generic
610 	   register controls; also does sanity checks */
611 	pctl->num_groups = 0;
612 	pctl->desc.npins = 0;
613 	for (n = 0; n < soc->ncontrols; n++) {
614 		struct mvebu_mpp_ctrl *ctrl = &soc->controls[n];
615 		char *names;
616 
617 		pctl->desc.npins += ctrl->npins;
618 		/* initial control pins */
619 		for (k = 0; k < ctrl->npins; k++)
620 			ctrl->pins[k] = ctrl->pid + k;
621 
622 		/* special soc specific control */
623 		if (ctrl->mpp_get || ctrl->mpp_set) {
624 			if (!ctrl->name || !ctrl->mpp_set || !ctrl->mpp_set) {
625 				dev_err(&pdev->dev, "wrong soc control info\n");
626 				return -EINVAL;
627 			}
628 			pctl->num_groups += 1;
629 			continue;
630 		}
631 
632 		/* generic mvebu register control */
633 		names = devm_kzalloc(&pdev->dev, ctrl->npins * 8, GFP_KERNEL);
634 		if (!names) {
635 			dev_err(&pdev->dev, "failed to alloc mpp names\n");
636 			return -ENOMEM;
637 		}
638 		for (k = 0; k < ctrl->npins; k++)
639 			sprintf(names + 8*k, "mpp%d", ctrl->pid+k);
640 		ctrl->name = names;
641 		pctl->num_groups += ctrl->npins;
642 	}
643 
644 	pdesc = devm_kzalloc(&pdev->dev, pctl->desc.npins *
645 			     sizeof(struct pinctrl_pin_desc), GFP_KERNEL);
646 	if (!pdesc) {
647 		dev_err(&pdev->dev, "failed to alloc pinctrl pins\n");
648 		return -ENOMEM;
649 	}
650 
651 	for (n = 0; n < pctl->desc.npins; n++)
652 		pdesc[n].number = n;
653 	pctl->desc.pins = pdesc;
654 
655 	pctl->groups = devm_kzalloc(&pdev->dev, pctl->num_groups *
656 			     sizeof(struct mvebu_pinctrl_group), GFP_KERNEL);
657 	if (!pctl->groups) {
658 		dev_err(&pdev->dev, "failed to alloc pinctrl groups\n");
659 		return -ENOMEM;
660 	}
661 
662 	/* assign mpp controls to groups */
663 	gid = 0;
664 	for (n = 0; n < soc->ncontrols; n++) {
665 		struct mvebu_mpp_ctrl *ctrl = &soc->controls[n];
666 		pctl->groups[gid].gid = gid;
667 		pctl->groups[gid].ctrl = ctrl;
668 		pctl->groups[gid].name = ctrl->name;
669 		pctl->groups[gid].pins = ctrl->pins;
670 		pctl->groups[gid].npins = ctrl->npins;
671 
672 		/* generic mvebu register control maps to a number of groups */
673 		if (!ctrl->mpp_get && !ctrl->mpp_set) {
674 			pctl->groups[gid].npins = 1;
675 
676 			for (k = 1; k < ctrl->npins; k++) {
677 				gid++;
678 				pctl->groups[gid].gid = gid;
679 				pctl->groups[gid].ctrl = ctrl;
680 				pctl->groups[gid].name = &ctrl->name[8*k];
681 				pctl->groups[gid].pins = &ctrl->pins[k];
682 				pctl->groups[gid].npins = 1;
683 			}
684 		}
685 		gid++;
686 	}
687 
688 	/* assign mpp modes to groups */
689 	for (n = 0; n < soc->nmodes; n++) {
690 		struct mvebu_mpp_mode *mode = &soc->modes[n];
691 		struct mvebu_pinctrl_group *grp =
692 			mvebu_pinctrl_find_group_by_pid(pctl, mode->pid);
693 		unsigned num_settings;
694 
695 		if (!grp) {
696 			dev_warn(&pdev->dev, "unknown pinctrl group %d\n",
697 				mode->pid);
698 			continue;
699 		}
700 
701 		for (num_settings = 0; ;) {
702 			struct mvebu_mpp_ctrl_setting *set =
703 				&mode->settings[num_settings];
704 
705 			if (!set->name)
706 				break;
707 			num_settings++;
708 
709 			/* skip unsupported settings for this variant */
710 			if (pctl->variant && !(pctl->variant & set->variant))
711 				continue;
712 
713 			/* find gpio/gpo/gpi settings */
714 			if (strcmp(set->name, "gpio") == 0)
715 				set->flags = MVEBU_SETTING_GPI |
716 					MVEBU_SETTING_GPO;
717 			else if (strcmp(set->name, "gpo") == 0)
718 				set->flags = MVEBU_SETTING_GPO;
719 			else if (strcmp(set->name, "gpi") == 0)
720 				set->flags = MVEBU_SETTING_GPI;
721 		}
722 
723 		grp->settings = mode->settings;
724 		grp->num_settings = num_settings;
725 	}
726 
727 	ret = mvebu_pinctrl_build_functions(pdev, pctl);
728 	if (ret) {
729 		dev_err(&pdev->dev, "unable to build functions\n");
730 		return ret;
731 	}
732 
733 	pctl->pctldev = pinctrl_register(&pctl->desc, &pdev->dev, pctl);
734 	if (!pctl->pctldev) {
735 		dev_err(&pdev->dev, "unable to register pinctrl driver\n");
736 		return -EINVAL;
737 	}
738 
739 	dev_info(&pdev->dev, "registered pinctrl driver\n");
740 
741 	/* register gpio ranges */
742 	for (n = 0; n < soc->ngpioranges; n++)
743 		pinctrl_add_gpio_range(pctl->pctldev, &soc->gpioranges[n]);
744 
745 	return 0;
746 }
747 
748 int __devexit mvebu_pinctrl_remove(struct platform_device *pdev)
749 {
750 	struct mvebu_pinctrl *pctl = platform_get_drvdata(pdev);
751 	pinctrl_unregister(pctl->pctldev);
752 	return 0;
753 }
754