diff mbox series

[SRU,J/starfive-5.17,1/1] pinctrl: starfive: Serialize adding groups and functions

Message ID 20220728120432.736696-2-emil.renner.berthing@canonical.com
State New
Headers show
Series Fix pinctrl-starfive race | expand

Commit Message

Emil Renner Berthing July 28, 2022, 12:04 p.m. UTC
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)
Signed-off-by: Emil Renner Berthing <emil.renner.berthing@canonical.com>
---
 drivers/pinctrl/pinctrl-starfive.c | 5 +++++
 1 file changed, 5 insertions(+)

Comments

Tim Gardner July 28, 2022, 12:35 p.m. UTC | #1
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 mbox series

Patch

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)