Blame view

include/sound/soc.h 31.3 KB
808db4a45   Richard Purdie   [ALSA] ASoC: core...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  /*
   * linux/sound/soc.h -- ALSA SoC Layer
   *
   * 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_H
  #define __LINUX_SND_SOC_H
  
  #include <linux/platform_device.h>
  #include <linux/types.h>
d5021ec9f   Mark Brown   ASoC: Add a notif...
18
  #include <linux/notifier.h>
4484bb2e9   Andrew Morton   [ALSA] Fix the so...
19
  #include <linux/workqueue.h>
ec67624d3   Lopez Cruz, Misael   ASoC: Add GPIO su...
20
21
  #include <linux/interrupt.h>
  #include <linux/kernel.h>
808db4a45   Richard Purdie   [ALSA] ASoC: core...
22
23
24
25
  #include <sound/core.h>
  #include <sound/pcm.h>
  #include <sound/control.h>
  #include <sound/ac97_codec.h>
808db4a45   Richard Purdie   [ALSA] ASoC: core...
26
27
28
  /*
   * Convenience kcontrol builders
   */
4eaa9819d   Jon Smirl   ALSA: ASoC: Conve...
29
30
  #define SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert) \
  	((unsigned long)&(struct soc_mixer_control) \
762b8df74   Mark Brown   ALSA: ASoC: Fix m...
31
  	{.reg = xreg, .shift = xshift, .rshift = xshift, .max = xmax, \
d11bb4a92   Peter Ujfalusi   ASoC: core: Fix f...
32
  	.platform_max = xmax, .invert = xinvert})
4eaa9819d   Jon Smirl   ALSA: ASoC: Conve...
33
34
  #define SOC_SINGLE_VALUE_EXT(xreg, xmax, xinvert) \
  	((unsigned long)&(struct soc_mixer_control) \
d11bb4a92   Peter Ujfalusi   ASoC: core: Fix f...
35
  	{.reg = xreg, .max = xmax, .platform_max = xmax, .invert = xinvert})
a7a4ac86b   Philipp Zabel   [ALSA] ASoC TLV s...
36
  #define SOC_SINGLE(xname, reg, shift, max, invert) \
808db4a45   Richard Purdie   [ALSA] ASoC: core...
37
38
39
  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
  	.info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\
  	.put = snd_soc_put_volsw, \
a7a4ac86b   Philipp Zabel   [ALSA] ASoC TLV s...
40
41
42
43
44
45
46
47
48
  	.private_value =  SOC_SINGLE_VALUE(reg, shift, max, invert) }
  #define SOC_SINGLE_TLV(xname, reg, shift, max, invert, 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_get_volsw,\
  	.put = snd_soc_put_volsw, \
  	.private_value =  SOC_SINGLE_VALUE(reg, shift, max, invert) }
4eaa9819d   Jon Smirl   ALSA: ASoC: Conve...
49
  #define SOC_DOUBLE(xname, xreg, shift_left, shift_right, xmax, xinvert) \
808db4a45   Richard Purdie   [ALSA] ASoC: core...
50
51
52
  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
  	.info = snd_soc_info_volsw, .get = snd_soc_get_volsw, \
  	.put = snd_soc_put_volsw, \
4eaa9819d   Jon Smirl   ALSA: ASoC: Conve...
53
54
  	.private_value = (unsigned long)&(struct soc_mixer_control) \
  		{.reg = xreg, .shift = shift_left, .rshift = shift_right, \
d11bb4a92   Peter Ujfalusi   ASoC: core: Fix f...
55
  		 .max = xmax, .platform_max = xmax, .invert = xinvert} }
4eaa9819d   Jon Smirl   ALSA: ASoC: Conve...
56
  #define SOC_DOUBLE_R(xname, reg_left, reg_right, xshift, xmax, xinvert) \
808db4a45   Richard Purdie   [ALSA] ASoC: core...
57
58
59
  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
  	.info = snd_soc_info_volsw_2r, \
  	.get = snd_soc_get_volsw_2r, .put = snd_soc_put_volsw_2r, \
4eaa9819d   Jon Smirl   ALSA: ASoC: Conve...
60
61
  	.private_value = (unsigned long)&(struct soc_mixer_control) \
  		{.reg = reg_left, .rreg = reg_right, .shift = xshift, \
d11bb4a92   Peter Ujfalusi   ASoC: core: Fix f...
62
  		.max = xmax, .platform_max = xmax, .invert = xinvert} }
4eaa9819d   Jon Smirl   ALSA: ASoC: Conve...
63
  #define SOC_DOUBLE_TLV(xname, xreg, shift_left, shift_right, xmax, xinvert, tlv_array) \
a7a4ac86b   Philipp Zabel   [ALSA] ASoC TLV s...
64
65
66
67
68
69
  {	.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_get_volsw, \
  	.put = snd_soc_put_volsw, \
4eaa9819d   Jon Smirl   ALSA: ASoC: Conve...
70
71
  	.private_value = (unsigned long)&(struct soc_mixer_control) \
  		{.reg = xreg, .shift = shift_left, .rshift = shift_right,\
d11bb4a92   Peter Ujfalusi   ASoC: core: Fix f...
72
  		 .max = xmax, .platform_max = xmax, .invert = xinvert} }
4eaa9819d   Jon Smirl   ALSA: ASoC: Conve...
73
  #define SOC_DOUBLE_R_TLV(xname, reg_left, reg_right, xshift, xmax, xinvert, tlv_array) \
a7a4ac86b   Philipp Zabel   [ALSA] ASoC TLV s...
74
75
76
77
78
79
  {	.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_2r, \
  	.get = snd_soc_get_volsw_2r, .put = snd_soc_put_volsw_2r, \
4eaa9819d   Jon Smirl   ALSA: ASoC: Conve...
80
81
  	.private_value = (unsigned long)&(struct soc_mixer_control) \
  		{.reg = reg_left, .rreg = reg_right, .shift = xshift, \
d11bb4a92   Peter Ujfalusi   ASoC: core: Fix f...
82
  		.max = xmax, .platform_max = xmax, .invert = xinvert} }
4eaa9819d   Jon Smirl   ALSA: ASoC: Conve...
83
  #define SOC_DOUBLE_S8_TLV(xname, xreg, xmin, xmax, tlv_array) \
e13ac2e9b   Mark Brown   [ALSA] ASoC: Add ...
84
85
86
87
88
89
  {	.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_s8, .get = snd_soc_get_volsw_s8, \
  	.put    = snd_soc_put_volsw_s8, \
4eaa9819d   Jon Smirl   ALSA: ASoC: Conve...
90
  	.private_value = (unsigned long)&(struct soc_mixer_control) \
d11bb4a92   Peter Ujfalusi   ASoC: core: Fix f...
91
92
  		{.reg = xreg, .min = xmin, .max = xmax, \
  		 .platform_max = xmax} }
f8ba0b7bf   Jon Smirl   ALSA: ASoC: Renam...
93
  #define SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmax, xtexts) \
808db4a45   Richard Purdie   [ALSA] ASoC: core...
94
  {	.reg = xreg, .shift_l = xshift_l, .shift_r = xshift_r, \
f8ba0b7bf   Jon Smirl   ALSA: ASoC: Renam...
95
96
97
98
99
  	.max = xmax, .texts = xtexts }
  #define SOC_ENUM_SINGLE(xreg, xshift, xmax, xtexts) \
  	SOC_ENUM_DOUBLE(xreg, xshift, xshift, xmax, xtexts)
  #define SOC_ENUM_SINGLE_EXT(xmax, xtexts) \
  {	.max = xmax, .texts = xtexts }
