diff options
author | Liam Girdwood <lg@opensource.wolfsonmicro.com> | 2007-02-08 11:06:09 -0500 |
---|---|---|
committer | Jaroslav Kysela <perex@suse.cz> | 2007-02-09 03:04:04 -0500 |
commit | 10b98527c34dca3f461256f5fcfff9b3790066e0 (patch) | |
tree | 46d527ff67416b6403968176edf1f86281e9725c | |
parent | c6d6eeeacc2ed0b736f20692ca021324f3b203b3 (diff) |
[ALSA] ASoC documentation updates
This patch updates the documentation for ASoC to reflect the recent
changes in API between 0.12.x and 0.13.x
Changes:-
o Removed all reference to old API's.
o Removed references and examples of automatic DAI config and matching.
o Fixed 80 char line length on some files.
Signed-off-by: Liam Girdwood <lg@opensource.wolfsonmicro.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@suse.cz>
-rw-r--r-- | Documentation/sound/alsa/soc/DAI.txt | 490 | ||||
-rw-r--r-- | Documentation/sound/alsa/soc/clocking.txt | 273 | ||||
-rw-r--r-- | Documentation/sound/alsa/soc/codec.txt | 107 | ||||
-rw-r--r-- | Documentation/sound/alsa/soc/machine.txt | 3 | ||||
-rw-r--r-- | Documentation/sound/alsa/soc/pops_clicks.txt | 12 |
5 files changed, 48 insertions, 837 deletions
diff --git a/Documentation/sound/alsa/soc/DAI.txt b/Documentation/sound/alsa/soc/DAI.txt index 251545a88693..58cbfd01ea8f 100644 --- a/Documentation/sound/alsa/soc/DAI.txt +++ b/Documentation/sound/alsa/soc/DAI.txt | |||
@@ -54,493 +54,3 @@ Common PCM operating modes:- | |||
54 | o Mode A - MSB is transmitted on falling edge of first BCLK after FRAME/SYNC. | 54 | o Mode A - MSB is transmitted on falling edge of first BCLK after FRAME/SYNC. |
55 | 55 | ||
56 | o Mode B - MSB is transmitted on rising edge of FRAME/SYNC. | 56 | o Mode B - MSB is transmitted on rising edge of FRAME/SYNC. |
57 | |||
58 | |||
59 | ASoC DAI Configuration | ||
60 | ====================== | ||
61 | |||
62 | Every CODEC DAI and SoC DAI must have their capabilities defined in order to | ||
63 | be configured together at runtime when the audio and clocking parameters are | ||
64 | known. This is achieved by creating an array of struct snd_soc_hw_mode in the | ||
65 | the CODEC and SoC interface drivers. Each element in the array describes a DAI | ||
66 | mode and each mode is usually based upon the DAI system clock to sample rate | ||
67 | ratio (FS). | ||
68 | |||
69 | i.e. 48k sample rate @ 256 FS = sytem clock of 12.288 MHz | ||
70 | 48000 * 256 = 12288000 | ||
71 | |||
72 | The CPU and Codec DAI modes are then ANDed together at runtime to determine the | ||
73 | rutime DAI configuration for both the Codec and CPU. | ||
74 | |||
75 | When creating a new codec or SoC DAI it's probably best to start of with a few | ||
76 | sample rates first and then test your interface. | ||
77 | |||
78 | struct snd_soc_dai_mode is defined (in soc.h) as:- | ||
79 | |||
80 | /* SoC DAI mode */ | ||
81 | struct snd_soc_dai_mode { | ||
82 | u16 fmt; /* SND_SOC_DAIFMT_* */ | ||
83 | u16 tdm; /* SND_SOC_HWTDM_* */ | ||
84 | u64 pcmfmt; /* SNDRV_PCM_FMTBIT_* */ | ||
85 | u16 pcmrate; /* SND_SOC_HWRATE_* */ | ||
86 | u16 pcmdir:2; /* SND_SOC_HWDIR_* */ | ||
87 | u16 flags:8; /* hw flags */ | ||
88 | u16 fs; /* mclk to rate divider */ | ||
89 | u64 bfs; /* mclk to bclk dividers */ | ||
90 | unsigned long priv; /* private mode data */ | ||
91 | }; | ||
92 | |||
93 | fmt: | ||
94 | ---- | ||
95 | This field defines the DAI mode hardware format (e.g. I2S settings) and | ||
96 | supports the following settings:- | ||
97 | |||
98 | 1) hardware DAI formats | ||
99 | |||
100 | #define SND_SOC_DAIFMT_I2S (1 << 0) /* I2S mode */ | ||
101 | #define SND_SOC_DAIFMT_RIGHT_J (1 << 1) /* Right justified mode */ | ||
102 | #define SND_SOC_DAIFMT_LEFT_J (1 << 2) /* Left Justified mode */ | ||
103 | #define SND_SOC_DAIFMT_DSP_A (1 << 3) /* L data msb after FRM */ | ||
104 | #define SND_SOC_DAIFMT_DSP_B (1 << 4) /* L data msb during FRM */ | ||
105 | #define SND_SOC_DAIFMT_AC97 (1 << 5) /* AC97 */ | ||
106 | |||
107 | 2) hw DAI signal inversions | ||
108 | |||
109 | #define SND_SOC_DAIFMT_NB_NF (1 << 8) /* normal bit clock + frame */ | ||
110 | #define SND_SOC_DAIFMT_NB_IF (1 << 9) /* normal bclk + inv frm */ | ||
111 | #define SND_SOC_DAIFMT_IB_NF (1 << 10) /* invert bclk + nor frm */ | ||
112 | #define SND_SOC_DAIFMT_IB_IF (1 << 11) /* invert bclk + frm */ | ||
113 | |||
114 | 3) hw clock masters | ||
115 | This is wrt the codec, the inverse is true for the interface | ||
116 | i.e. if the codec is clk and frm master then the interface is | ||
117 | clk and frame slave. | ||
118 | |||
119 | #define SND_SOC_DAIFMT_CBM_CFM (1 << 12) /* codec clk & frm master */ | ||
120 | #define SND_SOC_DAIFMT_CBS_CFM (1 << 13) /* codec clk slave & frm master */ | ||
121 | #define SND_SOC_DAIFMT_CBM_CFS (1 << 14) /* codec clk master & frame slave */ | ||
122 | #define SND_SOC_DAIFMT_CBS_CFS (1 << 15) /* codec clk & frm slave */ | ||
123 | |||
124 | At least one option from each section must be selected. Multiple selections are | ||
125 | also supported e.g. | ||
126 | |||
127 | .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_RIGHT_J | \ | ||
128 | SND_SOC_DAIFMT_NB_NF | SND_SOC_DAIFMT_NB_IF | SND_SOC_DAIFMT_IB_NF | \ | ||
129 | SND_SOC_DAIFMT_IB_IF | ||
130 | |||
131 | |||
132 | tdm: | ||
133 | ------ | ||
134 | This field defines the Time Division Multiplexing left and right word | ||
135 | positions for the DAI mode if applicable. Set to SND_SOC_DAITDM_LRDW(0,0) for | ||
136 | no TDM. | ||
137 | |||
138 | |||
139 | pcmfmt: | ||
140 | --------- | ||
141 | The hardware PCM format. This describes the PCM formats supported by the DAI | ||
142 | mode e.g. | ||
143 | |||
144 | .pcmfmt = SNDRV_PCM_FORMAT_S16_LE | SNDRV_PCM_FORMAT_S20_3LE | \ | ||
145 | SNDRV_PCM_FORMAT_S24_3LE | ||
146 | |||
147 | pcmrate: | ||
148 | ---------- | ||
149 | The PCM sample rates supported by the DAI mode. e.g. | ||
150 | |||
151 | .pcmrate = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \ | ||
152 | SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \ | ||
153 | SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | ||
154 | |||
155 | |||
156 | pcmdir: | ||
157 | --------- | ||
158 | The stream directions supported by this mode. e.g. playback and capture | ||
159 | |||
160 | |||
161 | flags: | ||
162 | -------- | ||
163 | The DAI hardware flags supported by the mode. | ||
164 | |||
165 | /* use bfs mclk divider mode (BCLK = MCLK / x) */ | ||
166 | #define SND_SOC_DAI_BFS_DIV 0x1 | ||
167 | /* use bfs rate mulitplier (BCLK = RATE * x)*/ | ||
168 | #define SND_SOC_DAI_BFS_RATE 0x2 | ||
169 | /* use bfs rcw multiplier (BCLK = RATE * CHN * WORD SIZE) */ | ||
170 | #define SND_SOC_DAI_BFS_RCW 0x4 | ||
171 | /* capture and playback can use different clocks */ | ||
172 | #define SND_SOC_DAI_ASYNC 0x8 | ||
173 | |||
174 | NOTE: Bitclock division and mulitiplication modes can be safely matched by the | ||
175 | core logic. | ||
176 | |||
177 | |||
178 | fs: | ||
179 | ----- | ||
180 | The FS supported by this DAI mode FS is the ratio between the system clock and | ||
181 | the sample rate. See above | ||
182 | |||
183 | bfs: | ||
184 | ------ | ||
185 | BFS is the ratio of BCLK to MCLK or the ratio of BCLK to sample rate (this | ||
186 | depends on the codec or CPU DAI). | ||
187 | |||
188 | The BFS supported by the DAI mode. This can either be the ratio between the | ||
189 | bitclock (BCLK) and the sample rate OR the ratio between the system clock and | ||
190 | the sample rate. Depends on the flags above. | ||
191 | |||
192 | priv: | ||
193 | ----- | ||
194 | private codec mode data. | ||
195 | |||
196 | |||
197 | |||
198 | Examples | ||
199 | ======== | ||
200 | |||
201 | Note that Codec DAI and CPU DAI examples are interchangeable in these examples | ||
202 | as long as the bus master is reversed. i.e. | ||
203 | |||
204 | SND_SOC_DAIFMT_CBM_CFM would become SND_SOC_DAIFMT_CBS_CFS | ||
205 | and vice versa. | ||
206 | |||
207 | This applies to all SND_SOC_DAIFMT_CB*_CF*. | ||
208 | |||
209 | Example 1 | ||
210 | --------- | ||
211 | |||
212 | Simple codec that only runs at 8k & 48k @ 256FS in master mode, can generate a | ||
213 | BCLK of either MCLK/2 or MCLK/4. | ||
214 | |||
215 | /* codec master */ | ||
216 | { | ||
217 | .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM, | ||
218 | .pcmfmt = SNDRV_PCM_FORMAT_S16_LE, | ||
219 | .pcmrate = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000, | ||
220 | .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE, | ||
221 | .flags = SND_SOC_DAI_BFS_DIV, | ||
222 | .fs = 256, | ||
223 | .bfs = SND_SOC_FSBD(2) | SND_SOC_FSBD(4), | ||
224 | } | ||
225 | |||
226 | |||
227 | Example 2 | ||
228 | --------- | ||
229 | Simple codec that only runs at 8k & 48k @ 256FS in master mode, can generate a | ||
230 | BCLK of either Rate * 32 or Rate * 64. | ||
231 | |||
232 | /* codec master */ | ||
233 | { | ||
234 | .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM, | ||
235 | .pcmfmt = SNDRV_PCM_FORMAT_S16_LE, | ||
236 | .pcmrate = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000, | ||
237 | .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE, | ||
238 | .flags = SND_SOC_DAI_BFS_RATE, | ||
239 | .fs = 256, | ||
240 | .bfs = 32, | ||
241 | }, | ||
242 | { | ||
243 | .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM, | ||
244 | .pcmfmt = SNDRV_PCM_FORMAT_S16_LE, | ||
245 | .pcmrate = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000, | ||
246 | .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE, | ||
247 | .flags = SND_SOC_DAI_BFS_RATE, | ||
248 | .fs = 256, | ||
249 | .bfs = 64, | ||
250 | }, | ||
251 | |||
252 | |||
253 | Example 3 | ||
254 | --------- | ||
255 | Codec that runs at 8k & 48k @ 256FS in master mode, can generate a BCLK that | ||
256 | is a multiple of Rate * channels * word size. (RCW) i.e. | ||
257 | |||
258 | BCLK = 8000 * 2 * 16 (8k, stereo, 16bit) | ||
259 | = 256kHz | ||
260 | |||
261 | This codecs supports a RCW multiple of 1,2 | ||
262 | |||
263 | { | ||
264 | .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM, | ||
265 | .pcmfmt = SNDRV_PCM_FORMAT_S16_LE, | ||
266 | .pcmrate = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000, | ||
267 | .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE, | ||
268 | .flags = SND_SOC_DAI_BFS_RCW, | ||
269 | .fs = 256, | ||
270 | .bfs = SND_SOC_FSBW(1) | SND_SOC_FSBW(2), | ||
271 | } | ||
272 | |||
273 | |||
274 | Example 4 | ||
275 | --------- | ||
276 | Codec that only runs at 8k & 48k @ 256FS in master mode, can generate a | ||
277 | BCLK of either Rate * 32 or Rate * 64. Codec can also run in slave mode as long | ||
278 | as BCLK is rate * 32 or rate * 64. | ||
279 | |||
280 | /* codec master */ | ||
281 | { | ||
282 | .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM, | ||
283 | .pcmfmt = SNDRV_PCM_FORMAT_S16_LE, | ||
284 | .pcmrate = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000, | ||
285 | .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE, | ||
286 | .flags = SND_SOC_DAI_BFS_RATE, | ||
287 | .fs = 256, | ||
288 | .bfs = 32, | ||
289 | }, | ||
290 | { | ||
291 | .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM, | ||
292 | .pcmfmt = SNDRV_PCM_FORMAT_S16_LE, | ||
293 | .pcmrate = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000, | ||
294 | .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE, | ||
295 | .flags = SND_SOC_DAI_BFS_RATE, | ||
296 | .fs = 256, | ||
297 | .bfs = 64, | ||
298 | }, | ||
299 | |||
300 | /* codec slave */ | ||
301 | { | ||
302 | .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS, | ||
303 | .pcmfmt = SNDRV_PCM_FORMAT_S16_LE, | ||
304 | .pcmdir = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000, | ||
305 | .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE, | ||
306 | .flags = SND_SOC_DAI_BFS_RATE, | ||
307 | .fs = SND_SOC_FS_ALL, | ||
308 | .bfs = 32, | ||
309 | }, | ||
310 | { | ||
311 | .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS, | ||
312 | .pcmfmt = SNDRV_PCM_FORMAT_S16_LE, | ||
313 | .pcmdir = SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_48000, | ||
314 | .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE, | ||
315 | .flags = SND_SOC_DAI_BFS_RATE, | ||
316 | .fs = SND_SOC_FS_ALL, | ||
317 | .bfs = 64, | ||
318 | }, | ||
319 | |||
320 | |||
321 | Example 5 | ||
322 | --------- | ||
323 | Codec that only runs at 8k, 16k, 32k, 48k, 96k @ 128FS, 192FS & 256FS in master | ||
324 | mode and can generate a BCLK of MCLK / (1,2,4,8,16). Codec can also run in slave | ||
325 | mode as and does not care about FS or BCLK (as long as there is enough bandwidth). | ||
326 | |||
327 | #define CODEC_FSB \ | ||
328 | (SND_SOC_FSBD(1) | SND_SOC_FSBD(2) | SND_SOC_FSBD(4) | \ | ||
329 | SND_SOC_FSBD(8) | SND_SOC_FSBD(16)) | ||
330 | |||
331 | #define CODEC_RATES \ | ||
332 | (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_32000 |\ | ||
333 | SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000) | ||
334 | |||
335 | /* codec master @ 128, 192 & 256 FS */ | ||
336 | { | ||
337 | .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM, | ||
338 | .pcmfmt = SNDRV_PCM_FORMAT_S16_LE, | ||
339 | .pcmrate = CODEC_RATES, | ||
340 | .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE, | ||
341 | .flags = SND_SOC_DAI_BFS_DIV, | ||
342 | .fs = 128, | ||
343 | .bfs = CODEC_FSB, | ||
344 | }, | ||
345 | |||
346 | { | ||
347 | .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM, | ||
348 | .pcmfmt = SNDRV_PCM_FORMAT_S16_LE, | ||
349 | .pcmrate = CODEC_RATES, | ||
350 | .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE, | ||
351 | .flags = SND_SOC_DAI_BFS_DIV, | ||
352 | .fs = 192, | ||
353 | .bfs = CODEC_FSB | ||
354 | }, | ||
355 | |||
356 | { | ||
357 | .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM, | ||
358 | .pcmfmt = SNDRV_PCM_FORMAT_S16_LE, | ||
359 | .pcmrate = CODEC_RATES, | ||
360 | .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE, | ||
361 | .flags = SND_SOC_DAI_BFS_DIV, | ||
362 | .fs = 256, | ||
363 | .bfs = CODEC_FSB, | ||
364 | }, | ||
365 | |||
366 | /* codec slave */ | ||
367 | { | ||
368 | .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS, | ||
369 | .pcmfmt = SNDRV_PCM_FORMAT_S16_LE, | ||
370 | .pcmrate = CODEC_RATES, | ||
371 | .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE, | ||
372 | .fs = SND_SOC_FS_ALL, | ||
373 | .bfs = SND_SOC_FSB_ALL, | ||
374 | }, | ||
375 | |||
376 | |||
377 | Example 6 | ||
378 | --------- | ||
379 | Codec that only runs at 8k, 44.1k, 48k @ different FS in master mode (for use | ||
380 | with a fixed MCLK) and can generate a BCLK of MCLK / (1,2,4,8,16). | ||
381 | Codec can also run in slave mode as and does not care about FS or BCLK (as long | ||
382 | as there is enough bandwidth). Codec can support 16, 24 and 32 bit PCM sample | ||
383 | sizes. | ||
384 | |||
385 | #define CODEC_FSB \ | ||
386 | (SND_SOC_FSBD(1) | SND_SOC_FSBD(2) | SND_SOC_FSBD(4) | \ | ||
387 | SND_SOC_FSBD(8) | SND_SOC_FSBD(16)) | ||
388 | |||
389 | #define CODEC_PCM_FORMATS \ | ||
390 | (SNDRV_PCM_FORMAT_S16_LE | SNDRV_PCM_FORMAT_S20_3LE | \ | ||
391 | SNDRV_PCM_FORMAT_S24_3LE | SNDRV_PCM_FORMAT_S24_LE | SNDRV_PCM_FORMAT_S32_LE) | ||
392 | |||
393 | /* codec master */ | ||
394 | { | ||
395 | .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM, | ||
396 | .pcmfmt = SNDRV_PCM_FORMAT_S16_LE, | ||
397 | .pcmrate = SNDRV_PCM_RATE_8000, | ||
398 | .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE, | ||
399 | .flags = SND_SOC_DAI_BFS_DIV, | ||
400 | .fs = 1536, | ||
401 | .bfs = CODEC_FSB, | ||
402 | }, | ||
403 | |||
404 | { | ||
405 | .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM, | ||
406 | .pcmfmt = SNDRV_PCM_FORMAT_S16_LE, | ||
407 | .pcmrate = SNDRV_PCM_RATE_44100, | ||
408 | .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE, | ||
409 | .flags = SND_SOC_DAI_BFS_DIV, | ||
410 | .fs = 272, | ||
411 | .bfs = CODEC_FSB, | ||
412 | }, | ||
413 | |||
414 | { | ||
415 | .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBM_CFM, | ||
416 | .pcmfmt = SNDRV_PCM_FORMAT_S16_LE, | ||
417 | .pcmrate = SNDRV_PCM_RATE_48000, | ||
418 | .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE, | ||
419 | .flags = SND_SOC_DAI_BFS_DIV, | ||
420 | .fs = 256, | ||
421 | .bfs = CODEC_FSB, | ||
422 | }, | ||
423 | |||
424 | /* codec slave */ | ||
425 | { | ||
426 | .fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS, | ||
427 | .pcmfmt = SNDRV_PCM_FORMAT_S16_LE, | ||
428 | .pcmrate = CODEC_RATES, | ||
429 | .pcmdir = SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE, | ||
430 | .fs = SND_SOC_FS_ALL, | ||
431 | .bfs = SND_SOC_FSB_ALL, | ||
432 | }, | ||
433 | |||
434 | |||
435 | Example 7 | ||
436 | --------- | ||
437 | AC97 Codec that does not support VRA (i.e only runs at 48k). | ||
438 | |||
439 | #define AC97_DIR \ | ||
440 | (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE) | ||
441 | |||
442 | #define AC97_PCM_FORMATS \ | ||
443 | (SNDRV_PCM_FORMAT_S16_LE | SNDRV_PCM_FORMAT_S18_3LE | \ | ||
444 | SNDRV_PCM_FORMAT_S20_3LE) | ||
445 | |||
446 | /* AC97 with no VRA */ | ||
447 | { | ||
448 | .pcmfmt = AC97_PCM_FORMATS, | ||
449 | .pcmrate = SNDRV_PCM_RATE_48000, | ||
450 | } | ||
451 | |||
452 | |||
453 | Example 8 | ||
454 | --------- | ||
455 | |||
456 | CPU DAI that supports 8k - 48k @ 256FS and BCLK = MCLK / 4 in master mode. | ||
457 | Slave mode (CPU DAI is FRAME master) supports 8k - 96k at any FS as long as | ||
458 | BCLK = 64 * rate. (Intel XScale I2S controller). | ||
459 | |||
460 | #define PXA_I2S_DAIFMT \ | ||
461 | (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF) | ||
462 | |||
463 | #define PXA_I2S_DIR \ | ||
464 | (SND_SOC_DAIDIR_PLAYBACK | SND_SOC_DAIDIR_CAPTURE) | ||
465 | |||
466 | #define PXA_I2S_RATES \ | ||
467 | (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \ | ||
468 | SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \ | ||
469 | SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000) | ||
470 | |||
471 | /* priv is divider */ | ||
472 | static struct snd_soc_dai_mode pxa2xx_i2s_modes[] = { | ||
473 | /* pxa2xx I2S frame and clock master modes */ | ||
474 | { | ||
475 | .fmt = PXA_I2S_DAIFMT | SND_SOC_DAIFMT_CBS_CFS, | ||
476 | .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE, | ||
477 | .pcmrate = SNDRV_PCM_RATE_8000, | ||
478 | .pcmdir = PXA_I2S_DIR, | ||
479 | .flags = SND_SOC_DAI_BFS_DIV, | ||
480 | .fs = 256, | ||
481 | .bfs = SND_SOC_FSBD(4), | ||
482 | .priv = 0x48, | ||
483 | }, | ||
484 | { | ||
485 | .fmt = PXA_I2S_DAIFMT | SND_SOC_DAIFMT_CBS_CFS, | ||
486 | .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE, | ||
487 | .pcmrate = SNDRV_PCM_RATE_11025, | ||
488 | .pcmdir = PXA_I2S_DIR, | ||
489 | .flags = SND_SOC_DAI_BFS_DIV, | ||
490 | .fs = 256, | ||
491 | .bfs = SND_SOC_FSBD(4), | ||
492 | .priv = 0x34, | ||
493 | }, | ||
494 | { | ||
495 | .fmt = PXA_I2S_DAIFMT | SND_SOC_DAIFMT_CBS_CFS, | ||
496 | .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE, | ||
497 | .pcmrate = SNDRV_PCM_RATE_16000, | ||
498 | .pcmdir = PXA_I2S_DIR, | ||
499 | .flags = SND_SOC_DAI_BFS_DIV, | ||
500 | .fs = 256, | ||
501 | .bfs = SND_SOC_FSBD(4), | ||
502 | .priv = 0x24, | ||
503 | }, | ||
504 | { | ||
505 | .fmt = PXA_I2S_DAIFMT | SND_SOC_DAIFMT_CBS_CFS, | ||
506 | .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE, | ||
507 | .pcmrate = SNDRV_PCM_RATE_22050, | ||
508 | .pcmdir = PXA_I2S_DIR, | ||
509 | .flags = SND_SOC_DAI_BFS_DIV, | ||
510 | .fs = 256, | ||
511 | .bfs = SND_SOC_FSBD(4), | ||
512 | .priv = 0x1a, | ||
513 | }, | ||
514 | { | ||
515 | .fmt = PXA_I2S_DAIFMT | SND_SOC_DAIFMT_CBS_CFS, | ||
516 | .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE, | ||
517 | .pcmrate = SNDRV_PCM_RATE_44100, | ||
518 | .pcmdir = PXA_I2S_DIR, | ||
519 | .flags = SND_SOC_DAI_BFS_DIV, | ||
520 | .fs = 256, | ||
521 | .bfs = SND_SOC_FSBD(4), | ||
522 | .priv = 0xd, | ||
523 | }, | ||
524 | { | ||
525 | .fmt = PXA_I2S_DAIFMT | SND_SOC_DAIFMT_CBS_CFS, | ||
526 | .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE, | ||
527 | .pcmrate = SNDRV_PCM_RATE_48000, | ||
528 | .pcmdir = PXA_I2S_DIR, | ||
529 | .flags = SND_SOC_DAI_BFS_DIV, | ||
530 | .fs = 256, | ||
531 | .bfs = SND_SOC_FSBD(4), | ||
532 | .priv = 0xc, | ||
533 | }, | ||
534 | |||
535 | /* pxa2xx I2S frame master and clock slave mode */ | ||
536 | { | ||
537 | .fmt = PXA_I2S_DAIFMT | SND_SOC_DAIFMT_CBM_CFS, | ||
538 | .pcmfmt = SNDRV_PCM_FMTBIT_S16_LE, | ||
539 | .pcmrate = PXA_I2S_RATES, | ||
540 | .pcmdir = PXA_I2S_DIR, | ||
541 | .fs = SND_SOC_FS_ALL, | ||
542 | .flags = SND_SOC_DAI_BFS_RATE, | ||
543 | .bfs = 64, | ||
544 | .priv = 0x48, | ||
545 | }, | ||
546 | }; | ||
diff --git a/Documentation/sound/alsa/soc/clocking.txt b/Documentation/sound/alsa/soc/clocking.txt index 1f55fd8cb117..e93960d53a1e 100644 --- a/Documentation/sound/alsa/soc/clocking.txt +++ b/Documentation/sound/alsa/soc/clocking.txt | |||
@@ -40,275 +40,12 @@ BCLK = LRC * x | |||
40 | 40 | ||
41 | BCLK = LRC * Channels * Word Size | 41 | BCLK = LRC * Channels * Word Size |
42 | 42 | ||
43 | This relationship depends on the codec or SoC CPU in particular. ASoC can quite | 43 | This relationship depends on the codec or SoC CPU in particular. In general |
44 | easily match BCLK generated by division (SND_SOC_DAI_BFS_DIV) with BCLK by | 44 | it's best to configure BCLK to the lowest possible speed (depending on your |
45 | multiplication (SND_SOC_DAI_BFS_RATE) or BCLK generated by | 45 | rate, number of channels and wordsize) to save on power. |
46 | Rate * Channels * Word size (RCW or SND_SOC_DAI_BFS_RCW). | ||
47 | 46 | ||
47 | It's also desireable to use the codec (if possible) to drive (or master) the | ||
48 | audio clocks as it's usually gives more accurate sample rates than the CPU. | ||
48 | 49 | ||
49 | ASoC Clocking | ||
50 | ------------- | ||
51 | 50 | ||
52 | The ASoC core determines the clocking for each particular configuration at | ||
53 | runtime. This is to allow for dynamic audio clocking wereby the audio clock is | ||
54 | variable and depends on the system state or device usage scenario. i.e. a voice | ||
55 | call requires slower clocks (and hence less power) than MP3 playback. | ||
56 | 51 | ||
57 | ASoC will call the config_sysclock() function for the target machine during the | ||
58 | audio parameters configuration. The function is responsible for then clocking | ||
59 | the machine audio subsytem and returning the audio clock speed to the core. | ||
60 | This function should also call the codec and cpu DAI clock_config() functions | ||
61 | to configure their respective internal clocking if required. | ||
62 | |||
63 | |||
64 | ASoC Clocking Control Flow | ||
65 | -------------------------- | ||
66 | |||
67 | The ASoC core will call the machine drivers config_sysclock() when most of the | ||
68 | DAI capabilities are known. The machine driver is then responsible for calling | ||
69 | the codec and/or CPU DAI drivers with the selected capabilities and the current | ||
70 | MCLK. Note that the machine driver is also resonsible for setting the MCLK (and | ||
71 | enabling it). | ||
72 | |||
73 | (1) Match Codec and CPU DAI capabilities. At this point we have | ||
74 | matched the majority of the DAI fields and now need to make sure this | ||
75 | mode is currently clockable. | ||
76 | |||
77 | (2) machine->config_sysclk() is now called with the matched DAI FS, sample | ||
78 | rate and BCLK master. This function then gets/sets the current audio | ||
79 | clock (depening on usage) and calls the codec and CPUI DAI drivers with | ||
80 | the FS, rate, BCLK master and MCLK. | ||
81 | |||
82 | (3) Codec/CPU DAI config_sysclock(). This function checks that the FS, rate, | ||
83 | BCLK master and MCLK are acceptable for the codec or CPU DAI. It also | ||
84 | sets the DAI internal state to work with said clocks. | ||
85 | |||
86 | The config_sysclk() functions for CPU, codec and machine should return the MCLK | ||
87 | on success and 0 on failure. | ||
88 | |||
89 | |||
90 | Examples (b = BCLK, l = LRC) | ||
91 | ============================ | ||
92 | |||
93 | Example 1 | ||
94 | --------- | ||
95 | |||
96 | Simple codec that only runs at 48k @ 256FS in master mode. | ||
97 | |||
98 | CPU only runs as slave DAI, however it generates a variable MCLK. | ||
99 | |||
100 | -------- --------- | ||
101 | | | <----mclk--- | | | ||
102 | | Codec |b -----------> | CPU | | ||
103 | | |l -----------> | | | ||
104 | | | | | | ||
105 | -------- --------- | ||
106 | |||
107 | The codec driver has the following config_sysclock() | ||
108 | |||
109 | static unsigned int config_sysclk(struct snd_soc_codec_dai *dai, | ||
110 | struct snd_soc_clock_info *info, unsigned int clk) | ||
111 | { | ||
112 | /* make sure clock is 256 * rate */ | ||
113 | if(info->rate << 8 == clk) { | ||
114 | dai->mclk = clk; | ||
115 | return clk; | ||
116 | } | ||
117 | |||
118 | return 0; | ||
119 | } | ||
120 | |||
121 | The CPU I2S DAI driver has the following config_sysclk() | ||
122 | |||
123 | static unsigned int config_sysclk(struct snd_soc_codec_dai *dai, | ||
124 | struct snd_soc_clock_info *info, unsigned int clk) | ||
125 | { | ||
126 | /* can we support this clk */ | ||
127 | if(set_audio_clk(clk) < 0) | ||
128 | return -EINVAL; | ||
129 | |||
130 | dai->mclk = clk; | ||
131 | return dai->clk; | ||
132 | } | ||
133 | |||
134 | The machine driver config_sysclk() in this example is as follows:- | ||
135 | |||
136 | unsigned int machine_config_sysclk(struct snd_soc_pcm_runtime *rtd, | ||
137 | struct snd_soc_clock_info *info) | ||
138 | { | ||
139 | int clk = info->rate * info->fs; | ||
140 | |||
141 | /* check that CPU can deliver clock */ | ||
142 | if(rtd->cpu_dai->config_sysclk(rtd->cpu_dai, info, clk) < 0) | ||
143 | return -EINVAL; | ||
144 | |||
145 | /* can codec work with this clock */ | ||
146 | return rtd->codec_dai->config_sysclk(rtd->codec_dai, info, clk); | ||
147 | } | ||
148 | |||
149 | |||
150 | Example 2 | ||
151 | --------- | ||
152 | |||
153 | Codec that can master at 8k and 48k at various FS (and hence supports a fixed | ||
154 | set of input MCLK's) and can also be slave at various FS . | ||
155 | |||
156 | The CPU can master at 8k and 48k @256 FS and can be slave at any FS. | ||
157 | |||
158 | MCLK is a 12.288MHz crystal on this machine. | ||
159 | |||
160 | -------- --------- | ||
161 | | | <---xtal---> | | | ||
162 | | Codec |b <----------> | CPU | | ||
163 | | |l <----------> | | | ||
164 | | | | | | ||
165 | -------- --------- | ||
166 | |||
167 | |||
168 | The codec driver has the following config_sysclock() | ||
169 | |||
170 | /* supported input clocks */ | ||
171 | const static int hifi_clks[] = {11289600, 12000000, 12288000, | ||
172 | 16934400, 18432000}; | ||
173 | |||
174 | static unsigned int config_hsysclk(struct snd_soc_codec_dai *dai, | ||
175 | struct snd_soc_clock_info *info, unsigned int clk) | ||
176 | { | ||
177 | int i; | ||
178 | |||
179 | /* is clk supported */ | ||
180 | for(i = 0; i < ARRAY_SIZE(hifi_clks); i++) { | ||
181 | if(clk == hifi_clks[i]) { | ||
182 | dai->mclk = clk; | ||
183 | return clk; | ||
184 | } | ||
185 | } | ||
186 | |||
187 | /* this clk is not supported */ | ||
188 | return 0; | ||
189 | } | ||
190 | |||
191 | The CPU I2S DAI driver has the following config_sysclk() | ||
192 | |||
193 | static unsigned int config_sysclk(struct snd_soc_codec_dai *dai, | ||
194 | struct snd_soc_clock_info *info, unsigned int clk) | ||
195 | { | ||
196 | /* are we master or slave */ | ||
197 | if (info->bclk_master & | ||
198 | (SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS)) { | ||
199 | |||
200 | /* we can only master @ 256FS */ | ||
201 | if(info->rate << 8 == clk) { | ||
202 | dai->mclk = clk; | ||
203 | return dai->mclk; | ||
204 | } | ||
205 | } else { | ||
206 | /* slave we can run at any FS */ | ||
207 | dai->mclk = clk; | ||
208 | return dai->mclk; | ||
209 | } | ||
210 | |||
211 | /* not supported */ | ||
212 | return dai->clk; | ||
213 | } | ||
214 | |||
215 | The machine driver config_sysclk() in this example is as follows:- | ||
216 | |||
217 | unsigned int machine_config_sysclk(struct snd_soc_pcm_runtime *rtd, | ||
218 | struct snd_soc_clock_info *info) | ||
219 | { | ||
220 | int clk = 12288000; /* 12.288MHz */ | ||
221 | |||
222 | /* who's driving the link */ | ||
223 | if (info->bclk_master & | ||
224 | (SND_SOC_DAIFMT_CBM_CFM | SND_SOC_DAIFMT_CBM_CFS)) { | ||
225 | /* codec master */ | ||
226 | |||
227 | /* check that CPU can work with clock */ | ||
228 | if(rtd->cpu_dai->config_sysclk(rtd->cpu_dai, info, clk) < 0) | ||
229 | return -EINVAL; | ||
230 | |||
231 | /* can codec work with this clock */ | ||
232 | return rtd->codec_dai->config_sysclk(rtd->codec_dai, info, clk); | ||
233 | } else { | ||
234 | /* cpu master */ | ||
235 | |||
236 | /* check that codec can work with clock */ | ||
237 | if(rtd->codec_dai->config_sysclk(rtd->codec_dai, info, clk) < 0) | ||
238 | return -EINVAL; | ||
239 | |||
240 | /* can CPU work with this clock */ | ||
241 | return rtd->cpu_dai->config_sysclk(rtd->cpu_dai, info, clk); | ||
242 | } | ||
243 | } | ||
244 | |||
245 | |||
246 | |||
247 | Example 3 | ||
248 | --------- | ||
249 | |||
250 | Codec that masters at 8k ... 48k @256 FS. Codec can also be slave and | ||
251 | doesn't care about FS. The codec has an internal PLL and dividers to generate | ||
252 | the necessary internal clocks (for 256FS). | ||
253 | |||
254 | CPU can only be slave and doesn't care about FS. | ||
255 | |||
256 | MCLK is a non controllable 13MHz clock from the CPU. | ||
257 | |||
258 | |||
259 | -------- --------- | ||
260 | | | <----mclk--- | | | ||
261 | | Codec |b <----------> | CPU | | ||
262 | | |l <----------> | | | ||
263 | | | | | | ||
264 | -------- --------- | ||
265 | |||
266 | The codec driver has the following config_sysclock() | ||
267 | |||
268 | /* valid PCM clock dividers * 2 */ | ||
269 | static int pcm_divs[] = {2, 6, 11, 4, 8, 12, 16}; | ||
270 | |||
271 | static unsigned int config_vsysclk(struct snd_soc_codec_dai *dai, | ||
272 | struct snd_soc_clock_info *info, unsigned int clk) | ||
273 | { | ||
274 | int i, j, best_clk = info->fs * info->rate; | ||
275 | |||
276 | /* can we run at this clk without the PLL ? */ | ||
277 | for (i = 0; i < ARRAY_SIZE(pcm_divs); i++) { | ||
278 | if ((best_clk >> 1) * pcm_divs[i] == clk) { | ||
279 | dai->pll_in = 0; | ||
280 | dai->clk_div = pcm_divs[i]; | ||
281 | dai->mclk = best_clk; | ||
282 | return dai->mclk; | ||
283 | } | ||
284 | } | ||
285 | |||
286 | /* now check for PLL support */ | ||
287 | for (i = 0; i < ARRAY_SIZE(pll_div); i++) { | ||
288 | if (pll_div[i].pll_in == clk) { | ||
289 | for (j = 0; j < ARRAY_SIZE(pcm_divs); j++) { | ||
290 | if (pll_div[i].pll_out == pcm_divs[j] * (best_clk >> 1)) { | ||
291 | dai->pll_in = clk; | ||
292 | dai->pll_out = pll_div[i].pll_out; | ||
293 | dai->clk_div = pcm_divs[j]; | ||
294 | dai->mclk = best_clk; | ||
295 | return dai->mclk; | ||
296 | } | ||
297 | } | ||
298 | } | ||
299 | } | ||
300 | |||
301 | /* this clk is not supported */ | ||
302 | return 0; | ||
303 | } | ||
304 | |||
305 | |||
306 | The CPU I2S DAI driver has the does not need a config_sysclk() as it can slave | ||
307 | at any FS. | ||
308 | |||
309 | unsigned int config_sysclk(struct snd_soc_pcm_runtime *rtd, | ||
310 | struct snd_soc_clock_info *info) | ||
311 | { | ||
312 | /* codec has pll that generates mclk from 13MHz xtal */ | ||
313 | return rtd->codec_dai->config_sysclk(rtd->codec_dai, info, 13000000); | ||
314 | } | ||
diff --git a/Documentation/sound/alsa/soc/codec.txt b/Documentation/sound/alsa/soc/codec.txt index 274657a03e1c..48983c75aad9 100644 --- a/Documentation/sound/alsa/soc/codec.txt +++ b/Documentation/sound/alsa/soc/codec.txt | |||
@@ -6,21 +6,18 @@ codec to provide audio capture and playback. It should contain no code that is | |||
6 | specific to the target platform or machine. All platform and machine specific | 6 | specific to the target platform or machine. All platform and machine specific |
7 | code should be added to the platform and machine drivers respectively. | 7 | code should be added to the platform and machine drivers respectively. |
8 | 8 | ||
9 | Each codec driver must provide the following features:- | 9 | Each codec driver *must* provide the following features:- |
10 | 10 | ||
11 | 1) Digital audio interface (DAI) description | 11 | 1) Codec DAI and PCM configuration |
12 | 2) Digital audio interface configuration | 12 | 2) Codec control IO - using I2C, 3 Wire(SPI) or both API's |
13 | 3) PCM's description | 13 | 3) Mixers and audio controls |
14 | 4) Codec control IO - using I2C, 3 Wire(SPI) or both API's | 14 | 4) Codec audio operations |
15 | 5) Mixers and audio controls | ||
16 | 6) Sysclk configuration | ||
17 | 7) Codec audio operations | ||
18 | 15 | ||
19 | Optionally, codec drivers can also provide:- | 16 | Optionally, codec drivers can also provide:- |
20 | 17 | ||
21 | 8) DAPM description. | 18 | 5) DAPM description. |
22 | 9) DAPM event handler. | 19 | 6) DAPM event handler. |
23 | 10) DAC Digital mute control. | 20 | 7) DAC Digital mute control. |
24 | 21 | ||
25 | It's probably best to use this guide in conjuction with the existing codec | 22 | It's probably best to use this guide in conjuction with the existing codec |
26 | driver code in sound/soc/codecs/ | 23 | driver code in sound/soc/codecs/ |
@@ -28,58 +25,47 @@ driver code in sound/soc/codecs/ | |||
28 | ASoC Codec driver breakdown | 25 | ASoC Codec driver breakdown |
29 | =========================== | 26 | =========================== |
30 | 27 | ||
31 | 1 - Digital Audio Interface (DAI) description | 28 | 1 - Codec DAI and PCM configuration |
32 | --------------------------------------------- | 29 | ----------------------------------- |
33 | The DAI is a digital audio data transfer link between the codec and host SoC | 30 | Each codec driver must have a struct snd_soc_codec_dai to define it's DAI and |
34 | CPU. It typically has data transfer capabilities in both directions | 31 | PCM's capablities and operations. This struct is exported so that it can be |
35 | (playback and capture) and can run at a variety of different speeds. | 32 | registered with the core by your machine driver. |
36 | Supported interfaces currently include AC97, I2S and generic PCM style links. | ||
37 | Please read DAI.txt for implementation information. | ||
38 | |||
39 | |||
40 | 2 - Digital Audio Interface (DAI) configuration | ||
41 | ----------------------------------------------- | ||
42 | DAI configuration is handled by the codec_pcm_prepare function and is | ||
43 | responsible for configuring and starting the DAI on the codec. This can be | ||
44 | called multiple times and is atomic. It can access the runtime parameters. | ||
45 | |||
46 | This usually consists of a large function with numerous switch statements to | ||
47 | set up each configuration option. These options are set by the core at runtime. | ||
48 | |||
49 | |||
50 | 3 - Codec PCM's | ||
51 | --------------- | ||
52 | Each codec must have it's PCM's defined. This defines the number of channels, | ||
53 | stream names, callbacks and codec name. It is also used to register the DAI | ||
54 | with the ASoC core. The PCM structure also associates the DAI capabilities with | ||
55 | the ALSA PCM. | ||
56 | 33 | ||
57 | e.g. | 34 | e.g. |
58 | 35 | ||
59 | static struct snd_soc_pcm_codec wm8731_pcm_client = { | 36 | struct snd_soc_codec_dai wm8731_dai = { |
60 | .name = "WM8731", | 37 | .name = "WM8731", |
38 | /* playback capabilities */ | ||
61 | .playback = { | 39 | .playback = { |
62 | .stream_name = "Playback", | 40 | .stream_name = "Playback", |
63 | .channels_min = 1, | 41 | .channels_min = 1, |
64 | .channels_max = 2, | 42 | .channels_max = 2, |
65 | }, | 43 | .rates = WM8731_RATES, |
44 | .formats = WM8731_FORMATS,}, | ||
45 | /* capture capabilities */ | ||
66 | .capture = { | 46 | .capture = { |
67 | .stream_name = "Capture", | 47 | .stream_name = "Capture", |
68 | .channels_min = 1, | 48 | .channels_min = 1, |
69 | .channels_max = 2, | 49 | .channels_max = 2, |
70 | }, | 50 | .rates = WM8731_RATES, |
71 | .config_sysclk = wm8731_config_sysclk, | 51 | .formats = WM8731_FORMATS,}, |
52 | /* pcm operations - see section 4 below */ | ||
72 | .ops = { | 53 | .ops = { |
73 | .prepare = wm8731_pcm_prepare, | 54 | .prepare = wm8731_pcm_prepare, |
55 | .hw_params = wm8731_hw_params, | ||
56 | .shutdown = wm8731_shutdown, | ||
74 | }, | 57 | }, |
75 | .caps = { | 58 | /* DAI operations - see DAI.txt */ |
76 | .num_modes = ARRAY_SIZE(wm8731_hwfmt), | 59 | .dai_ops = { |
77 | .modes = &wm8731_hwfmt[0], | 60 | .digital_mute = wm8731_mute, |
78 | }, | 61 | .set_sysclk = wm8731_set_dai_sysclk, |
62 | .set_fmt = wm8731_set_dai_fmt, | ||
63 | } | ||
79 | }; | 64 | }; |
65 | EXPORT_SYMBOL_GPL(wm8731_dai); | ||
80 | 66 | ||
81 | 67 | ||
82 | 4 - Codec control IO | 68 | 2 - Codec control IO |
83 | -------------------- | 69 | -------------------- |
84 | The codec can ususally be controlled via an I2C or SPI style interface (AC97 | 70 | The codec can ususally be controlled via an I2C or SPI style interface (AC97 |
85 | combines control with data in the DAI). The codec drivers will have to provide | 71 | combines control with data in the DAI). The codec drivers will have to provide |
@@ -104,7 +90,7 @@ read/write:- | |||
104 | hw_read_t hw_read; | 90 | hw_read_t hw_read; |
105 | 91 | ||
106 | 92 | ||
107 | 5 - Mixers and audio controls | 93 | 3 - Mixers and audio controls |
108 | ----------------------------- | 94 | ----------------------------- |
109 | All the codec mixers and audio controls can be defined using the convenience | 95 | All the codec mixers and audio controls can be defined using the convenience |
110 | macros defined in soc.h. | 96 | macros defined in soc.h. |
@@ -143,28 +129,7 @@ Defines an single enumerated control as follows:- | |||
143 | Defines a stereo enumerated control | 129 | Defines a stereo enumerated control |
144 | 130 | ||
145 | 131 | ||
146 | 6 - System clock configuration. | 132 | 4 - Codec Audio Operations |
147 | ------------------------------- | ||
148 | The system clock that drives the audio subsystem can change depending on sample | ||
149 | rate and the system power state. i.e. | ||
150 | |||
151 | o Higher sample rates sometimes need a higher system clock. | ||
152 | o Low system power states can sometimes limit the available clocks. | ||
153 | |||
154 | This function is a callback that the machine driver can call to set and | ||
155 | determine if the clock and sample rate combination is supported by the codec at | ||
156 | the present time (and system state). | ||
157 | |||
158 | NOTE: If the codec has a PLL then it has a lot more flexability wrt clock and | ||
159 | sample rate combinations. | ||
160 | |||
161 | Your config_sysclock function should return the MCLK if it's a valid | ||
162 | combination for your codec else 0; | ||
163 | |||
164 | Please read clocking.txt now. | ||
165 | |||
166 | |||
167 | 7 - Codec Audio Operations | ||
168 | -------------------------- | 133 | -------------------------- |
169 | The codec driver also supports the following alsa operations:- | 134 | The codec driver also supports the following alsa operations:- |
170 | 135 | ||
@@ -181,7 +146,7 @@ Please refer to the alsa driver PCM documentation for details. | |||
181 | http://www.alsa-project.org/~iwai/writing-an-alsa-driver/c436.htm | 146 | http://www.alsa-project.org/~iwai/writing-an-alsa-driver/c436.htm |
182 | 147 | ||
183 | 148 | ||
184 | 8 - DAPM description. | 149 | 5 - DAPM description. |
185 | --------------------- | 150 | --------------------- |
186 | The Dynamic Audio Power Management description describes the codec's power | 151 | The Dynamic Audio Power Management description describes the codec's power |
187 | components, their relationships and registers to the ASoC core. Please read | 152 | components, their relationships and registers to the ASoC core. Please read |
@@ -190,7 +155,7 @@ dapm.txt for details of building the description. | |||
190 | Please also see the examples in other codec drivers. | 155 | Please also see the examples in other codec drivers. |
191 | 156 | ||
192 | 157 | ||
193 | 9 - DAPM event handler | 158 | 6 - DAPM event handler |
194 | ---------------------- | 159 | ---------------------- |
195 | This function is a callback that handles codec domain PM calls and system | 160 | This function is a callback that handles codec domain PM calls and system |
196 | domain PM calls (e.g. suspend and resume). It's used to put the codec to sleep | 161 | domain PM calls (e.g. suspend and resume). It's used to put the codec to sleep |
@@ -210,7 +175,7 @@ Power states:- | |||
210 | SNDRV_CTL_POWER_D3cold: /* Everything Off, without power */ | 175 | SNDRV_CTL_POWER_D3cold: /* Everything Off, without power */ |
211 | 176 | ||
212 | 177 | ||
213 | 10 - Codec DAC digital mute control. | 178 | 7 - Codec DAC digital mute control. |
214 | ------------------------------------ | 179 | ------------------------------------ |
215 | Most codecs have a digital mute before the DAC's that can be used to minimise | 180 | Most codecs have a digital mute before the DAC's that can be used to minimise |
216 | any system noise. The mute stops any digital data from entering the DAC. | 181 | any system noise. The mute stops any digital data from entering the DAC. |
diff --git a/Documentation/sound/alsa/soc/machine.txt b/Documentation/sound/alsa/soc/machine.txt index 3014795b1733..72bd222f2a21 100644 --- a/Documentation/sound/alsa/soc/machine.txt +++ b/Documentation/sound/alsa/soc/machine.txt | |||
@@ -64,7 +64,7 @@ static struct snd_soc_dai_link corgi_dai = { | |||
64 | .cpu_dai = &pxa_i2s_dai, | 64 | .cpu_dai = &pxa_i2s_dai, |
65 | .codec_dai = &wm8731_dai, | 65 | .codec_dai = &wm8731_dai, |
66 | .init = corgi_wm8731_init, | 66 | .init = corgi_wm8731_init, |
67 | .config_sysclk = corgi_config_sysclk, | 67 | .ops = &corgi_ops, |
68 | }; | 68 | }; |
69 | 69 | ||
70 | struct snd_soc_machine then sets up the machine with it's DAI's. e.g. | 70 | struct snd_soc_machine then sets up the machine with it's DAI's. e.g. |
@@ -74,7 +74,6 @@ static struct snd_soc_machine snd_soc_machine_corgi = { | |||
74 | .name = "Corgi", | 74 | .name = "Corgi", |
75 | .dai_link = &corgi_dai, | 75 | .dai_link = &corgi_dai, |
76 | .num_links = 1, | 76 | .num_links = 1, |
77 | .ops = &corgi_ops, | ||
78 | }; | 77 | }; |
79 | 78 | ||
80 | 79 | ||
diff --git a/Documentation/sound/alsa/soc/pops_clicks.txt b/Documentation/sound/alsa/soc/pops_clicks.txt index f4f8de5a9686..2cf7ee5b3d74 100644 --- a/Documentation/sound/alsa/soc/pops_clicks.txt +++ b/Documentation/sound/alsa/soc/pops_clicks.txt | |||
@@ -2,14 +2,14 @@ Audio Pops and Clicks | |||
2 | ===================== | 2 | ===================== |
3 | 3 | ||
4 | Pops and clicks are unwanted audio artifacts caused by the powering up and down | 4 | Pops and clicks are unwanted audio artifacts caused by the powering up and down |
5 | of components within the audio subsystem. This is noticable on PC's when an audio | 5 | of components within the audio subsystem. This is noticable on PC's when an |
6 | module is either loaded or unloaded (at module load time the sound card is | 6 | audio module is either loaded or unloaded (at module load time the sound card is |
7 | powered up and causes a popping noise on the speakers). | 7 | powered up and causes a popping noise on the speakers). |
8 | 8 | ||
9 | Pops and clicks can be more frequent on portable systems with DAPM. This is because | 9 | Pops and clicks can be more frequent on portable systems with DAPM. This is |
10 | the components within the subsystem are being dynamically powered depending on | 10 | because the components within the subsystem are being dynamically powered |
11 | the audio usage and this can subsequently cause a small pop or click every time a | 11 | depending on the audio usage and this can subsequently cause a small pop or |
12 | component power state is changed. | 12 | click every time a component power state is changed. |
13 | 13 | ||
14 | 14 | ||
15 | Minimising Playback Pops and Clicks | 15 | Minimising Playback Pops and Clicks |