codec.rst 5.2 KB
Newer Older
T
Takashi Iwai 已提交
1
=======================
2 3
ASoC Codec Class Driver
=======================
4

5 6 7 8 9
The codec class driver is generic and hardware independent code that configures
the codec, FM, MODEM, BT or external DSP to provide audio capture and playback.
It should contain no code that is specific to the target platform or machine.
All platform and machine specific code should be added to the platform and
machine drivers respectively.
10

11
Each codec class driver *must* provide the following features:-
12

T
Takashi Iwai 已提交
13 14 15 16 17 18
1. Codec DAI and PCM configuration
2. Codec control IO - using RegMap API
3. Mixers and audio controls
4. Codec audio operations
5. DAPM description.
6. DAPM event handler.
19 20 21

Optionally, codec drivers can also provide:-

T
Takashi Iwai 已提交
22
7. DAC Digital mute control.
23

M
Mark Brown 已提交
24
Its probably best to use this guide in conjunction with the existing codec
25 26 27 28 29
driver code in sound/soc/codecs/

ASoC Codec driver breakdown
===========================

T
Takashi Iwai 已提交
30 31
Codec DAI and PCM configuration
-------------------------------
S
Seungwhan Youn 已提交
32
Each codec driver must have a struct snd_soc_dai_driver to define its DAI and
M
Mark Brown 已提交
33
PCM capabilities and operations. This struct is exported so that it can be
34
registered with the core by your machine driver.
35 36

e.g.
T
Takashi Iwai 已提交
37
::
38

T
Takashi Iwai 已提交
39
  static struct snd_soc_dai_ops wm8731_dai_ops = {
S
Seungwhan Youn 已提交
40 41 42 43 44 45
	.prepare	= wm8731_pcm_prepare,
	.hw_params	= wm8731_hw_params,
	.shutdown	= wm8731_shutdown,
	.digital_mute	= wm8731_mute,
	.set_sysclk	= wm8731_set_dai_sysclk,
	.set_fmt	= wm8731_set_dai_fmt,
T
Takashi Iwai 已提交
46 47 48
  };
  
  struct snd_soc_dai_driver wm8731_dai = {
S
Seungwhan Youn 已提交
49
	.name = "wm8731-hifi",
50 51 52 53
	.playback = {
		.stream_name = "Playback",
		.channels_min = 1,
		.channels_max = 2,
54 55
		.rates = WM8731_RATES,
		.formats = WM8731_FORMATS,},
56 57 58 59
	.capture = {
		.stream_name = "Capture",
		.channels_min = 1,
		.channels_max = 2,
60 61
		.rates = WM8731_RATES,
		.formats = WM8731_FORMATS,},
S
Seungwhan Youn 已提交
62 63
	.ops = &wm8731_dai_ops,
	.symmetric_rates = 1,
T
Takashi Iwai 已提交
64
  };
65 66


T
Takashi Iwai 已提交
67 68
Codec control IO
----------------
M
Mark Brown 已提交
69
The codec can usually be controlled via an I2C or SPI style interface
70 71 72
(AC97 combines control with data in the DAI). The codec driver should use the
Regmap API for all codec IO. Please see include/linux/regmap.h and existing
codec drivers for example regmap usage.
73 74


T
Takashi Iwai 已提交
75 76
Mixers and audio controls
-------------------------
77 78
All the codec mixers and audio controls can be defined using the convenience
macros defined in soc.h.
T
Takashi Iwai 已提交
79
::
80 81 82 83

    #define SOC_SINGLE(xname, reg, shift, mask, invert)

Defines a single control as follows:-
T
Takashi Iwai 已提交
84
::
85 86 87 88 89 90 91 92

  xname = Control name e.g. "Playback Volume"
  reg = codec register
  shift = control bit(s) offset in register
  mask = control bit size(s) e.g. mask of 7 = 3 bits
  invert = the control is inverted

Other macros include:-
T
Takashi Iwai 已提交
93
::
94 95 96 97

    #define SOC_DOUBLE(xname, reg, shift_left, shift_right, mask, invert)

