aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl/pinmux.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pinctrl/pinmux.c')
-rw-r--r--drivers/pinctrl/pinmux.c69
1 files changed, 43 insertions, 26 deletions
diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c
index 56ca42e6a6ec..4852ebe5712e 100644
--- a/drivers/pinctrl/pinmux.c
+++ b/drivers/pinctrl/pinmux.c
@@ -58,6 +58,17 @@ int pinmux_check_ops(struct pinctrl_dev *pctldev)
58 return 0; 58 return 0;
59} 59}
60 60
61int pinmux_validate_map(struct pinctrl_map const *map, int i)
62{
63 if (!map->data.mux.function) {
64 pr_err("failed to register map %s (%d): no function given\n",
65 map->name, i);
66 return -EINVAL;
67 }
68
69 return 0;
70}
71
61/** 72/**
62 * pin_request() - request a single pin to be muxed in, typically for GPIO 73 * pin_request() - request a single pin to be muxed in, typically for GPIO
63 * @pin: the pin number in the global pin space 74 * @pin: the pin number in the global pin space
@@ -284,21 +295,21 @@ int pinmux_map_to_setting(struct pinctrl_map const *map,
284 const unsigned *pins; 295 const unsigned *pins;
285 unsigned num_pins; 296 unsigned num_pins;
286 297
287 setting->func_selector = 298 setting->data.mux.func =
288 pinmux_func_name_to_selector(pctldev, map->function); 299 pinmux_func_name_to_selector(pctldev, map->data.mux.function);
289 if (setting->func_selector < 0) 300 if (setting->data.mux.func < 0)
290 return setting->func_selector; 301 return setting->data.mux.func;
291 302
292 ret = pmxops->get_function_groups(pctldev, setting->func_selector, 303 ret = pmxops->get_function_groups(pctldev, setting->data.mux.func,
293 &groups, &num_groups); 304 &groups, &num_groups);
294 if (ret < 0) 305 if (ret < 0)
295 return ret; 306 return ret;
296 if (!num_groups) 307 if (!num_groups)
297 return -EINVAL; 308 return -EINVAL;
298 309
299 if (map->group) { 310 if (map->data.mux.group) {
300 bool found = false; 311 bool found = false;
301 group = map->group; 312 group = map->data.mux.group;
302 for (i = 0; i < num_groups; i++) { 313 for (i = 0; i < num_groups; i++) {
303 if (!strcmp(group, groups[i])) { 314 if (!strcmp(group, groups[i])) {
304 found = true; 315 found = true;
@@ -311,17 +322,16 @@ int pinmux_map_to_setting(struct pinctrl_map const *map,
311 group = groups[0]; 322 group = groups[0];
312 } 323 }
313 324
314 setting->group_selector = 325 setting->data.mux.group = pinctrl_get_group_selector(pctldev, group);
315 pinctrl_get_group_selector(pctldev, group); 326 if (setting->data.mux.group < 0)
316 if (setting->group_selector < 0) 327 return setting->data.mux.group;
317 return setting->group_selector;
318 328
319 ret = pctlops->get_group_pins(pctldev, setting->group_selector, 329 ret = pctlops->get_group_pins(pctldev, setting->data.mux.group, &pins,
320 &pins, &num_pins); 330 &num_pins);
321 if (ret) { 331 if (ret) {
322 dev_err(pctldev->dev, 332 dev_err(pctldev->dev,
323 "could not get pins for device %s group selector %d\n", 333 "could not get pins for device %s group selector %d\n",
324 pinctrl_dev_get_name(pctldev), setting->group_selector); 334 pinctrl_dev_get_name(pctldev), setting->data.mux.group);
325 return -ENODEV; 335 return -ENODEV;
326 } 336 }
327 337
@@ -352,12 +362,12 @@ void pinmux_free_setting(struct pinctrl_setting const *setting)
352 int ret; 362 int ret;
353 int i; 363 int i;
354 364
355 ret = pctlops->get_group_pins(pctldev, setting->group_selector, 365 ret = pctlops->get_group_pins(pctldev, setting->data.mux.group,
356 &pins, &num_pins); 366 &pins, &num_pins);
357 if (ret) { 367 if (ret) {
358 dev_err(pctldev->dev, 368 dev_err(pctldev->dev,
359 "could not get pins for device %s group selector %d\n", 369 "could not get pins for device %s group selector %d\n",
360 pinctrl_dev_get_name(pctldev), setting->group_selector); 370 pinctrl_dev_get_name(pctldev), setting->data.mux.group);
361 return; 371 return;
362 } 372 }
363 373
@@ -370,8 +380,8 @@ int pinmux_enable_setting(struct pinctrl_setting const *setting)
370 struct pinctrl_dev *pctldev = setting->pctldev; 380 struct pinctrl_dev *pctldev = setting->pctldev;
371 const struct pinmux_ops *ops = pctldev->desc->pmxops; 381 const struct pinmux_ops *ops = pctldev->desc->pmxops;
372 382
373 return ops->enable(pctldev, setting->func_selector, 383 return ops->enable(pctldev, setting->data.mux.func,
374 setting->group_selector); 384 setting->data.mux.group);
375} 385}
376 386
377void pinmux_disable_setting(struct pinctrl_setting const *setting) 387void pinmux_disable_setting(struct pinctrl_setting const *setting)
@@ -379,7 +389,7 @@ void pinmux_disable_setting(struct pinctrl_setting const *setting)
379 struct pinctrl_dev *pctldev = setting->pctldev; 389 struct pinctrl_dev *pctldev = setting->pctldev;
380 const struct pinmux_ops *ops = pctldev->desc->pmxops; 390 const struct pinmux_ops *ops = pctldev->desc->pmxops;
381 391
382 ops->disable(pctldev, setting->func_selector, setting->group_selector); 392 ops->disable(pctldev, setting->data.mux.func, setting->data.mux.group);
383} 393}
384 394
385#ifdef CONFIG_DEBUG_FS 395#ifdef CONFIG_DEBUG_FS
@@ -456,18 +466,25 @@ static int pinmux_pins_show(struct seq_file *s, void *what)
456 return 0; 466 return 0;
457} 467}
458 468
459void pinmux_dbg_show(struct seq_file *s, struct pinctrl_setting const *setting) 469void pinmux_show_map(struct seq_file *s, struct pinctrl_map const *map)
470{
471 seq_printf(s, "group %s\nfunction %s\n",
472 map->data.mux.group ? map->data.mux.group : "(default)",
473 map->data.mux.function);
474}
475
476void pinmux_show_setting(struct seq_file *s,
477 struct pinctrl_setting const *setting)
460{ 478{
461 struct pinctrl_dev *pctldev = setting->pctldev; 479 struct pinctrl_dev *pctldev = setting->pctldev;
462 const struct pinmux_ops *pmxops = pctldev->desc->pmxops; 480 const struct pinmux_ops *pmxops = pctldev->desc->pmxops;
463 const struct pinctrl_ops *pctlops = pctldev->desc->pctlops; 481 const struct pinctrl_ops *pctlops = pctldev->desc->pctlops;
464 482
465 seq_printf(s, "controller: %s group: %s (%u) function: %s (%u)\n", 483 seq_printf(s, "group: %s (%u) function: %s (%u)\n",
466 pinctrl_dev_get_name(pctldev), 484 pctlops->get_group_name(pctldev, setting->data.mux.group),
467 pctlops->get_group_name(pctldev, setting->group_selector), 485 setting->data.mux.group,
468 setting->group_selector, 486 pmxops->get_function_name(pctldev, setting->data.mux.func),
469 pmxops->get_function_name(pctldev, setting->func_selector), 487 setting->data.mux.func);
470 setting->func_selector);
471} 488}
472 489
473static int pinmux_functions_open(struct inode *inode, struct file *file) 490static int pinmux_functions_open(struct inode *inode, struct file *file)