blob: 900afa5f40694a0ff864c6a679bb0c03aebe348c [file] [log] [blame]
Paul Mundtca5481c62012-07-10 12:08:14 +09001/*
2 * SuperH Pin Function Controller pinmux support.
3 *
4 * Copyright (C) 2012 Paul Mundt
5 *
6 * This file is subject to the terms and conditions of the GNU General Public
7 * License. See the file "COPYING" in the main directory of this archive
8 * for more details.
9 */
Paul Mundt54407112012-07-20 16:18:21 +090010#define DRV_NAME "pinctrl-sh_pfc"
11
12#define pr_fmt(fmt) DRV_NAME " " KBUILD_MODNAME ": " fmt
Paul Mundtca5481c62012-07-10 12:08:14 +090013
14#include <linux/init.h>
15#include <linux/module.h>
16#include <linux/sh_pfc.h>
17#include <linux/err.h>
18#include <linux/slab.h>
Paul Mundtd93a8912012-07-11 17:17:10 +090019#include <linux/spinlock.h>
Paul Mundtca5481c62012-07-10 12:08:14 +090020#include <linux/platform_device.h>
21#include <linux/pinctrl/consumer.h>
22#include <linux/pinctrl/pinctrl.h>
23#include <linux/pinctrl/pinconf.h>
24#include <linux/pinctrl/pinmux.h>
25#include <linux/pinctrl/pinconf-generic.h>
26
27struct sh_pfc_pinctrl {
28 struct pinctrl_dev *pctl;
29 struct sh_pfc *pfc;
30
Paul Mundtd93a8912012-07-11 17:17:10 +090031 struct pinmux_gpio **functions;
32 unsigned int nr_functions;
33
Paul Mundtca5481c62012-07-10 12:08:14 +090034 struct pinctrl_pin_desc *pads;
35 unsigned int nr_pads;
Paul Mundtd93a8912012-07-11 17:17:10 +090036
37 spinlock_t lock;
Paul Mundtca5481c62012-07-10 12:08:14 +090038};
39
40static struct sh_pfc_pinctrl *sh_pfc_pmx;
41
Paul Mundte3f805e2012-07-17 15:48:18 +090042static int sh_pfc_get_groups_count(struct pinctrl_dev *pctldev)
Paul Mundtca5481c62012-07-10 12:08:14 +090043{
Paul Mundte3f805e2012-07-17 15:48:18 +090044 struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
45
46 return pmx->nr_pads;
Paul Mundtca5481c62012-07-10 12:08:14 +090047}
48
Paul Mundte3f805e2012-07-17 15:48:18 +090049static const char *sh_pfc_get_group_name(struct pinctrl_dev *pctldev,
Paul Mundtca5481c62012-07-10 12:08:14 +090050 unsigned selector)
51{
Paul Mundte3f805e2012-07-17 15:48:18 +090052 struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
53
54 return pmx->pads[selector].name;
Paul Mundtca5481c62012-07-10 12:08:14 +090055}
56
57static int sh_pfc_get_group_pins(struct pinctrl_dev *pctldev, unsigned group,
58 const unsigned **pins, unsigned *num_pins)
59{
Paul Mundte3f805e2012-07-17 15:48:18 +090060 struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
61
62 *pins = &pmx->pads[group].number;
63 *num_pins = 1;
64
65 return 0;
Paul Mundtca5481c62012-07-10 12:08:14 +090066}
67
68static struct pinctrl_ops sh_pfc_pinctrl_ops = {
Paul Mundte3f805e2012-07-17 15:48:18 +090069 .get_groups_count = sh_pfc_get_groups_count,
70 .get_group_name = sh_pfc_get_group_name,
Paul Mundtca5481c62012-07-10 12:08:14 +090071 .get_group_pins = sh_pfc_get_group_pins,
72};
73
Paul Mundtd93a8912012-07-11 17:17:10 +090074static int sh_pfc_get_functions_count(struct pinctrl_dev *pctldev)
75{
76 struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
Paul Mundtca5481c62012-07-10 12:08:14 +090077
Paul Mundtd93a8912012-07-11 17:17:10 +090078 return pmx->nr_functions;
79}
80
81static const char *sh_pfc_get_function_name(struct pinctrl_dev *pctldev,
82 unsigned selector)
83{
84 struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
85
86 return pmx->functions[selector]->name;
87}
88
Paul Mundtca5481c62012-07-10 12:08:14 +090089static int sh_pfc_get_function_groups(struct pinctrl_dev *pctldev, unsigned func,
90 const char * const **groups,
91 unsigned * const num_groups)
92{
Paul Mundtd93a8912012-07-11 17:17:10 +090093 struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
94
95 *groups = &pmx->functions[func]->name;
96 *num_groups = 1;
97
Paul Mundtca5481c62012-07-10 12:08:14 +090098 return 0;
99}
100
101static int sh_pfc_noop_enable(struct pinctrl_dev *pctldev, unsigned func,
102 unsigned group)
103{
104 return 0;
105}
106
107static void sh_pfc_noop_disable(struct pinctrl_dev *pctldev, unsigned func,
108 unsigned group)
109{
110}
111
Paul Mundtd93a8912012-07-11 17:17:10 +0900112static inline int sh_pfc_config_function(struct sh_pfc *pfc, unsigned offset)
113{
114 if (sh_pfc_config_gpio(pfc, offset,
115 PINMUX_TYPE_FUNCTION,
116 GPIO_CFG_DRYRUN) != 0)
117 return -EINVAL;
118
119 if (sh_pfc_config_gpio(pfc, offset,
120 PINMUX_TYPE_FUNCTION,
121 GPIO_CFG_REQ) != 0)
122 return -EINVAL;
123
124 return 0;
125}
126
Paul Mundtca5481c62012-07-10 12:08:14 +0900127static int sh_pfc_gpio_request_enable(struct pinctrl_dev *pctldev,
128 struct pinctrl_gpio_range *range,
129 unsigned offset)
130{
131 struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
132 struct sh_pfc *pfc = pmx->pfc;
Paul Mundtca5481c62012-07-10 12:08:14 +0900133 unsigned long flags;
Paul Mundtd93a8912012-07-11 17:17:10 +0900134 int ret, pinmux_type;
Paul Mundtca5481c62012-07-10 12:08:14 +0900135
136 spin_lock_irqsave(&pfc->lock, flags);
137
Paul Mundtd93a8912012-07-11 17:17:10 +0900138 pinmux_type = pfc->gpios[offset].flags & PINMUX_FLAG_TYPE;
Paul Mundtca5481c62012-07-10 12:08:14 +0900139
Paul Mundtd93a8912012-07-11 17:17:10 +0900140 switch (pinmux_type) {
141 case PINMUX_TYPE_FUNCTION:
142 pr_notice_once("Use of GPIO API for function requests is "
143 "deprecated, convert to pinctrl\n");
144 /* handle for now */
145 ret = sh_pfc_config_function(pfc, offset);
146 if (unlikely(ret < 0))
Paul Mundtca5481c62012-07-10 12:08:14 +0900147 goto err;
148
Paul Mundtd93a8912012-07-11 17:17:10 +0900149 break;
150 case PINMUX_TYPE_GPIO:
151 break;
152 default:
153 pr_err("Unsupported mux type (%d), bailing...\n", pinmux_type);
154 return -ENOTSUPP;
155 }
Paul Mundtca5481c62012-07-10 12:08:14 +0900156
157 ret = 0;
158
159err:
160 spin_unlock_irqrestore(&pfc->lock, flags);
161
162 return ret;
163}
164
165static void sh_pfc_gpio_disable_free(struct pinctrl_dev *pctldev,
166 struct pinctrl_gpio_range *range,
167 unsigned offset)
168{
169 struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
170 struct sh_pfc *pfc = pmx->pfc;
171 unsigned long flags;
172 int pinmux_type;
173
174 spin_lock_irqsave(&pfc->lock, flags);
175
176 pinmux_type = pfc->gpios[offset].flags & PINMUX_FLAG_TYPE;
177
178 sh_pfc_config_gpio(pfc, offset, pinmux_type, GPIO_CFG_FREE);
179
Paul Mundtca5481c62012-07-10 12:08:14 +0900180 spin_unlock_irqrestore(&pfc->lock, flags);
181}
182
183static int sh_pfc_gpio_set_direction(struct pinctrl_dev *pctldev,
184 struct pinctrl_gpio_range *range,
185 unsigned offset, bool input)
186{
187 struct sh_pfc_pinctrl *pmx = pinctrl_dev_get_drvdata(pctldev);
188 struct sh_pfc *pfc = pmx->pfc;
189 unsigned long flags;
190 int pinmux_type, new_pinmux_type;
191 int ret = -EINVAL;
192
193 new_pinmux_type = input ? PINMUX_TYPE_INPUT : PINMUX_TYPE_OUTPUT;
194
195 spin_lock_irqsave(&pfc->lock, flags);
196
197 pinmux_type = pfc->gpios[offset].flags & PINMUX_FLAG_TYPE;
198
199 switch (pinmux_type) {
200 case PINMUX_TYPE_GPIO:
201 break;
202 case PINMUX_TYPE_OUTPUT:
203 case PINMUX_TYPE_INPUT:
204 case PINMUX_TYPE_INPUT_PULLUP:
205 case PINMUX_TYPE_INPUT_PULLDOWN:
206 sh_pfc_config_gpio(pfc, offset, pinmux_type, GPIO_CFG_FREE);
207 break;
208 default:
209 goto err;
210 }
211
212 if (sh_pfc_config_gpio(pfc, offset,
213 new_pinmux_type,
214 GPIO_CFG_DRYRUN) != 0)
215 goto err;
216
217 if (sh_pfc_config_gpio(pfc, offset,
218 new_pinmux_type,
219 GPIO_CFG_REQ) != 0)
220 BUG();
221
222 pfc->gpios[offset].flags &= ~PINMUX_FLAG_TYPE;
223 pfc->gpios[offset].flags |= new_pinmux_type;
224
225 ret = 0;
226
227err:
228 spin_unlock_irqrestore(&pfc->lock, flags);
229
230 return ret;
231}
232
233static struct pinmux_ops sh_pfc_pinmux_ops = {
Paul Mundtd93a8912012-07-11 17:17:10 +0900234 .get_functions_count = sh_pfc_get_functions_count,
235 .get_function_name = sh_pfc_get_function_name,
Paul Mundtca5481c62012-07-10 12:08:14 +0900236 .get_function_groups = sh_pfc_get_function_groups,
237 .enable = sh_pfc_noop_enable,
238 .disable = sh_pfc_noop_disable,
239 .gpio_request_enable = sh_pfc_gpio_request_enable,
240 .gpio_disable_free = sh_pfc_gpio_disable_free,
241 .gpio_set_direction = sh_pfc_gpio_set_direction,
242};
243
244static int sh_pfc_pinconf_get(struct pinctrl_dev *pctldev, unsigned pin,
245 unsigned long *config)
246{
Paul Mundtd93a8912012-07-11 17:17:10 +0900247 enum pin_config_param param = (enum pin_config_param)(*config);
248
249 switch (param) {
250 default:
251 break;
252 }
253
Paul Mundtca5481c62012-07-10 12:08:14 +0900254 return -ENOTSUPP;
255}
256
257static int sh_pfc_pinconf_set(struct pinctrl_dev *pctldev, unsigned pin,
258 unsigned long config)
259{
260 return -EINVAL;
261}
262
263static struct pinconf_ops sh_pfc_pinconf_ops = {
264 .is_generic = true,
265 .pin_config_get = sh_pfc_pinconf_get,
266 .pin_config_set = sh_pfc_pinconf_set,
267};
268
269static struct pinctrl_gpio_range sh_pfc_gpio_range = {
Paul Mundt54407112012-07-20 16:18:21 +0900270 .name = DRV_NAME,
Paul Mundtca5481c62012-07-10 12:08:14 +0900271 .id = 0,
272};
273
274static struct pinctrl_desc sh_pfc_pinctrl_desc = {
Paul Mundt54407112012-07-20 16:18:21 +0900275 .name = DRV_NAME,
Paul Mundtca5481c62012-07-10 12:08:14 +0900276 .owner = THIS_MODULE,
277 .pctlops = &sh_pfc_pinctrl_ops,
278 .pmxops = &sh_pfc_pinmux_ops,
279 .confops = &sh_pfc_pinconf_ops,
280};
281
282int sh_pfc_register_pinctrl(struct sh_pfc *pfc)
283{
Paul Mundtd93a8912012-07-11 17:17:10 +0900284 sh_pfc_pmx = kzalloc(sizeof(struct sh_pfc_pinctrl), GFP_KERNEL);
Paul Mundtca5481c62012-07-10 12:08:14 +0900285 if (unlikely(!sh_pfc_pmx))
286 return -ENOMEM;
287
Paul Mundtd93a8912012-07-11 17:17:10 +0900288 spin_lock_init(&sh_pfc_pmx->lock);
289
Paul Mundtca5481c62012-07-10 12:08:14 +0900290 sh_pfc_pmx->pfc = pfc;
291
292 return 0;
293}
Paul Mundt1acbbb4ed2012-07-17 15:21:47 +0900294EXPORT_SYMBOL_GPL(sh_pfc_register_pinctrl);
Paul Mundtca5481c62012-07-10 12:08:14 +0900295
Paul Mundtd93a8912012-07-11 17:17:10 +0900296static inline void __devinit sh_pfc_map_one_gpio(struct sh_pfc *pfc,
297 struct sh_pfc_pinctrl *pmx,
298 struct pinmux_gpio *gpio,
299 unsigned offset)
300{
301 struct pinmux_data_reg *dummy;
302 unsigned long flags;
303 int bit;
304
305 gpio->flags &= ~PINMUX_FLAG_TYPE;
306
307 if (sh_pfc_get_data_reg(pfc, offset, &dummy, &bit) == 0)
308 gpio->flags |= PINMUX_TYPE_GPIO;
309 else {
310 gpio->flags |= PINMUX_TYPE_FUNCTION;
311
312 spin_lock_irqsave(&pmx->lock, flags);
313 pmx->nr_functions++;
314 spin_unlock_irqrestore(&pmx->lock, flags);
315 }
316}
317
Paul Mundtca5481c62012-07-10 12:08:14 +0900318/* pinmux ranges -> pinctrl pin descs */
319static int __devinit sh_pfc_map_gpios(struct sh_pfc *pfc,
320 struct sh_pfc_pinctrl *pmx)
321{
Paul Mundtd93a8912012-07-11 17:17:10 +0900322 unsigned long flags;
Paul Mundtca5481c62012-07-10 12:08:14 +0900323 int i;
324
325 pmx->nr_pads = pfc->last_gpio - pfc->first_gpio + 1;
326
327 pmx->pads = kmalloc(sizeof(struct pinctrl_pin_desc) * pmx->nr_pads,
328 GFP_KERNEL);
329 if (unlikely(!pmx->pads)) {
330 pmx->nr_pads = 0;
331 return -ENOMEM;
332 }
333
Paul Mundtd93a8912012-07-11 17:17:10 +0900334 spin_lock_irqsave(&pfc->lock, flags);
335
Paul Mundtca5481c62012-07-10 12:08:14 +0900336 /*
337 * We don't necessarily have a 1:1 mapping between pin and linux
338 * GPIO number, as the latter maps to the associated enum_id.
339 * Care needs to be taken to translate back to pin space when
340 * dealing with any pin configurations.
341 */
342 for (i = 0; i < pmx->nr_pads; i++) {
343 struct pinctrl_pin_desc *pin = pmx->pads + i;
344 struct pinmux_gpio *gpio = pfc->gpios + i;
345
346 pin->number = pfc->first_gpio + i;
347 pin->name = gpio->name;
Paul Mundtd93a8912012-07-11 17:17:10 +0900348
Paul Mundte3e79452012-07-17 15:23:11 +0900349 /* XXX */
350 if (unlikely(!gpio->enum_id))
351 continue;
352
Paul Mundtd93a8912012-07-11 17:17:10 +0900353 sh_pfc_map_one_gpio(pfc, pmx, gpio, i);
Paul Mundtca5481c62012-07-10 12:08:14 +0900354 }
355
Paul Mundtd93a8912012-07-11 17:17:10 +0900356 spin_unlock_irqrestore(&pfc->lock, flags);
357
Paul Mundtca5481c62012-07-10 12:08:14 +0900358 sh_pfc_pinctrl_desc.pins = pmx->pads;
359 sh_pfc_pinctrl_desc.npins = pmx->nr_pads;
360
361 return 0;
362}
363
Paul Mundtd93a8912012-07-11 17:17:10 +0900364static int __devinit sh_pfc_map_functions(struct sh_pfc *pfc,
365 struct sh_pfc_pinctrl *pmx)
366{
367 unsigned long flags;
368 int i, fn;
369
370 pmx->functions = kzalloc(pmx->nr_functions * sizeof(void *),
371 GFP_KERNEL);
372 if (unlikely(!pmx->functions))
373 return -ENOMEM;
374
375 spin_lock_irqsave(&pmx->lock, flags);
376
377 for (i = fn = 0; i < pmx->nr_pads; i++) {
378 struct pinmux_gpio *gpio = pfc->gpios + i;
379
380 if ((gpio->flags & PINMUX_FLAG_TYPE) == PINMUX_TYPE_FUNCTION)
381 pmx->functions[fn++] = gpio;
382 }
383
384 spin_unlock_irqrestore(&pmx->lock, flags);
385
386 return 0;
387}
388
Paul Mundtca5481c62012-07-10 12:08:14 +0900389static int __devinit sh_pfc_pinctrl_probe(struct platform_device *pdev)
390{
391 struct sh_pfc *pfc;
392 int ret;
393
394 if (unlikely(!sh_pfc_pmx))
395 return -ENODEV;
396
397 pfc = sh_pfc_pmx->pfc;
398
399 ret = sh_pfc_map_gpios(pfc, sh_pfc_pmx);
400 if (unlikely(ret != 0))
401 return ret;
402
Paul Mundtd93a8912012-07-11 17:17:10 +0900403 ret = sh_pfc_map_functions(pfc, sh_pfc_pmx);
404 if (unlikely(ret != 0))
405 goto free_pads;
406
Paul Mundtca5481c62012-07-10 12:08:14 +0900407 sh_pfc_pmx->pctl = pinctrl_register(&sh_pfc_pinctrl_desc, &pdev->dev,
408 sh_pfc_pmx);
409 if (IS_ERR(sh_pfc_pmx->pctl)) {
410 ret = PTR_ERR(sh_pfc_pmx->pctl);
Paul Mundtd93a8912012-07-11 17:17:10 +0900411 goto free_functions;
Paul Mundtca5481c62012-07-10 12:08:14 +0900412 }
413
414 sh_pfc_gpio_range.npins = pfc->last_gpio - pfc->first_gpio + 1;
415 sh_pfc_gpio_range.base = pfc->first_gpio;
416 sh_pfc_gpio_range.pin_base = pfc->first_gpio;
417
418 pinctrl_add_gpio_range(sh_pfc_pmx->pctl, &sh_pfc_gpio_range);
419
420 platform_set_drvdata(pdev, sh_pfc_pmx);
421
422 return 0;
423
Paul Mundtd93a8912012-07-11 17:17:10 +0900424free_functions:
425 kfree(sh_pfc_pmx->functions);
426free_pads:
Paul Mundtca5481c62012-07-10 12:08:14 +0900427 kfree(sh_pfc_pmx->pads);
428 kfree(sh_pfc_pmx);
Paul Mundtd93a8912012-07-11 17:17:10 +0900429
Paul Mundtca5481c62012-07-10 12:08:14 +0900430 return ret;
431}
432
433static int __devexit sh_pfc_pinctrl_remove(struct platform_device *pdev)
434{
435 struct sh_pfc_pinctrl *pmx = platform_get_drvdata(pdev);
436
437 pinctrl_remove_gpio_range(pmx->pctl, &sh_pfc_gpio_range);
438 pinctrl_unregister(pmx->pctl);
439
440 platform_set_drvdata(pdev, NULL);
441
Paul Mundtd93a8912012-07-11 17:17:10 +0900442 kfree(sh_pfc_pmx->functions);
Paul Mundtca5481c62012-07-10 12:08:14 +0900443 kfree(sh_pfc_pmx->pads);
444 kfree(sh_pfc_pmx);
445
446 return 0;
447}
448
449static struct platform_driver sh_pfc_pinctrl_driver = {
450 .probe = sh_pfc_pinctrl_probe,
451 .remove = __devexit_p(sh_pfc_pinctrl_remove),
452 .driver = {
Paul Mundt54407112012-07-20 16:18:21 +0900453 .name = DRV_NAME,
Paul Mundtca5481c62012-07-10 12:08:14 +0900454 .owner = THIS_MODULE,
455 },
456};
457
458static struct platform_device sh_pfc_pinctrl_device = {
Paul Mundt54407112012-07-20 16:18:21 +0900459 .name = DRV_NAME,
Paul Mundtca5481c62012-07-10 12:08:14 +0900460 .id = -1,
461};
462
463static int __init sh_pfc_pinctrl_init(void)
464{
465 int rc;
466
467 rc = platform_driver_register(&sh_pfc_pinctrl_driver);
468 if (likely(!rc)) {
469 rc = platform_device_register(&sh_pfc_pinctrl_device);
470 if (unlikely(rc))
471 platform_driver_unregister(&sh_pfc_pinctrl_driver);
472 }
473
474 return rc;
475}
476
477static void __exit sh_pfc_pinctrl_exit(void)
478{
479 platform_driver_unregister(&sh_pfc_pinctrl_driver);
480}
481
482subsys_initcall(sh_pfc_pinctrl_init);
483module_exit(sh_pfc_pinctrl_exit);