2e72f8e37   Peter Ujfalusi   ASoC: New enum ty...
100
101
102
103
104
  #define SOC_VALUE_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmask, xmax, xtexts, xvalues) \
  {	.reg = xreg, .shift_l = xshift_l, .shift_r = xshift_r, \
  	.mask = xmask, .max = xmax, .texts = xtexts, .values = xvalues}
  #define SOC_VALUE_ENUM_SINGLE(xreg, xshift, xmask, xmax, xtexts, xvalues) \
  	SOC_VALUE_ENUM_DOUBLE(xreg, xshift, xshift, xmask, xmax, xtexts, xvalues)
808db4a45   Richard Purdie   [ALSA] ASoC: core...
105
106
107
108
109
  #define SOC_ENUM(xname, xenum) \
  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,\
  	.info = snd_soc_info_enum_double, \
  	.get = snd_soc_get_enum_double, .put = snd_soc_put_enum_double, \
  	.private_value = (unsigned long)&xenum }
2e72f8e37   Peter Ujfalusi   ASoC: New enum ty...
110
111
  #define SOC_VALUE_ENUM(xname, xenum) \
  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,\
741555568   Peter Ujfalusi   ASoC: Merge the s...
112
  	.info = snd_soc_info_enum_double, \
2e72f8e37   Peter Ujfalusi   ASoC: New enum ty...
113
114
115
  	.get = snd_soc_get_value_enum_double, \
  	.put = snd_soc_put_value_enum_double, \
  	.private_value = (unsigned long)&xenum }
f8ba0b7bf   Jon Smirl   ALSA: ASoC: Renam...
116
  #define SOC_SINGLE_EXT(xname, xreg, xshift, xmax, xinvert,\
808db4a45   Richard Purdie   [ALSA] ASoC: core...
117
118
  	 xhandler_get, xhandler_put) \
  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
1c433fbda   Graeme Gregory   [ALSA] soc - 0.13...
119
  	.info = snd_soc_info_volsw, \
808db4a45   Richard Purdie   [ALSA] ASoC: core...
120
  	.get = xhandler_get, .put = xhandler_put, \
f8ba0b7bf   Jon Smirl   ALSA: ASoC: Renam...
121
  	.private_value = SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert) }
7629ad24f   Daniel Mack   ASoC: add SOC_DOU...
122
123
124
125
126
127
128
  #define SOC_DOUBLE_EXT(xname, xreg, shift_left, shift_right, xmax, xinvert,\
  	 xhandler_get, xhandler_put) \
  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
  	.info = snd_soc_info_volsw, \
  	.get = xhandler_get, .put = xhandler_put, \
  	.private_value = (unsigned long)&(struct soc_mixer_control) \
  		{.reg = xreg, .shift = shift_left, .rshift = shift_right, \
d11bb4a92   Peter Ujfalusi   ASoC: core: Fix f...
129
  		 .max = xmax, .platform_max = xmax, .invert = xinvert} }
f8ba0b7bf   Jon Smirl   ALSA: ASoC: Renam...
130
  #define SOC_SINGLE_EXT_TLV(xname, xreg, xshift, xmax, xinvert,\
10144c09a   Mike Montour   ALSA: ASoC: Add S...
131
132
133
134
135
136
137
  	 xhandler_get, xhandler_put, 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 = xhandler_get, .put = xhandler_put, \
f8ba0b7bf   Jon Smirl   ALSA: ASoC: Renam...
138
  	.private_value = SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert) }
d0af93db1   Joonyoung Shim   ASoC: add SOC_DOU...
139
140
141
142
143
144
145
146
147
148
  #define SOC_DOUBLE_EXT_TLV(xname, xreg, shift_left, shift_right, xmax, xinvert,\
  	 xhandler_get, xhandler_put, 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 = xhandler_get, .put = xhandler_put, \
  	.private_value = (unsigned long)&(struct soc_mixer_control) \
  		{.reg = xreg, .shift = shift_left, .rshift = shift_right, \
d11bb4a92   Peter Ujfalusi   ASoC: core: Fix f...
149
  		.max = xmax, .platform_max = xmax, .invert = xinvert} }
3ce91d5a5   Joonyoung Shim   ASoC: add SOC_DOU...
150
151
152
153
154
155
156
157
158
159
  #define SOC_DOUBLE_R_EXT_TLV(xname, reg_left, reg_right, xshift, xmax, xinvert,\
  	 xhandler_get, xhandler_put, 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_2r, \
  	.get = xhandler_get, .put = xhandler_put, \
  	.private_value = (unsigned long)&(struct soc_mixer_control) \
  		{.reg = reg_left, .rreg = reg_right, .shift = xshift, \
d11bb4a92   Peter Ujfalusi   ASoC: core: Fix f...
160
  		.max = xmax, .platform_max = xmax, .invert = xinvert} }
808db4a45   Richard Purdie   [ALSA] ASoC: core...
161
162
163
164
165
166
167
168
169
170
  #define SOC_SINGLE_BOOL_EXT(xname, xdata, xhandler_get, xhandler_put) \
  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
  	.info = snd_soc_info_bool_ext, \
  	.get = xhandler_get, .put = xhandler_put, \
  	.private_value = xdata }
  #define SOC_ENUM_EXT(xname, xenum, xhandler_get, xhandler_put) \
  {	.iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
  	.info = snd_soc_info_enum_ext, \
  	.get = xhandler_get, .put = xhandler_put, \
  	.private_value = (unsigned long)&xenum }
b6f4bb383   apatard@mandriva.com   ASoC: Add SOC_DOU...
171
172
173
174
175
176
177
178
179
180
181
182
183
  #define SOC_DOUBLE_R_SX_TLV(xname, xreg_left, xreg_right, xshift,\
  		xmin, xmax, 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_2r_sx, \
  	.get = snd_soc_get_volsw_2r_sx, \
  	.put = snd_soc_put_volsw_2r_sx, \
  	.private_value = (unsigned long)&(struct soc_mixer_control) \
  		{.reg = xreg_left, \
  		 .rreg = xreg_right, .shift = xshift, \
  		 .min = xmin, .max = xmax} }
808db4a45   Richard Purdie   [ALSA] ASoC: core...
184
  /*
6c2fb6a8d   Guennadi Liakhovetski   ASoC: add helper ...
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
   * Simplified versions of above macros, declaring a struct and calculating
   * ARRAY_SIZE internally
   */
  #define SOC_ENUM_DOUBLE_DECL(name, xreg, xshift_l, xshift_r, xtexts) \
  	struct soc_enum name = SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, \
  						ARRAY_SIZE(xtexts), xtexts)
  #define SOC_ENUM_SINGLE_DECL(name, xreg, xshift, xtexts) \
  	SOC_ENUM_DOUBLE_DECL(name, xreg, xshift, xshift, xtexts)
  #define SOC_ENUM_SINGLE_EXT_DECL(name, xtexts) \
  	struct soc_enum name = SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(xtexts), xtexts)
  #define SOC_VALUE_ENUM_DOUBLE_DECL(name, xreg, xshift_l, xshift_r, xmask, xtexts, xvalues) \
  	struct soc_enum name = SOC_VALUE_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmask, \
  							ARRAY_SIZE(xtexts), xtexts, xvalues)
  #define SOC_VALUE_ENUM_SINGLE_DECL(name, xreg, xshift, xmask, xtexts, xvalues) \
  	SOC_VALUE_ENUM_DOUBLE_DECL(name, xreg, xshift, xshift, xmask, xtexts, xvalues)
  
  /*
0168bf0d1   Liam Girdwood   ASoC: core - Allo...
202
203
204
205
206
207
208
209
210
211
   * Component probe and remove ordering levels for components with runtime
   * dependencies.
   */
  #define SND_SOC_COMP_ORDER_FIRST		-2
  #define SND_SOC_COMP_ORDER_EARLY		-1
  #define SND_SOC_COMP_ORDER_NORMAL		0
  #define SND_SOC_COMP_ORDER_LATE		1
  #define SND_SOC_COMP_ORDER_LAST		2
  
  /*
0be9898ad   Mark Brown   [ALSA] ASoC: Clar...
212
213
214
215
216
217
218
219
220
221
222
   * Bias levels
   *
   * @ON:      Bias is fully on for audio playback and capture operations.
   * @PREPARE: Prepare for audio operations. Called before DAPM switching for
   *           stream start and stop operations.
   * @STANDBY: Low power standby state when no playback/capture operations are
   *           in progress. NOTE: The transition time between STANDBY and ON
   *           should be as fast as possible and no longer than 10ms.
   * @OFF:     Power Off. No restrictions on transition times.
   */
  enum snd_soc_bias_level {
56fba41f8   Mark Brown   ASoC: Specify tar...
223
224
225
226
  	SND_SOC_BIAS_OFF = 0,
  	SND_SOC_BIAS_STANDBY = 1,
  	SND_SOC_BIAS_PREPARE = 2,
  	SND_SOC_BIAS_ON = 3,
0be9898ad   Mark Brown   [ALSA] ASoC: Clar...
227
  };
