Unverified Commit 326fe810 authored by Jihed Chaibi's avatar Jihed Chaibi Committed by Mark Brown
Browse files

ASoC: adau1372: Fix unchecked clk_prepare_enable() return value



adau1372_set_power() calls clk_prepare_enable() but discards the return
value. If the clock enable fails, the driver proceeds to access registers
on unpowered hardware, potentially causing silent corruption.

Make adau1372_set_power() return int and propagate the error from
clk_prepare_enable(). Update adau1372_set_bias_level() to return the
error directly for the STANDBY and OFF cases.

Signed-off-by: default avatarJihed Chaibi <jihed.chaibi.dev@gmail.com>
Fixes: 6cd4c645 ("ASoC: Add ADAU1372 audio CODEC support")
Reviewed-by: default avatarNuno Sá <nuno.sa@analog.com>
Link: https://patch.msgid.link/20260325210704.76847-2-jihed.chaibi.dev@gmail.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent c3692998
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -782,15 +782,18 @@ static void adau1372_enable_pll(struct adau1372 *adau1372)
		dev_err(adau1372->dev, "Failed to lock PLL\n");
}

static void adau1372_set_power(struct adau1372 *adau1372, bool enable)
static int adau1372_set_power(struct adau1372 *adau1372, bool enable)
{
	if (adau1372->enabled == enable)
		return;
		return 0;

	if (enable) {
		unsigned int clk_ctrl = ADAU1372_CLK_CTRL_MCLK_EN;
		int ret;

		clk_prepare_enable(adau1372->mclk);
		ret = clk_prepare_enable(adau1372->mclk);
		if (ret)
			return ret;
		if (adau1372->pd_gpio)
			gpiod_set_value(adau1372->pd_gpio, 0);

@@ -829,6 +832,8 @@ static void adau1372_set_power(struct adau1372 *adau1372, bool enable)
	}

	adau1372->enabled = enable;

	return 0;
}

static int adau1372_set_bias_level(struct snd_soc_component *component,
@@ -842,11 +847,9 @@ static int adau1372_set_bias_level(struct snd_soc_component *component,
	case SND_SOC_BIAS_PREPARE:
		break;
	case SND_SOC_BIAS_STANDBY:
		adau1372_set_power(adau1372, true);
		break;
		return adau1372_set_power(adau1372, true);
	case SND_SOC_BIAS_OFF:
		adau1372_set_power(adau1372, false);
		break;
		return adau1372_set_power(adau1372, false);
	}

	return 0;