summaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl/pinmux.c
diff options
context:
space:
mode:
authorTony Lindgren <tony@atomide.com>2018-07-05 05:10:15 -0400
committerLinus Walleij <linus.walleij@linaro.org>2018-07-17 04:48:47 -0400
commitf913cfce4ee49a3382a9ff95696f49a46e56e974 (patch)
tree45cff803256ae9aed98bcb5b155b3402d516c4fb /drivers/pinctrl/pinmux.c
parenta203728ac6bbbed2fdcf0a2e807c5473efcfdb30 (diff)
pinctrl: pinmux: Return selector to the pinctrl driver
We must return the selector from pinmux_generic_add_function() so pin controller device drivers can remove the right group if needed for deferred probe for example. And we now must make sure that a proper name is passed so we can use it to check if the entry already exists. Note that fixes are also needed for the pin controller drivers to use the selector value. Fixes: a76edc89b100 ("pinctrl: core: Add generic pinctrl functions for managing groups") Reported-by: H. Nikolaus Schaller <hns@goldelico.com> Cc: Christ van Willegen <cvwillegen@gmail.com> Cc: Haojian Zhuang <haojian.zhuang@linaro.org> Cc: Jacopo Mondi <jacopo+renesas@jmondi.org> Cc: Paul Cercueil <paul@crapouillou.net> Cc: Sean Wang <sean.wang@mediatek.com> Signed-off-by: Tony Lindgren <tony@atomide.com> Tested-By: H. Nikolaus Schaller <hns@goldelico.com> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl/pinmux.c')
-rw-r--r--drivers/pinctrl/pinmux.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/drivers/pinctrl/pinmux.c b/drivers/pinctrl/pinmux.c
index d7c5b4abd741..5780442c068b 100644
--- a/drivers/pinctrl/pinmux.c
+++ b/drivers/pinctrl/pinmux.c
@@ -307,7 +307,6 @@ static int pinmux_func_name_to_selector(struct pinctrl_dev *pctldev,
307 selector++; 307 selector++;
308 } 308 }
309 309
310 dev_err(pctldev->dev, "function '%s' not supported\n", function);
311 return -EINVAL; 310 return -EINVAL;
312} 311}
313 312
@@ -774,6 +773,16 @@ int pinmux_generic_add_function(struct pinctrl_dev *pctldev,
774 void *data) 773 void *data)
775{ 774{
776 struct function_desc *function; 775 struct function_desc *function;
776 int selector;
777
778 if (!name)
779 return -EINVAL;
780
781 selector = pinmux_func_name_to_selector(pctldev, name);
782 if (selector >= 0)
783 return selector;
784
785 selector = pctldev->num_functions;
777 786
778 function = devm_kzalloc(pctldev->dev, sizeof(*function), GFP_KERNEL); 787 function = devm_kzalloc(pctldev->dev, sizeof(*function), GFP_KERNEL);
779 if (!function) 788 if (!function)
@@ -784,12 +793,11 @@ int pinmux_generic_add_function(struct pinctrl_dev *pctldev,
784 function->num_group_names = num_groups; 793 function->num_group_names = num_groups;
785 function->data = data; 794 function->data = data;
786 795
787 radix_tree_insert(&pctldev->pin_function_tree, pctldev->num_functions, 796 radix_tree_insert(&pctldev->pin_function_tree, selector, function);
788 function);
789 797
790 pctldev->num_functions++; 798 pctldev->num_functions++;
791 799
792 return 0; 800 return selector;
793} 801}
794EXPORT_SYMBOL_GPL(pinmux_generic_add_function); 802EXPORT_SYMBOL_GPL(pinmux_generic_add_function);
795 803