8a2cd6180   Mark Brown   ASoC: Add jack re...
228
229
  struct snd_jack;
  struct snd_soc_card;
808db4a45   Richard Purdie   [ALSA] ASoC: core...
230
231
  struct snd_soc_pcm_stream;
  struct snd_soc_ops;
808db4a45   Richard Purdie   [ALSA] ASoC: core...
232
  struct snd_soc_pcm_runtime;
3c4b266fe   Liam Girdwood   ALSA: asoc: core ...
233
  struct snd_soc_dai;
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
234
  struct snd_soc_dai_driver;
12a48a8c0   Mark Brown   ASoC: Add platfor...
235
  struct snd_soc_platform;
d273ebe77   jassi brar   ASoC: Pass dai_li...
236
  struct snd_soc_dai_link;
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
237
  struct snd_soc_platform_driver;
808db4a45   Richard Purdie   [ALSA] ASoC: core...
238
  struct snd_soc_codec;
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
239
  struct snd_soc_codec_driver;
808db4a45   Richard Purdie   [ALSA] ASoC: core...
240
  struct soc_enum;
8a2cd6180   Mark Brown   ASoC: Add jack re...
241
  struct snd_soc_jack;
fa9879ede   Vinod Koul   ASoC: add support...
242
  struct snd_soc_jack_zone;
8a2cd6180   Mark Brown   ASoC: Add jack re...
243
  struct snd_soc_jack_pin;
7a30a3db3   Dimitris Papastamos   ASoC: soc-cache: ...
244
  struct snd_soc_cache_ops;
ce6120cca   Liam Girdwood   ASoC: Decouple DA...
245
  #include <sound/soc-dapm.h>
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
246

ec67624d3   Lopez Cruz, Misael   ASoC: Add GPIO su...
247
248
249
  #ifdef CONFIG_GPIOLIB
  struct snd_soc_jack_gpio;
  #endif
808db4a45   Richard Purdie   [ALSA] ASoC: core...
250
251
  
  typedef int (*hw_write_t)(void *,const char* ,int);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
252
253
  
  extern struct snd_ac97_bus_ops soc_ac97_ops;
7084a42b9   Mark Brown   ASoC: Add I/O con...
254
  enum snd_soc_control_type {
e9c039052   Mark Brown   ASoC: Remove unus...
255
  	SND_SOC_I2C = 1,
7084a42b9   Mark Brown   ASoC: Add I/O con...
256
257
  	SND_SOC_SPI,
  };
7a30a3db3   Dimitris Papastamos   ASoC: soc-cache: ...
258
  enum snd_soc_compress_type {
119bd789f   Dimitris Papastamos   ASoC: Change the ...
259
  	SND_SOC_FLAT_COMPRESSION = 1,
a7f387d5a   Dimitris Papastamos   ASoC: soc-cache: ...
260
261
  	SND_SOC_LZO_COMPRESSION,
  	SND_SOC_RBTREE_COMPRESSION
7a30a3db3   Dimitris Papastamos   ASoC: soc-cache: ...
262
  };
b8c0dab9b   Liam Girdwood   ASoC: core - PCM ...
263
264
265
266
  enum snd_soc_pcm_subclass {
  	SND_SOC_PCM_CLASS_PCM	= 0,
  	SND_SOC_PCM_CLASS_BE	= 1,
  };
ec4ee52a8   Mark Brown   ASoC: Provide COD...
267
268
269
270
  int snd_soc_codec_set_sysclk(struct snd_soc_codec *codec, int clk_id,
  			     unsigned int freq, int dir);
  int snd_soc_codec_set_pll(struct snd_soc_codec *codec, int pll_id, int source,
  			  unsigned int freq_in, unsigned int freq_out);
70a7ca34d   Vinod Koul   ASoC: soc core al...
271
272
  int snd_soc_register_card(struct snd_soc_card *card);
  int snd_soc_unregister_card(struct snd_soc_card *card);
6f8ab4ac2   Mark Brown   ASoC: Export card...
273
274
275
  int snd_soc_suspend(struct device *dev);
  int snd_soc_resume(struct device *dev);
  int snd_soc_poweroff(struct device *dev);
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
276
277
278
279
  int snd_soc_register_platform(struct device *dev,
  		struct snd_soc_platform_driver *platform_drv);
  void snd_soc_unregister_platform(struct device *dev);
  int snd_soc_register_codec(struct device *dev,
001ae4c03   Mark Brown   ASoC: Constify st...
280
  		const struct snd_soc_codec_driver *codec_drv,
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
281
282
  		struct snd_soc_dai_driver *dai_drv, int num_dai);
  void snd_soc_unregister_codec(struct device *dev);
181e055e6   Mark Brown   ASoC: Fix type fo...
283
284
  int snd_soc_codec_volatile_register(struct snd_soc_codec *codec,
  				    unsigned int reg);
239c97062   Dimitris Papastamos   ASoC: Add snd_soc...
285
286
287
288
  int snd_soc_codec_readable_register(struct snd_soc_codec *codec,
  				    unsigned int reg);
  int snd_soc_codec_writable_register(struct snd_soc_codec *codec,
  				    unsigned int reg);
17a52fd60   Mark Brown   ASoC: Begin to fa...
289
  int snd_soc_codec_set_cache_io(struct snd_soc_codec *codec,
7084a42b9   Mark Brown   ASoC: Add I/O con...
290
291
  			       int addr_bits, int data_bits,
  			       enum snd_soc_control_type control);
7a30a3db3   Dimitris Papastamos   ASoC: soc-cache: ...
292
293
294
295
296
297
298
  int snd_soc_cache_sync(struct snd_soc_codec *codec);
  int snd_soc_cache_init(struct snd_soc_codec *codec);
  int snd_soc_cache_exit(struct snd_soc_codec *codec);
  int snd_soc_cache_write(struct snd_soc_codec *codec,
  			unsigned int reg, unsigned int value);
  int snd_soc_cache_read(struct snd_soc_codec *codec,
  		       unsigned int reg, unsigned int *value);
066d16c3e   Dimitris Papastamos   ASoC: soc-cache: ...
299
300
301
302
  int snd_soc_default_volatile_register(struct snd_soc_codec *codec,
  				      unsigned int reg);
  int snd_soc_default_readable_register(struct snd_soc_codec *codec,
  				      unsigned int reg);
8020454c9   Dimitris Papastamos   ASoC: Add default...
303
304
  int snd_soc_default_writable_register(struct snd_soc_codec *codec,
  				      unsigned int reg);
f1442bc1e   Liam Girdwood   ASoC: core - Add ...
305
306
307
308
  int snd_soc_platform_read(struct snd_soc_platform *platform,
  					unsigned int reg);
  int snd_soc_platform_write(struct snd_soc_platform *platform,
  					unsigned int reg, unsigned int val);
12a48a8c0   Mark Brown   ASoC: Add platfor...
309

7aae816da   Mark Brown   ASoC: Add bit clo...
310
311
312
  /* Utility functions to get clock rates from various things */
  int snd_soc_calc_frame_size(int sample_size, int channels, int tdm_slots);
  int snd_soc_params_to_frame_size(struct snd_pcm_hw_params *params);
c0fa59df7   Mark Brown   ASoC: Add BCLK ca...
313
  int snd_soc_calc_bclk(int fs, int sample_size, int channels, int tdm_slots);
7aae816da   Mark Brown   ASoC: Add bit clo...
314
  int snd_soc_params_to_bclk(struct snd_pcm_hw_params *parms);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
315
316
317
  /* set runtime hw params */
  int snd_soc_set_runtime_hwparams(struct snd_pcm_substream *substream,
  	const struct snd_pcm_hardware *hw);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
318

8a2cd6180   Mark Brown   ASoC: Add jack re...
319
  /* Jack reporting */
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
320
  int snd_soc_jack_new(struct snd_soc_codec *codec, const char *id, int type,
8a2cd6180   Mark Brown   ASoC: Add jack re...
321
322
323
324
  		     struct snd_soc_jack *jack);
  void snd_soc_jack_report(struct snd_soc_jack *jack, int status, int mask);
  int snd_soc_jack_add_pins(struct snd_soc_jack *jack, int count,
  			  struct snd_soc_jack_pin *pins);
d5021ec9f   Mark Brown   ASoC: Add a notif...
325
326
327
328
  void snd_soc_jack_notifier_register(struct snd_soc_jack *jack,
  				    struct notifier_block *nb);
  void snd_soc_jack_notifier_unregister(struct snd_soc_jack *jack,
  				      struct notifier_block *nb);
fa9879ede   Vinod Koul   ASoC: add support...
329
330
331
  int snd_soc_jack_add_zones(struct snd_soc_jack *jack, int count,
  			  struct snd_soc_jack_zone *zones);
  int snd_soc_jack_get_type(struct snd_soc_jack *jack, int micbias_voltage);
ec67624d3   Lopez Cruz, Misael   ASoC: Add GPIO su...
332
333
334
335
336
337
  #ifdef CONFIG_GPIOLIB
  int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,
  			struct snd_soc_jack_gpio *gpios);
  void snd_soc_jack_free_gpios(struct snd_soc_jack *jack, int count,
  			struct snd_soc_jack_gpio *gpios);
  #endif
8a2cd6180   Mark Brown   ASoC: Add jack re...
338

808db4a45   Richard Purdie   [ALSA] ASoC: core...
339
340
  /* codec register bit access */
  int snd_soc_update_bits(struct snd_soc_codec *codec, unsigned short reg,
46f5822f7   Daniel Ribeiro   ASoC: Allow 32 bi...
341
  				unsigned int mask, unsigned int value);
dd1b3d53c   Mark Brown   ASoC: Export snd_...
342
343
344
  int snd_soc_update_bits_locked(struct snd_soc_codec *codec,
  			       unsigned short reg, unsigned int mask,
  			       unsigned int value);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
345
  int snd_soc_test_bits(struct snd_soc_codec *codec, unsigned short reg,
46f5822f7   Daniel Ribeiro   ASoC: Allow 32 bi...
346
  				unsigned int mask, unsigned int value);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
347
348
349
350
351
352
353
354
355
  
  int snd_soc_new_ac97_codec(struct snd_soc_codec *codec,
  	struct snd_ac97_bus_ops *ops, int num);
  void snd_soc_free_ac97_codec(struct snd_soc_codec *codec);
  
  /*
   *Controls
   */
  struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template,
efb7ac3f9   Mark Brown   ASoC: Fix prefixi...
356
357
  				  void *data, char *long_name,
  				  const char *prefix);
3e8e1952e   Ian Molton   ASoC: cleanup dup...
358
359
  int snd_soc_add_controls(struct snd_soc_codec *codec,
  	const struct snd_kcontrol_new *controls, int num_controls);
a491a5c84   Liam Girdwood   ASoC: core - Add ...
360
361
  int snd_soc_add_platform_controls(struct snd_soc_platform *platform,
  	const struct snd_kcontrol_new *controls, int num_controls);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
362
363
364
365
366
367
368
369
  int snd_soc_info_enum_double(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_info *uinfo);
  int snd_soc_info_enum_ext(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_info *uinfo);
  int snd_soc_get_enum_double(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_value *ucontrol);
  int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_value *ucontrol);
2e72f8e37   Peter Ujfalusi   ASoC: New enum ty...
370
371
372
373
  int snd_soc_get_value_enum_double(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_value *ucontrol);
  int snd_soc_put_value_enum_double(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_value *ucontrol);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
374
375
376
377
  int snd_soc_info_volsw(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_info *uinfo);
  int snd_soc_info_volsw_ext(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_info *uinfo);
392abe9cb   Philipp Zabel   [ALSA] ASoC: buil...
378
  #define snd_soc_info_bool_ext		snd_ctl_boolean_mono_info
808db4a45   Richard Purdie   [ALSA] ASoC: core...
379
380
381
382
383
384
385
386
387
388
  int snd_soc_get_volsw(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_value *ucontrol);
  int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_value *ucontrol);
  int snd_soc_info_volsw_2r(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_info *uinfo);
  int snd_soc_get_volsw_2r(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_value *ucontrol);
  int snd_soc_put_volsw_2r(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_value *ucontrol);
e13ac2e9b   Mark Brown   [ALSA] ASoC: Add ...
389
390
391
392
393
394
  int snd_soc_info_volsw_s8(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_info *uinfo);
  int snd_soc_get_volsw_s8(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_value *ucontrol);
  int snd_soc_put_volsw_s8(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_value *ucontrol);
637d3847b   Peter Ujfalusi   ASoC: core: Suppo...
395
396
  int snd_soc_limit_volume(struct snd_soc_codec *codec,
  	const char *name, int max);
b6f4bb383   apatard@mandriva.com   ASoC: Add SOC_DOU...
397
398
399
400
401
402
  int snd_soc_info_volsw_2r_sx(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_info *uinfo);
  int snd_soc_get_volsw_2r_sx(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_value *ucontrol);
  int snd_soc_put_volsw_2r_sx(struct snd_kcontrol *kcontrol,
  	struct snd_ctl_elem_value *ucontrol);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
403

8a2cd6180   Mark Brown   ASoC: Add jack re...
404
  /**
066d16c3e   Dimitris Papastamos   ASoC: soc-cache: ...
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
   * struct snd_soc_reg_access - Describes whether a given register is
   * readable, writable or volatile.
   *
   * @reg: the register number
   * @read: whether this register is readable
   * @write: whether this register is writable
   * @vol: whether this register is volatile
   */
  struct snd_soc_reg_access {
  	u16 reg;
  	u16 read;
  	u16 write;
  	u16 vol;
  };
  
  /**
8a2cd6180   Mark Brown   ASoC: Add jack re...
421
422
423
424
425
426
427
428
429
430
431
432
   * struct snd_soc_jack_pin - Describes a pin to update based on jack detection
   *
   * @pin:    name of the pin to update
   * @mask:   bits to check for in reported jack status
   * @invert: if non-zero then pin is enabled when status is not reported
   */
  struct snd_soc_jack_pin {
  	struct list_head list;
  	const char *pin;
  	int mask;
  	bool invert;
  };
ec67624d3   Lopez Cruz, Misael   ASoC: Add GPIO su...
433
  /**
fa9879ede   Vinod Koul   ASoC: add support...
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
   * struct snd_soc_jack_zone - Describes voltage zones of jack detection
   *
   * @min_mv: start voltage in mv
   * @max_mv: end voltage in mv
   * @jack_type: type of jack that is expected for this voltage
   * @debounce_time: debounce_time for jack, codec driver should wait for this
   *		duration before reading the adc for voltages
   * @:list: list container
   */
  struct snd_soc_jack_zone {
  	unsigned int min_mv;
  	unsigned int max_mv;
  	unsigned int jack_type;
  	unsigned int debounce_time;
  	struct list_head list;
  };
  
  /**
ec67624d3   Lopez Cruz, Misael   ASoC: Add GPIO su...
452
453
454
455
456
457
458
   * struct snd_soc_jack_gpio - Describes a gpio pin for jack detection
   *
   * @gpio:         gpio number
   * @name:         gpio name
   * @report:       value to report when jack detected
   * @invert:       report presence in low state
   * @debouce_time: debouce time in ms
7887ab3a2   Mark Brown   ASoC: Allow GPIO ...
459
   * @wake:	  enable as wake source
fadddc875   Mark Brown   ASoC: Add kerneld...
460
461
462
   * @jack_status_check: callback function which overrides the detection
   *		       to provide more complex checks (eg, reading an
   *		       ADC).
ec67624d3   Lopez Cruz, Misael   ASoC: Add GPIO su...
463
464
465
466
467
468
469
470
   */
  #ifdef CONFIG_GPIOLIB
  struct snd_soc_jack_gpio {
  	unsigned int gpio;
  	const char *name;
  	int report;
  	int invert;
  	int debounce_time;
7887ab3a2   Mark Brown   ASoC: Allow GPIO ...
471
  	bool wake;
ec67624d3   Lopez Cruz, Misael   ASoC: Add GPIO su...
472
  	struct snd_soc_jack *jack;
4c14d78e8   Mark Brown   ASoC: Use delayed...
473
  	struct delayed_work work;
c871a0531   Joonyoung Shim   ASoC: Add jack_st...
474
475
  
  	int (*jack_status_check)(void);
ec67624d3   Lopez Cruz, Misael   ASoC: Add GPIO su...
476
477
  };
  #endif
8a2cd6180   Mark Brown   ASoC: Add jack re...
478
479
  struct snd_soc_jack {
  	struct snd_jack *jack;
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
480
  	struct snd_soc_codec *codec;
8a2cd6180   Mark Brown   ASoC: Add jack re...
481
482
  	struct list_head pins;
  	int status;
d5021ec9f   Mark Brown   ASoC: Add a notif...
483
  	struct blocking_notifier_head notifier;
fa9879ede   Vinod Koul   ASoC: add support...
484
  	struct list_head jack_zones;
8a2cd6180   Mark Brown   ASoC: Add jack re...
485
  };
808db4a45   Richard Purdie   [ALSA] ASoC: core...
486
487
  /* SoC PCM stream information */
  struct snd_soc_pcm_stream {
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
488
  	const char *stream_name;
1c433fbda   Graeme Gregory   [ALSA] soc - 0.13...
489
490
  	u64 formats;			/* SNDRV_PCM_FMTBIT_* */
  	unsigned int rates;		/* SNDRV_PCM_RATE_* */
808db4a45   Richard Purdie   [ALSA] ASoC: core...
491
492
493
494
  	unsigned int rate_min;		/* min rate */
  	unsigned int rate_max;		/* max rate */
  	unsigned int channels_min;	/* min channels */
  	unsigned int channels_max;	/* max channels */
808db4a45   Richard Purdie   [ALSA] ASoC: core...
495
496
497
498
499
500
501
502
503
504
505
  };
  
  /* SoC audio ops */
  struct snd_soc_ops {
  	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 *);
  	int (*trigger)(struct snd_pcm_substream *, int);
  };
7a30a3db3   Dimitris Papastamos   ASoC: soc-cache: ...
506
507
  /* SoC cache ops */
  struct snd_soc_cache_ops {
0d735eaa2   Dimitris Papastamos   ASoC: soc-cache: ...
508
  	const char *name;
7a30a3db3   Dimitris Papastamos   ASoC: soc-cache: ...
509
510
511
512
513
514
515
516
517
  	enum snd_soc_compress_type id;
  	int (*init)(struct snd_soc_codec *codec);
  	int (*exit)(struct snd_soc_codec *codec);
  	int (*read)(struct snd_soc_codec *codec, unsigned int reg,
  		unsigned int *value);
  	int (*write)(struct snd_soc_codec *codec, unsigned int reg,
  		unsigned int value);
  	int (*sync)(struct snd_soc_codec *codec);
  };
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
518
  /* SoC Audio Codec device */
