1 /*
2  * Driver for the ST Microelectronics SPEAr pinmux
3  *
4  * Copyright (C) 2012 ST Microelectronics
5  * Viresh Kumar <viresh.linux@gmail.com>
6  *
7  * Inspired from:
8  * - U300 Pinctl drivers
9  * - Tegra Pinctl drivers
10  *
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.
14  */
15 
16 #include <linux/err.h>
17 #include <linux/io.h>
18 #include <linux/module.h>
19 #include <linux/of.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>
26 
27 #include "pinctrl-spear.h"
28 
29 #define DRIVER_NAME "spear-pinmux"
30 
31 static inline u32 pmx_readl(struct spear_pmx *pmx, u32 reg)
32 {
33 	return readl_relaxed(pmx->vbase + reg);
34 }
35 
36 static inline void pmx_writel(struct spear_pmx *pmx, u32 val, u32 reg)
37 {
38 	writel_relaxed(val, pmx->vbase + reg);
39 }
40 
41 static int set_mode(struct spear_pmx *pmx, int mode)
42 {
43 	struct spear_pmx_mode *pmx_mode = NULL;
44 	int i;
45 	u32 val;
46 
47 	if (!pmx->machdata->pmx_modes || !pmx->machdata->npmx_modes)
48 		return -EINVAL;
49 
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];
53 			break;
54 		}
55 	}
56 
57 	if (!pmx_mode)
58 		return -EINVAL;
59 
60 	val = pmx_readl(pmx, pmx_mode->reg);
61 	val &= ~pmx_mode->mask;
62 	val |= pmx_mode->val;
63 	pmx_writel(pmx, val, pmx_mode->reg);
64 
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",
68 			pmx_mode->reg);
69 
70 	return 0;
71 }
72 
73 void __devinit pmx_init_addr(struct spear_pinctrl_machdata *machdata, u16 reg)
74 {
75 	struct spear_pingroup *pgroup;
76 	struct spear_modemux *modemux;
77 	int i, j, group;
78 
79 	for (group = 0; group < machdata->ngroups; group++) {
80 		pgroup = machdata->groups[group];
81 
82 		for (i = 0; i < pgroup->nmodemuxs; i++) {
83 			modemux = &pgroup->modemuxs[i];
84 
85 			for (j = 0; j < modemux->nmuxregs; j++)
86 				if (modemux->muxregs[j].reg == 0xFFFF)
87 					modemux->muxregs[j].reg = reg;
88 		}
89 	}
90 }
91 
92 static int spear_pinctrl_get_groups_cnt(struct pinctrl_dev *pctldev)
93 {
94 	struct spear_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
95 
96 	return pmx->machdata->ngroups;
97 }
98 
99 static const char *spear_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
100 		unsigned group)
101 {
102 	struct spear_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
103 
104 	return pmx->machdata->groups[group]->name;
105 }
106 
107 static int spear_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
108 		unsigned group, const unsigned **pins, unsigned *num_pins)
109 {
110 	struct spear_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
111 
112 	*pins = pmx->machdata->groups[group]->pins;
113 	*num_pins = pmx->machdata->groups[group]->npins;
114 
115 	return 0;
116 }
117 
118 static void spear_pinctrl_pin_dbg_show(struct pinctrl_dev *pctldev,
119 		struct seq_file *s, unsigned offset)
120 {
121 	seq_printf(s, " " DRIVER_NAME);
122 }
123 
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)
127 {
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;
133 
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);
137 		if (ret < 0)
138 			return ret;
139 
140 		ret = of_property_count_strings(np, "st,pins");
141 		if (ret < 0)
142 			return ret;
143 
144 		count += ret;
145 	}
146 
147 	if (!count) {
148 		dev_err(pmx->dev, "No child nodes passed via DT\n");
149 		return -ENODEV;
150 	}
151 
152 	*map = kzalloc(sizeof(**map) * count, GFP_KERNEL);
153 	if (!*map)
154 		return -ENOMEM;
155 
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;
162 			index++;
163 		}
164 	}
165 
166 	*num_maps = count;
167 
168 	return 0;
169 }
170 
171 void spear_pinctrl_dt_free_map(struct pinctrl_dev *pctldev,
172 		struct pinctrl_map *map, unsigned num_maps)
173 {
174 	kfree(map);
175 }
176 
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,
184 };
185 
186 static int spear_pinctrl_get_funcs_count(struct pinctrl_dev *pctldev)
187 {
188 	struct spear_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
189 
190 	return pmx->machdata->nfunctions;
191 }
192 
193 static const char *spear_pinctrl_get_func_name(struct pinctrl_dev *pctldev,
194 		unsigned function)
195 {
196 	struct spear_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
197 
198 	return pmx->machdata->functions[function]->name;
199 }
200 
201 static int spear_pinctrl_get_func_groups(struct pinctrl_dev *pctldev,
202 		unsigned function, const char *const **groups,
203 		unsigned * const ngroups)
204 {
205 	struct spear_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
206 
207 	*groups = pmx->machdata->functions[function]->groups;
208 	*ngroups = pmx->machdata->functions[function]->ngroups;
209 
210 	return 0;
211 }
212 
213 static int spear_pinctrl_endisable(struct pinctrl_dev *pctldev,
214 		unsigned function, unsigned group, bool enable)
215 {
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;
220 	u32 val, temp;
221 	int i, j;
222 	bool found = false;
223 
224 	pgroup = pmx->machdata->groups[group];
225 
226 	for (i = 0; i < pgroup->nmodemuxs; i++) {
227 		modemux = &pgroup->modemuxs[i];
228 
229 		/* SoC have any modes */
230 		if (pmx->machdata->modes_supported) {
231 			if (!(pmx->machdata->mode & modemux->modes))
232 				continue;
233 		}
234 
235 		found = true;
236 		for (j = 0; j < modemux->nmuxregs; j++) {
237 			muxreg = &modemux->muxregs[j];
238 
239 			val = pmx_readl(pmx, muxreg->reg);
240 			val &= ~muxreg->mask;
241 
242 			if (enable)
243 				temp = muxreg->val;
244 			else
245 				temp = ~muxreg->val;
246 
247 			val |= temp;
248 			pmx_writel(pmx, val, muxreg->reg);
249 		}
250 	}
251 
252 	if (!found) {
253 		dev_err(pmx->dev, "pinmux group: %s not supported\n",
254 				pgroup->name);
255 		return -ENODEV;
256 	}
257 
258 	return 0;
259 }
260 
261 static int spear_pinctrl_enable(struct pinctrl_dev *pctldev, unsigned function,
262 		unsigned group)
263 {
264 	return spear_pinctrl_endisable(pctldev, function, group, true);
265 }
266 
267 static void spear_pinctrl_disable(struct pinctrl_dev *pctldev,
268 		unsigned function, unsigned group)
269 {
270 	spear_pinctrl_endisable(pctldev, function, group, false);
271 }
272 
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,
279 };
280 
281 static struct pinctrl_desc spear_pinctrl_desc = {
282 	.name = DRIVER_NAME,
283 	.pctlops = &spear_pinctrl_ops,
284 	.pmxops = &spear_pinmux_ops,
285 	.owner = THIS_MODULE,
286 };
287 
288 int __devinit spear_pinctrl_probe(struct platform_device *pdev,
289 		struct spear_pinctrl_machdata *machdata)
290 {
291 	struct device_node *np = pdev->dev.of_node;
292 	struct resource *res;
293 	struct spear_pmx *pmx;
294 
295 	if (!machdata)
296 		return -ENODEV;
297 
298 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
299 	if (!res)
300 		return -EINVAL;
301 
302 	pmx = devm_kzalloc(&pdev->dev, sizeof(*pmx), GFP_KERNEL);
303 	if (!pmx) {
304 		dev_err(&pdev->dev, "Can't alloc spear_pmx\n");
305 		return -ENOMEM;
306 	}
307 
308 	pmx->vbase = devm_ioremap(&pdev->dev, res->start, resource_size(res));
309 	if (!pmx->vbase) {
310 		dev_err(&pdev->dev, "Couldn't ioremap at index 0\n");
311 		return -ENODEV;
312 	}
313 
314 	pmx->dev = &pdev->dev;
315 	pmx->machdata = machdata;
316 
317 	/* configure mode, if supported by SoC */
318 	if (machdata->modes_supported) {
319 		int mode = 0;
320 
321 		if (of_property_read_u32(np, "st,pinmux-mode", &mode)) {
322 			dev_err(&pdev->dev, "OF: pinmux mode not passed\n");
323 			return -EINVAL;
324 		}
325 
326 		if (set_mode(pmx, mode)) {
327 			dev_err(&pdev->dev, "OF: Couldn't configure mode: %x\n",
328 					mode);
329 			return -EINVAL;
330 		}
331 	}
332 
333 	platform_set_drvdata(pdev, pmx);
334 
335 	spear_pinctrl_desc.pins = machdata->pins;
336 	spear_pinctrl_desc.npins = machdata->npins;
337 
338 	pmx->pctl = pinctrl_register(&spear_pinctrl_desc, &pdev->dev, pmx);
339 	if (!pmx->pctl) {
340 		dev_err(&pdev->dev, "Couldn't register pinctrl driver\n");
341 		return -ENODEV;
342 	}
343 
344 	return 0;
345 }
346 
347 int __devexit spear_pinctrl_remove(struct platform_device *pdev)
348 {
349 	struct spear_pmx *pmx = platform_get_drvdata(pdev);
350 
351 	pinctrl_unregister(pmx->pctl);
352 
353 	return 0;
354 }
355