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