808db4a45   Richard Purdie   [ALSA] ASoC: core...
519
  struct snd_soc_codec {
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
520
  	const char *name;
ead9b9199   Jarkko Nikula   ASoC: Add optiona...
521
  	const char *name_prefix;
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
522
  	int id;
0d0cf00a7   Mark Brown   ASoC: Add codec r...
523
  	struct device *dev;
001ae4c03   Mark Brown   ASoC: Constify st...
524
  	const struct snd_soc_codec_driver *driver;
0d0cf00a7   Mark Brown   ASoC: Add codec r...
525

f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
526
527
  	struct mutex mutex;
  	struct snd_soc_card *card;
0d0cf00a7   Mark Brown   ASoC: Add codec r...
528
  	struct list_head list;
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
529
530
  	struct list_head card_list;
  	int num_dai;
23bbce34f   Dimitris Papastamos   ASoC: Add compres...
531
  	enum snd_soc_compress_type compress_type;
aea170a09   Dimitris Papastamos   ASoC: soc-cache: ...
532
  	size_t reg_size;	/* reg_cache_size * reg_word_size */
1500b7b5f   Dimitris Papastamos   ASoC: Automatical...
533
534
  	int (*volatile_register)(struct snd_soc_codec *, unsigned int);
  	int (*readable_register)(struct snd_soc_codec *, unsigned int);
8020454c9   Dimitris Papastamos   ASoC: Add default...
535
  	int (*writable_register)(struct snd_soc_codec *, unsigned int);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
536
537
  
  	/* runtime */
808db4a45   Richard Purdie   [ALSA] ASoC: core...
538
539
  	struct snd_ac97 *ac97;  /* for ad-hoc ac97 devices */
  	unsigned int active;
dad8e7aee   Dimitris Papastamos   ASoC: soc-cache: ...
540
  	unsigned int cache_bypass:1; /* Suppress access to the cache */
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
541
542
543
  	unsigned int suspended:1; /* Codec is in suspend PM state */
  	unsigned int probed:1; /* Codec has been probed */
  	unsigned int ac97_registered:1; /* Codec has been AC97 registered */
0562f7882   Mika Westerberg   ASoC: don't regis...
544
  	unsigned int ac97_created:1; /* Codec has been created by SoC */
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
545
  	unsigned int sysfs_registered:1; /* codec has been sysfs registered */
fdf0f54da   Dimitris Papastamos   ASoC: soc-core: A...
546
  	unsigned int cache_init:1; /* codec cache has been initialized */
aaee8ef14   Mark Brown   ASoC: Make cache ...
547
548
  	u32 cache_only;  /* Suppress writes to hardware */
  	u32 cache_sync; /* Cache needs to be synced to hardware */
808db4a45   Richard Purdie   [ALSA] ASoC: core...
549
550
551
  
  	/* codec IO */
  	void *control_data; /* codec control (i2c/3wire) data */
67850a892   Dimitris Papastamos   ASoC: Add control...
552
  	enum snd_soc_control_type control_type;
808db4a45   Richard Purdie   [ALSA] ASoC: core...
553
  	hw_write_t hw_write;
afa2f1066   Mark Brown   ASoC: Factor out ...
554
  	unsigned int (*hw_read)(struct snd_soc_codec *, unsigned int);
c3acec267   Mark Brown   ASoC: Move active...
555
556
  	unsigned int (*read)(struct snd_soc_codec *, unsigned int);
  	int (*write)(struct snd_soc_codec *, unsigned int, unsigned int);
5fb609d43   Dimitris Papastamos   ASoC: soc-cache: ...
557
  	int (*bulk_write_raw)(struct snd_soc_codec *, unsigned int, const void *, size_t);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
558
  	void *reg_cache;
3335ddca9   Dimitris Papastamos   ASoC: soc-cache: ...
559
  	const void *reg_def_copy;
7a30a3db3   Dimitris Papastamos   ASoC: soc-cache: ...
560
561
  	const struct snd_soc_cache_ops *cache_ops;
  	struct mutex cache_rw_mutex;
a96ca3387   Mark Brown   ASoC: Support tur...
562

808db4a45   Richard Purdie   [ALSA] ASoC: core...
563
  	/* dapm */
ce6120cca   Liam Girdwood   ASoC: Decouple DA...
564
  	struct snd_soc_dapm_context dapm;
808db4a45   Richard Purdie   [ALSA] ASoC: core...
565

384c89e2e   Mark Brown   ASoC: Push debugf...
566
  #ifdef CONFIG_DEBUG_FS
88439ac79   Peter Ujfalusi   ASoC: add support...
567
  	struct dentry *debugfs_codec_root;
384c89e2e   Mark Brown   ASoC: Push debugf...
568
  	struct dentry *debugfs_reg;
79fb9387f   Mark Brown   ASoC: Add DAPM wi...
569
  	struct dentry *debugfs_dapm;
384c89e2e   Mark Brown   ASoC: Push debugf...
570
  #endif
808db4a45   Richard Purdie   [ALSA] ASoC: core...
571
  };
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
572
573
574
575
576
577
578
579
580
  /* codec driver */
  struct snd_soc_codec_driver {
  
  	/* driver ops */
  	int (*probe)(struct snd_soc_codec *);
  	int (*remove)(struct snd_soc_codec *);
  	int (*suspend)(struct snd_soc_codec *,
  			pm_message_t state);
  	int (*resume)(struct snd_soc_codec *);
b7af1dafd   Mark Brown   ASoC: Add data ba...
581
582
583
  	/* Default control and setup, added after probe() is run */
  	const struct snd_kcontrol_new *controls;
  	int num_controls;
89b95ac09   Mark Brown   ASoC: Add DAPM wi...
584
585
586
587
  	const struct snd_soc_dapm_widget *dapm_widgets;
  	int num_dapm_widgets;
  	const struct snd_soc_dapm_route *dapm_routes;
  	int num_dapm_routes;
ec4ee52a8   Mark Brown   ASoC: Provide COD...
588
589
590
591
592
  	/* codec wide operations */
  	int (*set_sysclk)(struct snd_soc_codec *codec,
  			  int clk_id, unsigned int freq, int dir);
  	int (*set_pll)(struct snd_soc_codec *codec, int pll_id, int source,
  		unsigned int freq_in, unsigned int freq_out);
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
593
594
595
596
597
  	/* codec IO */
  	unsigned int (*read)(struct snd_soc_codec *, unsigned int);
  	int (*write)(struct snd_soc_codec *, unsigned int, unsigned int);
  	int (*display_register)(struct snd_soc_codec *, char *,
  				size_t, unsigned int);
d4754ec91   Dimitris Papastamos   ASoC: Update user...
598
599
  	int (*volatile_register)(struct snd_soc_codec *, unsigned int);
  	int (*readable_register)(struct snd_soc_codec *, unsigned int);
8020454c9   Dimitris Papastamos   ASoC: Add default...
600
  	int (*writable_register)(struct snd_soc_codec *, unsigned int);
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
601
602
603
604
  	short reg_cache_size;
  	short reg_cache_step;
  	short reg_word_size;
  	const void *reg_cache_default;
066d16c3e   Dimitris Papastamos   ASoC: soc-cache: ...
605
606
  	short reg_access_size;
  	const struct snd_soc_reg_access *reg_access_default;
7a30a3db3   Dimitris Papastamos   ASoC: soc-cache: ...
607
  	enum snd_soc_compress_type compress_type;
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
608
609
610
611
  
  	/* codec bias level */
  	int (*set_bias_level)(struct snd_soc_codec *,
  			      enum snd_soc_bias_level level);
474b62d6e   Mark Brown   ASoC: Provide per...
612
613
  
  	void (*seq_notifier)(struct snd_soc_dapm_context *,
f85a9e0d2   Mark Brown   ASoC: Add subsequ...
614
  			     enum snd_soc_dapm_type, int);
0168bf0d1   Liam Girdwood   ASoC: core - Allo...
615
616
617
618
  
  	/* probe ordering - for components with runtime dependencies */
  	int probe_order;
  	int remove_order;
808db4a45   Richard Purdie   [ALSA] ASoC: core...
619
620
621
  };
  
  /* SoC platform interface */
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
622
  struct snd_soc_platform_driver {
808db4a45   Richard Purdie   [ALSA] ASoC: core...
623

f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
624
625
626
627
  	int (*probe)(struct snd_soc_platform *);
  	int (*remove)(struct snd_soc_platform *);
  	int (*suspend)(struct snd_soc_dai *dai);
  	int (*resume)(struct snd_soc_dai *dai);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
628
629
  
  	/* pcm creation and destruction */
552d1ef6b   Liam Girdwood   ASoC: core - Opti...
630
  	int (*pcm_new)(struct snd_soc_pcm_runtime *);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
631
  	void (*pcm_free)(struct snd_pcm *);
cb2cf612f   Liam Girdwood   ASoC: core - Add ...
632
633
634
635
636
637
638
  	/* Default control and setup, added after probe() is run */
  	const struct snd_kcontrol_new *controls;
  	int num_controls;
  	const struct snd_soc_dapm_widget *dapm_widgets;
  	int num_dapm_widgets;
  	const struct snd_soc_dapm_route *dapm_routes;
  	int num_dapm_routes;
258020d08   Peter Ujfalusi   ASoC: core: Add d...
639
640
641
642
643
644
  	/*
  	 * For platform caused delay reporting.
  	 * Optional.
  	 */
  	snd_pcm_sframes_t (*delay)(struct snd_pcm_substream *,
  		struct snd_soc_dai *);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
645
  	/* platform stream ops */
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
646
  	struct snd_pcm_ops *ops;
0168bf0d1   Liam Girdwood   ASoC: core - Allo...
647
648
649
650
  
  	/* probe ordering - for components with runtime dependencies */
  	int probe_order;
  	int remove_order;
f1442bc1e   Liam Girdwood   ASoC: core - Add ...
651
652
653
654
  
  	/* platform IO - used for platform DAPM */
  	unsigned int (*read)(struct snd_soc_platform *, unsigned int);
  	int (*write)(struct snd_soc_platform *, unsigned int, unsigned int);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
655
  };
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
656
657
658
659
660
  struct snd_soc_platform {
  	const char *name;
  	int id;
  	struct device *dev;
  	struct snd_soc_platform_driver *driver;
808db4a45   Richard Purdie   [ALSA] ASoC: core...
661

f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
662
663
  	unsigned int suspended:1; /* platform is suspended */
  	unsigned int probed:1;
1c433fbda   Graeme Gregory   [ALSA] soc - 0.13...
664

f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
665
666
667
  	struct snd_soc_card *card;
  	struct list_head list;
  	struct list_head card_list;
b79506413   Liam Girdwood   ASoC: core - Add ...
668
669
  
  	struct snd_soc_dapm_context dapm;
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
670
  };
