Patch "ASoC: soc-pcm: fix regression in soc_new_pcm()" has been added to the 5.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: fix regression in soc_new_pcm()

to the 5.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-fix-regression-in-soc_new_pcm.patch
and it can be found in the queue-5.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 3cc04777951b0691f7f41617cb9ef09962798700
Author: Stephan Gerhold <stephan@xxxxxxxxxxx>
Date:   Tue Feb 18 11:38:24 2020 +0100

    ASoC: soc-pcm: fix regression in soc_new_pcm()
    
    commit a4877a6fb2bd2e356a5eaacd86d6b6d69ff84e69 upstream.
    
    Commit af4bac11531f ("ASoC: soc-pcm: crash in snd_soc_dapm_new_dai")
    swapped the SNDRV_PCM_STREAM_* parameter in the
    snd_soc_dai_stream_valid(cpu_dai, ...) checks. But that works only
    for codec2codec links. For normal links it breaks registration of
    playback/capture-only PCM devices.
    
    E.g. on qcom/apq8016_sbc there is usually one playback-only and one
    capture-only PCM device, but they disappeared after the commit.
    
    The codec2codec case was added in commit a342031cdd08
    ("ASoC: create pcm for codec2codec links as well") as an extra check
    (e.g. `playback = playback && cpu_playback->channels_min`).
    
    We should be able to simplify the code by checking directly for
    the correct stream type in the loop.
    This also fixes the regression because we check for PLAYBACK for
    both codec and cpu dai again when codec2codec is not used.
    
    Fixes: af4bac11531f ("ASoC: soc-pcm: crash in snd_soc_dapm_new_dai")
    Signed-off-by: Stephan Gerhold <stephan@xxxxxxxxxxx>
    Tested-by: Jerome Brunet <jbrunet@xxxxxxxxxxxx>
    Reviewed-by: Jerome Brunet <jbrunet@xxxxxxxxxxxx>
    Cc: Jerome Brunet <jbrunet@xxxxxxxxxxxx>
    Cc: Sameer Pujar <spujar@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20200218103824.26708-1-stephan@xxxxxxxxxxx
    Signed-off-by: Mark Brown <broonie@xxxxxxxxxx>
    Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>

diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
index 8f6f0ad502880..10e2305bb885b 100644
--- a/sound/soc/soc-pcm.c
+++ b/sound/soc/soc-pcm.c
@@ -2890,22 +2890,19 @@ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num)
 		capture = rtd->dai_link->dpcm_capture;
 	} else {
 		/* Adapt stream for codec2codec links */
-		struct snd_soc_pcm_stream *cpu_capture = rtd->dai_link->params ?
-			&cpu_dai->driver->playback : &cpu_dai->driver->capture;
-		struct snd_soc_pcm_stream *cpu_playback = rtd->dai_link->params ?
-			&cpu_dai->driver->capture : &cpu_dai->driver->playback;
+		int cpu_capture = rtd->dai_link->params ?
+			SNDRV_PCM_STREAM_PLAYBACK : SNDRV_PCM_STREAM_CAPTURE;
+		int cpu_playback = rtd->dai_link->params ?
+			SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK;
 
 		for_each_rtd_codec_dai(rtd, i, codec_dai) {
 			if (snd_soc_dai_stream_valid(codec_dai, SNDRV_PCM_STREAM_PLAYBACK) &&
-			    snd_soc_dai_stream_valid(cpu_dai,   SNDRV_PCM_STREAM_CAPTURE))
+			    snd_soc_dai_stream_valid(cpu_dai,   cpu_playback))
 				playback = 1;
 			if (snd_soc_dai_stream_valid(codec_dai, SNDRV_PCM_STREAM_CAPTURE) &&
-			    snd_soc_dai_stream_valid(cpu_dai,   SNDRV_PCM_STREAM_PLAYBACK))
+			    snd_soc_dai_stream_valid(cpu_dai,   cpu_capture))
 				capture = 1;
 		}
-
-		capture = capture && cpu_capture->channels_min;
-		playback = playback && cpu_playback->channels_min;
 	}
 
 	if (rtd->dai_link->playback_only) {



[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