In exynos_arm64_enable_bus_clk(), when dev is NULL the parent clock is obtained with of_clk_get_by_name() and then handed to clk_prepare_enable(). On the enable failure path the function returns directly without clk_put(), leaking the consumer reference. Store the clk_prepare_enable() return value and release the reference with clk_put() before returning on failure. Fixes: 454e8d296ce4 ("clk: samsung: Extract parent clock enabling to common function") Cc: stable@vger.kernel.org Signed-off-by: Wentao Liang --- drivers/clk/samsung/clk-exynos-arm64.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/drivers/clk/samsung/clk-exynos-arm64.c b/drivers/clk/samsung/clk-exynos-arm64.c index 35d4de233cc1..05c4a15dfe99 100644 --- a/drivers/clk/samsung/clk-exynos-arm64.c +++ b/drivers/clk/samsung/clk-exynos-arm64.c @@ -149,6 +149,7 @@ static int __init exynos_arm64_enable_bus_clk(struct device *dev, struct device_node *np, const struct samsung_cmu_info *cmu) { struct clk *parent_clk; + int ret; if (!cmu->clk_name) return 0; @@ -167,7 +168,11 @@ static int __init exynos_arm64_enable_bus_clk(struct device *dev, if (IS_ERR(parent_clk)) return PTR_ERR(parent_clk); - return clk_prepare_enable(parent_clk); + ret = clk_prepare_enable(parent_clk); + if (ret) + clk_put(parent_clk); + + return ret; } static int __init exynos_arm64_cmu_prepare_pm(struct device *dev, -- 2.34.1