Patch "ASoC: soc-pcm.c: Make sure DAI parameters cleared if the DAI becomes inactive" has been added to the 6.6-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    ASoC: soc-pcm.c: Make sure DAI parameters cleared if the DAI becomes inactive

to the 6.6-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     asoc-soc-pcm.c-make-sure-dai-parameters-cleared-if-t.patch
and it can be found in the queue-6.6 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 45810fd6ad9c36ebbc8cae977a4b2bcb63e4d8ff
Author: Chancel Liu <chancel.liu@xxxxxxx>
Date:   Wed Sep 20 23:36:21 2023 +0800

    ASoC: soc-pcm.c: Make sure DAI parameters cleared if the DAI becomes inactive
    
    [ Upstream commit 3efcb471f871cc095841d411f98c593228ecbac6 ]
    
    The commit 1da681e52853 ("ASoC: soc-pcm.c: Clear DAIs parameters after
    stream_active is updated") tries to make sure DAI parameters can be
    cleared properly through moving the cleanup to the place where stream
    active status is updated. However, it will cause the cleanup only
    happening in soc_pcm_close().
    
    Suppose a case: aplay -Dhw:0 44100.wav 48000.wav. The case calls
    soc_pcm_open()->soc_pcm_hw_params()->soc_pcm_hw_free()->
    soc_pcm_hw_params()->soc_pcm_hw_free()->soc_pcm_close() in order. The
    parameters would be remained in the system even if the playback of
    44100.wav is finished.
    
    The case requires us clearing parameters in phase of soc_pcm_hw_free().
    However, moving the DAI parameters cleanup back to soc_pcm_hw_free()
    has the risk that DAIs parameters never be cleared if there're more
    than one stream, see commit 1da681e52853 ("ASoC: soc-pcm.c: Clear DAIs
    parameters after stream_active is updated") for more details.
    
    To meet all these requirements, in addition to do DAI parameters
    cleanup in soc_pcm_hw_free(), also check it in soc_pcm_close() to make
    sure DAI parameters cleared if the DAI becomes inactive.
    
    Fixes: 1da681e52853 ("ASoC: soc-pcm.c: Clear DAIs parameters after stream_active is updated")
    Signed-off-by: Chancel Liu <chancel.liu@xxxxxxx>
    Link: https://lore.kernel.org/r/20230920153621.711373-2-chancel.liu@xxxxxxx
    Signed-off-by: Mark Brown <broonie@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
index 54704250c0a2c..0a20122b3e555 100644
--- a/sound/soc/soc-pcm.c
+++ b/sound/soc/soc-pcm.c
@@ -698,14 +698,12 @@ static int soc_pcm_clean(struct snd_soc_pcm_runtime *rtd,
 
 	if (!rollback) {
 		snd_soc_runtime_deactivate(rtd, substream->stream);
-		/* clear the corresponding DAIs parameters when going to be inactive */
-		for_each_rtd_dais(rtd, i, dai) {
-			if (snd_soc_dai_active(dai) == 0)
-				soc_pcm_set_dai_params(dai, NULL);
 
-			if (snd_soc_dai_stream_active(dai, substream->stream) == 0)
-				snd_soc_dai_digital_mute(dai, 1, substream->stream);
-		}
+		/* Make sure DAI parameters cleared if the DAI becomes inactive */
+		for_each_rtd_dais(rtd, i, dai)
+			if (snd_soc_dai_active(dai) == 0 &&
+			    (dai->rate || dai->channels || dai->sample_bits))
+				soc_pcm_set_dai_params(dai, NULL);
 	}
 
 	for_each_rtd_dais(rtd, i, dai)
@@ -936,6 +934,15 @@ static int soc_pcm_hw_clean(struct snd_soc_pcm_runtime *rtd,
 
 	snd_soc_dpcm_mutex_assert_held(rtd);
 
+	/* clear the corresponding DAIs parameters when going to be inactive */
+	for_each_rtd_dais(rtd, i, dai) {
+		if (snd_soc_dai_active(dai) == 1)
+			soc_pcm_set_dai_params(dai, NULL);
+
+		if (snd_soc_dai_stream_active(dai, substream->stream) == 1)
+			snd_soc_dai_digital_mute(dai, 1, substream->stream);
+	}
+
 	/* run the stream event */
 	snd_soc_dapm_stream_stop(rtd, substream->stream);
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux