Hi Kai
I think we might still have issues if we have multiple CPU DAIs per runtime and dpcm_init_runtime_hw() is called multiple times. With the fixup, the limits are taken from the last CPU DAI.
But if you look at original code, the same issues seems to be there (rate and channels taken from the stream directly with no consideration of already set values). Only exception is runtime->hw.formats, which is handled differently:
Actually, when I posted the patch, I removed 1 line which I thought not needed. But it seems it was necessary...
Current fixup patch always initialize hw at dpcm_set_fe_runtime()'s loop, but I guess we need is initialize once.
How about this patch ? It reverts current fixup, and initialize hw once at dpcm_set_fe_runtime().
----------- diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c index 37094aeff440..14d85ca1e435 100644 --- a/sound/soc/soc-pcm.c +++ b/sound/soc/soc-pcm.c @@ -1531,10 +1531,12 @@ static void dpcm_init_runtime_hw(struct snd_pcm_runtime *runtime, { struct snd_pcm_hardware *hw = &runtime->hw;
- soc_pcm_hw_init(hw); soc_pcm_hw_update_rate(hw, stream); soc_pcm_hw_update_chan(hw, stream); - soc_pcm_hw_update_format(hw, stream); + if (runtime->hw.formats) + runtime->hw.formats &= stream->formats; + else + runtime->hw.formats = stream->formats; }
static void dpcm_runtime_merge_format(struct snd_pcm_substream *substream, @@ -1662,10 +1664,13 @@ static void dpcm_runtime_merge_rate(struct snd_pcm_substream *substream, static void dpcm_set_fe_runtime(struct snd_pcm_substream *substream) { struct snd_pcm_runtime *runtime = substream->runtime; + struct snd_pcm_hardware *hw = &runtime->hw; struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream); struct snd_soc_dai *cpu_dai; int i;
+ soc_pcm_hw_init(hw); + for_each_rtd_cpu_dais(rtd, i, cpu_dai) { /* * Skip CPUs which don't support the current stream
Thank you for your help !!
Best regards --- Kuninori Morimoto