1919#include "../codecs/rt5682s.h"
2020#include "common.h"
2121#include "lpass.h"
22+ #include "qdsp6/q6afe.h"
2223
2324#define DEFAULT_MCLK_RATE 19200000
2425#define RT5682_PLL_FREQ (48000 * 512)
26+ #define MI2S_BCLK_RATE 1536000
2527
2628struct sc7280_snd_data {
2729 struct snd_soc_card card ;
@@ -79,6 +81,7 @@ static int sc7280_headset_init(struct snd_soc_pcm_runtime *rtd)
7981 case MI2S_PRIMARY :
8082 case LPASS_CDC_DMA_RX0 :
8183 case LPASS_CDC_DMA_TX3 :
84+ case TX_CODEC_DMA_TX_3 :
8285 for_each_rtd_codec_dais (rtd , i , codec_dai ) {
8386 rval = snd_soc_component_set_jack (component , & pdata -> hs_jack , NULL );
8487 if (rval != 0 && rval != - ENOTSUPP ) {
@@ -164,10 +167,14 @@ static int sc7280_init(struct snd_soc_pcm_runtime *rtd)
164167 switch (cpu_dai -> id ) {
165168 case MI2S_PRIMARY :
166169 case LPASS_CDC_DMA_TX3 :
170+ case TX_CODEC_DMA_TX_3 :
167171 return sc7280_headset_init (rtd );
168172 case LPASS_CDC_DMA_RX0 :
169173 case LPASS_CDC_DMA_VA_TX0 :
170174 case MI2S_SECONDARY :
175+ case RX_CODEC_DMA_RX_0 :
176+ case SECONDARY_MI2S_RX :
177+ case VA_CODEC_DMA_TX_0 :
171178 return 0 ;
172179 case LPASS_DP_RX :
173180 return sc7280_hdmi_init (rtd );
@@ -195,6 +202,10 @@ static int sc7280_snd_hw_params(struct snd_pcm_substream *substream,
195202 switch (cpu_dai -> id ) {
196203 case LPASS_CDC_DMA_TX3 :
197204 case LPASS_CDC_DMA_RX0 :
205+ case RX_CODEC_DMA_RX_0 :
206+ case SECONDARY_MI2S_RX :
207+ case TX_CODEC_DMA_TX_3 :
208+ case VA_CODEC_DMA_TX_0 :
198209 for_each_rtd_codec_dais (rtd , i , codec_dai ) {
199210 sruntime = snd_soc_dai_get_stream (codec_dai , substream -> stream );
200211 if (sruntime != ERR_PTR (- ENOTSUPP ))
@@ -245,6 +256,9 @@ static int sc7280_snd_prepare(struct snd_pcm_substream *substream)
245256 switch (cpu_dai -> id ) {
246257 case LPASS_CDC_DMA_RX0 :
247258 case LPASS_CDC_DMA_TX3 :
259+ case RX_CODEC_DMA_RX_0 :
260+ case TX_CODEC_DMA_TX_3 :
261+ case VA_CODEC_DMA_TX_0 :
248262 return sc7280_snd_swr_prepare (substream );
249263 default :
250264 break ;
@@ -263,6 +277,9 @@ static int sc7280_snd_hw_free(struct snd_pcm_substream *substream)
263277 switch (cpu_dai -> id ) {
264278 case LPASS_CDC_DMA_RX0 :
265279 case LPASS_CDC_DMA_TX3 :
280+ case RX_CODEC_DMA_RX_0 :
281+ case TX_CODEC_DMA_TX_3 :
282+ case VA_CODEC_DMA_TX_0 :
266283 if (sruntime && data -> stream_prepared [cpu_dai -> id ]) {
267284 sdw_disable_stream (sruntime );
268285 sdw_deprepare_stream (sruntime );
@@ -291,21 +308,37 @@ static void sc7280_snd_shutdown(struct snd_pcm_substream *substream)
291308 SNDRV_PCM_STREAM_PLAYBACK );
292309 }
293310 break ;
311+ case SECONDARY_MI2S_RX :
312+ snd_soc_dai_set_sysclk (cpu_dai , Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT ,
313+ 0 , SNDRV_PCM_STREAM_PLAYBACK );
314+ break ;
294315 default :
295316 break ;
296317 }
297318}
298319
299320static int sc7280_snd_startup (struct snd_pcm_substream * substream )
300321{
322+ unsigned int fmt = SND_SOC_DAIFMT_CBS_CFS ;
323+ unsigned int codec_dai_fmt = SND_SOC_DAIFMT_CBS_CFS ;
301324 struct snd_soc_pcm_runtime * rtd = substream -> private_data ;
302325 struct snd_soc_dai * cpu_dai = asoc_rtd_to_cpu (rtd , 0 );
326+ struct snd_soc_dai * codec_dai = asoc_rtd_to_codec (rtd , 0 );
303327 int ret = 0 ;
304328
305329 switch (cpu_dai -> id ) {
306330 case MI2S_PRIMARY :
307331 ret = sc7280_rt5682_init (rtd );
308332 break ;
333+ case SECONDARY_MI2S_RX :
334+ codec_dai_fmt |= SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_I2S ;
335+
336+ snd_soc_dai_set_sysclk (cpu_dai , Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT ,
337+ MI2S_BCLK_RATE , SNDRV_PCM_STREAM_PLAYBACK );
338+
339+ snd_soc_dai_set_fmt (cpu_dai , fmt );
340+ snd_soc_dai_set_fmt (codec_dai , codec_dai_fmt );
341+ break ;
309342 default :
310343 break ;
311344 }
0 commit comments