]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blame - Documentation/sound/alsa/soc/codec.txt
[ALSA] ASoC: documentation & maintainer
[mirror_ubuntu-artful-kernel.git] / Documentation / sound / alsa / soc / codec.txt
CommitLineData
eb1a6af3
LG
1ASoC Codec Driver
2=================
3
4The codec driver is generic and hardware independent code that configures the
5codec to provide audio capture and playback. It should contain no code that is
6specific to the target platform or machine. All platform and machine specific
7code should be added to the platform and machine drivers respectively.
8
9Each codec driver must provide the following features:-
10
11 1) Digital audio interface (DAI) description
12 2) Digital audio interface configuration
13 3) PCM's description
14 4) Codec control IO - using I2C, 3 Wire(SPI) or both API's
15 5) Mixers and audio controls
16 6) Sysclk configuration
17 7) Codec audio operations
18
19Optionally, codec drivers can also provide:-
20
21 8) DAPM description.
22 9) DAPM event handler.
2310) DAC Digital mute control.
24
25It's probably best to use this guide in conjuction with the existing codec
26driver code in sound/soc/codecs/
27
28ASoC Codec driver breakdown
29===========================
30
311 - Digital Audio Interface (DAI) description
32---------------------------------------------
33The DAI is a digital audio data transfer link between the codec and host SoC
34CPU. It typically has data transfer capabilities in both directions
35(playback and capture) and can run at a variety of different speeds.
36Supported interfaces currently include AC97, I2S and generic PCM style links.
37Please read DAI.txt for implementation information.
38
39
402 - Digital Audio Interface (DAI) configuration
41-----------------------------------------------
42DAI configuration is handled by the codec_pcm_prepare function and is
43responsible for configuring and starting the DAI on the codec. This can be
44called multiple times and is atomic. It can access the runtime parameters.
45
46This usually consists of a large function with numerous switch statements to
47set up each configuration option. These options are set by the core at runtime.
48
49
503 - Codec PCM's
51---------------
52Each codec must have it's PCM's defined. This defines the number of channels,
53stream names, callbacks and codec name. It is also used to register the DAI
54with the ASoC core. The PCM structure also associates the DAI capabilities with
55the ALSA PCM.
56
57e.g.
58
59static struct snd_soc_pcm_codec wm8731_pcm_client = {
60 .name = "WM8731",
61 .playback = {
62 .stream_name = "Playback",
63 .channels_min = 1,
64 .channels_max = 2,
65 },
66 .capture = {
67 .stream_name = "Capture",
68 .channels_min = 1,
69 .channels_max = 2,
70 },
71 .config_sysclk = wm8731_config_sysclk,
72 .ops = {
73 .prepare = wm8731_pcm_prepare,
74 },
75 .caps = {
76 .num_modes = ARRAY_SIZE(wm8731_hwfmt),
77 .modes = &wm8731_hwfmt[0],
78 },
79};
80
81
824 - Codec control IO
83--------------------
84The codec can ususally be controlled via an I2C or SPI style interface (AC97
85combines control with data in the DAI). The codec drivers will have to provide
86functions to read and write the codec registers along with supplying a register
87cache:-
88
89 /* IO control data and register cache */
90 void *control_data; /* codec control (i2c/3wire) data */
91 void *reg_cache;
92
93Codec read/write should do any data formatting and call the hardware read write
94below to perform the IO. These functions are called by the core and alsa when
95performing DAPM or changing the mixer:-
96
97 unsigned int (*read)(struct snd_soc_codec *, unsigned int);
98 int (*write)(struct snd_soc_codec *, unsigned int, unsigned int);
99
100Codec hardware IO functions - usually points to either the I2C, SPI or AC97
101read/write:-
102
103 hw_write_t hw_write;
104 hw_read_t hw_read;
105
106
1075 - Mixers and audio controls
108-----------------------------
109All the codec mixers and audio controls can be defined using the convenience
110macros defined in soc.h.
111
112 #define SOC_SINGLE(xname, reg, shift, mask, invert)
113
114Defines a single control as follows:-
115
116 xname = Control name e.g. "Playback Volume"
117 reg = codec register
118 shift = control bit(s) offset in register
119 mask = control bit size(s) e.g. mask of 7 = 3 bits
120 invert = the control is inverted
121
122Other macros include:-
123
124 #define SOC_DOUBLE(xname, reg, shift_left, shift_right, mask, invert)
125
126A stereo control
127
128 #define SOC_DOUBLE_R(xname, reg_left, reg_right, shift, mask, invert)
129
130A stereo control spanning 2 registers
131
132 #define SOC_ENUM_SINGLE(xreg, xshift, xmask, xtexts)
133
134Defines an single enumerated control as follows:-
135
136 xreg = register
137 xshift = control bit(s) offset in register
138 xmask = control bit(s) size
139 xtexts = pointer to array of strings that describe each setting
140
141 #define SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmask, xtexts)
142
143Defines a stereo enumerated control
144
145
1466 - System clock configuration.
147-------------------------------
148The system clock that drives the audio subsystem can change depending on sample
149rate and the system power state. i.e.
150
151o Higher sample rates sometimes need a higher system clock.
152o Low system power states can sometimes limit the available clocks.
153
154This function is a callback that the machine driver can call to set and
155determine if the clock and sample rate combination is supported by the codec at
156the present time (and system state).
157
158NOTE: If the codec has a PLL then it has a lot more flexability wrt clock and
159sample rate combinations.
160
161Your config_sysclock function should return the MCLK if it's a valid
162combination for your codec else 0;
163
164Please read clocking.txt now.
165
166
1677 - Codec Audio Operations
168--------------------------
169The codec driver also supports the following alsa operations:-
170
171/* SoC audio ops */
172struct snd_soc_ops {
173 int (*startup)(snd_pcm_substream_t *);
174 void (*shutdown)(snd_pcm_substream_t *);
175 int (*hw_params)(snd_pcm_substream_t *, snd_pcm_hw_params_t *);
176 int (*hw_free)(snd_pcm_substream_t *);
177 int (*prepare)(snd_pcm_substream_t *);
178};
179
180Please refer to the alsa driver PCM documentation for details.
181http://www.alsa-project.org/~iwai/writing-an-alsa-driver/c436.htm
182
183
1848 - DAPM description.
185---------------------
186The Dynamic Audio Power Management description describes the codec's power
187components, their relationships and registers to the ASoC core. Please read
188dapm.txt for details of building the description.
189
190Please also see the examples in other codec drivers.
191
192
1939 - DAPM event handler
194----------------------
195This function is a callback that handles codec domain PM calls and system
196domain PM calls (e.g. suspend and resume). It's used to put the codec to sleep
197when not in use.
198
199Power states:-
200
201 SNDRV_CTL_POWER_D0: /* full On */
202 /* vref/mid, clk and osc on, active */
203
204 SNDRV_CTL_POWER_D1: /* partial On */
205 SNDRV_CTL_POWER_D2: /* partial On */
206
207 SNDRV_CTL_POWER_D3hot: /* Off, with power */
208 /* everything off except vref/vmid, inactive */
209
210 SNDRV_CTL_POWER_D3cold: /* Everything Off, without power */
211
212
21310 - Codec DAC digital mute control.
214------------------------------------
215Most codecs have a digital mute before the DAC's that can be used to minimise
216any system noise. The mute stops any digital data from entering the DAC.
217
218A callback can be created that is called by the core for each codec DAI when the
219mute is applied or freed.
220
221i.e.
222
223static int wm8974_mute(struct snd_soc_codec *codec,
224 struct snd_soc_codec_dai *dai, int mute)
225{
226 u16 mute_reg = wm8974_read_reg_cache(codec, WM8974_DAC) & 0xffbf;
227 if(mute)
228 wm8974_write(codec, WM8974_DAC, mute_reg | 0x40);
229 else
230 wm8974_write(codec, WM8974_DAC, mute_reg);
231 return 0;
232}