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/slab.h>
15 #include <linux/io.h>
16 #include <linux/of.h>
17 #include <linux/of_address.h>
18 #include <linux/of_platform.h>
19 #include <linux/err.h>
20 #include <linux/gpio.h>
21 #include <linux/pinctrl/machine.h>
22 #include <linux/pinctrl/pinconf.h>
23 #include <linux/pinctrl/pinctrl.h>
24 #include <linux/pinctrl/pinmux.h>
25 #include <linux/mfd/syscon.h>
26 #include <linux/regmap.h>
27 
28 #include "pinctrl-mvebu.h"
29 
30 #define MPPS_PER_REG	8
31 #define MPP_BITS	4
32 #define MPP_MASK	0xf
33 
34 struct mvebu_pinctrl_function {
35 	const char *name;
36 	const char **groups;
37 	unsigned num_groups;
38 };
39 
40 struct mvebu_pinctrl_group {
41 	const char *name;
42 	const struct mvebu_mpp_ctrl *ctrl;
43 	struct mvebu_mpp_ctrl_data *data;
44 	struct mvebu_mpp_ctrl_setting *settings;
45 	unsigned num_settings;
46 	unsigned gid;
47 	unsigned *pins;
48 	unsigned npins;
49 };
50 
51 struct mvebu_pinctrl {
52 	struct device *dev;
53 	struct pinctrl_dev *pctldev;
54 	struct pinctrl_desc desc;
55 	struct mvebu_pinctrl_group *groups;
56 	unsigned num_groups;
57 	struct mvebu_pinctrl_function *functions;
58 	unsigned num_functions;
59 	u8 variant;
60 };
61 
62 int mvebu_mmio_mpp_ctrl_get(struct mvebu_mpp_ctrl_data *data,
63 			     unsigned int pid, unsigned long *config)
64 {
65 	unsigned off = (pid / MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS;
66 	unsigned shift = (pid % MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS;
67 
68 	*config = (readl(data->base + off) >> shift) & MVEBU_MPP_MASK;
69 
70 	return 0;
71 }
72 
73 int mvebu_mmio_mpp_ctrl_set(struct mvebu_mpp_ctrl_data *data,
74 			     unsigned int pid, unsigned long config)
75 {
76 	unsigned off = (pid / MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS;
77 	unsigned shift = (pid % MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS;
78 	unsigned long reg;
79 
80 	reg = readl(data->base + off) & ~(MVEBU_MPP_MASK << shift);
81 	writel(reg | (config << shift), data->base + off);
82 
83 	return 0;
84 }
85 
86 static struct mvebu_pinctrl_group *mvebu_pinctrl_find_group_by_pid(
87 	struct mvebu_pinctrl *pctl, unsigned pid)
88 {
89 	unsigned n;
90 	for (n = 0; n < pctl->num_groups; n++) {
91 		if (pid >= pctl->groups[n].pins[0] &&
92 		    pid < pctl->groups[n].pins[0] +
93 			pctl->groups[n].npins)
94 			return &pctl->groups[n];
95 	}
96 	return NULL;
97 }
98 
99 static struct mvebu_pinctrl_group *mvebu_pinctrl_find_group_by_name(
100 	struct mvebu_pinctrl *pctl, const char *name)
101 {
102 	unsigned n;
103 	for (n = 0; n < pctl->num_groups; n++) {
104 		if (strcmp(name, pctl->groups[n].name) == 0)
105 			return &pctl->groups[n];
106 	}
107 	return NULL;
108 }
109 
110 static struct mvebu_mpp_ctrl_setting *mvebu_pinctrl_find_setting_by_val(
111 	struct mvebu_pinctrl *pctl, struct mvebu_pinctrl_group *grp,
112 	unsigned long config)
113 {
114 	unsigned n;
115 	for (n = 0; n < grp->num_settings; n++) {
116 		if (config == grp->settings[n].val) {
117 			if (!pctl->variant || (pctl->variant &
118 					       grp->settings[n].variant))
119 				return &grp->settings[n];
120 		}
121 	}
122 	return NULL;
123 }
124 
125 static struct mvebu_mpp_ctrl_setting *mvebu_pinctrl_find_setting_by_name(
126 	struct mvebu_pinctrl *pctl, struct mvebu_pinctrl_group *grp,
127 	const char *name)
128 {
129 	unsigned n;
130 	for (n = 0; n < grp->num_settings; n++) {
131 		if (strcmp(name, grp->settings[n].name) == 0) {
132 			if (!pctl->variant || (pctl->variant &
133 					       grp->settings[n].variant))
134 				return &grp->settings[n];
135 		}
136 	}
137 	return NULL;
138 }
139 
140 static struct mvebu_mpp_ctrl_setting *mvebu_pinctrl_find_gpio_setting(
141 	struct mvebu_pinctrl *pctl, struct mvebu_pinctrl_group *grp)
142 {
143 	unsigned n;
144 	for (n = 0; n < grp->num_settings; n++) {
145 		if (grp->settings[n].flags &
146 			(MVEBU_SETTING_GPO | MVEBU_SETTING_GPI)) {
147 			if (!pctl->variant || (pctl->variant &
148 						grp->settings[n].variant))
149 				return &grp->settings[n];
150 		}
151 	}
152 	return NULL;
153 }
154 
155 static struct mvebu_pinctrl_function *mvebu_pinctrl_find_function_by_name(
156 	struct mvebu_pinctrl *pctl, const char *name)
157 {
158 	unsigned n;
159 	for (n = 0; n < pctl->num_functions; n++) {
160 		if (strcmp(name, pctl->functions[n].name) == 0)
161 			return &pctl->functions[n];
162 	}
163 	return NULL;
164 }
165 
166 static int mvebu_pinconf_group_get(struct pinctrl_dev *pctldev,
167 				unsigned gid, unsigned long *config)
168 {
169 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
170 	struct mvebu_pinctrl_group *grp = &pctl->groups[gid];
171 
172 	if (!grp->ctrl)
173 		return -EINVAL;
174 
175 	return grp->ctrl->mpp_get(grp->data, grp->pins[0], config);
176 }
177 
178 static int mvebu_pinconf_group_set(struct pinctrl_dev *pctldev,
179 				unsigned gid, unsigned long *configs,
180 				unsigned num_configs)
181 {
182 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
183 	struct mvebu_pinctrl_group *grp = &pctl->groups[gid];
184 	int i, ret;
185 
186 	if (!grp->ctrl)
187 		return -EINVAL;
188 
189 	for (i = 0; i < num_configs; i++) {
190 		ret = grp->ctrl->mpp_set(grp->data, grp->pins[0], configs[i]);
191 		if (ret)
192 			return ret;
193 	} /* for each config */
194 
195 	return 0;
196 }
197 
198 static void mvebu_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
199 					struct seq_file *s, unsigned gid)
200 {
201 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
202 	struct mvebu_pinctrl_group *grp = &pctl->groups[gid];
203 	struct mvebu_mpp_ctrl_setting *curr;
204 	unsigned long config;
205 	unsigned n;
206 
207 	if (mvebu_pinconf_group_get(pctldev, gid, &config))
208 		return;
209 
210 	curr = mvebu_pinctrl_find_setting_by_val(pctl, grp, config);
211 
212 	if (curr) {
213 		seq_printf(s, "current: %s", curr->name);
214 		if (curr->subname)
215 			seq_printf(s, "(%s)", curr->subname);
216 		if (curr->flags & (MVEBU_SETTING_GPO | MVEBU_SETTING_GPI)) {
217 			seq_putc(s, '(');
218 			if (curr->flags & MVEBU_SETTING_GPI)
219 				seq_putc(s, 'i');
220 			if (curr->flags & MVEBU_SETTING_GPO)
221 				seq_putc(s, 'o');
222 			seq_putc(s, ')');
223 		}
224 	} else {
225 		seq_puts(s, "current: UNKNOWN");
226 	}
227 
228 	if (grp->num_settings > 1) {
229 		seq_puts(s, ", available = [");
230 		for (n = 0; n < grp->num_settings; n++) {
231 			if (curr == &grp->settings[n])
232 				continue;
233 
234 			/* skip unsupported settings for this variant */
235 			if (pctl->variant &&
236 			    !(pctl->variant & grp->settings[n].variant))
237 				continue;
238 
239 			seq_printf(s, " %s", grp->settings[n].name);
240 			if (grp->settings[n].subname)
241 				seq_printf(s, "(%s)", grp->settings[n].subname);
242 			if (grp->settings[n].flags &
243 				(MVEBU_SETTING_GPO | MVEBU_SETTING_GPI)) {
244 				seq_putc(s, '(');
245 				if (grp->settings[n].flags & MVEBU_SETTING_GPI)
246 					seq_putc(s, 'i');
247 				if (grp->settings[n].flags & MVEBU_SETTING_GPO)
248 					seq_putc(s, 'o');
249 				seq_putc(s, ')');
250 			}
251 		}
252 		seq_puts(s, " ]");
253 	}
254 }
255 
256 static const struct pinconf_ops mvebu_pinconf_ops = {
257 	.pin_config_group_get = mvebu_pinconf_group_get,
258 	.pin_config_group_set = mvebu_pinconf_group_set,
259 	.pin_config_group_dbg_show = mvebu_pinconf_group_dbg_show,
260 };
261 
262 static int mvebu_pinmux_get_funcs_count(struct pinctrl_dev *pctldev)
263 {
264 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
265 
266 	return pctl->num_functions;
267 }
268 
269 static const char *mvebu_pinmux_get_func_name(struct pinctrl_dev *pctldev,
270 					unsigned fid)
271 {
272 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
273 
274 	return pctl->functions[fid].name;
275 }
276 
277 static int mvebu_pinmux_get_groups(struct pinctrl_dev *pctldev, unsigned fid,
278 				const char * const **groups,
279 				unsigned * const num_groups)
280 {
281 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
282 
283 	*groups = pctl->functions[fid].groups;
284 	*num_groups = pctl->functions[fid].num_groups;
285 	return 0;
286 }
287 
288 static int mvebu_pinmux_set(struct pinctrl_dev *pctldev, unsigned fid,
289 			    unsigned gid)
290 {
291 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
292 	struct mvebu_pinctrl_function *func = &pctl->functions[fid];
293 	struct mvebu_pinctrl_group *grp = &pctl->groups[gid];
294 	struct mvebu_mpp_ctrl_setting *setting;
295 	int ret;
296 	unsigned long config;
297 
298 	setting = mvebu_pinctrl_find_setting_by_name(pctl, grp,
299 						     func->name);
300 	if (!setting) {
301 		dev_err(pctl->dev,
302 			"unable to find setting %s in group %s\n",
303 			func->name, func->groups[gid]);
304 		return -EINVAL;
305 	}
306 
307 	config = setting->val;
308 	ret = mvebu_pinconf_group_set(pctldev, grp->gid, &config, 1);
309 	if (ret) {
310 		dev_err(pctl->dev, "cannot set group %s to %s\n",
311 			func->groups[gid], func->name);
312 		return ret;
313 	}
314 
315 	return 0;
316 }
317 
318 static int mvebu_pinmux_gpio_request_enable(struct pinctrl_dev *pctldev,
319 			struct pinctrl_gpio_range *range, unsigned offset)
320 {
321 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
322 	struct mvebu_pinctrl_group *grp;
323 	struct mvebu_mpp_ctrl_setting *setting;
324 	unsigned long config;
325 
326 	grp = mvebu_pinctrl_find_group_by_pid(pctl, offset);
327 	if (!grp)
328 		return -EINVAL;
329 
330 	if (grp->ctrl->mpp_gpio_req)
331 		return grp->ctrl->mpp_gpio_req(grp->data, offset);
332 
333 	setting = mvebu_pinctrl_find_gpio_setting(pctl, grp);
334 	if (!setting)
335 		return -ENOTSUPP;
336 
337 	config = setting->val;
338 
339 	return mvebu_pinconf_group_set(pctldev, grp->gid, &config, 1);
340 }
341 
342 static int mvebu_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,
343 	   struct pinctrl_gpio_range *range, unsigned offset, bool input)
344 {
345 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
346 	struct mvebu_pinctrl_group *grp;
347 	struct mvebu_mpp_ctrl_setting *setting;
348 
349 	grp = mvebu_pinctrl_find_group_by_pid(pctl, offset);
350 	if (!grp)
351 		return -EINVAL;
352 
353 	if (grp->ctrl->mpp_gpio_dir)
354 		return grp->ctrl->mpp_gpio_dir(grp->data, offset, input);
355 
356 	setting = mvebu_pinctrl_find_gpio_setting(pctl, grp);
357 	if (!setting)
358 		return -ENOTSUPP;
359 
360 	if ((input && (setting->flags & MVEBU_SETTING_GPI)) ||
361 	    (!input && (setting->flags & MVEBU_SETTING_GPO)))
362 		return 0;
363 
364 	return -ENOTSUPP;
365 }
366 
367 static const struct pinmux_ops mvebu_pinmux_ops = {
368 	.get_functions_count = mvebu_pinmux_get_funcs_count,
369 	.get_function_name = mvebu_pinmux_get_func_name,
370 	.get_function_groups = mvebu_pinmux_get_groups,
371 	.gpio_request_enable = mvebu_pinmux_gpio_request_enable,
372 	.gpio_set_direction = mvebu_pinmux_gpio_set_direction,
373 	.set_mux = mvebu_pinmux_set,
374 };
375 
376 static int mvebu_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
377 {
378 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
379 	return pctl->num_groups;
380 }
381 
382 static const char *mvebu_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
383 						unsigned gid)
384 {
385 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
386 	return pctl->groups[gid].name;
387 }
388 
389 static int mvebu_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
390 					unsigned gid, const unsigned **pins,
391 					unsigned *num_pins)
392 {
393 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
394 	*pins = pctl->groups[gid].pins;
395 	*num_pins = pctl->groups[gid].npins;
396 	return 0;
397 }
398 
399 static int mvebu_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
400 					struct device_node *np,
401 					struct pinctrl_map **map,
402 					unsigned *num_maps)
403 {
404 	struct mvebu_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
405 	struct property *prop;
406 	const char *function;
407 	const char *group;
408 	int ret, nmaps, n;
409 
410 	*map = NULL;
411 	*num_maps = 0;
412 
413 	ret = of_property_read_string(np, "marvell,function", &function);
414 	if (ret) {
415 		dev_err(pctl->dev,
416 			"missing marvell,function in node %s\n", np->name);
417 		return 0;
418 	}
419 
420 	nmaps = of_property_count_strings(np, "marvell,pins");
421 	if (nmaps < 0) {
422 		dev_err(pctl->dev,
423 			"missing marvell,pins in node %s\n", np->name);
424 		return 0;
425 	}
426 
427 	*map = kmalloc_array(nmaps, sizeof(**map), GFP_KERNEL);
428 	if (!*map)
429 		return -ENOMEM;
430 
431 	n = 0;
432 	of_property_for_each_string(np, "marvell,pins", prop, group) {
433 		struct mvebu_pinctrl_group *grp =
434 			mvebu_pinctrl_find_group_by_name(pctl, group);
435 
436 		if (!grp) {
437 			dev_err(pctl->dev, "unknown pin %s", group);
438 			continue;
439 		}
440 
441 		if (!mvebu_pinctrl_find_setting_by_name(pctl, grp, function)) {
442 			dev_err(pctl->dev, "unsupported function %s on pin %s",
443 				function, group);
444 			continue;
445 		}
446 
447 		(*map)[n].type = PIN_MAP_TYPE_MUX_GROUP;
448 		(*map)[n].data.mux.group = group;
449 		(*map)[n].data.mux.function = function;
450 		n++;
451 	}
452 
453 	*num_maps = nmaps;
454 
455 	return 0;
456 }
457 
458 static void mvebu_pinctrl_dt_free_map(struct pinctrl_dev *pctldev,
459 				struct pinctrl_map *map, unsigned num_maps)
460 {
461 	kfree(map);
462 }
463 
464 static const struct pinctrl_ops mvebu_pinctrl_ops = {
465 	.get_groups_count = mvebu_pinctrl_get_groups_count,
466 	.get_group_name = mvebu_pinctrl_get_group_name,
467 	.get_group_pins = mvebu_pinctrl_get_group_pins,
468 	.dt_node_to_map = mvebu_pinctrl_dt_node_to_map,
469 	.dt_free_map = mvebu_pinctrl_dt_free_map,
470 };
471 
472 static int _add_function(struct mvebu_pinctrl_function *funcs, int *funcsize,
473 			const char *name)
474 {
475 	if (*funcsize <= 0)
476 		return -EOVERFLOW;
477 
478 	while (funcs->num_groups) {
479 		/* function already there */
480 		if (strcmp(funcs->name, name) == 0) {
481 			funcs->num_groups++;
482 			return -EEXIST;
483 		}
484 		funcs++;
485 	}
486 
487 	/* append new unique function */
488 	funcs->name = name;
489 	funcs->num_groups = 1;
490 	(*funcsize)--;
491 
492 	return 0;
493 }
494 
495 static int mvebu_pinctrl_build_functions(struct platform_device *pdev,
496 					 struct mvebu_pinctrl *pctl)
497 {
498 	struct mvebu_pinctrl_function *funcs;
499 	int num = 0, funcsize = pctl->desc.npins;
500 	int n, s;
501 
502 	/* we allocate functions for number of pins and hope
503 	 * there are fewer unique functions than pins available */
504 	funcs = devm_kzalloc(&pdev->dev, funcsize *
505 			     sizeof(struct mvebu_pinctrl_function), GFP_KERNEL);
506 	if (!funcs)
507 		return -ENOMEM;
508 
509 	for (n = 0; n < pctl->num_groups; n++) {
510 		struct mvebu_pinctrl_group *grp = &pctl->groups[n];
511 		for (s = 0; s < grp->num_settings; s++) {
512 			int ret;
513 
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 			ret = _add_function(funcs, &funcsize,
521 					    grp->settings[s].name);
522 			if (ret == -EOVERFLOW)
523 				dev_err(&pdev->dev,
524 					"More functions than pins(%d)\n",
525 					pctl->desc.npins);
526 			if (ret < 0)
527 				continue;
528 
529 			num++;
530 		}
531 	}
532 
533 	pctl->num_functions = num;
534 	pctl->functions = funcs;
535 
536 	for (n = 0; n < pctl->num_groups; n++) {
537 		struct mvebu_pinctrl_group *grp = &pctl->groups[n];
538 		for (s = 0; s < grp->num_settings; s++) {
539 			struct mvebu_pinctrl_function *f;
540 			const char **groups;
541 
542 			/* skip unsupported settings on this variant */
543 			if (pctl->variant &&
544 			    !(pctl->variant & grp->settings[s].variant))
545 				continue;
546 
547 			f = mvebu_pinctrl_find_function_by_name(pctl,
548 							grp->settings[s].name);
549 
550 			/* allocate group name array if not done already */
551 			if (!f->groups) {
552 				f->groups = devm_kzalloc(&pdev->dev,
553 						 f->num_groups * sizeof(char *),
554 						 GFP_KERNEL);
555 				if (!f->groups)
556 					return -ENOMEM;
557 			}
558 
559 			/* find next free group name and assign current name */
560 			groups = f->groups;
561 			while (*groups)
562 				groups++;
563 			*groups = grp->name;
564 		}
565 	}
566 
567 	return 0;
568 }
569 
570 int mvebu_pinctrl_probe(struct platform_device *pdev)
571 {
572 	struct mvebu_pinctrl_soc_info *soc = dev_get_platdata(&pdev->dev);
573 	struct mvebu_pinctrl *pctl;
574 	struct pinctrl_pin_desc *pdesc;
575 	unsigned gid, n, k;
576 	unsigned size, noname = 0;
577 	char *noname_buf;
578 	void *p;
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 	pctl = devm_kzalloc(&pdev->dev, sizeof(struct mvebu_pinctrl),
587 			GFP_KERNEL);
588 	if (!pctl)
589 		return -ENOMEM;
590 
591 	pctl->desc.name = dev_name(&pdev->dev);
592 	pctl->desc.owner = THIS_MODULE;
593 	pctl->desc.pctlops = &mvebu_pinctrl_ops;
594 	pctl->desc.pmxops = &mvebu_pinmux_ops;
595 	pctl->desc.confops = &mvebu_pinconf_ops;
596 	pctl->variant = soc->variant;
597 	pctl->dev = &pdev->dev;
598 	platform_set_drvdata(pdev, pctl);
599 
600 	/* count controls and create names for mvebu generic
601 	   register controls; also does sanity checks */
602 	pctl->num_groups = 0;
603 	pctl->desc.npins = 0;
604 	for (n = 0; n < soc->ncontrols; n++) {
605 		const struct mvebu_mpp_ctrl *ctrl = &soc->controls[n];
606 
607 		pctl->desc.npins += ctrl->npins;
608 		/* initialize control's pins[] array */
609 		for (k = 0; k < ctrl->npins; k++)
610 			ctrl->pins[k] = ctrl->pid + k;
611 
612 		/*
613 		 * We allow to pass controls with NULL name that we treat
614 		 * as a range of one-pin groups with generic mvebu register
615 		 * controls.
616 		 */
617 		if (!ctrl->name) {
618 			pctl->num_groups += ctrl->npins;
619 			noname += ctrl->npins;
620 		} else {
621 			pctl->num_groups += 1;
622 		}
623 	}
624 
625 	pdesc = devm_kzalloc(&pdev->dev, pctl->desc.npins *
626 			     sizeof(struct pinctrl_pin_desc), GFP_KERNEL);
627 	if (!pdesc)
628 		return -ENOMEM;
629 
630 	for (n = 0; n < pctl->desc.npins; n++)
631 		pdesc[n].number = n;
632 	pctl->desc.pins = pdesc;
633 
634 	/*
635 	 * allocate groups and name buffers for unnamed groups.
636 	 */
637 	size = pctl->num_groups * sizeof(*pctl->groups) + noname * 8;
638 	p = devm_kzalloc(&pdev->dev, size, GFP_KERNEL);
639 	if (!p)
640 		return -ENOMEM;
641 
642 	pctl->groups = p;
643 	noname_buf = p + pctl->num_groups * sizeof(*pctl->groups);
644 
645 	/* assign mpp controls to groups */
646 	gid = 0;
647 	for (n = 0; n < soc->ncontrols; n++) {
648 		const struct mvebu_mpp_ctrl *ctrl = &soc->controls[n];
649 		struct mvebu_mpp_ctrl_data *data = soc->control_data ?
650 						   &soc->control_data[n] : NULL;
651 
652 		pctl->groups[gid].gid = gid;
653 		pctl->groups[gid].ctrl = ctrl;
654 		pctl->groups[gid].data = data;
655 		pctl->groups[gid].name = ctrl->name;
656 		pctl->groups[gid].pins = ctrl->pins;
657 		pctl->groups[gid].npins = ctrl->npins;
658 
659 		/*
660 		 * We treat unnamed controls as a range of one-pin groups
661 		 * with generic mvebu register controls. Use one group for
662 		 * each in this range and assign a default group name.
663 		 */
664 		if (!ctrl->name) {
665 			pctl->groups[gid].name = noname_buf;
666 			pctl->groups[gid].npins = 1;
667 			sprintf(noname_buf, "mpp%d", ctrl->pid+0);
668 			noname_buf += 8;
669 
670 			for (k = 1; k < ctrl->npins; k++) {
671 				gid++;
672 				pctl->groups[gid].gid = gid;
673 				pctl->groups[gid].ctrl = ctrl;
674 				pctl->groups[gid].data = data;
675 				pctl->groups[gid].name = noname_buf;
676 				pctl->groups[gid].pins = &ctrl->pins[k];
677 				pctl->groups[gid].npins = 1;
678 				sprintf(noname_buf, "mpp%d", ctrl->pid+k);
679 				noname_buf += 8;
680 			}
681 		}
682 		gid++;
683 	}
684 
685 	/* assign mpp modes to groups */
686 	for (n = 0; n < soc->nmodes; n++) {
687 		struct mvebu_mpp_mode *mode = &soc->modes[n];
688 		struct mvebu_mpp_ctrl_setting *set = &mode->settings[0];
689 		struct mvebu_pinctrl_group *grp;
690 		unsigned num_settings;
691 		unsigned supp_settings;
692 
693 		for (num_settings = 0, supp_settings = 0; ; set++) {
694 			if (!set->name)
695 				break;
696 
697 			num_settings++;
698 
699 			/* skip unsupported settings for this variant */
700 			if (pctl->variant && !(pctl->variant & set->variant))
701 				continue;
702 
703 			supp_settings++;
704 
705 			/* find gpio/gpo/gpi settings */
706 			if (strcmp(set->name, "gpio") == 0)
707 				set->flags = MVEBU_SETTING_GPI |
708 					MVEBU_SETTING_GPO;
709 			else if (strcmp(set->name, "gpo") == 0)
710 				set->flags = MVEBU_SETTING_GPO;
711 			else if (strcmp(set->name, "gpi") == 0)
712 				set->flags = MVEBU_SETTING_GPI;
713 		}
714 
715 		/* skip modes with no settings for this variant */
716 		if (!supp_settings)
717 			continue;
718 
719 		grp = mvebu_pinctrl_find_group_by_pid(pctl, mode->pid);
720 		if (!grp) {
721 			dev_warn(&pdev->dev, "unknown pinctrl group %d\n",
722 				mode->pid);
723 			continue;
724 		}
725 
726 		grp->settings = mode->settings;
727 		grp->num_settings = num_settings;
728 	}
729 
730 	ret = mvebu_pinctrl_build_functions(pdev, pctl);
731 	if (ret) {
732 		dev_err(&pdev->dev, "unable to build functions\n");
733 		return ret;
734 	}
735 
736 	pctl->pctldev = devm_pinctrl_register(&pdev->dev, &pctl->desc, pctl);
737 	if (IS_ERR(pctl->pctldev)) {
738 		dev_err(&pdev->dev, "unable to register pinctrl driver\n");
739 		return PTR_ERR(pctl->pctldev);
740 	}
741 
742 	dev_info(&pdev->dev, "registered pinctrl driver\n");
743 
744 	/* register gpio ranges */
745 	for (n = 0; n < soc->ngpioranges; n++)
746 		pinctrl_add_gpio_range(pctl->pctldev, &soc->gpioranges[n]);
747 
748 	return 0;
749 }
750 
751 /*
752  * mvebu_pinctrl_simple_mmio_probe - probe a simple mmio pinctrl
753  * @pdev: platform device (with platform data already attached)
754  *
755  * Initialise a simple (single base address) mmio pinctrl driver,
756  * assigning the MMIO base address to all mvebu mpp ctrl instances.
757  */
758 int mvebu_pinctrl_simple_mmio_probe(struct platform_device *pdev)
759 {
760 	struct mvebu_pinctrl_soc_info *soc = dev_get_platdata(&pdev->dev);
761 	struct mvebu_mpp_ctrl_data *mpp_data;
762 	struct resource *res;
763 	void __iomem *base;
764 	int i;
765 
766 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
767 	base = devm_ioremap_resource(&pdev->dev, res);
768 	if (IS_ERR(base))
769 		return PTR_ERR(base);
770 
771 	mpp_data = devm_kcalloc(&pdev->dev, soc->ncontrols, sizeof(*mpp_data),
772 				GFP_KERNEL);
773 	if (!mpp_data)
774 		return -ENOMEM;
775 
776 	for (i = 0; i < soc->ncontrols; i++)
777 		mpp_data[i].base = base;
778 
779 	soc->control_data = mpp_data;
780 
781 	return mvebu_pinctrl_probe(pdev);
782 }
783 
784 int mvebu_regmap_mpp_ctrl_get(struct mvebu_mpp_ctrl_data *data,
785 			      unsigned int pid, unsigned long *config)
786 {
787 	unsigned off = (pid / MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS;
788 	unsigned shift = (pid % MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS;
789 	unsigned int val;
790 	int err;
791 
792 	err = regmap_read(data->regmap.map, data->regmap.offset + off, &val);
793 	if (err)
794 		return err;
795 
796 	*config = (val >> shift) & MVEBU_MPP_MASK;
797 
798 	return 0;
799 }
800 
801 int mvebu_regmap_mpp_ctrl_set(struct mvebu_mpp_ctrl_data *data,
802 			      unsigned int pid, unsigned long config)
803 {
804 	unsigned off = (pid / MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS;
805 	unsigned shift = (pid % MVEBU_MPPS_PER_REG) * MVEBU_MPP_BITS;
806 
807 	return regmap_update_bits(data->regmap.map, data->regmap.offset + off,
808 				  MVEBU_MPP_MASK << shift, config << shift);
809 }
810 
811 int mvebu_pinctrl_simple_regmap_probe(struct platform_device *pdev,
812 				      struct device *syscon_dev, u32 offset)
813 {
814 	struct mvebu_pinctrl_soc_info *soc = dev_get_platdata(&pdev->dev);
815 	struct mvebu_mpp_ctrl_data *mpp_data;
816 	struct regmap *regmap;
817 	int i;
818 
819 	regmap = syscon_node_to_regmap(syscon_dev->of_node);
820 	if (IS_ERR(regmap))
821 		return PTR_ERR(regmap);
822 
823 	mpp_data = devm_kcalloc(&pdev->dev, soc->ncontrols, sizeof(*mpp_data),
824 				GFP_KERNEL);
825 	if (!mpp_data)
826 		return -ENOMEM;
827 
828 	for (i = 0; i < soc->ncontrols; i++) {
829 		mpp_data[i].regmap.map = regmap;
830 		mpp_data[i].regmap.offset = offset;
831 	}
832 
833 	soc->control_data = mpp_data;
834 
835 	return mvebu_pinctrl_probe(pdev);
836 }
837