[PATCH 04/10] ASoC: mediatek: mt8196: fix register access clock error handling
From: phucduc . bui
Date: Tue Sep 29 2026 - 02:12:50 EST
From: bui duc phuc <phucduc.bui@xxxxxxxxx>
Propagate errors from clock operations and disable previously enabled
clocks when a later operation fails.
This ensures that the register access clocks are properly cleaned up on
the error path.
Fixes: 7384ecab34eb ("ASoC: mediatek: mt8196: support audio clock control")
Signed-off-by: bui duc phuc <phucduc.bui@xxxxxxxxx>
---
sound/soc/mediatek/mt8196/mt8196-afe-clk.c | 25 +++++++++++++++++-----
1 file changed, 20 insertions(+), 5 deletions(-)
diff --git a/sound/soc/mediatek/mt8196/mt8196-afe-clk.c b/sound/soc/mediatek/mt8196/mt8196-afe-clk.c
index 1d107b85d03c..6198711e01b5 100644
--- a/sound/soc/mediatek/mt8196/mt8196-afe-clk.c
+++ b/sound/soc/mediatek/mt8196/mt8196-afe-clk.c
@@ -546,26 +546,41 @@ int mt8196_afe_enable_reg_rw_clk(struct mtk_base_afe *afe)
int ret;
/* bus clock for AFE external access, like DRAM */
- mt8196_afe_enable_clk(afe, afe_priv->clk[MT8196_CLK_TOP_ADSP_SEL]);
+ ret = mt8196_afe_enable_clk(afe, afe_priv->clk[MT8196_CLK_TOP_ADSP_SEL]);
+ if (ret)
+ return ret;
/* bus clock for AFE internal access, like AFE SRAM */
- mt8196_afe_enable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIOINTBUS]);
+ ret = mt8196_afe_enable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIOINTBUS]);
+ if (ret)
+ goto err_disable_adsp_sel;
ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIOINTBUS],
MT8196_AFE_26M);
if (ret)
- return ret;
+ goto err_disable_audiointbus;
/* enable audio h clock */
- mt8196_afe_enable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H]);
+ ret = mt8196_afe_enable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H]);
+ if (ret)
+ goto err_disable_audiointbus;
ret = mt8196_afe_set_clk_rate(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H],
MT8196_AFE_26M);
if (ret)
- return ret;
+ goto err_disable_audio_h;
/* AFE hw clock */
/* IPM2.0: USE HOPPING & 26M */
/* set in the regmap_register_patch */
return 0;
+
+err_disable_audio_h:
+ mt8196_afe_disable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIO_H]);
+err_disable_audiointbus:
+ mt8196_afe_disable_clk(afe, afe_priv->clk[MT8196_CLK_VLP_MUX_AUDIOINTBUS]);
+err_disable_adsp_sel:
+ mt8196_afe_disable_clk(afe, afe_priv->clk[MT8196_CLK_TOP_ADSP_SEL]);
+
+ return ret;
}
int mt8196_afe_disable_reg_rw_clk(struct mtk_base_afe *afe)
--
2.43.0