162306a36Sopenharmony_ci============================================== 262306a36Sopenharmony_ciCreating codec to codec dai link for ALSA dapm 362306a36Sopenharmony_ci============================================== 462306a36Sopenharmony_ci 562306a36Sopenharmony_ciMostly the flow of audio is always from CPU to codec so your system 662306a36Sopenharmony_ciwill look as below: 762306a36Sopenharmony_ci:: 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci --------- --------- 1062306a36Sopenharmony_ci | | dai | | 1162306a36Sopenharmony_ci CPU -------> codec 1262306a36Sopenharmony_ci | | | | 1362306a36Sopenharmony_ci --------- --------- 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ciIn case your system looks as below: 1662306a36Sopenharmony_ci:: 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci --------- 1962306a36Sopenharmony_ci | | 2062306a36Sopenharmony_ci codec-2 2162306a36Sopenharmony_ci | | 2262306a36Sopenharmony_ci --------- 2362306a36Sopenharmony_ci | 2462306a36Sopenharmony_ci dai-2 2562306a36Sopenharmony_ci | 2662306a36Sopenharmony_ci ---------- --------- 2762306a36Sopenharmony_ci | | dai-1 | | 2862306a36Sopenharmony_ci CPU -------> codec-1 2962306a36Sopenharmony_ci | | | | 3062306a36Sopenharmony_ci ---------- --------- 3162306a36Sopenharmony_ci | 3262306a36Sopenharmony_ci dai-3 3362306a36Sopenharmony_ci | 3462306a36Sopenharmony_ci --------- 3562306a36Sopenharmony_ci | | 3662306a36Sopenharmony_ci codec-3 3762306a36Sopenharmony_ci | | 3862306a36Sopenharmony_ci --------- 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ciSuppose codec-2 is a bluetooth chip and codec-3 is connected to 4162306a36Sopenharmony_cia speaker and you have a below scenario: 4262306a36Sopenharmony_cicodec-2 will receive the audio data and the user wants to play that 4362306a36Sopenharmony_ciaudio through codec-3 without involving the CPU.This 4462306a36Sopenharmony_ciaforementioned case is the ideal case when codec to codec 4562306a36Sopenharmony_ciconnection should be used. 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ciYour dai_link should appear as below in your machine 4862306a36Sopenharmony_cifile: 4962306a36Sopenharmony_ci:: 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci /* 5262306a36Sopenharmony_ci * this pcm stream only supports 24 bit, 2 channel and 5362306a36Sopenharmony_ci * 48k sampling rate. 5462306a36Sopenharmony_ci */ 5562306a36Sopenharmony_ci static const struct snd_soc_pcm_stream dsp_codec_params = { 5662306a36Sopenharmony_ci .formats = SNDRV_PCM_FMTBIT_S24_LE, 5762306a36Sopenharmony_ci .rate_min = 48000, 5862306a36Sopenharmony_ci .rate_max = 48000, 5962306a36Sopenharmony_ci .channels_min = 2, 6062306a36Sopenharmony_ci .channels_max = 2, 6162306a36Sopenharmony_ci }; 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci { 6462306a36Sopenharmony_ci .name = "CPU-DSP", 6562306a36Sopenharmony_ci .stream_name = "CPU-DSP", 6662306a36Sopenharmony_ci .cpu_dai_name = "samsung-i2s.0", 6762306a36Sopenharmony_ci .codec_name = "codec-2, 6862306a36Sopenharmony_ci .codec_dai_name = "codec-2-dai_name", 6962306a36Sopenharmony_ci .platform_name = "samsung-i2s.0", 7062306a36Sopenharmony_ci .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF 7162306a36Sopenharmony_ci | SND_SOC_DAIFMT_CBM_CFM, 7262306a36Sopenharmony_ci .ignore_suspend = 1, 7362306a36Sopenharmony_ci .params = &dsp_codec_params, 7462306a36Sopenharmony_ci }, 7562306a36Sopenharmony_ci { 7662306a36Sopenharmony_ci .name = "DSP-CODEC", 7762306a36Sopenharmony_ci .stream_name = "DSP-CODEC", 7862306a36Sopenharmony_ci .cpu_dai_name = "wm0010-sdi2", 7962306a36Sopenharmony_ci .codec_name = "codec-3, 8062306a36Sopenharmony_ci .codec_dai_name = "codec-3-dai_name", 8162306a36Sopenharmony_ci .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF 8262306a36Sopenharmony_ci | SND_SOC_DAIFMT_CBM_CFM, 8362306a36Sopenharmony_ci .ignore_suspend = 1, 8462306a36Sopenharmony_ci .params = &dsp_codec_params, 8562306a36Sopenharmony_ci }, 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ciAbove code snippet is motivated from sound/soc/samsung/speyside.c. 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ciNote the "params" callback which lets the dapm know that this 9062306a36Sopenharmony_cidai_link is a codec to codec connection. 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ciIn dapm core a route is created between cpu_dai playback widget 9362306a36Sopenharmony_ciand codec_dai capture widget for playback path and vice-versa is 9462306a36Sopenharmony_citrue for capture path. In order for this aforementioned route to get 9562306a36Sopenharmony_citriggered, DAPM needs to find a valid endpoint which could be either 9662306a36Sopenharmony_cia sink or source widget corresponding to playback and capture path 9762306a36Sopenharmony_cirespectively. 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ciIn order to trigger this dai_link widget, a thin codec driver for 10062306a36Sopenharmony_cithe speaker amp can be created as demonstrated in wm8727.c file, it 10162306a36Sopenharmony_cisets appropriate constraints for the device even if it needs no control. 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ciMake sure to name your corresponding cpu and codec playback and capture 10462306a36Sopenharmony_cidai names ending with "Playback" and "Capture" respectively as dapm core 10562306a36Sopenharmony_ciwill link and power those dais based on the name. 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ciA dai_link in a "simple-audio-card" will automatically be detected as 10862306a36Sopenharmony_cicodec to codec when all DAIs on the link belong to codec components. 10962306a36Sopenharmony_ciThe dai_link will be initialized with the subset of stream parameters 11062306a36Sopenharmony_ci(channels, format, sample rate) supported by all DAIs on the link. Since 11162306a36Sopenharmony_cithere is no way to provide these parameters in the device tree, this is 11262306a36Sopenharmony_cimostly useful for communication with simple fixed-function codecs, such 11362306a36Sopenharmony_cias a Bluetooth controller or cellular modem. 114