Unverified Commit 30c64fb9 authored by Chen Ni's avatar Chen Ni Committed by Mark Brown
Browse files

ASoC: amd: acp-mach-common: Add missing error check for clock acquisition



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: 8b725626 ("ASoC: amd: acp: Add support for RT5682-VS codec")
Fixes: d4c750f2 ("ASoC: amd: acp: Add generic machine driver support for ACP cards")
Signed-off-by: default avatarChen Ni <nichen@iscas.ac.cn>
Link: https://patch.msgid.link/20260310044327.2582018-1-nichen@iscas.ac.cn


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent a9683730
Loading
Loading
Loading
Loading
+14 −4
Original line number Diff line number Diff line
@@ -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,