Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6b669f38 authored by Wang Jianzheng's avatar Wang Jianzheng Committed by Greg Kroah-Hartman
Browse files

pinctrl: mvebu: Fix devinit_dove_pinctrl_probe function



[ 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: ba607b62 ("pinctrl: mvebu: make pdma clock on dove mandatory")
Signed-off-by: default avatarWang Jianzheng <wangjianzheng@vivo.com>
Link: https://lore.kernel.org/20240829064823.19808-1-wangjianzheng@vivo.com


Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 4679497a
Loading
Loading
Loading
Loading
+29 −13
Original line number Diff line number Diff line
@@ -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;

@@ -786,13 +786,17 @@ static int dove_pinctrl_probe(struct platform_device *pdev)

	mpp_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	base = devm_ioremap_resource(&pdev->dev, 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++)
@@ -811,8 +815,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) {
@@ -823,8 +829,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)) {
@@ -834,12 +842,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 */
@@ -847,6 +860,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 = {