[PATCH v2 1/2] ASoC: adau1372: Fix unchecked clk_prepare_enable() return value

Jihed Chaibi posted 2 patches 1 week, 1 day ago
[PATCH v2 1/2] ASoC: adau1372: Fix unchecked clk_prepare_enable() return value
Posted by Jihed Chaibi 1 week, 1 day ago
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: Jihed Chaibi <jihed.chaibi.dev@gmail.com>
---
Changes in v2:
- No changes.

 sound/soc/codecs/adau1372.c | 17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/sound/soc/codecs/adau1372.c b/sound/soc/codecs/adau1372.c
index fdee689cae53..6345342218d6 100644
--- a/sound/soc/codecs/adau1372.c
+++ b/sound/soc/codecs/adau1372.c
@@ -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;
--
2.47.3
Re: [PATCH v2 1/2] ASoC: adau1372: Fix unchecked clk_prepare_enable() return value
Posted by Nuno Sá 1 week ago
On Wed, 2026-03-25 at 22:07 +0100, Jihed Chaibi wrote:
> 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: Jihed Chaibi <jihed.chaibi.dev@gmail.com>
> ---

No Fixes tag?

- Nuno Sá

> Changes in v2:
> - No changes.
> 
>  sound/soc/codecs/adau1372.c | 17 ++++++++++-------
>  1 file changed, 10 insertions(+), 7 deletions(-)
> 
> diff --git a/sound/soc/codecs/adau1372.c b/sound/soc/codecs/adau1372.c
> index fdee689cae53..6345342218d6 100644
> --- a/sound/soc/codecs/adau1372.c
> +++ b/sound/soc/codecs/adau1372.c
> @@ -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;
> --
> 2.47.3