Blame view

include/sound/soc-dapm.h 16.7 KB
808db4a45   Richard Purdie   [ALSA] ASoC: core...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  /*
   * linux/sound/soc-dapm.h -- ALSA SoC Dynamic Audio Power Management
   *
   * Author:		Liam Girdwood
   * Created:		Aug 11th 2005
   * Copyright:	Wolfson Microelectronics. PLC.
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
   */
  
  #ifndef __LINUX_SND_SOC_DAPM_H
  #define __LINUX_SND_SOC_DAPM_H
  
  #include <linux/device.h>
  #include <linux/types.h>
  #include <sound/control.h>
  #include <sound/soc.h>
  
  /* widget has no PM register bit */
  #define SND_SOC_NOPM	-1
  
  /*
b7d2a8035   Joe Perches   [ALSA] include/so...
25
   * SoC dynamic audio power management
808db4a45   Richard Purdie   [ALSA] ASoC: core...
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
   *
   * We can have upto 4 power domains
   * 	1. Codec domain - VREF, VMID
   *     Usually controlled at codec probe/remove, although can be set
   *     at stream time if power is not needed for sidetone, etc.
   *  2. Platform/Machine domain - physically connected inputs and outputs
   *     Is platform/machine and user action specific, is set in the machine
   *     driver and by userspace e.g when HP are inserted
   *  3. Path domain - Internal codec path mixers
   *     Are automatically set when mixer and mux settings are
   *     changed by the user.
   *  4. Stream domain - DAC's and ADC's.
   *     Enabled when stream playback/capture is started.
   */
  
  /* codec domain */
  #define SND_SOC_DAPM_VMID(wname) \
  {	.id = snd_soc_dapm_vmid, .name = wname, .kcontrols = NULL, \
  	.num_kcontrols = 0}
  
  /* platform domain */
  #define SND_SOC_DAPM_INPUT(wname) \
  {	.id = snd_soc_dapm_input, .name = wname, .kcontrols = NULL, \
  	.num_kcontrols = 0}
  #define SND_SOC_DAPM_OUTPUT(wname) \
  {	.id = snd_soc_dapm_output, .name = wname, .kcontrols = NULL, \
  	.num_kcontrols = 0}
  #define SND_SOC_DAPM_MIC(wname, wevent) \
  {	.id = snd_soc_dapm_mic, .name = wname, .kcontrols = NULL, \
  	.num_kcontrols = 0, .event = wevent, \
  	.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD}
  #define SND_SOC_DAPM_HP(wname, wevent) \
  {	.id = snd_soc_dapm_hp, .name = wname, .kcontrols = NULL, \
  	.num_kcontrols = 0, .event = wevent, \
  	.event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD}
  #define SND_SOC_DAPM_SPK(wname, wevent) \
  {	.id = snd_soc_dapm_spk, .name = wname, .kcontrols = NULL, \
  	.num_kcontrols = 0, .event = wevent, \
  	.event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD}
  #define SND_SOC_DAPM_LINE(wname, wevent) \
  {	.id = snd_soc_dapm_line, .name = wname, .kcontrols = NULL, \
  	.num_kcontrols = 0, .event = wevent, \
  	.event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD}
  
  /* path domain */
  #define SND_SOC_DAPM_PGA(wname, wreg, wshift, winvert,\
  	 wcontrols, wncontrols) \
  {	.id = snd_soc_dapm_pga, .name = wname, .reg = wreg, .shift = wshift, \
  	.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols}
  #define SND_SOC_DAPM_MIXER(wname, wreg, wshift, winvert, \
  	 wcontrols, wncontrols)\
  {	.id = snd_soc_dapm_mixer, .name = wname, .reg = wreg, .shift = wshift, \
  	.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols}
ca9c1aaec   Ian Molton   ASoC: dapm: Allow...
79
80
81
82
83
  #define SND_SOC_DAPM_MIXER_NAMED_CTL(wname, wreg, wshift, winvert, \
  	 wcontrols, wncontrols)\
  {       .id = snd_soc_dapm_mixer_named_ctl, .name = wname, .reg = wreg, \
  	.shift = wshift, .invert = winvert, .kcontrols = wcontrols, \
  	.num_kcontrols = wncontrols}
