Commit afc0cbc6 authored by Zhang Heng's avatar Zhang Heng Committed by Joerg Roedel
Browse files

iommu/msm: Use helper function devm_clk_get_prepared()



Since commit 7ef9651e ("clk: Provide new devm_clk helpers for prepared
and enabled clocks"), devm_clk_get() and clk_prepare() can now be replaced
by devm_clk_get_prepared() when driver prepares the clocks for the whole
lifetime of the device. Moreover, it is no longer necessary to unprepare
the clocks explicitly.

Signed-off-by: default avatarZhang Heng <zhangheng@kylinos.cn>
Reviewed-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Link: https://lore.kernel.org/r/20250103113059.463033-1-zhangheng@kylinos.cn


Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent 78d4f34e
Loading
Loading
Loading
Loading
+11 −40
Original line number Diff line number Diff line
@@ -725,47 +725,32 @@ static int msm_iommu_probe(struct platform_device *pdev)
	iommu->dev = &pdev->dev;
	INIT_LIST_HEAD(&iommu->ctx_list);

	iommu->pclk = devm_clk_get(iommu->dev, "smmu_pclk");
	iommu->pclk = devm_clk_get_prepared(iommu->dev, "smmu_pclk");
	if (IS_ERR(iommu->pclk))
		return dev_err_probe(iommu->dev, PTR_ERR(iommu->pclk),
				     "could not get smmu_pclk\n");

	ret = clk_prepare(iommu->pclk);
	if (ret)
		return dev_err_probe(iommu->dev, ret,
				     "could not prepare smmu_pclk\n");

	iommu->clk = devm_clk_get(iommu->dev, "iommu_clk");
	if (IS_ERR(iommu->clk)) {
		clk_unprepare(iommu->pclk);
	iommu->clk = devm_clk_get_prepared(iommu->dev, "iommu_clk");
	if (IS_ERR(iommu->clk))
		return dev_err_probe(iommu->dev, PTR_ERR(iommu->clk),
				     "could not get iommu_clk\n");
	}

	ret = clk_prepare(iommu->clk);
	if (ret) {
		clk_unprepare(iommu->pclk);
		return dev_err_probe(iommu->dev, ret, "could not prepare iommu_clk\n");
	}

	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	iommu->base = devm_ioremap_resource(iommu->dev, r);
	if (IS_ERR(iommu->base)) {
		ret = dev_err_probe(iommu->dev, PTR_ERR(iommu->base), "could not get iommu base\n");
		goto fail;
		return ret;
	}
	ioaddr = r->start;

	iommu->irq = platform_get_irq(pdev, 0);
	if (iommu->irq < 0) {
		ret = -ENODEV;
		goto fail;
	}
	if (iommu->irq < 0)
		return -ENODEV;

	ret = of_property_read_u32(iommu->dev->of_node, "qcom,ncb", &val);
	if (ret) {
		dev_err(iommu->dev, "could not get ncb\n");
		goto fail;
		return ret;
	}
	iommu->ncb = val;

@@ -780,8 +765,7 @@ static int msm_iommu_probe(struct platform_device *pdev)

	if (!par) {
		pr_err("Invalid PAR value detected\n");
		ret = -ENODEV;
		goto fail;
		return -ENODEV;
	}

	ret = devm_request_threaded_irq(iommu->dev, iommu->irq, NULL,
@@ -791,7 +775,7 @@ static int msm_iommu_probe(struct platform_device *pdev)
					iommu);
	if (ret) {
		pr_err("Request IRQ %d failed with ret=%d\n", iommu->irq, ret);
		goto fail;
		return ret;
	}

	list_add(&iommu->dev_node, &qcom_iommu_devices);
@@ -800,23 +784,19 @@ static int msm_iommu_probe(struct platform_device *pdev)
				     "msm-smmu.%pa", &ioaddr);
	if (ret) {
		pr_err("Could not add msm-smmu at %pa to sysfs\n", &ioaddr);
		goto fail;
		return ret;
	}

	ret = iommu_device_register(&iommu->iommu, &msm_iommu_ops, &pdev->dev);
	if (ret) {
		pr_err("Could not register msm-smmu at %pa\n", &ioaddr);
		goto fail;
		return ret;
	}

	pr_info("device mapped at %p, irq %d with %d ctx banks\n",
		iommu->base, iommu->irq, iommu->ncb);

	return ret;
fail:
	clk_unprepare(iommu->clk);
	clk_unprepare(iommu->pclk);
	return ret;
}

static const struct of_device_id msm_iommu_dt_match[] = {
@@ -824,20 +804,11 @@ static const struct of_device_id msm_iommu_dt_match[] = {
	{}
};

static void msm_iommu_remove(struct platform_device *pdev)
{
	struct msm_iommu_dev *iommu = platform_get_drvdata(pdev);

	clk_unprepare(iommu->clk);
	clk_unprepare(iommu->pclk);
}

static struct platform_driver msm_iommu_driver = {
	.driver = {
		.name	= "msm_iommu",
		.of_match_table = msm_iommu_dt_match,
	},
	.probe		= msm_iommu_probe,
	.remove		= msm_iommu_remove,
};
builtin_platform_driver(msm_iommu_driver);