diff options
author | Marek Szyprowski <m.szyprowski@samsung.com> | 2016-05-23 11:30:07 +0200 |
---|---|---|
committer | Joerg Roedel <jroedel@suse.de> | 2016-06-15 13:59:58 +0200 |
commit | 0c2b063f1813ac99238b9c61edb58752eb7762cf (patch) | |
tree | 57d0c11b9fe686a5f738ba71c9dc0d0a685afbef /drivers/iommu | |
parent | b54b874fbaf5e024723e50dfb035a9916d6752b4 (diff) | |
download | linux-stable-0c2b063f1813ac99238b9c61edb58752eb7762cf.tar.gz linux-stable-0c2b063f1813ac99238b9c61edb58752eb7762cf.tar.bz2 linux-stable-0c2b063f1813ac99238b9c61edb58752eb7762cf.zip |
iommu/exynos: Return proper errors from getting clocks
This patch reworks driver probe code to propagate error codes from
clk_get() operation. This will allow to properly handle deferred probe
in the future.
Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
Diffstat (limited to 'drivers/iommu')
-rw-r--r-- | drivers/iommu/exynos-iommu.c | 56 |
1 files changed, 24 insertions, 32 deletions
diff --git a/drivers/iommu/exynos-iommu.c b/drivers/iommu/exynos-iommu.c index e27e3b7df4e7..989365682d14 100644 --- a/drivers/iommu/exynos-iommu.c +++ b/drivers/iommu/exynos-iommu.c @@ -602,37 +602,31 @@ static int __init exynos_sysmmu_probe(struct platform_device *pdev) } data->clk = devm_clk_get(dev, "sysmmu"); - if (!IS_ERR(data->clk)) { - ret = clk_prepare(data->clk); - if (ret) { - dev_err(dev, "Failed to prepare clk\n"); - return ret; - } - } else { + if (PTR_ERR(data->clk) == -ENOENT) data->clk = NULL; - } + else if (IS_ERR(data->clk)) + return PTR_ERR(data->clk); + ret = clk_prepare(data->clk); + if (ret) + return ret; data->aclk = devm_clk_get(dev, "aclk"); - if (!IS_ERR(data->aclk)) { - ret = clk_prepare(data->aclk); - if (ret) { - dev_err(dev, "Failed to prepare aclk\n"); - return ret; - } - } else { + if (PTR_ERR(data->aclk) == -ENOENT) data->aclk = NULL; - } + else if (IS_ERR(data->aclk)) + return PTR_ERR(data->aclk); + ret = clk_prepare(data->aclk); + if (ret) + return ret; data->pclk = devm_clk_get(dev, "pclk"); - if (!IS_ERR(data->pclk)) { - ret = clk_prepare(data->pclk); - if (ret) { - dev_err(dev, "Failed to prepare pclk\n"); - return ret; - } - } else { + if (PTR_ERR(data->pclk) == -ENOENT) data->pclk = NULL; - } + else if (IS_ERR(data->pclk)) + return PTR_ERR(data->pclk); + ret = clk_prepare(data->pclk); + if (ret) + return ret; if (!data->clk && (!data->aclk || !data->pclk)) { dev_err(dev, "Failed to get device clock(s)!\n"); @@ -640,15 +634,13 @@ static int __init exynos_sysmmu_probe(struct platform_device *pdev) } data->clk_master = devm_clk_get(dev, "master"); - if (!IS_ERR(data->clk_master)) { - ret = clk_prepare(data->clk_master); - if (ret) { - dev_err(dev, "Failed to prepare master's clk\n"); - return ret; - } - } else { + if (PTR_ERR(data->clk_master) == -ENOENT) data->clk_master = NULL; - } + else if (IS_ERR(data->clk_master)) + return PTR_ERR(data->clk_master); + ret = clk_prepare(data->clk_master); + if (ret) + return ret; data->sysmmu = dev; spin_lock_init(&data->lock); |