diff options
Diffstat (limited to 'drivers/pinctrl/pinmux.c')
| -rw-r--r-- | drivers/pinctrl/pinmux.c | 81 |
1 files changed, 43 insertions, 38 deletions
diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c index a76a348321bb..7c3193f7a044 100644 --- a/drivers/pinctrl/pinmux.c +++ b/drivers/pinctrl/pinmux.c | |||
| @@ -53,11 +53,6 @@ struct pinmux_group { | |||
| 53 | * @dev: the device using this pinmux | 53 | * @dev: the device using this pinmux |
| 54 | * @usecount: the number of active users of this mux setting, used to keep | 54 | * @usecount: the number of active users of this mux setting, used to keep |
| 55 | * track of nested use cases | 55 | * track of nested use cases |
| 56 | * @pins: an array of discrete physical pins used in this mapping, taken | ||
| 57 | * from the global pin enumeration space (copied from pinmux map) | ||
| 58 | * @num_pins: the number of pins in this mapping array, i.e. the number of | ||
| 59 | * elements in .pins so we can iterate over that array (copied from | ||
| 60 | * pinmux map) | ||
| 61 | * @pctldev: pin control device handling this pinmux | 56 | * @pctldev: pin control device handling this pinmux |
| 62 | * @func_selector: the function selector for the pinmux device handling | 57 | * @func_selector: the function selector for the pinmux device handling |
| 63 | * this pinmux | 58 | * this pinmux |
| @@ -152,8 +147,7 @@ static int pin_request(struct pinctrl_dev *pctldev, | |||
| 152 | status = 0; | 147 | status = 0; |
| 153 | 148 | ||
| 154 | if (status) | 149 | if (status) |
| 155 | dev_err(pctldev->dev, "->request on device %s failed " | 150 | dev_err(pctldev->dev, "->request on device %s failed for pin %d\n", |
| 156 | "for pin %d\n", | ||
| 157 | pctldev->desc->name, pin); | 151 | pctldev->desc->name, pin); |
| 158 | out_free_pin: | 152 | out_free_pin: |
| 159 | if (status) { | 153 | if (status) { |
| @@ -355,21 +349,20 @@ int __init pinmux_register_mappings(struct pinmux_map const *maps, | |||
| 355 | /* First sanity check the new mapping */ | 349 | /* First sanity check the new mapping */ |
| 356 | for (i = 0; i < num_maps; i++) { | 350 | for (i = 0; i < num_maps; i++) { |
| 357 | if (!maps[i].name) { | 351 | if (!maps[i].name) { |
| 358 | pr_err("failed to register map %d: " | 352 | pr_err("failed to register map %d: no map name given\n", |
| 359 | "no map name given\n", i); | 353 | i); |
| 360 | return -EINVAL; | 354 | return -EINVAL; |
| 361 | } | 355 | } |
| 362 | 356 | ||
| 363 | if (!maps[i].ctrl_dev && !maps[i].ctrl_dev_name) { | 357 | if (!maps[i].ctrl_dev && !maps[i].ctrl_dev_name) { |
| 364 | pr_err("failed to register map %s (%d): " | 358 | pr_err("failed to register map %s (%d): no pin control device given\n", |
| 365 | "no pin control device given\n", | ||
| 366 | maps[i].name, i); | 359 | maps[i].name, i); |
| 367 | return -EINVAL; | 360 | return -EINVAL; |
| 368 | } | 361 | } |
| 369 | 362 | ||
| 370 | if (!maps[i].function) { | 363 | if (!maps[i].function) { |
| 371 | pr_err("failed to register map %s (%d): " | 364 | pr_err("failed to register map %s (%d): no function ID given\n", |
| 372 | "no function ID given\n", maps[i].name, i); | 365 | maps[i].name, i); |
| 373 | return -EINVAL; | 366 | return -EINVAL; |
| 374 | } | 367 | } |
| 375 | 368 | ||
| @@ -411,7 +404,7 @@ int __init pinmux_register_mappings(struct pinmux_map const *maps, | |||
| 411 | } | 404 | } |
| 412 | 405 | ||
| 413 | /** | 406 | /** |
| 414 | * acquire_pins() - acquire all the pins for a certain funcion on a pinmux | 407 | * acquire_pins() - acquire all the pins for a certain function on a pinmux |
| 415 | * @pctldev: the device to take the pins on | 408 | * @pctldev: the device to take the pins on |
| 416 | * @func_selector: the function selector to acquire the pins for | 409 | * @func_selector: the function selector to acquire the pins for |
| 417 | * @group_selector: the group selector containing the pins to acquire | 410 | * @group_selector: the group selector containing the pins to acquire |
| @@ -442,8 +435,7 @@ static int acquire_pins(struct pinctrl_dev *pctldev, | |||
| 442 | ret = pin_request(pctldev, pins[i], func, NULL); | 435 | ret = pin_request(pctldev, pins[i], func, NULL); |
| 443 | if (ret) { | 436 | if (ret) { |
| 444 | dev_err(pctldev->dev, | 437 | dev_err(pctldev->dev, |
| 445 | "could not get pin %d for function %s " | 438 | "could not get pin %d for function %s on device %s - conflicting mux mappings?\n", |
| 446 | "on device %s - conflicting mux mappings?\n", | ||
| 447 | pins[i], func ? : "(undefined)", | 439 | pins[i], func ? : "(undefined)", |
| 448 | pinctrl_dev_get_name(pctldev)); | 440 | pinctrl_dev_get_name(pctldev)); |
| 449 | /* On error release all taken pins */ | 441 | /* On error release all taken pins */ |
| @@ -458,7 +450,7 @@ static int acquire_pins(struct pinctrl_dev *pctldev, | |||
| 458 | 450 | ||
| 459 | /** | 451 | /** |
| 460 | * release_pins() - release pins taken by earlier acquirement | 452 | * release_pins() - release pins taken by earlier acquirement |
| 461 | * @pctldev: the device to free the pinx on | 453 | * @pctldev: the device to free the pins on |
| 462 | * @group_selector: the group selector containing the pins to free | 454 | * @group_selector: the group selector containing the pins to free |
| 463 | */ | 455 | */ |
| 464 | static void release_pins(struct pinctrl_dev *pctldev, | 456 | static void release_pins(struct pinctrl_dev *pctldev, |
| @@ -473,8 +465,7 @@ static void release_pins(struct pinctrl_dev *pctldev, | |||
| 473 | ret = pctlops->get_group_pins(pctldev, group_selector, | 465 | ret = pctlops->get_group_pins(pctldev, group_selector, |
| 474 | &pins, &num_pins); | 466 | &pins, &num_pins); |
| 475 | if (ret) { | 467 | if (ret) { |
| 476 | dev_err(pctldev->dev, "could not get pins to release for " | 468 | dev_err(pctldev->dev, "could not get pins to release for group selector %d\n", |
| 477 | "group selector %d\n", | ||
| 478 | group_selector); | 469 | group_selector); |
| 479 | return; | 470 | return; |
| 480 | } | 471 | } |
| @@ -526,8 +517,7 @@ static int pinmux_check_pin_group(struct pinctrl_dev *pctldev, | |||
| 526 | ret = pinctrl_get_group_selector(pctldev, groups[0]); | 517 | ret = pinctrl_get_group_selector(pctldev, groups[0]); |
| 527 | if (ret < 0) { | 518 | if (ret < 0) { |
| 528 | dev_err(pctldev->dev, | 519 | dev_err(pctldev->dev, |
| 529 | "function %s wants group %s but the pin " | 520 | "function %s wants group %s but the pin controller does not seem to have that group\n", |
| 530 | "controller does not seem to have that group\n", | ||
| 531 | pmxops->get_function_name(pctldev, func_selector), | 521 | pmxops->get_function_name(pctldev, func_selector), |
| 532 | groups[0]); | 522 | groups[0]); |
| 533 | return ret; | 523 | return ret; |
| @@ -535,8 +525,7 @@ static int pinmux_check_pin_group(struct pinctrl_dev *pctldev, | |||
| 535 | 525 | ||
| 536 | if (num_groups > 1) | 526 | if (num_groups > 1) |
| 537 | dev_dbg(pctldev->dev, | 527 | dev_dbg(pctldev->dev, |
| 538 | "function %s support more than one group, " | 528 | "function %s support more than one group, default-selecting first group %s (%d)\n", |
| 539 | "default-selecting first group %s (%d)\n", | ||
| 540 | pmxops->get_function_name(pctldev, func_selector), | 529 | pmxops->get_function_name(pctldev, func_selector), |
| 541 | groups[0], | 530 | groups[0], |
| 542 | ret); | 531 | ret); |
| @@ -628,10 +617,8 @@ static int pinmux_enable_muxmap(struct pinctrl_dev *pctldev, | |||
| 628 | 617 | ||
| 629 | if (pmx->pctldev && pmx->pctldev != pctldev) { | 618 | if (pmx->pctldev && pmx->pctldev != pctldev) { |
| 630 | dev_err(pctldev->dev, | 619 | dev_err(pctldev->dev, |
| 631 | "different pin control devices given for device %s, " | 620 | "different pin control devices given for device %s, function %s\n", |
| 632 | "function %s\n", | 621 | devname, map->function); |
| 633 | devname, | ||
| 634 | map->function); | ||
| 635 | return -EINVAL; | 622 | return -EINVAL; |
| 636 | } | 623 | } |
| 637 | pmx->dev = dev; | 624 | pmx->dev = dev; |
| @@ -695,7 +682,6 @@ static void pinmux_free_groups(struct pinmux *pmx) | |||
| 695 | */ | 682 | */ |
| 696 | struct pinmux *pinmux_get(struct device *dev, const char *name) | 683 | struct pinmux *pinmux_get(struct device *dev, const char *name) |
| 697 | { | 684 | { |
| 698 | |||
| 699 | struct pinmux_map const *map = NULL; | 685 | struct pinmux_map const *map = NULL; |
| 700 | struct pinctrl_dev *pctldev = NULL; | 686 | struct pinctrl_dev *pctldev = NULL; |
| 701 | const char *devname = NULL; | 687 | const char *devname = NULL; |
| @@ -745,8 +731,7 @@ struct pinmux *pinmux_get(struct device *dev, const char *name) | |||
| 745 | else if (map->ctrl_dev_name) | 731 | else if (map->ctrl_dev_name) |
| 746 | devname = map->ctrl_dev_name; | 732 | devname = map->ctrl_dev_name; |
| 747 | 733 | ||
| 748 | pr_warning("could not find a pinctrl device for pinmux " | 734 | pr_warning("could not find a pinctrl device for pinmux function %s, fishy, they shall all have one\n", |
| 749 | "function %s, fishy, they shall all have one\n", | ||
| 750 | map->function); | 735 | map->function); |
| 751 | pr_warning("given pinctrl device name: %s", | 736 | pr_warning("given pinctrl device name: %s", |
| 752 | devname ? devname : "UNDEFINED"); | 737 | devname ? devname : "UNDEFINED"); |
| @@ -904,8 +889,11 @@ void pinmux_disable(struct pinmux *pmx) | |||
| 904 | } | 889 | } |
| 905 | EXPORT_SYMBOL_GPL(pinmux_disable); | 890 | EXPORT_SYMBOL_GPL(pinmux_disable); |
| 906 | 891 | ||
| 907 | int pinmux_check_ops(const struct pinmux_ops *ops) | 892 | int pinmux_check_ops(struct pinctrl_dev *pctldev) |
| 908 | { | 893 | { |
| 894 | const struct pinmux_ops *ops = pctldev->desc->pmxops; | ||
| 895 | unsigned selector = 0; | ||
| 896 | |||
| 909 | /* Check that we implement required operations */ | 897 | /* Check that we implement required operations */ |
| 910 | if (!ops->list_functions || | 898 | if (!ops->list_functions || |
| 911 | !ops->get_function_name || | 899 | !ops->get_function_name || |
| @@ -914,6 +902,18 @@ int pinmux_check_ops(const struct pinmux_ops *ops) | |||
| 914 | !ops->disable) | 902 | !ops->disable) |
| 915 | return -EINVAL; | 903 | return -EINVAL; |
| 916 | 904 | ||
| 905 | /* Check that all functions registered have names */ | ||
| 906 | while (ops->list_functions(pctldev, selector) >= 0) { | ||
| 907 | const char *fname = ops->get_function_name(pctldev, | ||
| 908 | selector); | ||
| 909 | if (!fname) { | ||
| 910 | pr_err("pinmux ops has no name for function%u\n", | ||
| 911 | selector); | ||
| 912 | return -EINVAL; | ||
| 913 | } | ||
| 914 | selector++; | ||
| 915 | } | ||
| 916 | |||
| 917 | return 0; | 917 | return 0; |
| 918 | } | 918 | } |
| 919 | 919 | ||
| @@ -932,8 +932,8 @@ static int pinmux_hog_map(struct pinctrl_dev *pctldev, | |||
| 932 | * without any problems, so then we can hog pinmuxes for | 932 | * without any problems, so then we can hog pinmuxes for |
| 933 | * all devices that just want a static pin mux at this point. | 933 | * all devices that just want a static pin mux at this point. |
| 934 | */ | 934 | */ |
| 935 | dev_err(pctldev->dev, "map %s wants to hog a non-system " | 935 | dev_err(pctldev->dev, "map %s wants to hog a non-system pinmux, this is not going to work\n", |
| 936 | "pinmux, this is not going to work\n", map->name); | 936 | map->name); |
| 937 | return -EINVAL; | 937 | return -EINVAL; |
| 938 | } | 938 | } |
| 939 | 939 | ||
| @@ -993,9 +993,12 @@ int pinmux_hog_maps(struct pinctrl_dev *pctldev) | |||
| 993 | for (i = 0; i < pinmux_maps_num; i++) { | 993 | for (i = 0; i < pinmux_maps_num; i++) { |
| 994 | struct pinmux_map const *map = &pinmux_maps[i]; | 994 | struct pinmux_map const *map = &pinmux_maps[i]; |
| 995 | 995 | ||
| 996 | if (((map->ctrl_dev == dev) || | 996 | if (!map->hog_on_boot) |
| 997 | !strcmp(map->ctrl_dev_name, devname)) && | 997 | continue; |
| 998 | map->hog_on_boot) { | 998 | |
| 999 | if ((map->ctrl_dev == dev) || | ||
| 1000 | (map->ctrl_dev_name && | ||
| 1001 | !strcmp(map->ctrl_dev_name, devname))) { | ||
| 999 | /* OK time to hog! */ | 1002 | /* OK time to hog! */ |
| 1000 | ret = pinmux_hog_map(pctldev, map); | 1003 | ret = pinmux_hog_map(pctldev, map); |
| 1001 | if (ret) | 1004 | if (ret) |
| @@ -1122,13 +1125,15 @@ static int pinmux_show(struct seq_file *s, void *what) | |||
| 1122 | 1125 | ||
| 1123 | seq_printf(s, "device: %s function: %s (%u),", | 1126 | seq_printf(s, "device: %s function: %s (%u),", |
| 1124 | pinctrl_dev_get_name(pmx->pctldev), | 1127 | pinctrl_dev_get_name(pmx->pctldev), |
| 1125 | pmxops->get_function_name(pctldev, pmx->func_selector), | 1128 | pmxops->get_function_name(pctldev, |
| 1129 | pmx->func_selector), | ||
| 1126 | pmx->func_selector); | 1130 | pmx->func_selector); |
| 1127 | 1131 | ||
| 1128 | seq_printf(s, " groups: ["); | 1132 | seq_printf(s, " groups: ["); |
| 1129 | list_for_each_entry(grp, &pmx->groups, node) { | 1133 | list_for_each_entry(grp, &pmx->groups, node) { |
| 1130 | seq_printf(s, " %s (%u)", | 1134 | seq_printf(s, " %s (%u)", |
| 1131 | pctlops->get_group_name(pctldev, grp->group_selector), | 1135 | pctlops->get_group_name(pctldev, |
| 1136 | grp->group_selector), | ||
| 1132 | grp->group_selector); | 1137 | grp->group_selector); |
| 1133 | } | 1138 | } |
| 1134 | seq_printf(s, " ]"); | 1139 | seq_printf(s, " ]"); |
