From: Chancel Liu <[email protected]>

In a full-duplex setup, when one direction (playback or capture) is
closed while the other is still running, imx_aif_shutdown() was
unconditionally calling snd_soc_dai_set_sysclk() with rate=0 for all
cpu/codec DAIs, which would disable the clock still needed by the
active stream.

Add snd_soc_dai_active() checks before clearing sysclk so that only
truly inactive DAIs have their clocks reset.

Fixes: 2260bc6ea8bd ("ASoC: imx-card: Add WM8524 support")
Cc: [email protected]
Signed-off-by: Chancel Liu <[email protected]>
---
 sound/soc/fsl/imx-card.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/sound/soc/fsl/imx-card.c b/sound/soc/fsl/imx-card.c
index a4518fefad69..43438af1e1c6 100644
--- a/sound/soc/fsl/imx-card.c
+++ b/sound/soc/fsl/imx-card.c
@@ -496,11 +496,15 @@ static void imx_aif_shutdown(struct snd_pcm_substream 
*substream)
        struct snd_soc_dai *codec_dai;
        int i;
 
-       for_each_rtd_cpu_dais(rtd, i, cpu_dai)
-               snd_soc_dai_set_sysclk(cpu_dai, 0, 0, SND_SOC_CLOCK_OUT);
+       for_each_rtd_cpu_dais(rtd, i, cpu_dai) {
+               if (!snd_soc_dai_active(cpu_dai))
+                       snd_soc_dai_set_sysclk(cpu_dai, 0, 0, 
SND_SOC_CLOCK_OUT);
+       }
 
-       for_each_rtd_codec_dais(rtd, i, codec_dai)
-               snd_soc_dai_set_sysclk(codec_dai, 0, 0, SND_SOC_CLOCK_IN);
+       for_each_rtd_codec_dais(rtd, i, codec_dai) {
+               if (!snd_soc_dai_active(codec_dai))
+                       snd_soc_dai_set_sysclk(codec_dai, 0, 0, 
SND_SOC_CLOCK_IN);
+       }
 }
 
 static const struct snd_soc_ops imx_aif_ops = {
-- 
2.50.1


Reply via email to