Skip to content

Commit

Permalink
pinctrl: mvebu: Fix devinit_dove_pinctrl_probe function
Browse files Browse the repository at this point in the history
[ Upstream commit c254784 ]

When an error occurs during the execution of the function
__devinit_dove_pinctrl_probe, the clk is not properly disabled.

Fix this by calling clk_disable_unprepare before return.

Fixes: ba607b6 ("pinctrl: mvebu: make pdma clock on dove mandatory")
Signed-off-by: Wang Jianzheng <wangjianzheng@vivo.com>
Link: https://lore.kernel.org/20240829064823.19808-1-wangjianzheng@vivo.com
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
Wang Jianzheng authored and gregkh committed Oct 4, 2024
1 parent a685bc3 commit 4c49d34
Showing 1 changed file with 29 additions and 13 deletions.
42 changes: 29 additions & 13 deletions drivers/pinctrl/mvebu/pinctrl-dove.c
Original file line number Diff line number Diff line change
Expand Up @@ -767,7 +767,7 @@ static int dove_pinctrl_probe(struct platform_device *pdev)
struct resource fb_res;
struct mvebu_mpp_ctrl_data *mpp_data;
void __iomem *base;
int i;
int i, ret;

pdev->dev.platform_data = (void *)device_get_match_data(&pdev->dev);

Expand All @@ -783,13 +783,17 @@ static int dove_pinctrl_probe(struct platform_device *pdev)
clk_prepare_enable(clk);

base = devm_platform_get_and_ioremap_resource(pdev, 0, &mpp_res);
if (IS_ERR(base))
return PTR_ERR(base);
if (IS_ERR(base)) {
ret = PTR_ERR(base);
goto err_probe;
}

mpp_data = devm_kcalloc(&pdev->dev, dove_pinctrl_info.ncontrols,
sizeof(*mpp_data), GFP_KERNEL);
if (!mpp_data)
return -ENOMEM;
if (!mpp_data) {
ret = -ENOMEM;
goto err_probe;
}

dove_pinctrl_info.control_data = mpp_data;
for (i = 0; i < ARRAY_SIZE(dove_mpp_controls); i++)
Expand All @@ -808,8 +812,10 @@ static int dove_pinctrl_probe(struct platform_device *pdev)
}

mpp4_base = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(mpp4_base))
return PTR_ERR(mpp4_base);
if (IS_ERR(mpp4_base)) {
ret = PTR_ERR(mpp4_base);
goto err_probe;
}

res = platform_get_resource(pdev, IORESOURCE_MEM, 2);
if (!res) {
Expand All @@ -820,8 +826,10 @@ static int dove_pinctrl_probe(struct platform_device *pdev)
}

pmu_base = devm_ioremap_resource(&pdev->dev, res);
if (IS_ERR(pmu_base))
return PTR_ERR(pmu_base);
if (IS_ERR(pmu_base)) {
ret = PTR_ERR(pmu_base);
goto err_probe;
}

gconfmap = syscon_regmap_lookup_by_compatible("marvell,dove-global-config");
if (IS_ERR(gconfmap)) {
Expand All @@ -831,19 +839,27 @@ static int dove_pinctrl_probe(struct platform_device *pdev)
adjust_resource(&fb_res,
(mpp_res->start & INT_REGS_MASK) + GC_REGS_OFFS, 0x14);
gc_base = devm_ioremap_resource(&pdev->dev, &fb_res);
if (IS_ERR(gc_base))
return PTR_ERR(gc_base);
if (IS_ERR(gc_base)) {
ret = PTR_ERR(gc_base);
goto err_probe;
}

gconfmap = devm_regmap_init_mmio(&pdev->dev,
gc_base, &gc_regmap_config);
if (IS_ERR(gconfmap))
return PTR_ERR(gconfmap);
if (IS_ERR(gconfmap)) {
ret = PTR_ERR(gconfmap);
goto err_probe;
}
}

/* Warn on any missing DT resource */
if (fb_res.start)
dev_warn(&pdev->dev, FW_BUG "Missing pinctrl regs in DTB. Please update your firmware.\n");

return mvebu_pinctrl_probe(pdev);
err_probe:
clk_disable_unprepare(clk);
return ret;
}

static struct platform_driver dove_pinctrl_driver = {
Expand Down

0 comments on commit 4c49d34

Please sign in to comment.