808db4a45   Richard Purdie   [ALSA] ASoC: core...
84
85
86
87
88
89
90
91
92
  #define SND_SOC_DAPM_MICBIAS(wname, wreg, wshift, winvert) \
  {	.id = snd_soc_dapm_micbias, .name = wname, .reg = wreg, .shift = wshift, \
  	.invert = winvert, .kcontrols = NULL, .num_kcontrols = 0}
  #define SND_SOC_DAPM_SWITCH(wname, wreg, wshift, winvert, wcontrols) \
  {	.id = snd_soc_dapm_switch, .name = wname, .reg = wreg, .shift = wshift, \
  	.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1}
  #define SND_SOC_DAPM_MUX(wname, wreg, wshift, winvert, wcontrols) \
  {	.id = snd_soc_dapm_mux, .name = wname, .reg = wreg, .shift = wshift, \
  	.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1}
2e72f8e37   Peter Ujfalusi   ASoC: New enum ty...
93
94
95
96
  #define SND_SOC_DAPM_VALUE_MUX(wname, wreg, wshift, winvert, wcontrols) \
  {	.id = snd_soc_dapm_value_mux, .name = wname, .reg = wreg, \
  	.shift = wshift, .invert = winvert, .kcontrols = wcontrols, \
  	.num_kcontrols = 1}
808db4a45   Richard Purdie   [ALSA] ASoC: core...
97
98
99
100
101
102
103
104
105
106
107
108
  
  /* path domain with event - event handler must return 0 for success */
  #define SND_SOC_DAPM_PGA_E(wname, wreg, wshift, winvert, wcontrols, \
  	wncontrols, wevent, wflags) \
  {	.id = snd_soc_dapm_pga, .name = wname, .reg = wreg, .shift = wshift, \
  	.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols, \
  	.event = wevent, .event_flags = wflags}
  #define SND_SOC_DAPM_MIXER_E(wname, wreg, wshift, winvert, wcontrols, \
  	wncontrols, wevent, wflags) \
  {	.id = snd_soc_dapm_mixer, .name = wname, .reg = wreg, .shift = wshift, \
  	.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = wncontrols, \
  	.event = wevent, .event_flags = wflags}
ca9c1aaec   Ian Molton   ASoC: dapm: Allow...
109
110
111
112
113
  #define SND_SOC_DAPM_MIXER_NAMED_CTL_E(wname, wreg, wshift, winvert, \
  	wcontrols, wncontrols, wevent, wflags) \
  {       .id = snd_soc_dapm_mixer, .name = wname, .reg = wreg, .shift = wshift, \
  	.invert = winvert, .kcontrols = wcontrols, \
  	.num_kcontrols = wncontrols, .event = wevent, .event_flags = wflags}
808db4a45   Richard Purdie   [ALSA] ASoC: core...
114
115
116
117
118
119
120
  #define SND_SOC_DAPM_MICBIAS_E(wname, wreg, wshift, winvert, wevent, wflags) \
  {	.id = snd_soc_dapm_micbias, .name = wname, .reg = wreg, .shift = wshift, \
  	.invert = winvert, .kcontrols = NULL, .num_kcontrols = 0, \
  	.event = wevent, .event_flags = wflags}
  #define SND_SOC_DAPM_SWITCH_E(wname, wreg, wshift, winvert, wcontrols, \
  	wevent, wflags) \
  {	.id = snd_soc_dapm_switch, .name = wname, .reg = wreg, .shift = wshift, \
43d50807d   Peter Ujfalusi   ASoC: Add missing...
121
  	.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1, \
808db4a45   Richard Purdie   [ALSA] ASoC: core...
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
  	.event = wevent, .event_flags = wflags}
  #define SND_SOC_DAPM_MUX_E(wname, wreg, wshift, winvert, wcontrols, \
  	wevent, wflags) \
  {	.id = snd_soc_dapm_mux, .name = wname, .reg = wreg, .shift = wshift, \
  	.invert = winvert, .kcontrols = wcontrols, .num_kcontrols = 1, \
  	.event = wevent, .event_flags = wflags}
  
  /* events that are pre and post DAPM */
  #define SND_SOC_DAPM_PRE(wname, wevent) \
  {	.id = snd_soc_dapm_pre, .name = wname, .kcontrols = NULL, \
  	.num_kcontrols = 0, .event = wevent, \
  	.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_PRE_PMD}
  #define SND_SOC_DAPM_POST(wname, wevent) \
  {	.id = snd_soc_dapm_post, .name = wname, .kcontrols = NULL, \
  	.num_kcontrols = 0, .event = wevent, \
  	.event_flags = SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD}
  
  /* stream domain */
010ff2622   Mark Brown   ASoC: Add input a...
140
141
142
143
144
145
  #define SND_SOC_DAPM_AIF_IN(wname, stname, wslot, wreg, wshift, winvert) \
  {	.id = snd_soc_dapm_aif_in, .name = wname, .sname = stname, \
  	.reg = wreg, .shift = wshift, .invert = winvert }
  #define SND_SOC_DAPM_AIF_OUT(wname, stname, wslot, wreg, wshift, winvert) \
  {	.id = snd_soc_dapm_aif_out, .name = wname, .sname = stname, \
  	.reg = wreg, .shift = wshift, .invert = winvert }
808db4a45   Richard Purdie   [ALSA] ASoC: core...
146
147
148
  #define SND_SOC_DAPM_DAC(wname, stname, wreg, wshift, winvert) \
  {	.id = snd_soc_dapm_dac, .name = wname, .sname = stname, .reg = wreg, \
  	.shift = wshift, .invert = winvert}
f6d655a6e   Mark Brown   ASoC: Support DAP...
149
150
151
152
153
  #define SND_SOC_DAPM_DAC_E(wname, stname, wreg, wshift, winvert, \
  			   wevent, wflags)				\
  {	.id = snd_soc_dapm_dac, .name = wname, .sname = stname, .reg = wreg, \
  	.shift = wshift, .invert = winvert, \
  	.event = wevent, .event_flags = wflags}
808db4a45   Richard Purdie   [ALSA] ASoC: core...
154
155
156
  #define SND_SOC_DAPM_ADC(wname, stname, wreg, wshift, winvert) \
  {	.id = snd_soc_dapm_adc, .name = wname, .sname = stname, .reg = wreg, \
  	.shift = wshift, .invert = winvert}
f6d655a6e   Mark Brown   ASoC: Support DAP...
157
158
159
160
161
  #define SND_SOC_DAPM_ADC_E(wname, stname, wreg, wshift, winvert, \
  			   wevent, wflags)				\
  {	.id = snd_soc_dapm_adc, .name = wname, .sname = stname, .reg = wreg, \
  	.shift = wshift, .invert = winvert, \
  	.event = wevent, .event_flags = wflags}
808db4a45   Richard Purdie   [ALSA] ASoC: core...
162

246d0a17f   Mark Brown   ASoC: Add power s...
163
  /* generic widgets */
e2be2ccf9   Jarkko Nikula   ALSA: ASoC: Add s...
164
165
166
167
168
  #define SND_SOC_DAPM_REG(wid, wname, wreg, wshift, wmask, won_val, woff_val) \
  {	.id = wid, .name = wname, .kcontrols = NULL, .num_kcontrols = 0, \
  	.reg = -((wreg) + 1), .shift = wshift, .mask = wmask, \
  	.on_val = won_val, .off_val = woff_val, .event = dapm_reg_event, \
  	.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD}
246d0a17f   Mark Brown   ASoC: Add power s...
169
170
171
172
  #define SND_SOC_DAPM_SUPPLY(wname, wreg, wshift, winvert, wevent, wflags) \
  {	.id = snd_soc_dapm_supply, .name = wname, .reg = wreg,	\
  	.shift = wshift, .invert = winvert, .event = wevent, \
  	.event_flags = wflags}
e2be2ccf9   Jarkko Nikula   ALSA: ASoC: Add s...
173

808db4a45   Richard Purdie   [ALSA] ASoC: core...
174
  /* dapm kcontrol types */
a7a4ac86b   Philipp Zabel   [ALSA] ASoC TLV s...
175
  #define SOC_DAPM_SINGLE(xname, reg, shift, max, invert) \
808db4a45   Richard Purdie   [ALSA] ASoC: core...
176
177
178
  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
  	.info = snd_soc_info_volsw, \
  	.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
a7a4ac86b   Philipp Zabel   [ALSA] ASoC TLV s...
179
180
  	.private_value =  SOC_SINGLE_VALUE(reg, shift, max, invert) }
  #define SOC_DAPM_DOUBLE(xname, reg, shift_left, shift_right, max, invert, \
808db4a45   Richard Purdie   [ALSA] ASoC: core...
181
182
183
184
185
  	power) \
  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
  	.info = snd_soc_info_volsw, \
   	.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
   	.private_value = (reg) | ((shift_left) << 8) | ((shift_right) << 12) |\
a7a4ac86b   Philipp Zabel   [ALSA] ASoC TLV s...
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
  		((max) << 16) | ((invert) << 24) }
  #define SOC_DAPM_SINGLE_TLV(xname, reg, shift, max, invert, tlv_array) \
  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
  	.info = snd_soc_info_volsw, \
  	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | SNDRV_CTL_ELEM_ACCESS_READWRITE,\
  	.tlv.p = (tlv_array), \
  	.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
  	.private_value =  SOC_SINGLE_VALUE(reg, shift, max, invert) }
  #define SOC_DAPM_DOUBLE_TLV(xname, reg, shift_left, shift_right, max, invert, \
  	power, tlv_array) \
  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
  	.access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | SNDRV_CTL_ELEM_ACCESS_READWRITE,\
  	.tlv.p = (tlv_array), \
  	.info = snd_soc_info_volsw, \
  	.get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
  	.private_value = (reg) | ((shift_left) << 8) | ((shift_right) << 12) |\
  		((max) << 16) | ((invert) << 24) }
808db4a45   Richard Purdie   [ALSA] ASoC: core...
203
204
205
206
207
208
  #define SOC_DAPM_ENUM(xname, xenum) \
  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
  	.info = snd_soc_info_enum_double, \
   	.get = snd_soc_dapm_get_enum_double, \
   	.put = snd_soc_dapm_put_enum_double, \
    	.private_value = (unsigned long)&xenum }
2e72f8e37   Peter Ujfalusi   ASoC: New enum ty...
209
210
  #define SOC_DAPM_VALUE_ENUM(xname, xenum) \
  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
741555568   Peter Ujfalusi   ASoC: Merge the s...
211
  	.info = snd_soc_info_enum_double, \
2e72f8e37   Peter Ujfalusi   ASoC: New enum ty...
212
213
214
  	.get = snd_soc_dapm_get_value_enum_double, \
  	.put = snd_soc_dapm_put_value_enum_double, \
  	.private_value = (unsigned long)&xenum }
8b37dbd2a   Mark Brown   ASoC: Add SND_SOC...
215
216
217
218
219
220
  #define SOC_DAPM_PIN_SWITCH(xname) \
  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname " Switch", \
  	.info = snd_soc_dapm_info_pin_switch, \
  	.get = snd_soc_dapm_get_pin_switch, \
  	.put = snd_soc_dapm_put_pin_switch, \
  	.private_value = (unsigned long)xname }
808db4a45   Richard Purdie   [ALSA] ASoC: core...
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
  
  /* dapm stream operations */
  #define SND_SOC_DAPM_STREAM_NOP			0x0
  #define SND_SOC_DAPM_STREAM_START		0x1
  #define SND_SOC_DAPM_STREAM_STOP		0x2
  #define SND_SOC_DAPM_STREAM_SUSPEND		0x4
  #define SND_SOC_DAPM_STREAM_RESUME		0x8
  #define SND_SOC_DAPM_STREAM_PAUSE_PUSH	0x10
  #define SND_SOC_DAPM_STREAM_PAUSE_RELEASE	0x20
  
  /* dapm event types */
  #define SND_SOC_DAPM_PRE_PMU	0x1 	/* before widget power up */
  #define SND_SOC_DAPM_POST_PMU	0x2		/* after widget power up */
  #define SND_SOC_DAPM_PRE_PMD	0x4 	/* before widget power down */
  #define SND_SOC_DAPM_POST_PMD	0x8		/* after widget power down */
  #define SND_SOC_DAPM_PRE_REG	0x10	/* before audio path setup */
  #define SND_SOC_DAPM_POST_REG	0x20	/* after audio path setup */
  
  /* convenience event type detection */
  #define SND_SOC_DAPM_EVENT_ON(e)	\
  	(e & (SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU))
  #define SND_SOC_DAPM_EVENT_OFF(e)	\
  	(e & (SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD))
  
  struct snd_soc_dapm_widget;
  enum snd_soc_dapm_type;
  struct snd_soc_dapm_path;
  struct snd_soc_dapm_pin;
105f1c284   Mark Brown   [ALSA] soc - DAPM...
249
  struct snd_soc_dapm_route;
808db4a45   Richard Purdie   [ALSA] ASoC: core...
250

