| From foo@baz Mon Sep 24 09:45:39 CEST 2018 |
| From: Tony Lindgren <tony@atomide.com> |
| Date: Thu, 5 Jul 2018 02:10:17 -0700 |
| Subject: pinctrl: rza1: Fix selector use for groups and functions |
| |
| From: Tony Lindgren <tony@atomide.com> |
| |
| [ Upstream commit dc4003d260594aa300028c3c5d040c5719abd19b ] |
| |
| We must use a mutex around the generic_add functions and save the |
| function and group selector in case we need to remove them. Otherwise |
| the selector use will be racy for deferred probe at least. |
| |
| Fixes: 5a49b644b307 ("pinctrl: Renesas RZ/A1 pin and gpio controller") |
| Reported-by: H. Nikolaus Schaller <hns@goldelico.com> |
| Cc: Christ van Willegen <cvwillegen@gmail.com> |
| Cc: Haojian Zhuang <haojian.zhuang@linaro.org> |
| Cc: Paul Cercueil <paul@crapouillou.net> |
| Cc: Sean Wang <sean.wang@mediatek.com> |
| Acked-by: Jacopo Mondi <jacopo@jmondi.org> |
| 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/pinctrl-rza1.c | 24 +++++++++++++----------- |
| 1 file changed, 13 insertions(+), 11 deletions(-) |
| |
| --- a/drivers/pinctrl/pinctrl-rza1.c |
| +++ b/drivers/pinctrl/pinctrl-rza1.c |
| @@ -1006,6 +1006,7 @@ static int rza1_dt_node_to_map(struct pi |
| const char *grpname; |
| const char **fngrps; |
| int ret, npins; |
| + int gsel, fsel; |
| |
| npins = rza1_dt_node_pin_count(np); |
| if (npins < 0) { |
| @@ -1055,18 +1056,19 @@ static int rza1_dt_node_to_map(struct pi |
| fngrps[0] = grpname; |
| |
| mutex_lock(&rza1_pctl->mutex); |
| - ret = pinctrl_generic_add_group(pctldev, grpname, grpins, npins, |
| - NULL); |
| - if (ret) { |
| + gsel = pinctrl_generic_add_group(pctldev, grpname, grpins, npins, |
| + NULL); |
| + if (gsel < 0) { |
| mutex_unlock(&rza1_pctl->mutex); |
| - return ret; |
| + return gsel; |
| } |
| |
| - ret = pinmux_generic_add_function(pctldev, grpname, fngrps, 1, |
| - mux_confs); |
| - if (ret) |
| + fsel = pinmux_generic_add_function(pctldev, grpname, fngrps, 1, |
| + mux_confs); |
| + if (fsel < 0) { |
| + ret = fsel; |
| goto remove_group; |
| - mutex_unlock(&rza1_pctl->mutex); |
| + } |
| |
| dev_info(rza1_pctl->dev, "Parsed function and group %s with %d pins\n", |
| grpname, npins); |
| @@ -1083,15 +1085,15 @@ static int rza1_dt_node_to_map(struct pi |
| (*map)->data.mux.group = np->name; |
| (*map)->data.mux.function = np->name; |
| *num_maps = 1; |
| + mutex_unlock(&rza1_pctl->mutex); |
| |
| return 0; |
| |
| remove_function: |
| - mutex_lock(&rza1_pctl->mutex); |
| - pinmux_generic_remove_last_function(pctldev); |
| + pinmux_generic_remove_function(pctldev, fsel); |
| |
| remove_group: |
| - pinctrl_generic_remove_last_group(pctldev); |
| + pinctrl_generic_remove_group(pctldev, gsel); |
| mutex_unlock(&rza1_pctl->mutex); |
| |
| dev_info(rza1_pctl->dev, "Unable to parse function and group %s\n", |