NAK: [SRU][J/starfive-5.17][PATCH 1/1] pinctrl: starfive: Serialize adding groups and functions
Tim Gardner
tim.gardner at canonical.com
Thu Jul 28 12:35:38 UTC 2022
On 7/28/22 06:04, Emil Renner Berthing wrote:
> From: Jianlong Huang <jianlong.huang at 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 at starfivetech.com>
> Signed-off-by: Emil Renner Berthing <kernel at esmil.dk>
> Link: https://lore.kernel.org/r/20220627085333.1774396-1-emil.renner.berthing@canonical.com
> Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
> (cherry picked from commit e2961cd685fe548f0ffd6c7bd3ae6a491301b1e4)
(cherry picked from commit e2961cd685fe548f0ffd6c7bd3ae6a491301b1e4
linux-next)
> Signed-off-by: Emil Renner Berthing <emil.renner.berthing at 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)
--
-----------
Tim Gardner
Canonical, Inc
More information about the kernel-team
mailing list