[PATCH 15/15] ASoC: mediatek: mt8192-mt6359: Fix error handling in MTKAIF calibration

From: phucduc . bui

Date: Fri Sep 18 2026 - 10:03:55 EST


From: bui duc phuc <phucduc.bui@xxxxxxxxx>

mt8192_mt6359_mtkaif_calibration() ignored the return values of
pm_runtime_get_sync() and mt8192_afe_gpio_request(), which could
leave PM runtime references or GPIO state unbalanced on failure.

Switch to pm_runtime_resume_and_get(), check each GPIO request,
and unwind on error.

Fixes: 18b13ff23fab ("ASoC: mediatek: mt8192: add machine driver with mt6359, rt1015 and rt5682")
Signed-off-by: bui duc phuc <phucduc.bui@xxxxxxxxx>
---
.../mt8192/mt8192-mt6359-rt1015-rt5682.c | 37 +++++++++++++------
1 file changed, 25 insertions(+), 12 deletions(-)

diff --git a/sound/soc/mediatek/mt8192/mt8192-mt6359-rt1015-rt5682.c b/sound/soc/mediatek/mt8192/mt8192-mt6359-rt1015-rt5682.c
index c86348691641..b010726e9b57 100644
--- a/sound/soc/mediatek/mt8192/mt8192-mt6359-rt1015-rt5682.c
+++ b/sound/soc/mediatek/mt8192/mt8192-mt6359-rt1015-rt5682.c
@@ -163,12 +163,23 @@ static int mt8192_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime *rtd)
int chosen_phase_1, chosen_phase_2, chosen_phase_3;
int counter;
int mtkaif_calib_ok;
+ int ret = 0;

- pm_runtime_get_sync(afe->dev);
- mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 1);
- mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 0);
- mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34, 1);
- mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34, 0);
+ ret = pm_runtime_resume_and_get(afe->dev);
+ if (ret < 0)
+ return ret;
+ ret = mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 1);
+ if (ret)
+ goto err_pm_put;
+ ret = mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA, 0);
+ if (ret)
+ goto err_disable_adda_1;
+ ret = mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34, 1);
+ if (ret)
+ goto err_disable_adda_0;
+ ret = mt8192_afe_gpio_request(afe->dev, true, MT8192_DAI_ADDA_CH34, 0);
+ if (ret)
+ goto err_disable_adda_ch34_1;

mt6359_mtkaif_calibration_enable(cmpnt_codec);

@@ -289,10 +300,14 @@ static int mt8192_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime *rtd)

mt6359_mtkaif_calibration_disable(cmpnt_codec);

- mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 1);
- mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 0);
- mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34, 1);
mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34, 0);
+err_disable_adda_ch34_1:
+ mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA_CH34, 1);
+err_disable_adda_0:
+ mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 0);
+err_disable_adda_1:
+ mt8192_afe_gpio_request(afe->dev, false, MT8192_DAI_ADDA, 1);
+err_pm_put:
pm_runtime_put(afe->dev);

dev_dbg(afe->dev, "%s(), mtkaif_chosen_phase[0/1/2]:%d/%d/%d\n",
@@ -301,7 +316,7 @@ static int mt8192_mt6359_mtkaif_calibration(struct snd_soc_pcm_runtime *rtd)
afe_priv->mtkaif_chosen_phase[1],
afe_priv->mtkaif_chosen_phase[2]);

- return 0;
+ return ret;
}

static int mt8192_mt6359_init(struct snd_soc_pcm_runtime *rtd)
@@ -319,9 +334,7 @@ static int mt8192_mt6359_init(struct snd_soc_pcm_runtime *rtd)
afe_priv->mtkaif_protocol = MTKAIF_PROTOCOL_2_CLK_P2;

/* mtkaif calibration */
- mt8192_mt6359_mtkaif_calibration(rtd);
-
- return 0;
+ return mt8192_mt6359_mtkaif_calibration(rtd);
}

static int mt8192_rt5682_init(struct snd_soc_pcm_runtime *rtd)
--
2.43.0