@@ -1485,30 +1485,67 @@ int dpcm_be_dai_startup(struct snd_soc_pcm_runtime *fe, int stream)
14851485}
14861486
14871487static void dpcm_init_runtime_hw (struct snd_pcm_runtime * runtime ,
1488- struct snd_soc_pcm_stream * stream )
1488+ struct snd_soc_pcm_stream * stream ,
1489+ u64 formats )
14891490{
14901491 runtime -> hw .rate_min = stream -> rate_min ;
14911492 runtime -> hw .rate_max = stream -> rate_max ;
14921493 runtime -> hw .channels_min = stream -> channels_min ;
14931494 runtime -> hw .channels_max = stream -> channels_max ;
14941495 if (runtime -> hw .formats )
1495- runtime -> hw .formats &= stream -> formats ;
1496+ runtime -> hw .formats &= formats & stream -> formats ;
14961497 else
1497- runtime -> hw .formats = stream -> formats ;
1498+ runtime -> hw .formats = formats & stream -> formats ;
14981499 runtime -> hw .rates = stream -> rates ;
14991500}
15001501
1502+ static u64 dpcm_runtime_base_format (struct snd_pcm_substream * substream )
1503+ {
1504+ struct snd_soc_pcm_runtime * fe = substream -> private_data ;
1505+ struct snd_soc_dpcm * dpcm ;
1506+ u64 formats = ULLONG_MAX ;
1507+ int stream = substream -> stream ;
1508+
1509+ if (!fe -> dai_link -> dpcm_merged_format )
1510+ return formats ;
1511+
1512+ /*
1513+ * It returns merged BE codec format
1514+ * if FE want to use it (= dpcm_merged_format)
1515+ */
1516+
1517+ list_for_each_entry (dpcm , & fe -> dpcm [stream ].be_clients , list_be ) {
1518+ struct snd_soc_pcm_runtime * be = dpcm -> be ;
1519+ struct snd_soc_dai_driver * codec_dai_drv ;
1520+ struct snd_soc_pcm_stream * codec_stream ;
1521+ int i ;
1522+
1523+ for (i = 0 ; i < be -> num_codecs ; i ++ ) {
1524+ codec_dai_drv = be -> codec_dais [i ]-> driver ;
1525+ if (stream == SNDRV_PCM_STREAM_PLAYBACK )
1526+ codec_stream = & codec_dai_drv -> playback ;
1527+ else
1528+ codec_stream = & codec_dai_drv -> capture ;
1529+
1530+ formats &= codec_stream -> formats ;
1531+ }
1532+ }
1533+
1534+ return formats ;
1535+ }
1536+
15011537static void dpcm_set_fe_runtime (struct snd_pcm_substream * substream )
15021538{
15031539 struct snd_pcm_runtime * runtime = substream -> runtime ;
15041540 struct snd_soc_pcm_runtime * rtd = substream -> private_data ;
15051541 struct snd_soc_dai * cpu_dai = rtd -> cpu_dai ;
15061542 struct snd_soc_dai_driver * cpu_dai_drv = cpu_dai -> driver ;
1543+ u64 format = dpcm_runtime_base_format (substream );
15071544
15081545 if (substream -> stream == SNDRV_PCM_STREAM_PLAYBACK )
1509- dpcm_init_runtime_hw (runtime , & cpu_dai_drv -> playback );
1546+ dpcm_init_runtime_hw (runtime , & cpu_dai_drv -> playback , format );
15101547 else
1511- dpcm_init_runtime_hw (runtime , & cpu_dai_drv -> capture );
1548+ dpcm_init_runtime_hw (runtime , & cpu_dai_drv -> capture , format );
15121549}
15131550
15141551static int dpcm_fe_dai_do_trigger (struct snd_pcm_substream * substream , int cmd );
0 commit comments