4.18-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tony Lindgren tony@atomide.com
[ Upstream commit f913cfce4ee49a3382a9ff95696f49a46e56e974 ]
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 Signed-off-by: Sasha Levin alexander.levin@microsoft.com Signed-off-by: Greg Kroah-Hartman gregkh@linuxfoundation.org --- drivers/pinctrl/pinmux.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
--- a/drivers/pinctrl/pinmux.c +++ b/drivers/pinctrl/pinmux.c @@ -308,7 +308,6 @@ static int pinmux_func_name_to_selector( selector++; }
- dev_err(pctldev->dev, "function '%s' not supported\n", function); return -EINVAL; }
@@ -775,6 +774,16 @@ int pinmux_generic_add_function(struct p void *data) { struct function_desc *function; + int selector; + + if (!name) + return -EINVAL; + + selector = pinmux_func_name_to_selector(pctldev, name); + if (selector >= 0) + return selector; + + selector = pctldev->num_functions;
function = devm_kzalloc(pctldev->dev, sizeof(*function), GFP_KERNEL); if (!function) @@ -785,12 +794,11 @@ int pinmux_generic_add_function(struct p function->num_group_names = num_groups; function->data = data;
- radix_tree_insert(&pctldev->pin_function_tree, pctldev->num_functions, - function); + radix_tree_insert(&pctldev->pin_function_tree, selector, function);
pctldev->num_functions++;
- return 0; + return selector; } EXPORT_SYMBOL_GPL(pinmux_generic_add_function);