]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
pinctrl: mvebu: Fix devinit_dove_pinctrl_probe function
authorWang Jianzheng <wangjianzheng@vivo.com>
Thu, 29 Aug 2024 06:48:23 +0000 (14:48 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 17 Oct 2024 13:07:53 +0000 (15:07 +0200)
[ Upstream commit c25478419f6fd3f74c324a21ec007cf14f2688d7 ]

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: ba607b6238a1 ("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>
drivers/pinctrl/mvebu/pinctrl-dove.c

index bd74daa9ed666395131599c03e387a197a91bb36..c84326dfe371c71c22ccb23328cd9e972eaad2f1 100644 (file)
@@ -769,7 +769,7 @@ static int dove_pinctrl_probe(struct platform_device *pdev)
                of_match_device(dove_pinctrl_of_match, &pdev->dev);
        struct mvebu_mpp_ctrl_data *mpp_data;
        void __iomem *base;
-       int i;
+       int i, ret;
 
        pdev->dev.platform_data = (void *)match->data;
 
@@ -785,13 +785,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++)
@@ -810,8 +814,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) {
@@ -822,8 +828,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)) {
@@ -833,12 +841,17 @@ 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 */
@@ -846,6 +859,9 @@ static int dove_pinctrl_probe(struct platform_device *pdev)
                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 = {