Message ID | 20220728120432.736696-2-emil.renner.berthing@canonical.com |
---|---|
State | New |
Headers | show |
Series | Fix pinctrl-starfive race | expand |
On 7/28/22 06:04, Emil Renner Berthing wrote: > From: Jianlong Huang <jianlong.huang@starfivetech.com> > > BugLink: https://bugs.launchpad.net/bugs/1983019 > > The pinctrl dt_node_to_map method may be called in parallel which leads > us to call pinconf_generic_add_group and pinconf_generic_add_function > in parallel. This is not supported though and leads to errors, so add a > mutex to serialize these calls. > > Signed-off-by: Jianlong Huang <jianlong.huang@starfivetech.com> > Signed-off-by: Emil Renner Berthing <kernel@esmil.dk> > Link: https://lore.kernel.org/r/20220627085333.1774396-1-emil.renner.berthing@canonical.com > Signed-off-by: Linus Walleij <linus.walleij@linaro.org> > (cherry picked from commit e2961cd685fe548f0ffd6c7bd3ae6a491301b1e4) (cherry picked from commit e2961cd685fe548f0ffd6c7bd3ae6a491301b1e4 linux-next) > Signed-off-by: Emil Renner Berthing <emil.renner.berthing@canonical.com> > --- > drivers/pinctrl/pinctrl-starfive.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/drivers/pinctrl/pinctrl-starfive.c b/drivers/pinctrl/pinctrl-starfive.c > index d2c9503a82c9..e563cdfcddef 100644 > --- a/drivers/pinctrl/pinctrl-starfive.c > +++ b/drivers/pinctrl/pinctrl-starfive.c > @@ -211,6 +211,7 @@ struct starfive_pinctrl { > void __iomem *base; > void __iomem *padctl; > struct pinctrl_dev *pctl; > + struct mutex mutex; /* serialize adding groups and functions */ > }; > > static inline unsigned int starfive_pin_to_gpio(const struct starfive_pinctrl *sfp, > @@ -526,6 +527,7 @@ static int starfive_dt_node_to_map(struct pinctrl_dev *pctldev, > > nmaps = 0; > ngroups = 0; > + mutex_lock(&sfp->mutex); > for_each_child_of_node(np, child) { > int npins; > int i; > @@ -619,12 +621,14 @@ static int starfive_dt_node_to_map(struct pinctrl_dev *pctldev, > > *maps = map; > *num_maps = nmaps; > + mutex_unlock(&sfp->mutex); > return 0; > > put_child: > of_node_put(child); > free_map: > pinctrl_utils_free_map(pctldev, map, nmaps); > + mutex_unlock(&sfp->mutex); > return ret; > } > > @@ -1325,6 +1329,7 @@ static int starfive_probe(struct platform_device *pdev) > platform_set_drvdata(pdev, sfp); > sfp->gc.parent = dev; > raw_spin_lock_init(&sfp->lock); > + mutex_init(&sfp->mutex); > > ret = devm_pinctrl_register_and_init(dev, &starfive_desc, sfp, &sfp->pctl); > if (ret)
diff --git a/drivers/pinctrl/pinctrl-starfive.c b/drivers/pinctrl/pinctrl-starfive.c index d2c9503a82c9..e563cdfcddef 100644 --- a/drivers/pinctrl/pinctrl-starfive.c +++ b/drivers/pinctrl/pinctrl-starfive.c @@ -211,6 +211,7 @@ struct starfive_pinctrl { void __iomem *base; void __iomem *padctl; struct pinctrl_dev *pctl; + struct mutex mutex; /* serialize adding groups and functions */ }; static inline unsigned int starfive_pin_to_gpio(const struct starfive_pinctrl *sfp, @@ -526,6 +527,7 @@ static int starfive_dt_node_to_map(struct pinctrl_dev *pctldev, nmaps = 0; ngroups = 0; + mutex_lock(&sfp->mutex); for_each_child_of_node(np, child) { int npins; int i; @@ -619,12 +621,14 @@ static int starfive_dt_node_to_map(struct pinctrl_dev *pctldev, *maps = map; *num_maps = nmaps; + mutex_unlock(&sfp->mutex); return 0; put_child: of_node_put(child); free_map: pinctrl_utils_free_map(pctldev, map, nmaps); + mutex_unlock(&sfp->mutex); return ret; } @@ -1325,6 +1329,7 @@ static int starfive_probe(struct platform_device *pdev) platform_set_drvdata(pdev, sfp); sfp->gc.parent = dev; raw_spin_lock_init(&sfp->lock); + mutex_init(&sfp->mutex); ret = devm_pinctrl_register_and_init(dev, &starfive_desc, sfp, &sfp->pctl); if (ret)