11589418a   Mark Brown   ALSA: ASoC: Expor...
251
252
  int dapm_reg_event(struct snd_soc_dapm_widget *w,
  		   struct snd_kcontrol *kcontrol, int event);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
253
254
255
256
257
258
259
260
261
  /* dapm controls */
  int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_value *ucontrol);
  int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_value *ucontrol);
  int snd_soc_dapm_get_enum_double(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_value *ucontrol);
  int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_value *ucontrol);
2e72f8e37   Peter Ujfalusi   ASoC: New enum ty...
262
263
264
265
  int snd_soc_dapm_get_value_enum_double(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_value *ucontrol);
  int snd_soc_dapm_put_value_enum_double(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_value *ucontrol);
8b37dbd2a   Mark Brown   ASoC: Add SND_SOC...
266
267
268
269
270
271
  int snd_soc_dapm_info_pin_switch(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_info *uinfo);
  int snd_soc_dapm_get_pin_switch(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_value *uncontrol);
  int snd_soc_dapm_put_pin_switch(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_value *uncontrol);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
272
273
  int snd_soc_dapm_new_control(struct snd_soc_codec *codec,
  	const struct snd_soc_dapm_widget *widget);
4ba1327ab   Mark Brown   [ALSA] soc - DAPM...
274
275
276
  int snd_soc_dapm_new_controls(struct snd_soc_codec *codec,
  	const struct snd_soc_dapm_widget *widget,
  	int num);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
277
278
  
  /* dapm path setup */
808db4a45   Richard Purdie   [ALSA] ASoC: core...
279
280
  int snd_soc_dapm_new_widgets(struct snd_soc_codec *codec);
  void snd_soc_dapm_free(struct snd_soc_device *socdev);
105f1c284   Mark Brown   [ALSA] soc - DAPM...
281
282
  int snd_soc_dapm_add_routes(struct snd_soc_codec *codec,
  			    const struct snd_soc_dapm_route *route, int num);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
283
284
285
286
  
  /* dapm events */
  int snd_soc_dapm_stream_event(struct snd_soc_codec *codec, char *stream,
  	int event);
517374704   Mark Brown   ASoC: Add a shutd...
287
  void snd_soc_dapm_shutdown(struct snd_soc_device *socdev);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
288
289
290
  
  /* dapm sys fs - used by the core */
  int snd_soc_dapm_sys_add(struct device *dev);
79fb9387f   Mark Brown   ASoC: Add DAPM wi...
291
  void snd_soc_dapm_debugfs_init(struct snd_soc_codec *codec);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
292

a5302181e   Liam Girdwood   ALSA: asoc: core ...
293
  /* dapm audio pin control and status */
1649923dd   Mark Brown   ASoC: Constify pi...
294
295
296
297
  int snd_soc_dapm_enable_pin(struct snd_soc_codec *codec, const char *pin);
  int snd_soc_dapm_disable_pin(struct snd_soc_codec *codec, const char *pin);
  int snd_soc_dapm_nc_pin(struct snd_soc_codec *codec, const char *pin);
  int snd_soc_dapm_get_pin_status(struct snd_soc_codec *codec, const char *pin);
a5302181e   Liam Girdwood   ALSA: asoc: core ...
298
  int snd_soc_dapm_sync(struct snd_soc_codec *codec);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
299
300
301
302
303
304
  
  /* dapm widget types */
  enum snd_soc_dapm_type {
  	snd_soc_dapm_input = 0,		/* input pin */
  	snd_soc_dapm_output,		/* output pin */
  	snd_soc_dapm_mux,			/* selects 1 analog signal from many inputs */
2e72f8e37   Peter Ujfalusi   ASoC: New enum ty...
305
  	snd_soc_dapm_value_mux,			/* selects 1 analog signal from many inputs */
808db4a45   Richard Purdie   [ALSA] ASoC: core...
306
  	snd_soc_dapm_mixer,			/* mixes several analog signals together */
ca9c1aaec   Ian Molton   ASoC: dapm: Allow...
307
  	snd_soc_dapm_mixer_named_ctl,		/* mixer with named controls */
808db4a45   Richard Purdie   [ALSA] ASoC: core...
308
309
310
311
312
313
314
315
316
317
318
319
  	snd_soc_dapm_pga,			/* programmable gain/attenuation (volume) */
  	snd_soc_dapm_adc,			/* analog to digital converter */
  	snd_soc_dapm_dac,			/* digital to analog converter */
  	snd_soc_dapm_micbias,		/* microphone bias (power) */
  	snd_soc_dapm_mic,			/* microphone */
  	snd_soc_dapm_hp,			/* headphones */
  	snd_soc_dapm_spk,			/* speaker */
  	snd_soc_dapm_line,			/* line input/output */
  	snd_soc_dapm_switch,		/* analog switch */
  	snd_soc_dapm_vmid,			/* codec bias/vmid - to minimise pops */
  	snd_soc_dapm_pre,			/* machine specific pre widget - exec first */
  	snd_soc_dapm_post,			/* machine specific post widget - exec last */
246d0a17f   Mark Brown   ASoC: Add power s...
320
  	snd_soc_dapm_supply,		/* power/clock supply */
010ff2622   Mark Brown   ASoC: Add input a...
321
322
  	snd_soc_dapm_aif_in,		/* audio interface input */
  	snd_soc_dapm_aif_out,		/* audio interface output */
808db4a45   Richard Purdie   [ALSA] ASoC: core...
323
  };