808db4a45   Richard Purdie   [ALSA] ASoC: core...
671

f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
672
673
674
675
676
677
678
679
  struct snd_soc_dai_link {
  	/* config - must be set by machine driver */
  	const char *name;			/* Codec name */
  	const char *stream_name;		/* Stream name */
  	const char *codec_name;		/* for multi-codec */
  	const char *platform_name;	/* for multi-platform */
  	const char *cpu_dai_name;
  	const char *codec_dai_name;
4ccab3e72   Liam Girdwood   [ALSA] soc - Ensu...
680

3efab7dcc   Mark Brown   ASoC: Allow DAI l...
681
682
  	/* Keep DAI active over suspend */
  	unsigned int ignore_suspend:1;
06f409d76   Mark Brown   ASoC: Provide cor...
683
684
  	/* Symmetry requirements */
  	unsigned int symmetric_rates:1;
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
685
686
  	/* codec/machine specific init - e.g. add machine controls */
  	int (*init)(struct snd_soc_pcm_runtime *rtd);
06f409d76   Mark Brown   ASoC: Provide cor...
687

f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
688
689
  	/* machine stream operations */
  	struct snd_soc_ops *ops;
808db4a45   Richard Purdie   [ALSA] ASoC: core...
690
  };
ff819b835   Dimitris Papastamos   ASoC: soc-core: G...
691
  struct snd_soc_codec_conf {
ead9b9199   Jarkko Nikula   ASoC: Add optiona...
692
  	const char *dev_name;
ff819b835   Dimitris Papastamos   ASoC: soc-core: G...
693
694
695
696
697
  
  	/*
  	 * optional map of kcontrol, widget and path name prefixes that are
  	 * associated per device
  	 */
ead9b9199   Jarkko Nikula   ASoC: Add optiona...
698
  	const char *name_prefix;
ff819b835   Dimitris Papastamos   ASoC: soc-core: G...
699
700
701
702
703
704
  
  	/*
  	 * set this to the desired compression type if you want to
  	 * override the one supplied in codec->driver->compress_type
  	 */
  	enum snd_soc_compress_type compress_type;
ead9b9199   Jarkko Nikula   ASoC: Add optiona...
705
  };
2eea392d0   Jarkko Nikula   ASoC: Add support...
706
707
708
709
710
711
712
  struct snd_soc_aux_dev {
  	const char *name;		/* Codec name */
  	const char *codec_name;		/* for multi-codec */
  
  	/* codec/machine specific init - e.g. add machine controls */
  	int (*init)(struct snd_soc_dapm_context *dapm);
  };
875065491   Mark Brown   ASoC: Rename snd_...
713
714
  /* SoC card */
  struct snd_soc_card {
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
715
  	const char *name;
22de71ba0   Liam Girdwood   ASoC: core - allo...
716
717
  	const char *long_name;
  	const char *driver_name;
c5af3a2e1   Mark Brown   ASoC: Add card re...
718
  	struct device *dev;
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
719
720
  	struct snd_card *snd_card;
  	struct module *owner;
c5af3a2e1   Mark Brown   ASoC: Add card re...
721
722
  
  	struct list_head list;
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
723
  	struct mutex mutex;
c5af3a2e1   Mark Brown   ASoC: Add card re...
724

f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
725
  	bool instantiated;
808db4a45   Richard Purdie   [ALSA] ASoC: core...
726

e7361ec49   Mark Brown   ASoC: Replace pde...
727
  	int (*probe)(struct snd_soc_card *card);
28e9ad921   Mark Brown   ASoC: Add a late_...
728
  	int (*late_probe)(struct snd_soc_card *card);
e7361ec49   Mark Brown   ASoC: Replace pde...
729
  	int (*remove)(struct snd_soc_card *card);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
730
731
732
  
  	/* the pre and post PM functions are used to do any PM work before and
  	 * after the codec and DAI's do any PM work. */
70b2ac126   Mark Brown   ASoC: Use card ra...
733
734
735
736
  	int (*suspend_pre)(struct snd_soc_card *card);
  	int (*suspend_post)(struct snd_soc_card *card);
  	int (*resume_pre)(struct snd_soc_card *card);
  	int (*resume_post)(struct snd_soc_card *card);
808db4a45   Richard Purdie   [ALSA] ASoC: core...
737

0b4d221b8   Liam Girdwood   [ALSA] soc - Add ...
738
  	/* callbacks */
875065491   Mark Brown   ASoC: Rename snd_...
739
  	int (*set_bias_level)(struct snd_soc_card *,
d4c6005f8   Mark Brown   ASoC: Add context...
740
  			      struct snd_soc_dapm_context *dapm,
0be9898ad   Mark Brown   [ALSA] ASoC: Clar...
741
  			      enum snd_soc_bias_level level);
1badabd98   Mark Brown   ASoC: Add post-CO...
742
  	int (*set_bias_level_post)(struct snd_soc_card *,
d4c6005f8   Mark Brown   ASoC: Add context...
743
  				   struct snd_soc_dapm_context *dapm,
1badabd98   Mark Brown   ASoC: Add post-CO...
744
  				   enum snd_soc_bias_level level);
0b4d221b8   Liam Girdwood   [ALSA] soc - Add ...
745

6c5f1fed4   Mark Brown   ASoC: Make pmdown...
746
  	long pmdown_time;
96dd36228   Mark Brown   ASoC: Make pmdown...
747

808db4a45   Richard Purdie   [ALSA] ASoC: core...
748
749
750
  	/* CPU <--> Codec DAI links  */
  	struct snd_soc_dai_link *dai_link;
  	int num_links;
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
751
752
  	struct snd_soc_pcm_runtime *rtd;
  	int num_rtd;
6308419a1   Mark Brown   ASoC: Push workqu...
753

ff819b835   Dimitris Papastamos   ASoC: soc-core: G...
754
755
756
  	/* optional codec specific configuration */
  	struct snd_soc_codec_conf *codec_conf;
  	int num_configs;
ead9b9199   Jarkko Nikula   ASoC: Add optiona...
757

2eea392d0   Jarkko Nikula   ASoC: Add support...
758
759
760
761
762
763
764
765
  	/*
  	 * optional auxiliary devices such as amplifiers or codecs with DAI
  	 * link unused
  	 */
  	struct snd_soc_aux_dev *aux_dev;
  	int num_aux_devs;
  	struct snd_soc_pcm_runtime *rtd_aux;
  	int num_aux_rtd;
b7af1dafd   Mark Brown   ASoC: Add data ba...
766
767
  	const struct snd_kcontrol_new *controls;
  	int num_controls;
b8ad29deb   Mark Brown   ASoC: Allow card ...
768
769
770
  	/*
  	 * Card-specific routes and widgets.
  	 */
d06e48db1   Lars-Peter Clausen   ASoC: Make struct...
771
  	const struct snd_soc_dapm_widget *dapm_widgets;
b8ad29deb   Mark Brown   ASoC: Allow card ...
772
  	int num_dapm_widgets;
d06e48db1   Lars-Peter Clausen   ASoC: Make struct...
773
  	const struct snd_soc_dapm_route *dapm_routes;
b8ad29deb   Mark Brown   ASoC: Allow card ...
774
  	int num_dapm_routes;
6308419a1   Mark Brown   ASoC: Push workqu...
775
  	struct work_struct deferred_resume_work;
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
776
777
778
779
780
  
  	/* lists of probed devices belonging to this card */
  	struct list_head codec_dev_list;
  	struct list_head platform_dev_list;
  	struct list_head dai_dev_list;
a60521549   Jarkko Nikula   ASoC: Add sound c...
781

97c866def   Jarkko Nikula   ASoC: Move widget...
782
  	struct list_head widgets;
8ddab3f51   Jarkko Nikula   ASoC: Move DAPM p...
783
  	struct list_head paths;
7be31be88   Jarkko Nikula   ASoC: Extend DAPM...
784
  	struct list_head dapm_list;
8ddab3f51   Jarkko Nikula   ASoC: Move DAPM p...
785

e37a4970c   Mark Brown   ASoC: Add a per-c...
786
787
  	/* Generic DAPM context for the card */
  	struct snd_soc_dapm_context dapm;
a60521549   Jarkko Nikula   ASoC: Add sound c...
788
789
  #ifdef CONFIG_DEBUG_FS
  	struct dentry *debugfs_card_root;
3a45b8672   Jarkko Nikula   ASoC: Move pop ti...
790
  	struct dentry *debugfs_pop_time;
a60521549   Jarkko Nikula   ASoC: Add sound c...
791
  #endif
3a45b8672   Jarkko Nikula   ASoC: Move pop ti...
792
  	u32 pop_time;
dddf3e4c2   Mark Brown   ASoC: Add card dr...
793
794
  
  	void *drvdata;
808db4a45   Richard Purdie   [ALSA] ASoC: core...
795
  };
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
796
797
798
  /* SoC machine DAI configuration, glues a codec and cpu DAI together */
  struct snd_soc_pcm_runtime  {
  	struct device dev;
875065491   Mark Brown   ASoC: Rename snd_...
799
  	struct snd_soc_card *card;
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
800
  	struct snd_soc_dai_link *dai_link;
b8c0dab9b   Liam Girdwood   ASoC: core - PCM ...
801
802
803
  	struct mutex pcm_mutex;
  	enum snd_soc_pcm_subclass pcm_subclass;
  	struct snd_pcm_ops ops;
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
804
805
806
  
  	unsigned int complete:1;
  	unsigned int dev_registered:1;
808db4a45   Richard Purdie   [ALSA] ASoC: core...
807

f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
808
809
810
811
812
813
814
815
816
817
818
819
  	/* Symmetry data - only valid if symmetry is being enforced */
  	unsigned int rate;
  	long pmdown_time;
  
  	/* runtime devices */
  	struct snd_pcm *pcm;
  	struct snd_soc_codec *codec;
  	struct snd_soc_platform *platform;
  	struct snd_soc_dai *codec_dai;
  	struct snd_soc_dai *cpu_dai;
  
  	struct delayed_work delayed_work;
808db4a45   Richard Purdie   [ALSA] ASoC: core...
820
  };
