]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: cs4271: Fix resource leak in cs4271_soc_resume()
authorHarshit Mogalapalli <harshit.m.mogalapalli@oracle.com>
Sat, 10 Jan 2026 19:53:36 +0000 (11:53 -0800)
committerMark Brown <broonie@kernel.org>
Thu, 5 Feb 2026 00:46:04 +0000 (00:46 +0000)
Smatch detects this resource leak:

sound/soc/codecs/cs4271.c:548 cs4271_soc_resume() warn:
 'cs4271->clk' from clk_prepare_enable() not released on lines: 540,546.

Instead of direct returns, unprepare the clock and disable regulators on
the error paths.

Fixes: cf6bf51b5325 ("ASoC: cs4271: Add support for the external mclk")
Fixes: 9a397f473657 ("ASoC: cs4271: add regulator consumer support")
Signed-off-by: Harshit Mogalapalli <harshit.m.mogalapalli@oracle.com>
Reviewed-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Acked-by: Herve Codina <herve.codina@bootlin.com>
Reviewed-by: Alexander Sverdlin <alexander.sverdlin@gmail.com>
Link: https://patch.msgid.link/20260110195337.2522347-1-harshit.m.mogalapalli@oracle.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/codecs/cs4271.c

index 77dfc83a3c01319f1e12ccef4463e4ab99b763f4..d8cdd37e9112b24eeb46b534654839ea62e97741 100644 (file)
@@ -528,7 +528,7 @@ static int cs4271_soc_resume(struct snd_soc_component *component)
        ret = clk_prepare_enable(cs4271->clk);
        if (ret) {
                dev_err(component->dev, "Failed to enable clk: %d\n", ret);
-               return ret;
+               goto err_disable_regulators;
        }
 
        /* Do a proper reset after power up */
@@ -537,15 +537,21 @@ static int cs4271_soc_resume(struct snd_soc_component *component)
        /* Restore codec state */
        ret = regcache_sync(cs4271->regmap);
        if (ret < 0)
-               return ret;
+               goto err_disable_clk;
 
        /* then disable the power-down bit */
        ret = regmap_update_bits(cs4271->regmap, CS4271_MODE2,
                                 CS4271_MODE2_PDN, 0);
        if (ret < 0)
-               return ret;
+               goto err_disable_clk;
 
        return 0;
+
+err_disable_clk:
+       clk_disable_unprepare(cs4271->clk);
+err_disable_regulators:
+       regulator_bulk_disable(ARRAY_SIZE(cs4271->supplies), cs4271->supplies);
+       return ret;
 }
 #else
 #define cs4271_soc_suspend     NULL