Commit | Line | Data |
---|---|---|
c6ab9e57 | 1 | ============================================== |
452a2568 | 2 | Creating codec to codec dai link for ALSA dapm |
c6ab9e57 | 3 | ============================================== |
452a2568 | 4 | |
5 | Mostly the flow of audio is always from CPU to codec so your system | |
6 | will look as below: | |
c6ab9e57 | 7 | :: |
452a2568 | 8 | |
c6ab9e57 TI |
9 | --------- --------- |
10 | | | dai | | | |
11 | CPU -------> codec | |
12 | | | | | | |
13 | --------- --------- | |
452a2568 | 14 | |
15 | In case your system looks as below: | |
c6ab9e57 TI |
16 | :: |
17 | ||
18 | --------- | |
19 | | | | |
20 | codec-2 | |
21 | | | | |
22 | --------- | |
23 | | | |
24 | dai-2 | |
25 | | | |
26 | ---------- --------- | |
27 | | | dai-1 | | | |
28 | CPU -------> codec-1 | |
29 | | | | | | |
30 | ---------- --------- | |
31 | | | |
32 | dai-3 | |
33 | | | |
34 | --------- | |
35 | | | | |
36 | codec-3 | |
37 | | | | |
38 | --------- | |
452a2568 | 39 | |
40 | Suppose codec-2 is a bluetooth chip and codec-3 is connected to | |
41 | a speaker and you have a below scenario: | |
42 | codec-2 will receive the audio data and the user wants to play that | |
43 | audio through codec-3 without involving the CPU.This | |
44 | aforementioned case is the ideal case when codec to codec | |
45 | connection should be used. | |
46 | ||
47 | Your dai_link should appear as below in your machine | |
48 | file: | |
c6ab9e57 | 49 | :: |
452a2568 | 50 | |
c6ab9e57 TI |
51 | /* |
52 | * this pcm stream only supports 24 bit, 2 channel and | |
53 | * 48k sampling rate. | |
54 | */ | |
55 | static const struct snd_soc_pcm_stream dsp_codec_params = { | |
452a2568 | 56 | .formats = SNDRV_PCM_FMTBIT_S24_LE, |
57 | .rate_min = 48000, | |
58 | .rate_max = 48000, | |
59 | .channels_min = 2, | |
60 | .channels_max = 2, | |
c6ab9e57 | 61 | }; |
452a2568 | 62 | |
c6ab9e57 | 63 | { |
452a2568 | 64 | .name = "CPU-DSP", |
65 | .stream_name = "CPU-DSP", | |
66 | .cpu_dai_name = "samsung-i2s.0", | |
67 | .codec_name = "codec-2, | |
68 | .codec_dai_name = "codec-2-dai_name", | |
69 | .platform_name = "samsung-i2s.0", | |
70 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | |
71 | | SND_SOC_DAIFMT_CBM_CFM, | |
72 | .ignore_suspend = 1, | |
b5d5c879 AS |
73 | .c2c_params = &dsp_codec_params, |
74 | .num_c2c_params = 1, | |
c6ab9e57 TI |
75 | }, |
76 | { | |
452a2568 | 77 | .name = "DSP-CODEC", |
78 | .stream_name = "DSP-CODEC", | |
79 | .cpu_dai_name = "wm0010-sdi2", | |
80 | .codec_name = "codec-3, | |
81 | .codec_dai_name = "codec-3-dai_name", | |
82 | .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | |
83 | | SND_SOC_DAIFMT_CBM_CFM, | |
84 | .ignore_suspend = 1, | |
b5d5c879 AS |
85 | .c2c_params = &dsp_codec_params, |
86 | .num_c2c_params = 1, | |
c6ab9e57 | 87 | }, |
452a2568 | 88 | |
89 | Above code snippet is motivated from sound/soc/samsung/speyside.c. | |
90 | ||
b5d5c879 | 91 | Note the "c2c_params" callback which lets the dapm know that this |
452a2568 | 92 | dai_link is a codec to codec connection. |
93 | ||
94 | In dapm core a route is created between cpu_dai playback widget | |
95 | and codec_dai capture widget for playback path and vice-versa is | |
96 | true for capture path. In order for this aforementioned route to get | |
97 | triggered, DAPM needs to find a valid endpoint which could be either | |
98 | a sink or source widget corresponding to playback and capture path | |
99 | respectively. | |
100 | ||
101 | In order to trigger this dai_link widget, a thin codec driver for | |
102 | the speaker amp can be created as demonstrated in wm8727.c file, it | |
103 | sets appropriate constraints for the device even if it needs no control. | |
104 | ||
105 | Make sure to name your corresponding cpu and codec playback and capture | |
106 | dai names ending with "Playback" and "Capture" respectively as dapm core | |
107 | will link and power those dais based on the name. | |
108 | ||
95cfc0a0 SH |
109 | A dai_link in a "simple-audio-card" will automatically be detected as |
110 | codec to codec when all DAIs on the link belong to codec components. | |
111 | The dai_link will be initialized with the subset of stream parameters | |
112 | (channels, format, sample rate) supported by all DAIs on the link. Since | |
113 | there is no way to provide these parameters in the device tree, this is | |
114 | mostly useful for communication with simple fixed-function codecs, such | |
115 | as a Bluetooth controller or cellular modem. |