4eaa9819d   Jon Smirl   ALSA: ASoC: Conve...
821
822
  /* mixer control */
  struct soc_mixer_control {
d11bb4a92   Peter Ujfalusi   ASoC: core: Fix f...
823
  	int min, max, platform_max;
815ecf8de   Jon Smirl   ALSA: ASoC: conve...
824
  	unsigned int reg, rreg, shift, rshift, invert;
4eaa9819d   Jon Smirl   ALSA: ASoC: Conve...
825
  };
808db4a45   Richard Purdie   [ALSA] ASoC: core...
826
827
828
829
830
831
  /* enumerated kcontrol */
  struct soc_enum {
  	unsigned short reg;
  	unsigned short reg2;
  	unsigned char shift_l;
  	unsigned char shift_r;
f8ba0b7bf   Jon Smirl   ALSA: ASoC: Renam...
832
  	unsigned int max;
2e72f8e37   Peter Ujfalusi   ASoC: New enum ty...
833
  	unsigned int mask;
87023ff74   Takashi Iwai   ASoC: Declare con...
834
  	const char * const *texts;
2e72f8e37   Peter Ujfalusi   ASoC: New enum ty...
835
836
837
  	const unsigned int *values;
  	void *dapm;
  };
5c82f5673   Mark Brown   AsoC: Make snd_so...
838
  /* codec IO */
c37537079   Mark Brown   ASoC: Push snd_so...
839
840
841
  unsigned int snd_soc_read(struct snd_soc_codec *codec, unsigned int reg);
  unsigned int snd_soc_write(struct snd_soc_codec *codec,
  			   unsigned int reg, unsigned int val);
5fb609d43   Dimitris Papastamos   ASoC: soc-cache: ...
842
843
  unsigned int snd_soc_bulk_write_raw(struct snd_soc_codec *codec,
  				    unsigned int reg, const void *data, size_t len);
5c82f5673   Mark Brown   AsoC: Make snd_so...
844

f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
845
  /* device driver data */
dddf3e4c2   Mark Brown   ASoC: Add card dr...
846
847
848
849
850
851
852
853
854
855
  static inline void snd_soc_card_set_drvdata(struct snd_soc_card *card,
  		void *data)
  {
  	card->drvdata = data;
  }
  
  static inline void *snd_soc_card_get_drvdata(struct snd_soc_card *card)
  {
  	return card->drvdata;
  }
b2c812e22   Mark Brown   ASoC: Add indirec...
856
  static inline void snd_soc_codec_set_drvdata(struct snd_soc_codec *codec,
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
857
  		void *data)
b2c812e22   Mark Brown   ASoC: Add indirec...
858
  {
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
859
  	dev_set_drvdata(codec->dev, data);
b2c812e22   Mark Brown   ASoC: Add indirec...
860
861
862
863
  }
  
  static inline void *snd_soc_codec_get_drvdata(struct snd_soc_codec *codec)
  {
f0fba2ad1   Liam Girdwood   ASoC: multi-compo...
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
  	return dev_get_drvdata(codec->dev);
  }
  
  static inline void snd_soc_platform_set_drvdata(struct snd_soc_platform *platform,
  		void *data)
  {
  	dev_set_drvdata(platform->dev, data);
  }
  
  static inline void *snd_soc_platform_get_drvdata(struct snd_soc_platform *platform)
  {
  	return dev_get_drvdata(platform->dev);
  }
  
  static inline void snd_soc_pcm_set_drvdata(struct snd_soc_pcm_runtime *rtd,
  		void *data)
  {
  	dev_set_drvdata(&rtd->dev, data);
  }
  
  static inline void *snd_soc_pcm_get_drvdata(struct snd_soc_pcm_runtime *rtd)
  {
  	return dev_get_drvdata(&rtd->dev);
b2c812e22   Mark Brown   ASoC: Add indirec...
887
  }
4e10bda05   Vinod Koul   ASoC: soc core ad...
888
889
890
891
892
893
894
895
896
  static inline void snd_soc_initialize_card_lists(struct snd_soc_card *card)
  {
  	INIT_LIST_HEAD(&card->dai_dev_list);
  	INIT_LIST_HEAD(&card->codec_dev_list);
  	INIT_LIST_HEAD(&card->platform_dev_list);
  	INIT_LIST_HEAD(&card->widgets);
  	INIT_LIST_HEAD(&card->paths);
  	INIT_LIST_HEAD(&card->dapm_list);
  }
fb257897b   Mark Brown   ASoC: Work around...
897
898
  int snd_soc_util_init(void);
  void snd_soc_util_exit(void);
a47cbe726   Mark Brown   ASoC: Move DAI st...
899
  #include <sound/soc-dai.h>
faff4bb06   Stephen Warren   ASoC: Export debu...
900
  #ifdef CONFIG_DEBUG_FS
8a9dab1a5   Mark Brown   ASoC: Update name...
901
  extern struct dentry *snd_soc_debugfs_root;
faff4bb06   Stephen Warren   ASoC: Export debu...
902
  #endif
6f8ab4ac2   Mark Brown   ASoC: Export card...
903
  extern const struct dev_pm_ops snd_soc_pm_ops;
808db4a45   Richard Purdie   [ALSA] ASoC: core...
904
  #endif