| From 36aa03eb526c9ee432f557e30a9ee24bcfdb4520 Mon Sep 17 00:00:00 2001 |
| From: Marek Szyprowski <m.szyprowski@samsung.com> |
| Date: Wed, 2 Oct 2019 10:53:09 +0200 |
| Subject: [PATCH] clk: samsung: exynos5433: Fix error paths |
| |
| commit faac3604d05e8015567124e5ee79edc3f1568a89 upstream. |
| |
| Add checking the value returned by samsung_clk_alloc_reg_dump() and |
| devm_kcalloc(). While fixing this, also release all gathered clocks. |
| |
| Fixes: 523d3de41f02 ("clk: samsung: exynos5433: Add support for runtime PM") |
| Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> |
| Reviewed-by: Krzysztof Kozlowski <krzk@kernel.org> |
| Acked-by: Chanwoo Choi <cw00.choi@samsung.com> |
| [s.nawrocki: squashed patch from K. Kozlowski adding missing slab.h header] |
| Reported-by: kbuild test robot <lkp@intel.com> |
| Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org> |
| Signed-off-by: Sylwester Nawrocki <s.nawrocki@samsung.com> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/clk/samsung/clk-exynos5433.c b/drivers/clk/samsung/clk-exynos5433.c |
| index 945d5f2ad733..d49c466af143 100644 |
| --- a/drivers/clk/samsung/clk-exynos5433.c |
| +++ b/drivers/clk/samsung/clk-exynos5433.c |
| @@ -13,6 +13,7 @@ |
| #include <linux/of_device.h> |
| #include <linux/platform_device.h> |
| #include <linux/pm_runtime.h> |
| +#include <linux/slab.h> |
| |
| #include <dt-bindings/clock/exynos5433.h> |
| |
| @@ -5584,6 +5585,8 @@ static int __init exynos5433_cmu_probe(struct platform_device *pdev) |
| |
| data->clk_save = samsung_clk_alloc_reg_dump(info->clk_regs, |
| info->nr_clk_regs); |
| + if (!data->clk_save) |
| + return -ENOMEM; |
| data->nr_clk_save = info->nr_clk_regs; |
| data->clk_suspend = info->suspend_regs; |
| data->nr_clk_suspend = info->nr_suspend_regs; |
| @@ -5592,12 +5595,19 @@ static int __init exynos5433_cmu_probe(struct platform_device *pdev) |
| if (data->nr_pclks > 0) { |
| data->pclks = devm_kcalloc(dev, sizeof(struct clk *), |
| data->nr_pclks, GFP_KERNEL); |
| - |
| + if (!data->pclks) { |
| + kfree(data->clk_save); |
| + return -ENOMEM; |
| + } |
| for (i = 0; i < data->nr_pclks; i++) { |
| struct clk *clk = of_clk_get(dev->of_node, i); |
| |
| - if (IS_ERR(clk)) |
| + if (IS_ERR(clk)) { |
| + kfree(data->clk_save); |
| + while (--i >= 0) |
| + clk_put(data->pclks[i]); |
| return PTR_ERR(clk); |
| + } |
| data->pclks[i] = clk; |
| } |
| } |
| -- |
| 2.7.4 |
| |