A stereo control
T
Takashi Iwai 已提交
98
::
99 100 101 102

    #define SOC_DOUBLE_R(xname, reg_left, reg_right, shift, mask, invert)

A stereo control spanning 2 registers
T
Takashi Iwai 已提交
103
::
104 105 106 107

    #define SOC_ENUM_SINGLE(xreg, xshift, xmask, xtexts)

Defines an single enumerated control as follows:-
T
Takashi Iwai 已提交
108
::
109 110 111 112 113 114 115 116 117 118 119

   xreg = register
   xshift = control bit(s) offset in register
   xmask = control bit(s) size
   xtexts = pointer to array of strings that describe each setting

   #define SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmask, xtexts)

Defines a stereo enumerated control


T
Takashi Iwai 已提交
120 121
Codec Audio Operations
----------------------
122
The codec driver also supports the following ALSA PCM operations:-
T
Takashi Iwai 已提交
123
::
124

T
Takashi Iwai 已提交
125 126
  /* SoC audio ops */
  struct snd_soc_ops {
T
Takashi Iwai 已提交
127 128 129 130 131
	int (*startup)(struct snd_pcm_substream *);
	void (*shutdown)(struct snd_pcm_substream *);
	int (*hw_params)(struct snd_pcm_substream *, struct snd_pcm_hw_params *);
	int (*hw_free)(struct snd_pcm_substream *);
	int (*prepare)(struct snd_pcm_substream *);
T
Takashi Iwai 已提交
132
  };
133

M
Mark Brown 已提交
134
Please refer to the ALSA driver PCM documentation for details.
135
http://www.alsa-project.org/~iwai/writing-an-alsa-driver/
136 137


T
Takashi Iwai 已提交
138 139
DAPM description
----------------
M
Mark Brown 已提交
140 141 142
The Dynamic Audio Power Management description describes the codec power
components and their relationships and registers to the ASoC core.
Please read dapm.txt for details of building the description.
143 144 145 146

Please also see the examples in other codec drivers.


T
Takashi Iwai 已提交
147 148
DAPM event handler
------------------
149
This function is a callback that handles codec domain PM calls and system
M
Mark Brown 已提交
150 151
domain PM calls (e.g. suspend and resume). It is used to put the codec
to sleep when not in use.
152 153

Power states:-
T
Takashi Iwai 已提交
154
::
155 156 157 158 159 160 161 162 163 164 165 166 167

	SNDRV_CTL_POWER_D0: /* full On */
	/* vref/mid, clk and osc on, active */

	SNDRV_CTL_POWER_D1: /* partial On */
	SNDRV_CTL_POWER_D2: /* partial On */

	SNDRV_CTL_POWER_D3hot: /* Off, with power */
	/* everything off except vref/vmid, inactive */

	SNDRV_CTL_POWER_D3cold: /* Everything Off, without power */


T
Takashi Iwai 已提交
168 169
Codec DAC digital mute control
------------------------------
M
Mark Brown 已提交
170 171 172
Most codecs have a digital mute before the DACs that can be used to
minimise any system noise.  The mute stops any digital data from
entering the DAC.
173

M
Mark Brown 已提交
174 175
A callback can be created that is called by the core for each codec DAI
when the mute is applied or freed.
176 177

i.e.
T
Takashi Iwai 已提交
178
::
179

T
Takashi Iwai 已提交
180 181
  static int wm8974_mute(struct snd_soc_dai *dai, int mute)
  {
182 183
	struct snd_soc_component *component = dai->component;
	u16 mute_reg = snd_soc_component_read32(component, WM8974_DAC) & 0xffbf;
S
Seungwhan Youn 已提交
184 185

	if (mute)
186
		snd_soc_component_write(component, WM8974_DAC, mute_reg | 0x40);
187
	else
188
		snd_soc_component_write(component, WM8974_DAC, mute_reg);
189
	return 0;
T
Takashi Iwai 已提交
190
  }