pinctrl: ocelot: add missing destroy_workqueue() in error path in ocelot_pinctrl_probe()
[ Upstream commit8ada020ade
] Using devm_add_action_or_reset() to make workqueue device-managed, so it can be destroy whenever the driver is unbound. Fixes:c297561bc9
("pinctrl: ocelot: Fix interrupt controller") Signed-off-by: Yang Yingliang <yangyingliang@huawei.com> Reviewed-by: Horatiu Vultur <horatiu.vultur@microchip.com> Link: https://lore.kernel.org/r/20220925021258.1492905-1-yangyingliang@huawei.com Signed-off-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
55442d2f2c
commit
e02b42f3fc
|
@ -2047,6 +2047,11 @@ static struct regmap *ocelot_pinctrl_create_pincfg(struct platform_device *pdev,
|
||||||
return devm_regmap_init_mmio(&pdev->dev, base, ®map_config);
|
return devm_regmap_init_mmio(&pdev->dev, base, ®map_config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ocelot_destroy_workqueue(void *data)
|
||||||
|
{
|
||||||
|
destroy_workqueue(data);
|
||||||
|
}
|
||||||
|
|
||||||
static int ocelot_pinctrl_probe(struct platform_device *pdev)
|
static int ocelot_pinctrl_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
const struct ocelot_match_data *data;
|
const struct ocelot_match_data *data;
|
||||||
|
@ -2078,6 +2083,11 @@ static int ocelot_pinctrl_probe(struct platform_device *pdev)
|
||||||
if (!info->wq)
|
if (!info->wq)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
ret = devm_add_action_or_reset(dev, ocelot_destroy_workqueue,
|
||||||
|
info->wq);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
info->pincfg_data = &data->pincfg_data;
|
info->pincfg_data = &data->pincfg_data;
|
||||||
|
|
||||||
reset = devm_reset_control_get_optional_shared(dev, "switch");
|
reset = devm_reset_control_get_optional_shared(dev, "switch");
|
||||||
|
@ -2119,15 +2129,6 @@ static int ocelot_pinctrl_probe(struct platform_device *pdev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ocelot_pinctrl_remove(struct platform_device *pdev)
|
|
||||||
{
|
|
||||||
struct ocelot_pinctrl *info = platform_get_drvdata(pdev);
|
|
||||||
|
|
||||||
destroy_workqueue(info->wq);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct platform_driver ocelot_pinctrl_driver = {
|
static struct platform_driver ocelot_pinctrl_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "pinctrl-ocelot",
|
.name = "pinctrl-ocelot",
|
||||||
|
@ -2135,7 +2136,6 @@ static struct platform_driver ocelot_pinctrl_driver = {
|
||||||
.suppress_bind_attrs = true,
|
.suppress_bind_attrs = true,
|
||||||
},
|
},
|
||||||
.probe = ocelot_pinctrl_probe,
|
.probe = ocelot_pinctrl_probe,
|
||||||
.remove = ocelot_pinctrl_remove,
|
|
||||||
};
|
};
|
||||||
module_platform_driver(ocelot_pinctrl_driver);
|
module_platform_driver(ocelot_pinctrl_driver);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue