2022-06-27 09:23:03

by Emil Renner Berthing

[permalink] [raw]
Subject: [PATCH] pinctrl: starfive: Serialize adding groups and functions

From: Jianlong Huang <[email protected]>

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 <[email protected]>
Signed-off-by: Emil Renner Berthing <[email protected]>
---
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 2a86c1035cc8..3eb40e230d98 100644
--- a/drivers/pinctrl/pinctrl-starfive.c
+++ b/drivers/pinctrl/pinctrl-starfive.c
@@ -207,6 +207,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,
@@ -522,6 +523,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;
@@ -615,12 +617,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;
}

@@ -1267,6 +1271,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)
--
2.36.1


2022-07-11 09:09:32

by Linus Walleij

[permalink] [raw]
Subject: Re: [PATCH] pinctrl: starfive: Serialize adding groups and functions

On Mon, Jun 27, 2022 at 10:53 AM Emil Renner Berthing
<[email protected]> wrote:

> From: Jianlong Huang <[email protected]>
>
> 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 <[email protected]>
> Signed-off-by: Emil Renner Berthing <[email protected]>

Patch applied! Sorry for taking so long, I think I was waiting for
maintainer feedback that never arrived.

Yours,
Linus Walleij