Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[sfrench/cifs-2.6.git] / drivers / pinctrl / spear / pinctrl-spear.c
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 |= muxreg->mask & 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 }