|
@@ -0,0 +1,103 @@
|
|
|
|
+Creating codec to codec dai link for ALSA dapm
|
|
|
|
+===================================================
|
|
|
|
+
|
|
|
|
+Mostly the flow of audio is always from CPU to codec so your system
|
|
|
|
+will look as below:
|
|
|
|
+
|
|
|
|
+ --------- ---------
|
|
|
|
+| | dai | |
|
|
|
|
+ CPU -------> codec
|
|
|
|
+| | | |
|
|
|
|
+ --------- ---------
|
|
|
|
+
|
|
|
|
+In case your system looks as below:
|
|
|
|
+ ---------
|
|
|
|
+ | |
|
|
|
|
+ codec-2
|
|
|
|
+ | |
|
|
|
|
+ ---------
|
|
|
|
+ |
|
|
|
|
+ dai-2
|
|
|
|
+ |
|
|
|
|
+ ---------- ---------
|
|
|
|
+| | dai-1 | |
|
|
|
|
+ CPU -------> codec-1
|
|
|
|
+| | | |
|
|
|
|
+ ---------- ---------
|
|
|
|
+ |
|
|
|
|
+ dai-3
|
|
|
|
+ |
|
|
|
|
+ ---------
|
|
|
|
+ | |
|
|
|
|
+ codec-3
|
|
|
|
+ | |
|
|
|
|
+ ---------
|
|
|
|
+
|
|
|
|
+Suppose codec-2 is a bluetooth chip and codec-3 is connected to
|
|
|
|
+a speaker and you have a below scenario:
|
|
|
|
+codec-2 will receive the audio data and the user wants to play that
|
|
|
|
+audio through codec-3 without involving the CPU.This
|
|
|
|
+aforementioned case is the ideal case when codec to codec
|
|
|
|
+connection should be used.
|
|
|
|
+
|
|
|
|
+Your dai_link should appear as below in your machine
|
|
|
|
+file:
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * this pcm stream only supports 24 bit, 2 channel and
|
|
|
|
+ * 48k sampling rate.
|
|
|
|
+ */
|
|
|
|
+static const struct snd_soc_pcm_stream dsp_codec_params = {
|
|
|
|
+ .formats = SNDRV_PCM_FMTBIT_S24_LE,
|
|
|
|
+ .rate_min = 48000,
|
|
|
|
+ .rate_max = 48000,
|
|
|
|
+ .channels_min = 2,
|
|
|
|
+ .channels_max = 2,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+{
|
|
|
|
+ .name = "CPU-DSP",
|
|
|
|
+ .stream_name = "CPU-DSP",
|
|
|
|
+ .cpu_dai_name = "samsung-i2s.0",
|
|
|
|
+ .codec_name = "codec-2,
|
|
|
|
+ .codec_dai_name = "codec-2-dai_name",
|
|
|
|
+ .platform_name = "samsung-i2s.0",
|
|
|
|
+ .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
|
|
|
|
+ | SND_SOC_DAIFMT_CBM_CFM,
|
|
|
|
+ .ignore_suspend = 1,
|
|
|
|
+ .params = &dsp_codec_params,
|
|
|
|
+},
|
|
|
|
+{
|
|
|
|
+ .name = "DSP-CODEC",
|
|
|
|
+ .stream_name = "DSP-CODEC",
|
|
|
|
+ .cpu_dai_name = "wm0010-sdi2",
|
|
|
|
+ .codec_name = "codec-3,
|
|
|
|
+ .codec_dai_name = "codec-3-dai_name",
|
|
|
|
+ .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
|
|
|
|
+ | SND_SOC_DAIFMT_CBM_CFM,
|
|
|
|
+ .ignore_suspend = 1,
|
|
|
|
+ .params = &dsp_codec_params,
|
|
|
|
+},
|
|
|
|
+
|
|
|
|
+Above code snippet is motivated from sound/soc/samsung/speyside.c.
|
|
|
|
+
|
|
|
|
+Note the "params" callback which lets the dapm know that this
|
|
|
|
+dai_link is a codec to codec connection.
|
|
|
|
+
|
|
|
|
+In dapm core a route is created between cpu_dai playback widget
|
|
|
|
+and codec_dai capture widget for playback path and vice-versa is
|
|
|
|
+true for capture path. In order for this aforementioned route to get
|
|
|
|
+triggered, DAPM needs to find a valid endpoint which could be either
|
|
|
|
+a sink or source widget corresponding to playback and capture path
|
|
|
|
+respectively.
|
|
|
|
+
|
|
|
|
+In order to trigger this dai_link widget, a thin codec driver for
|
|
|
|
+the speaker amp can be created as demonstrated in wm8727.c file, it
|
|
|
|
+sets appropriate constraints for the device even if it needs no control.
|
|
|
|
+
|
|
|
|
+Make sure to name your corresponding cpu and codec playback and capture
|
|
|
|
+dai names ending with "Playback" and "Capture" respectively as dapm core
|
|
|
|
+will link and power those dais based on the name.
|
|
|
|
+
|
|
|
|
+Note that in current device tree there is no way to mark a dai_link
|
|
|
|
+as codec to codec. However, it may change in future.
|