xref: /OK3568_Linux_fs/kernel/drivers/pinctrl/pxa/pinctrl-pxa2xx.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Marvell PXA2xx family pin control
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2015 Robert Jarzmik
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <linux/bitops.h>
9*4882a593Smuzhiyun #include <linux/io.h>
10*4882a593Smuzhiyun #include <linux/of.h>
11*4882a593Smuzhiyun #include <linux/of_address.h>
12*4882a593Smuzhiyun #include <linux/module.h>
13*4882a593Smuzhiyun #include <linux/pinctrl/machine.h>
14*4882a593Smuzhiyun #include <linux/pinctrl/pinconf.h>
15*4882a593Smuzhiyun #include <linux/pinctrl/pinconf-generic.h>
16*4882a593Smuzhiyun #include <linux/pinctrl/pinmux.h>
17*4882a593Smuzhiyun #include <linux/pinctrl/pinctrl.h>
18*4882a593Smuzhiyun #include <linux/platform_device.h>
19*4882a593Smuzhiyun #include <linux/slab.h>
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #include "../pinctrl-utils.h"
22*4882a593Smuzhiyun #include "pinctrl-pxa2xx.h"
23*4882a593Smuzhiyun 
pxa2xx_pctrl_get_groups_count(struct pinctrl_dev * pctldev)24*4882a593Smuzhiyun static int pxa2xx_pctrl_get_groups_count(struct pinctrl_dev *pctldev)
25*4882a593Smuzhiyun {
26*4882a593Smuzhiyun 	struct pxa_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun 	return pctl->ngroups;
29*4882a593Smuzhiyun }
30*4882a593Smuzhiyun 
pxa2xx_pctrl_get_group_name(struct pinctrl_dev * pctldev,unsigned tgroup)31*4882a593Smuzhiyun static const char *pxa2xx_pctrl_get_group_name(struct pinctrl_dev *pctldev,
32*4882a593Smuzhiyun 					       unsigned tgroup)
33*4882a593Smuzhiyun {
34*4882a593Smuzhiyun 	struct pxa_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
35*4882a593Smuzhiyun 	struct pxa_pinctrl_group *group = pctl->groups + tgroup;
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun 	return group->name;
38*4882a593Smuzhiyun }
39*4882a593Smuzhiyun 
pxa2xx_pctrl_get_group_pins(struct pinctrl_dev * pctldev,unsigned tgroup,const unsigned ** pins,unsigned * num_pins)40*4882a593Smuzhiyun static int pxa2xx_pctrl_get_group_pins(struct pinctrl_dev *pctldev,
41*4882a593Smuzhiyun 				       unsigned tgroup,
42*4882a593Smuzhiyun 				       const unsigned **pins,
43*4882a593Smuzhiyun 				       unsigned *num_pins)
44*4882a593Smuzhiyun {
45*4882a593Smuzhiyun 	struct pxa_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
46*4882a593Smuzhiyun 	struct pxa_pinctrl_group *group = pctl->groups + tgroup;
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun 	*pins = (unsigned *)&group->pin;
49*4882a593Smuzhiyun 	*num_pins = 1;
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun 	return 0;
52*4882a593Smuzhiyun }
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun static const struct pinctrl_ops pxa2xx_pctl_ops = {
55*4882a593Smuzhiyun #ifdef CONFIG_OF
56*4882a593Smuzhiyun 	.dt_node_to_map		= pinconf_generic_dt_node_to_map_all,
57*4882a593Smuzhiyun 	.dt_free_map		= pinctrl_utils_free_map,
58*4882a593Smuzhiyun #endif
59*4882a593Smuzhiyun 	.get_groups_count	= pxa2xx_pctrl_get_groups_count,
60*4882a593Smuzhiyun 	.get_group_name		= pxa2xx_pctrl_get_group_name,
61*4882a593Smuzhiyun 	.get_group_pins		= pxa2xx_pctrl_get_group_pins,
62*4882a593Smuzhiyun };
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun static struct pxa_desc_function *
pxa_desc_by_func_group(struct pxa_pinctrl * pctl,const char * pin_name,const char * func_name)65*4882a593Smuzhiyun pxa_desc_by_func_group(struct pxa_pinctrl *pctl, const char *pin_name,
66*4882a593Smuzhiyun 		       const char *func_name)
67*4882a593Smuzhiyun {
68*4882a593Smuzhiyun 	int i;
69*4882a593Smuzhiyun 	struct pxa_desc_function *df;
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun 	for (i = 0; i < pctl->npins; i++) {
72*4882a593Smuzhiyun 		const struct pxa_desc_pin *pin = pctl->ppins + i;
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun 		if (!strcmp(pin->pin.name, pin_name))
75*4882a593Smuzhiyun 			for (df = pin->functions; df->name; df++)
76*4882a593Smuzhiyun 				if (!strcmp(df->name, func_name))
77*4882a593Smuzhiyun 					return df;
78*4882a593Smuzhiyun 	}
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun 	return NULL;
81*4882a593Smuzhiyun }
82*4882a593Smuzhiyun 
pxa2xx_pmx_gpio_set_direction(struct pinctrl_dev * pctldev,struct pinctrl_gpio_range * range,unsigned pin,bool input)83*4882a593Smuzhiyun static int pxa2xx_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
84*4882a593Smuzhiyun 					 struct pinctrl_gpio_range *range,
85*4882a593Smuzhiyun 					 unsigned pin,
86*4882a593Smuzhiyun 					 bool input)
87*4882a593Smuzhiyun {
88*4882a593Smuzhiyun 	struct pxa_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
89*4882a593Smuzhiyun 	unsigned long flags;
90*4882a593Smuzhiyun 	uint32_t val;
91*4882a593Smuzhiyun 	void __iomem *gpdr;
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun 	gpdr = pctl->base_gpdr[pin / 32];
94*4882a593Smuzhiyun 	dev_dbg(pctl->dev, "set_direction(pin=%d): dir=%d\n",
95*4882a593Smuzhiyun 		pin, !input);
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun 	spin_lock_irqsave(&pctl->lock, flags);
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun 	val = readl_relaxed(gpdr);
100*4882a593Smuzhiyun 	val = (val & ~BIT(pin % 32)) | (input ? 0 : BIT(pin % 32));
101*4882a593Smuzhiyun 	writel_relaxed(val, gpdr);
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun 	spin_unlock_irqrestore(&pctl->lock, flags);
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun 	return 0;
106*4882a593Smuzhiyun }
107*4882a593Smuzhiyun 
pxa2xx_pmx_get_func_name(struct pinctrl_dev * pctldev,unsigned function)108*4882a593Smuzhiyun static const char *pxa2xx_pmx_get_func_name(struct pinctrl_dev *pctldev,
109*4882a593Smuzhiyun 					    unsigned function)
110*4882a593Smuzhiyun {
111*4882a593Smuzhiyun 	struct pxa_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
112*4882a593Smuzhiyun 	struct pxa_pinctrl_function *pf = pctl->functions + function;
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 	return pf->name;
115*4882a593Smuzhiyun }
116*4882a593Smuzhiyun 
pxa2xx_get_functions_count(struct pinctrl_dev * pctldev)117*4882a593Smuzhiyun static int pxa2xx_get_functions_count(struct pinctrl_dev *pctldev)
118*4882a593Smuzhiyun {
119*4882a593Smuzhiyun 	struct pxa_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun 	return pctl->nfuncs;
122*4882a593Smuzhiyun }
123*4882a593Smuzhiyun 
pxa2xx_pmx_get_func_groups(struct pinctrl_dev * pctldev,unsigned function,const char * const ** groups,unsigned * const num_groups)124*4882a593Smuzhiyun static int pxa2xx_pmx_get_func_groups(struct pinctrl_dev *pctldev,
125*4882a593Smuzhiyun 				      unsigned function,
126*4882a593Smuzhiyun 				      const char * const **groups,
127*4882a593Smuzhiyun 				      unsigned * const num_groups)
128*4882a593Smuzhiyun {
129*4882a593Smuzhiyun 	struct pxa_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
130*4882a593Smuzhiyun 	struct pxa_pinctrl_function *pf = pctl->functions + function;
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun 	*groups = pf->groups;
133*4882a593Smuzhiyun 	*num_groups = pf->ngroups;
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun 	return 0;
136*4882a593Smuzhiyun }
137*4882a593Smuzhiyun 
pxa2xx_pmx_set_mux(struct pinctrl_dev * pctldev,unsigned function,unsigned tgroup)138*4882a593Smuzhiyun static int pxa2xx_pmx_set_mux(struct pinctrl_dev *pctldev, unsigned function,
139*4882a593Smuzhiyun 			      unsigned tgroup)
140*4882a593Smuzhiyun {
141*4882a593Smuzhiyun 	struct pxa_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
142*4882a593Smuzhiyun 	struct pxa_pinctrl_group *group = pctl->groups + tgroup;
143*4882a593Smuzhiyun 	struct pxa_desc_function *df;
144*4882a593Smuzhiyun 	int pin, shift;
145*4882a593Smuzhiyun 	unsigned long flags;
146*4882a593Smuzhiyun 	void __iomem *gafr, *gpdr;
147*4882a593Smuzhiyun 	u32 val;
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 	df = pxa_desc_by_func_group(pctl, group->name,
151*4882a593Smuzhiyun 				    (pctl->functions + function)->name);
152*4882a593Smuzhiyun 	if (!df)
153*4882a593Smuzhiyun 		return -EINVAL;
154*4882a593Smuzhiyun 
155*4882a593Smuzhiyun 	pin = group->pin;
156*4882a593Smuzhiyun 	gafr = pctl->base_gafr[pin / 16];
157*4882a593Smuzhiyun 	gpdr = pctl->base_gpdr[pin / 32];
158*4882a593Smuzhiyun 	shift = (pin % 16) << 1;
159*4882a593Smuzhiyun 	dev_dbg(pctl->dev, "set_mux(pin=%d): af=%d dir=%d\n",
160*4882a593Smuzhiyun 		pin, df->muxval >> 1, df->muxval & 0x1);
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun 	spin_lock_irqsave(&pctl->lock, flags);
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun 	val = readl_relaxed(gafr);
165*4882a593Smuzhiyun 	val = (val & ~(0x3 << shift)) | ((df->muxval >> 1) << shift);
166*4882a593Smuzhiyun 	writel_relaxed(val, gafr);
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun 	val = readl_relaxed(gpdr);
169*4882a593Smuzhiyun 	val = (val & ~BIT(pin % 32)) | ((df->muxval & 1) ? BIT(pin % 32) : 0);
170*4882a593Smuzhiyun 	writel_relaxed(val, gpdr);
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun 	spin_unlock_irqrestore(&pctl->lock, flags);
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 	return 0;
175*4882a593Smuzhiyun }
176*4882a593Smuzhiyun static const struct pinmux_ops pxa2xx_pinmux_ops = {
177*4882a593Smuzhiyun 	.get_functions_count = pxa2xx_get_functions_count,
178*4882a593Smuzhiyun 	.get_function_name = pxa2xx_pmx_get_func_name,
179*4882a593Smuzhiyun 	.get_function_groups = pxa2xx_pmx_get_func_groups,
180*4882a593Smuzhiyun 	.set_mux = pxa2xx_pmx_set_mux,
181*4882a593Smuzhiyun 	.gpio_set_direction = pxa2xx_pmx_gpio_set_direction,
182*4882a593Smuzhiyun };
183*4882a593Smuzhiyun 
pxa2xx_pconf_group_get(struct pinctrl_dev * pctldev,unsigned group,unsigned long * config)184*4882a593Smuzhiyun static int pxa2xx_pconf_group_get(struct pinctrl_dev *pctldev,
185*4882a593Smuzhiyun 				  unsigned group,
186*4882a593Smuzhiyun 				  unsigned long *config)
187*4882a593Smuzhiyun {
188*4882a593Smuzhiyun 	struct pxa_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
189*4882a593Smuzhiyun 	struct pxa_pinctrl_group *g = pctl->groups + group;
190*4882a593Smuzhiyun 	unsigned long flags;
191*4882a593Smuzhiyun 	unsigned pin = g->pin;
192*4882a593Smuzhiyun 	void __iomem *pgsr = pctl->base_pgsr[pin / 32];
193*4882a593Smuzhiyun 	u32 val;
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun 	spin_lock_irqsave(&pctl->lock, flags);
196*4882a593Smuzhiyun 	val = readl_relaxed(pgsr) & BIT(pin % 32);
197*4882a593Smuzhiyun 	*config = val ? PIN_CONFIG_LOW_POWER_MODE : 0;
198*4882a593Smuzhiyun 	spin_unlock_irqrestore(&pctl->lock, flags);
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun 	dev_dbg(pctl->dev, "get sleep gpio state(pin=%d) %d\n",
201*4882a593Smuzhiyun 		pin, !!val);
202*4882a593Smuzhiyun 	return 0;
203*4882a593Smuzhiyun }
204*4882a593Smuzhiyun 
pxa2xx_pconf_group_set(struct pinctrl_dev * pctldev,unsigned group,unsigned long * configs,unsigned num_configs)205*4882a593Smuzhiyun static int pxa2xx_pconf_group_set(struct pinctrl_dev *pctldev,
206*4882a593Smuzhiyun 				  unsigned group,
207*4882a593Smuzhiyun 				  unsigned long *configs,
208*4882a593Smuzhiyun 				  unsigned num_configs)
209*4882a593Smuzhiyun {
210*4882a593Smuzhiyun 	struct pxa_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
211*4882a593Smuzhiyun 	struct pxa_pinctrl_group *g = pctl->groups + group;
212*4882a593Smuzhiyun 	unsigned long flags;
213*4882a593Smuzhiyun 	unsigned pin = g->pin;
214*4882a593Smuzhiyun 	void __iomem *pgsr = pctl->base_pgsr[pin / 32];
215*4882a593Smuzhiyun 	int i, is_set = 0;
216*4882a593Smuzhiyun 	u32 val;
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun 	for (i = 0; i < num_configs; i++) {
219*4882a593Smuzhiyun 		switch (pinconf_to_config_param(configs[i])) {
220*4882a593Smuzhiyun 		case PIN_CONFIG_LOW_POWER_MODE:
221*4882a593Smuzhiyun 			is_set = pinconf_to_config_argument(configs[i]);
222*4882a593Smuzhiyun 			break;
223*4882a593Smuzhiyun 		default:
224*4882a593Smuzhiyun 			return -EINVAL;
225*4882a593Smuzhiyun 		}
226*4882a593Smuzhiyun 	}
227*4882a593Smuzhiyun 
228*4882a593Smuzhiyun 	dev_dbg(pctl->dev, "set sleep gpio state(pin=%d) %d\n",
229*4882a593Smuzhiyun 		pin, is_set);
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun 	spin_lock_irqsave(&pctl->lock, flags);
232*4882a593Smuzhiyun 	val = readl_relaxed(pgsr);
233*4882a593Smuzhiyun 	val = (val & ~BIT(pin % 32)) | (is_set ? BIT(pin % 32) : 0);
234*4882a593Smuzhiyun 	writel_relaxed(val, pgsr);
235*4882a593Smuzhiyun 	spin_unlock_irqrestore(&pctl->lock, flags);
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun 	return 0;
238*4882a593Smuzhiyun }
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun static const struct pinconf_ops pxa2xx_pconf_ops = {
241*4882a593Smuzhiyun 	.pin_config_group_get	= pxa2xx_pconf_group_get,
242*4882a593Smuzhiyun 	.pin_config_group_set	= pxa2xx_pconf_group_set,
243*4882a593Smuzhiyun 	.is_generic		= true,
244*4882a593Smuzhiyun };
245*4882a593Smuzhiyun 
246*4882a593Smuzhiyun static struct pinctrl_desc pxa2xx_pinctrl_desc = {
247*4882a593Smuzhiyun 	.confops	= &pxa2xx_pconf_ops,
248*4882a593Smuzhiyun 	.pctlops	= &pxa2xx_pctl_ops,
249*4882a593Smuzhiyun 	.pmxops		= &pxa2xx_pinmux_ops,
250*4882a593Smuzhiyun };
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun static const struct pxa_pinctrl_function *
pxa2xx_find_function(struct pxa_pinctrl * pctl,const char * fname,const struct pxa_pinctrl_function * functions)253*4882a593Smuzhiyun pxa2xx_find_function(struct pxa_pinctrl *pctl, const char *fname,
254*4882a593Smuzhiyun 		     const struct pxa_pinctrl_function *functions)
255*4882a593Smuzhiyun {
256*4882a593Smuzhiyun 	const struct pxa_pinctrl_function *func;
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun 	for (func = functions; func->name; func++)
259*4882a593Smuzhiyun 		if (!strcmp(fname, func->name))
260*4882a593Smuzhiyun 			return func;
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun 	return NULL;
263*4882a593Smuzhiyun }
264*4882a593Smuzhiyun 
pxa2xx_build_functions(struct pxa_pinctrl * pctl)265*4882a593Smuzhiyun static int pxa2xx_build_functions(struct pxa_pinctrl *pctl)
266*4882a593Smuzhiyun {
267*4882a593Smuzhiyun 	int i;
268*4882a593Smuzhiyun 	struct pxa_pinctrl_function *functions;
269*4882a593Smuzhiyun 	struct pxa_desc_function *df;
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun 	/*
272*4882a593Smuzhiyun 	 * Each pin can have at most 6 alternate functions, and 2 gpio functions
273*4882a593Smuzhiyun 	 * which are common to each pin. As there are more than 2 pins without
274*4882a593Smuzhiyun 	 * alternate function, 6 * npins is an absolute high limit of the number
275*4882a593Smuzhiyun 	 * of functions.
276*4882a593Smuzhiyun 	 */
277*4882a593Smuzhiyun 	functions = devm_kcalloc(pctl->dev, pctl->npins * 6,
278*4882a593Smuzhiyun 				 sizeof(*functions), GFP_KERNEL);
279*4882a593Smuzhiyun 	if (!functions)
280*4882a593Smuzhiyun 		return -ENOMEM;
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun 	for (i = 0; i < pctl->npins; i++)
283*4882a593Smuzhiyun 		for (df = pctl->ppins[i].functions; df->name; df++)
284*4882a593Smuzhiyun 			if (!pxa2xx_find_function(pctl, df->name, functions))
285*4882a593Smuzhiyun 				(functions + pctl->nfuncs++)->name = df->name;
286*4882a593Smuzhiyun 	pctl->functions = devm_kmemdup(pctl->dev, functions,
287*4882a593Smuzhiyun 				       pctl->nfuncs * sizeof(*functions),
288*4882a593Smuzhiyun 				       GFP_KERNEL);
289*4882a593Smuzhiyun 	if (!pctl->functions)
290*4882a593Smuzhiyun 		return -ENOMEM;
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	devm_kfree(pctl->dev, functions);
293*4882a593Smuzhiyun 	return 0;
294*4882a593Smuzhiyun }
295*4882a593Smuzhiyun 
pxa2xx_build_groups(struct pxa_pinctrl * pctl)296*4882a593Smuzhiyun static int pxa2xx_build_groups(struct pxa_pinctrl *pctl)
297*4882a593Smuzhiyun {
298*4882a593Smuzhiyun 	int i, j, ngroups;
299*4882a593Smuzhiyun 	struct pxa_pinctrl_function *func;
300*4882a593Smuzhiyun 	struct pxa_desc_function *df;
301*4882a593Smuzhiyun 	char **gtmp;
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun 	gtmp = devm_kmalloc_array(pctl->dev, pctl->npins, sizeof(*gtmp),
304*4882a593Smuzhiyun 				  GFP_KERNEL);
305*4882a593Smuzhiyun 	if (!gtmp)
306*4882a593Smuzhiyun 		return -ENOMEM;
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun 	for (i = 0; i < pctl->nfuncs; i++) {
309*4882a593Smuzhiyun 		ngroups = 0;
310*4882a593Smuzhiyun 		for (j = 0; j < pctl->npins; j++)
311*4882a593Smuzhiyun 			for (df = pctl->ppins[j].functions; df->name;
312*4882a593Smuzhiyun 			     df++)
313*4882a593Smuzhiyun 				if (!strcmp(pctl->functions[i].name,
314*4882a593Smuzhiyun 					    df->name))
315*4882a593Smuzhiyun 					gtmp[ngroups++] = (char *)
316*4882a593Smuzhiyun 						pctl->ppins[j].pin.name;
317*4882a593Smuzhiyun 		func = pctl->functions + i;
318*4882a593Smuzhiyun 		func->ngroups = ngroups;
319*4882a593Smuzhiyun 		func->groups =
320*4882a593Smuzhiyun 			devm_kmalloc_array(pctl->dev, ngroups,
321*4882a593Smuzhiyun 					   sizeof(char *), GFP_KERNEL);
322*4882a593Smuzhiyun 		if (!func->groups)
323*4882a593Smuzhiyun 			return -ENOMEM;
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun 		memcpy(func->groups, gtmp, ngroups * sizeof(*gtmp));
326*4882a593Smuzhiyun 	}
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun 	devm_kfree(pctl->dev, gtmp);
329*4882a593Smuzhiyun 	return 0;
330*4882a593Smuzhiyun }
331*4882a593Smuzhiyun 
pxa2xx_build_state(struct pxa_pinctrl * pctl,const struct pxa_desc_pin * ppins,int npins)332*4882a593Smuzhiyun static int pxa2xx_build_state(struct pxa_pinctrl *pctl,
333*4882a593Smuzhiyun 			      const struct pxa_desc_pin *ppins, int npins)
334*4882a593Smuzhiyun {
335*4882a593Smuzhiyun 	struct pxa_pinctrl_group *group;
336*4882a593Smuzhiyun 	struct pinctrl_pin_desc *pins;
337*4882a593Smuzhiyun 	int ret, i;
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun 	pctl->npins = npins;
340*4882a593Smuzhiyun 	pctl->ppins = ppins;
341*4882a593Smuzhiyun 	pctl->ngroups = npins;
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun 	pctl->desc.npins = npins;
344*4882a593Smuzhiyun 	pins = devm_kcalloc(pctl->dev, npins, sizeof(*pins), GFP_KERNEL);
345*4882a593Smuzhiyun 	if (!pins)
346*4882a593Smuzhiyun 		return -ENOMEM;
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun 	pctl->desc.pins = pins;
349*4882a593Smuzhiyun 	for (i = 0; i < npins; i++)
350*4882a593Smuzhiyun 		pins[i] = ppins[i].pin;
351*4882a593Smuzhiyun 
352*4882a593Smuzhiyun 	pctl->groups = devm_kmalloc_array(pctl->dev, pctl->ngroups,
353*4882a593Smuzhiyun 					  sizeof(*pctl->groups), GFP_KERNEL);
354*4882a593Smuzhiyun 	if (!pctl->groups)
355*4882a593Smuzhiyun 		return -ENOMEM;
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun 	for (i = 0; i < npins; i++) {
358*4882a593Smuzhiyun 		group = pctl->groups + i;
359*4882a593Smuzhiyun 		group->name = ppins[i].pin.name;
360*4882a593Smuzhiyun 		group->pin = ppins[i].pin.number;
361*4882a593Smuzhiyun 	}
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun 	ret = pxa2xx_build_functions(pctl);
364*4882a593Smuzhiyun 	if (ret)
365*4882a593Smuzhiyun 		return ret;
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun 	ret = pxa2xx_build_groups(pctl);
368*4882a593Smuzhiyun 	if (ret)
369*4882a593Smuzhiyun 		return ret;
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun 	return 0;
372*4882a593Smuzhiyun }
373*4882a593Smuzhiyun 
pxa2xx_pinctrl_init(struct platform_device * pdev,const struct pxa_desc_pin * ppins,int npins,void __iomem * base_gafr[],void __iomem * base_gpdr[],void __iomem * base_pgsr[])374*4882a593Smuzhiyun int pxa2xx_pinctrl_init(struct platform_device *pdev,
375*4882a593Smuzhiyun 			const struct pxa_desc_pin *ppins, int npins,
376*4882a593Smuzhiyun 			void __iomem *base_gafr[], void __iomem *base_gpdr[],
377*4882a593Smuzhiyun 			void __iomem *base_pgsr[])
378*4882a593Smuzhiyun {
379*4882a593Smuzhiyun 	struct pxa_pinctrl *pctl;
380*4882a593Smuzhiyun 	int ret, i, maxpin = 0;
381*4882a593Smuzhiyun 
382*4882a593Smuzhiyun 	for (i = 0; i < npins; i++)
383*4882a593Smuzhiyun 		maxpin = max_t(int, ppins[i].pin.number, maxpin);
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun 	pctl = devm_kzalloc(&pdev->dev, sizeof(*pctl), GFP_KERNEL);
386*4882a593Smuzhiyun 	if (!pctl)
387*4882a593Smuzhiyun 		return -ENOMEM;
388*4882a593Smuzhiyun 	pctl->base_gafr = devm_kcalloc(&pdev->dev, roundup(maxpin, 16),
389*4882a593Smuzhiyun 				       sizeof(*pctl->base_gafr), GFP_KERNEL);
390*4882a593Smuzhiyun 	pctl->base_gpdr = devm_kcalloc(&pdev->dev, roundup(maxpin, 32),
391*4882a593Smuzhiyun 				       sizeof(*pctl->base_gpdr), GFP_KERNEL);
392*4882a593Smuzhiyun 	pctl->base_pgsr = devm_kcalloc(&pdev->dev, roundup(maxpin, 32),
393*4882a593Smuzhiyun 				       sizeof(*pctl->base_pgsr), GFP_KERNEL);
394*4882a593Smuzhiyun 	if (!pctl->base_gafr || !pctl->base_gpdr || !pctl->base_pgsr)
395*4882a593Smuzhiyun 		return -ENOMEM;
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun 	platform_set_drvdata(pdev, pctl);
398*4882a593Smuzhiyun 	spin_lock_init(&pctl->lock);
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun 	pctl->dev = &pdev->dev;
401*4882a593Smuzhiyun 	pctl->desc = pxa2xx_pinctrl_desc;
402*4882a593Smuzhiyun 	pctl->desc.name = dev_name(&pdev->dev);
403*4882a593Smuzhiyun 	pctl->desc.owner = THIS_MODULE;
404*4882a593Smuzhiyun 
405*4882a593Smuzhiyun 	for (i = 0; i < roundup(maxpin, 16); i += 16)
406*4882a593Smuzhiyun 		pctl->base_gafr[i / 16] = base_gafr[i / 16];
407*4882a593Smuzhiyun 	for (i = 0; i < roundup(maxpin, 32); i += 32) {
408*4882a593Smuzhiyun 		pctl->base_gpdr[i / 32] = base_gpdr[i / 32];
409*4882a593Smuzhiyun 		pctl->base_pgsr[i / 32] = base_pgsr[i / 32];
410*4882a593Smuzhiyun 	}
411*4882a593Smuzhiyun 
412*4882a593Smuzhiyun 	ret = pxa2xx_build_state(pctl, ppins, npins);
413*4882a593Smuzhiyun 	if (ret)
414*4882a593Smuzhiyun 		return ret;
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun 	pctl->pctl_dev = devm_pinctrl_register(&pdev->dev, &pctl->desc, pctl);
417*4882a593Smuzhiyun 	if (IS_ERR(pctl->pctl_dev)) {
418*4882a593Smuzhiyun 		dev_err(&pdev->dev, "couldn't register pinctrl driver\n");
419*4882a593Smuzhiyun 		return PTR_ERR(pctl->pctl_dev);
420*4882a593Smuzhiyun 	}
421*4882a593Smuzhiyun 
422*4882a593Smuzhiyun 	dev_info(&pdev->dev, "initialized pxa2xx pinctrl driver\n");
423*4882a593Smuzhiyun 
424*4882a593Smuzhiyun 	return 0;
425*4882a593Smuzhiyun }
426*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(pxa2xx_pinctrl_init);
427*4882a593Smuzhiyun 
428*4882a593Smuzhiyun MODULE_AUTHOR("Robert Jarzmik <robert.jarzmik@free.fr>");
429*4882a593Smuzhiyun MODULE_DESCRIPTION("Marvell PXA2xx pinctrl driver");
430*4882a593Smuzhiyun MODULE_LICENSE("GPL v2");
431