ASoC: soc-pcm: fix regression in soc_new_pcm()
Commitaf4bac1153
("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 commita342031cdd
("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:af4bac1153
("ASoC: soc-pcm: crash in snd_soc_dapm_new_dai") Signed-off-by: Stephan Gerhold <stephan@gerhold.net> Tested-by: Jerome Brunet <jbrunet@baylibre.com> Reviewed-by: Jerome Brunet <jbrunet@baylibre.com> Cc: Jerome Brunet <jbrunet@baylibre.com> Cc: Sameer Pujar <spujar@nvidia.com> Link: https://lore.kernel.org/r/20200218103824.26708-1-stephan@gerhold.net Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
0247142233
commit
a4877a6fb2
@ -2858,22 +2858,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) {
|
||||
|
Loading…
Reference in New Issue
Block a user