]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ASoC: amd: acp-mach-common: Add missing error check for clock acquisition
authorChen Ni <nichen@iscas.ac.cn>
Tue, 10 Mar 2026 04:43:27 +0000 (12:43 +0800)
committerMark Brown <broonie@kernel.org>
Wed, 11 Mar 2026 19:18:17 +0000 (19:18 +0000)
The acp_card_rt5682_init() and acp_card_rt5682s_init() functions did not
check the return values of clk_get(). This could lead to a kernel crash
when the invalid pointers are later dereferenced by clock core
functions.

Fix this by:
1. Changing clk_get() to the device-managed devm_clk_get().
2. Adding IS_ERR() checks immediately after each clock acquisition.

Fixes: 8b7256266848 ("ASoC: amd: acp: Add support for RT5682-VS codec")
Fixes: d4c750f2c7d4 ("ASoC: amd: acp: Add generic machine driver support for ACP cards")
Signed-off-by: Chen Ni <nichen@iscas.ac.cn>
Link: https://patch.msgid.link/20260310044327.2582018-1-nichen@iscas.ac.cn
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/amd/acp/acp-mach-common.c

index 4d99472c75baf023d5dbaa869b177bb01a03b20b..09f6c9a2c04104b555a4657980e5f020fc23f202 100644 (file)
@@ -127,8 +127,13 @@ static int acp_card_rt5682_init(struct snd_soc_pcm_runtime *rtd)
        if (drvdata->hs_codec_id != RT5682)
                return -EINVAL;
 
-       drvdata->wclk = clk_get(component->dev, "rt5682-dai-wclk");
-       drvdata->bclk = clk_get(component->dev, "rt5682-dai-bclk");
+       drvdata->wclk = devm_clk_get(component->dev, "rt5682-dai-wclk");
+       if (IS_ERR(drvdata->wclk))
+               return PTR_ERR(drvdata->wclk);
+
+       drvdata->bclk = devm_clk_get(component->dev, "rt5682-dai-bclk");
+       if (IS_ERR(drvdata->bclk))
+               return PTR_ERR(drvdata->bclk);
 
        ret = snd_soc_dapm_new_controls(dapm, rt5682_widgets,
                                        ARRAY_SIZE(rt5682_widgets));
@@ -370,8 +375,13 @@ static int acp_card_rt5682s_init(struct snd_soc_pcm_runtime *rtd)
                return -EINVAL;
 
        if (!drvdata->soc_mclk) {
-               drvdata->wclk = clk_get(component->dev, "rt5682-dai-wclk");
-               drvdata->bclk = clk_get(component->dev, "rt5682-dai-bclk");
+               drvdata->wclk = devm_clk_get(component->dev, "rt5682-dai-wclk");
+               if (IS_ERR(drvdata->wclk))
+                       return PTR_ERR(drvdata->wclk);
+
+               drvdata->bclk = devm_clk_get(component->dev, "rt5682-dai-bclk");
+               if (IS_ERR(drvdata->bclk))
+                       return PTR_ERR(drvdata->bclk);
        }
 
        ret = snd_soc_dapm_new_controls(dapm, rt5682s_widgets,