105f1c284   Mark Brown   [ALSA] soc - DAPM...
324
325
326
327
328
329
330
331
332
333
334
  /*
   * DAPM audio route definition.
   *
   * Defines an audio route originating at source via control and finishing
   * at sink.
   */
  struct snd_soc_dapm_route {
  	const char *sink;
  	const char *control;
  	const char *source;
  };
808db4a45   Richard Purdie   [ALSA] ASoC: core...
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
  /* dapm audio path between two widgets */
  struct snd_soc_dapm_path {
  	char *name;
  	char *long_name;
  
  	/* source (input) and sink (output) widgets */
  	struct snd_soc_dapm_widget *source;
  	struct snd_soc_dapm_widget *sink;
  	struct snd_kcontrol *kcontrol;
  
  	/* status */
  	u32 connect:1;	/* source and sink widgets are connected */
  	u32 walked:1;	/* path has been walked */
  
  	struct list_head list_source;
  	struct list_head list_sink;
  	struct list_head list;
  };
  
  /* dapm widget */
  struct snd_soc_dapm_widget {
  	enum snd_soc_dapm_type id;
  	char *name;		/* widget name */
  	char *sname;	/* stream name */
  	struct snd_soc_codec *codec;
  	struct list_head list;
  
  	/* dapm control */
  	short reg;						/* negative reg = no direct dapm */
  	unsigned char shift;			/* bits to shift */
  	unsigned int saved_value;		/* widget saved value */
  	unsigned int value;				/* widget current value */
e2be2ccf9   Jarkko Nikula   ALSA: ASoC: Add s...
367
368
369
  	unsigned int mask;			/* non-shifted mask */
  	unsigned int on_val;			/* on state value */
  	unsigned int off_val;			/* off state value */
808db4a45   Richard Purdie   [ALSA] ASoC: core...
370
371
372
373
374
375
376
377
378
  	unsigned char power:1;			/* block power status */
  	unsigned char invert:1;			/* invert the power bit */
  	unsigned char active:1;			/* active stream on DAC, ADC's */
  	unsigned char connected:1;		/* connected codec pin */
  	unsigned char new:1;			/* cnew complete */
  	unsigned char ext:1;			/* has external widgets */
  	unsigned char muted:1;			/* muted for pop reduction */
  	unsigned char suspend:1;		/* was active before suspend */
  	unsigned char pmdown:1;			/* waiting for timeout */
b75576d76   Mark Brown   ASoC: Make the DA...
379
  	int (*power_check)(struct snd_soc_dapm_widget *w);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
380
381
  	/* external events */
  	unsigned short event_flags;		/* flags to specify event types */
9af6d9562   Laim Girdwood   [ALSA] soc - Add ...
382
  	int (*event)(struct snd_soc_dapm_widget*, struct snd_kcontrol *, int);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
383
384
385
386
387
388
389
390
  
  	/* kcontrols that relate to this widget */
  	int num_kcontrols;
  	const struct snd_kcontrol_new *kcontrols;
  
  	/* widget input and outputs */
  	struct list_head sources;
  	struct list_head sinks;
6d3ddc81f   Mark Brown   ASoC: Split DAPM ...
391
392
393
  
  	/* used during DAPM updates */
  	struct list_head power_list;
808db4a45   Richard Purdie   [ALSA] ASoC: core...
394
395
396
  };
  
  #endif