Hi On Mon, Mar 13, 2023 at 7:59 AM Kuninori Morimoto < kuninori.morimoto.gx@xxxxxxxxxxx> wrote: > > Hi Shengjiu > > > The hw->formats may be set by snd_dmaengine_pcm_refine_runtime_hwparams() > > in component's startup()/open(), but soc_pcm_hw_init() will init > > hw->formats in dpcm_runtime_setup_fe() after component's > startup()/open(), > > which causes the valuable hw->formats to be cleared. > > > > So need to store the hw->formats before initialization, then restore > > it after initialization. > > > > Signed-off-by: Shengjiu Wang <shengjiu.wang@xxxxxxx> > > --- > > sound/soc/soc-pcm.c | 4 ++++ > > 1 file changed, 4 insertions(+) > > > > diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c > > index 5eb056b942ce..7958c9defd49 100644 > > --- a/sound/soc/soc-pcm.c > > +++ b/sound/soc/soc-pcm.c > > @@ -1661,10 +1661,14 @@ static void dpcm_runtime_setup_fe(struct > snd_pcm_substream *substream) > > struct snd_pcm_hardware *hw = &runtime->hw; > > struct snd_soc_dai *dai; > > int stream = substream->stream; > > + u64 formats = hw->formats; > > int i; > > > > soc_pcm_hw_init(hw); > > > > + if (formats) > > + hw->formats &= formats; > > + > > If my understanding was correct, dpcm_runtime_setup_fe() (B) is called > after __soc_pcm_open() (A), and you updated (B) part. > > static int dpcm_fe_dai_startup(...) { > ... > (A) ret = __soc_pcm_open(fe, fe_substream); > ... > (B) dpcm_runtime_setup_fe(fe_substream); > ... > } > > But, it is doing same things under (A), too. > Do we need to initialize hw many times ? I'm not sure. > Can we simply remove soc_pcm_hw_init() from dpcm_runtime_setup_fe() ? > > (A) static int __soc_pcm_open() > { > ... > (X) soc_pcm_init_runtime_hw(substream); > ... > } > Here there is condition: /* Dynamic PCM DAI links compat checks use dynamic capabilities */ if (rtd->dai_link->dynamic || rtd->dai_link->no_pcm) goto dynamic; /* Check that the codec and cpu DAIs are compatible */ soc_pcm_init_runtime_hw(substream); which only calls soc_pcm_init_runtime_hw() for non dpcm case. So the initialization of hw is not many times. For dpcm the code here will be skipped. The initialization happens only in dpcm_runtime_setup_fe(). Best regards Wang shengjiu > (X) static void soc_pcm_init_runtime_hw(...) > { > => u64 formats = hw->formats; > > (Y) snd_soc_runtime_calc_hw(rtd, hw, substream->stream); > > => if (formats) > => hw->formats &= formats; > } > > (Y) int snd_soc_runtime_calc_hw(...) > { > ... > => soc_pcm_hw_init(hw); > ... > } > > Thank you for your help !! > > Best regards > --- > Kuninori Morimoto >