Smatch reports: drivers/bus/qcom-ebi2.c:387 qcom_ebi2_probe() warn: 'ebi2clk' from clk_prepare_enable() not released on lines: 358. drivers/bus/qcom-ebi2.c:387 qcom_ebi2_probe() warn: 'ebi2xclk' from clk_prepare_enabled() not released on lines: 358. The clk_disable_unprepare() is only used to explicitly release resources when the qcom_ebi2_probe() fails, and when executed correctly, it may cause resource leakage due to unknown release time. Replace devm_clk_get() and clk_prepare_enable() with devm_clk_get_enabled() to automatically manage the allocated resources. Fixes: 335a12754808 ("bus: qcom: add EBI2 driver") Signed-off-by: Ziliang Liao <saraday@xxxxxxxxxxx> Reviewed-by: Dongliang Mu <dzm91@xxxxxxxxxxx> --- The issue is found by static analyzer. The patched code has passed Smatch checker, but remains untested on real device. drivers/bus/qcom-ebi2.c | 35 ++++++++--------------------------- 1 file changed, 8 insertions(+), 27 deletions(-) diff --git a/drivers/bus/qcom-ebi2.c b/drivers/bus/qcom-ebi2.c index c1fef1b4bd89..3999e969e1cf 100644 --- a/drivers/bus/qcom-ebi2.c +++ b/drivers/bus/qcom-ebi2.c @@ -303,40 +303,28 @@ static int qcom_ebi2_probe(struct platform_device *pdev) u32 val; int ret; - ebi2xclk = devm_clk_get(dev, "ebi2x"); - if (IS_ERR(ebi2xclk)) + ebi2xclk = devm_clk_get_enabled(dev, "ebi2x"); + if (IS_ERR(ebi2xclk)) { + dev_err(dev, "could not enable EBI2X clk"); return PTR_ERR(ebi2xclk); - - ret = clk_prepare_enable(ebi2xclk); - if (ret) { - dev_err(dev, "could not enable EBI2X clk (%d)\n", ret); - return ret; } - ebi2clk = devm_clk_get(dev, "ebi2"); + ebi2clk = devm_clk_get_enabled(dev, "ebi2"); if (IS_ERR(ebi2clk)) { - ret = PTR_ERR(ebi2clk); - goto err_disable_2x_clk; - } - - ret = clk_prepare_enable(ebi2clk); - if (ret) { - dev_err(dev, "could not enable EBI2 clk\n"); - goto err_disable_2x_clk; + dev_err(dev, "could not enable EBI2 clk"); + return PTR_ERR(ebi2clk); } res = platform_get_resource(pdev, IORESOURCE_MEM, 0); ebi2_base = devm_ioremap_resource(dev, res); if (IS_ERR(ebi2_base)) { - ret = PTR_ERR(ebi2_base); - goto err_disable_clk; + return PTR_ERR(ebi2_base); } res = platform_get_resource(pdev, IORESOURCE_MEM, 1); ebi2_xmem = devm_ioremap_resource(dev, res); if (IS_ERR(ebi2_xmem)) { - ret = PTR_ERR(ebi2_xmem); - goto err_disable_clk; + return PTR_ERR(ebi2_xmem); } /* Allegedly this turns the power save mode off */ @@ -378,13 +366,6 @@ static int qcom_ebi2_probe(struct platform_device *pdev) if (have_children) return of_platform_default_populate(np, NULL, dev); return 0; - -err_disable_clk: - clk_disable_unprepare(ebi2clk); -err_disable_2x_clk: - clk_disable_unprepare(ebi2xclk); - - return ret; } static const struct of_device_id qcom_ebi2_of_match[] = { -- 2.25.1