This source file includes following definitions.
- snd_soc_suspend
- snd_soc_resume
- snd_soc_new_compress
- snd_soc_set_dmi_name
- snd_soc_jack_add_gpios
- snd_soc_jack_add_gpiods
- snd_soc_jack_free_gpios
- snd_soc_set_ac97_ops_of_reset
- snd_soc_set_ac97_ops
- snd_soc_card_set_drvdata
- snd_soc_card_get_drvdata
- snd_soc_volsw_is_stereo
- snd_soc_enum_val_to_item
- snd_soc_enum_item_to_val
- snd_soc_kcontrol_component
- snd_soc_of_parse_audio_prefix
- snd_soc_card_get_codec_dai
- snd_soc_fixup_dai_links_platform_name
- snd_soc_dapm_mutex_lock
- snd_soc_dapm_mutex_unlock
1
2
3
4
5
6
7
8
9
10 #ifndef __LINUX_SND_SOC_H
11 #define __LINUX_SND_SOC_H
12
13 #include <linux/of.h>
14 #include <linux/platform_device.h>
15 #include <linux/types.h>
16 #include <linux/notifier.h>
17 #include <linux/workqueue.h>
18 #include <linux/interrupt.h>
19 #include <linux/kernel.h>
20 #include <linux/regmap.h>
21 #include <linux/log2.h>
22 #include <sound/core.h>
23 #include <sound/pcm.h>
24 #include <sound/compress_driver.h>
25 #include <sound/control.h>
26 #include <sound/ac97_codec.h>
27
28
29
30
31 #define SOC_DOUBLE_VALUE(xreg, shift_left, shift_right, xmax, xinvert, xautodisable) \
32 ((unsigned long)&(struct soc_mixer_control) \
33 {.reg = xreg, .rreg = xreg, .shift = shift_left, \
34 .rshift = shift_right, .max = xmax, .platform_max = xmax, \
35 .invert = xinvert, .autodisable = xautodisable})
36 #define SOC_DOUBLE_S_VALUE(xreg, shift_left, shift_right, xmin, xmax, xsign_bit, xinvert, xautodisable) \
37 ((unsigned long)&(struct soc_mixer_control) \
38 {.reg = xreg, .rreg = xreg, .shift = shift_left, \
39 .rshift = shift_right, .min = xmin, .max = xmax, .platform_max = xmax, \
40 .sign_bit = xsign_bit, .invert = xinvert, .autodisable = xautodisable})
41 #define SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert, xautodisable) \
42 SOC_DOUBLE_VALUE(xreg, xshift, xshift, xmax, xinvert, xautodisable)
43 #define SOC_SINGLE_VALUE_EXT(xreg, xmax, xinvert) \
44 ((unsigned long)&(struct soc_mixer_control) \
45 {.reg = xreg, .max = xmax, .platform_max = xmax, .invert = xinvert})
46 #define SOC_DOUBLE_R_VALUE(xlreg, xrreg, xshift, xmax, xinvert) \
47 ((unsigned long)&(struct soc_mixer_control) \
48 {.reg = xlreg, .rreg = xrreg, .shift = xshift, .rshift = xshift, \
49 .max = xmax, .platform_max = xmax, .invert = xinvert})
50 #define SOC_DOUBLE_R_S_VALUE(xlreg, xrreg, xshift, xmin, xmax, xsign_bit, xinvert) \
51 ((unsigned long)&(struct soc_mixer_control) \
52 {.reg = xlreg, .rreg = xrreg, .shift = xshift, .rshift = xshift, \
53 .max = xmax, .min = xmin, .platform_max = xmax, .sign_bit = xsign_bit, \
54 .invert = xinvert})
55 #define SOC_DOUBLE_R_RANGE_VALUE(xlreg, xrreg, xshift, xmin, xmax, xinvert) \
56 ((unsigned long)&(struct soc_mixer_control) \
57 {.reg = xlreg, .rreg = xrreg, .shift = xshift, .rshift = xshift, \
58 .min = xmin, .max = xmax, .platform_max = xmax, .invert = xinvert})
59 #define SOC_SINGLE(xname, reg, shift, max, invert) \
60 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
61 .info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\
62 .put = snd_soc_put_volsw, \
63 .private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) }
64 #define SOC_SINGLE_RANGE(xname, xreg, xshift, xmin, xmax, xinvert) \
65 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
66 .info = snd_soc_info_volsw_range, .get = snd_soc_get_volsw_range, \
67 .put = snd_soc_put_volsw_range, \
68 .private_value = (unsigned long)&(struct soc_mixer_control) \
69 {.reg = xreg, .rreg = xreg, .shift = xshift, \
70 .rshift = xshift, .min = xmin, .max = xmax, \
71 .platform_max = xmax, .invert = xinvert} }
72 #define SOC_SINGLE_TLV(xname, reg, shift, max, invert, tlv_array) \
73 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
74 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
75 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
76 .tlv.p = (tlv_array), \
77 .info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\
78 .put = snd_soc_put_volsw, \
79 .private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) }
80 #define SOC_SINGLE_SX_TLV(xname, xreg, xshift, xmin, xmax, tlv_array) \
81 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
82 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
83 SNDRV_CTL_ELEM_ACCESS_READWRITE, \
84 .tlv.p = (tlv_array),\
85 .info = snd_soc_info_volsw_sx, \
86 .get = snd_soc_get_volsw_sx,\
87 .put = snd_soc_put_volsw_sx, \
88 .private_value = (unsigned long)&(struct soc_mixer_control) \
89 {.reg = xreg, .rreg = xreg, \
90 .shift = xshift, .rshift = xshift, \
91 .max = xmax, .min = xmin} }
92 #define SOC_SINGLE_RANGE_TLV(xname, xreg, xshift, xmin, xmax, xinvert, tlv_array) \
93 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
94 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
95 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
96 .tlv.p = (tlv_array), \
97 .info = snd_soc_info_volsw_range, \
98 .get = snd_soc_get_volsw_range, .put = snd_soc_put_volsw_range, \
99 .private_value = (unsigned long)&(struct soc_mixer_control) \
100 {.reg = xreg, .rreg = xreg, .shift = xshift, \
101 .rshift = xshift, .min = xmin, .max = xmax, \
102 .platform_max = xmax, .invert = xinvert} }
103 #define SOC_DOUBLE(xname, reg, shift_left, shift_right, max, invert) \
104 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
105 .info = snd_soc_info_volsw, .get = snd_soc_get_volsw, \
106 .put = snd_soc_put_volsw, \
107 .private_value = SOC_DOUBLE_VALUE(reg, shift_left, shift_right, \
108 max, invert, 0) }
109 #define SOC_DOUBLE_STS(xname, reg, shift_left, shift_right, max, invert) \
110 { \
111 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
112 .info = snd_soc_info_volsw, .get = snd_soc_get_volsw, \
113 .access = SNDRV_CTL_ELEM_ACCESS_READ | \
114 SNDRV_CTL_ELEM_ACCESS_VOLATILE, \
115 .private_value = SOC_DOUBLE_VALUE(reg, shift_left, shift_right, \
116 max, invert, 0) }
117 #define SOC_DOUBLE_R(xname, reg_left, reg_right, xshift, xmax, xinvert) \
118 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
119 .info = snd_soc_info_volsw, \
120 .get = snd_soc_get_volsw, .put = snd_soc_put_volsw, \
121 .private_value = SOC_DOUBLE_R_VALUE(reg_left, reg_right, xshift, \
122 xmax, xinvert) }
123 #define SOC_DOUBLE_R_RANGE(xname, reg_left, reg_right, xshift, xmin, \
124 xmax, xinvert) \
125 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
126 .info = snd_soc_info_volsw_range, \
127 .get = snd_soc_get_volsw_range, .put = snd_soc_put_volsw_range, \
128 .private_value = SOC_DOUBLE_R_RANGE_VALUE(reg_left, reg_right, \
129 xshift, xmin, xmax, xinvert) }
130 #define SOC_DOUBLE_TLV(xname, reg, shift_left, shift_right, max, invert, tlv_array) \
131 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
132 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
133 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
134 .tlv.p = (tlv_array), \
135 .info = snd_soc_info_volsw, .get = snd_soc_get_volsw, \
136 .put = snd_soc_put_volsw, \
137 .private_value = SOC_DOUBLE_VALUE(reg, shift_left, shift_right, \
138 max, invert, 0) }
139 #define SOC_DOUBLE_R_TLV(xname, reg_left, reg_right, xshift, xmax, xinvert, tlv_array) \
140 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
141 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
142 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
143 .tlv.p = (tlv_array), \
144 .info = snd_soc_info_volsw, \
145 .get = snd_soc_get_volsw, .put = snd_soc_put_volsw, \
146 .private_value = SOC_DOUBLE_R_VALUE(reg_left, reg_right, xshift, \
147 xmax, xinvert) }
148 #define SOC_DOUBLE_R_RANGE_TLV(xname, reg_left, reg_right, xshift, xmin, \
149 xmax, xinvert, tlv_array) \
150 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
151 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
152 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
153 .tlv.p = (tlv_array), \
154 .info = snd_soc_info_volsw_range, \
155 .get = snd_soc_get_volsw_range, .put = snd_soc_put_volsw_range, \
156 .private_value = SOC_DOUBLE_R_RANGE_VALUE(reg_left, reg_right, \
157 xshift, xmin, xmax, xinvert) }
158 #define SOC_DOUBLE_R_SX_TLV(xname, xreg, xrreg, xshift, xmin, xmax, tlv_array) \
159 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
160 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
161 SNDRV_CTL_ELEM_ACCESS_READWRITE, \
162 .tlv.p = (tlv_array), \
163 .info = snd_soc_info_volsw_sx, \
164 .get = snd_soc_get_volsw_sx, \
165 .put = snd_soc_put_volsw_sx, \
166 .private_value = (unsigned long)&(struct soc_mixer_control) \
167 {.reg = xreg, .rreg = xrreg, \
168 .shift = xshift, .rshift = xshift, \
169 .max = xmax, .min = xmin} }
170 #define SOC_DOUBLE_R_S_TLV(xname, reg_left, reg_right, xshift, xmin, xmax, xsign_bit, xinvert, tlv_array) \
171 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
172 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
173 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
174 .tlv.p = (tlv_array), \
175 .info = snd_soc_info_volsw, \
176 .get = snd_soc_get_volsw, .put = snd_soc_put_volsw, \
177 .private_value = SOC_DOUBLE_R_S_VALUE(reg_left, reg_right, xshift, \
178 xmin, xmax, xsign_bit, xinvert) }
179 #define SOC_SINGLE_S8_TLV(xname, xreg, xmin, xmax, tlv_array) \
180 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
181 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
182 SNDRV_CTL_ELEM_ACCESS_READWRITE, \
183 .tlv.p = (tlv_array), \
184 .info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\
185 .put = snd_soc_put_volsw, \
186 .private_value = (unsigned long)&(struct soc_mixer_control) \
187 {.reg = xreg, .rreg = xreg, \
188 .min = xmin, .max = xmax, .platform_max = xmax, \
189 .sign_bit = 7,} }
190 #define SOC_DOUBLE_S8_TLV(xname, xreg, xmin, xmax, tlv_array) \
191 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
192 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
193 SNDRV_CTL_ELEM_ACCESS_READWRITE, \
194 .tlv.p = (tlv_array), \
195 .info = snd_soc_info_volsw, .get = snd_soc_get_volsw,\
196 .put = snd_soc_put_volsw, \
197 .private_value = SOC_DOUBLE_S_VALUE(xreg, 0, 8, xmin, xmax, 7, 0, 0) }
198 #define SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xitems, xtexts) \
199 { .reg = xreg, .shift_l = xshift_l, .shift_r = xshift_r, \
200 .items = xitems, .texts = xtexts, \
201 .mask = xitems ? roundup_pow_of_two(xitems) - 1 : 0}
202 #define SOC_ENUM_SINGLE(xreg, xshift, xitems, xtexts) \
203 SOC_ENUM_DOUBLE(xreg, xshift, xshift, xitems, xtexts)
204 #define SOC_ENUM_SINGLE_EXT(xitems, xtexts) \
205 { .items = xitems, .texts = xtexts }
206 #define SOC_VALUE_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmask, xitems, xtexts, xvalues) \
207 { .reg = xreg, .shift_l = xshift_l, .shift_r = xshift_r, \
208 .mask = xmask, .items = xitems, .texts = xtexts, .values = xvalues}
209 #define SOC_VALUE_ENUM_SINGLE(xreg, xshift, xmask, xitems, xtexts, xvalues) \
210 SOC_VALUE_ENUM_DOUBLE(xreg, xshift, xshift, xmask, xitems, xtexts, xvalues)
211 #define SOC_VALUE_ENUM_SINGLE_AUTODISABLE(xreg, xshift, xmask, xitems, xtexts, xvalues) \
212 { .reg = xreg, .shift_l = xshift, .shift_r = xshift, \
213 .mask = xmask, .items = xitems, .texts = xtexts, \
214 .values = xvalues, .autodisable = 1}
215 #define SOC_ENUM_SINGLE_VIRT(xitems, xtexts) \
216 SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, xitems, xtexts)
217 #define SOC_ENUM(xname, xenum) \
218 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname,\
219 .info = snd_soc_info_enum_double, \
220 .get = snd_soc_get_enum_double, .put = snd_soc_put_enum_double, \
221 .private_value = (unsigned long)&xenum }
222 #define SOC_SINGLE_EXT(xname, xreg, xshift, xmax, xinvert,\
223 xhandler_get, xhandler_put) \
224 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
225 .info = snd_soc_info_volsw, \
226 .get = xhandler_get, .put = xhandler_put, \
227 .private_value = SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert, 0) }
228 #define SOC_DOUBLE_EXT(xname, reg, shift_left, shift_right, max, invert,\
229 xhandler_get, xhandler_put) \
230 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
231 .info = snd_soc_info_volsw, \
232 .get = xhandler_get, .put = xhandler_put, \
233 .private_value = \
234 SOC_DOUBLE_VALUE(reg, shift_left, shift_right, max, invert, 0) }
235 #define SOC_DOUBLE_R_EXT(xname, reg_left, reg_right, xshift, xmax, xinvert,\
236 xhandler_get, xhandler_put) \
237 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
238 .info = snd_soc_info_volsw, \
239 .get = xhandler_get, .put = xhandler_put, \
240 .private_value = SOC_DOUBLE_R_VALUE(reg_left, reg_right, xshift, \
241 xmax, xinvert) }
242 #define SOC_SINGLE_EXT_TLV(xname, xreg, xshift, xmax, xinvert,\
243 xhandler_get, xhandler_put, tlv_array) \
244 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
245 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
246 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
247 .tlv.p = (tlv_array), \
248 .info = snd_soc_info_volsw, \
249 .get = xhandler_get, .put = xhandler_put, \
250 .private_value = SOC_SINGLE_VALUE(xreg, xshift, xmax, xinvert, 0) }
251 #define SOC_SINGLE_RANGE_EXT_TLV(xname, xreg, xshift, xmin, xmax, xinvert, \
252 xhandler_get, xhandler_put, tlv_array) \
253 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname),\
254 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
255 SNDRV_CTL_ELEM_ACCESS_READWRITE,\
256 .tlv.p = (tlv_array), \
257 .info = snd_soc_info_volsw_range, \
258 .get = xhandler_get, .put = xhandler_put, \
259 .private_value = (unsigned long)&(struct soc_mixer_control) \
260 {.reg = xreg, .rreg = xreg, .shift = xshift, \
261 .rshift = xshift, .min = xmin, .max = xmax, \
262 .platform_max = xmax, .invert = xinvert} }
263 #define SOC_DOUBLE_EXT_TLV(xname, xreg, shift_left, shift_right, xmax, xinvert,\
264 xhandler_get, xhandler_put, tlv_array) \
265 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
266 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
267 SNDRV_CTL_ELEM_ACCESS_READWRITE, \
268 .tlv.p = (tlv_array), \
269 .info = snd_soc_info_volsw, \
270 .get = xhandler_get, .put = xhandler_put, \
271 .private_value = SOC_DOUBLE_VALUE(xreg, shift_left, shift_right, \
272 xmax, xinvert, 0) }
273 #define SOC_DOUBLE_R_EXT_TLV(xname, reg_left, reg_right, xshift, xmax, xinvert,\
274 xhandler_get, xhandler_put, tlv_array) \
275 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
276 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
277 SNDRV_CTL_ELEM_ACCESS_READWRITE, \
278 .tlv.p = (tlv_array), \
279 .info = snd_soc_info_volsw, \
280 .get = xhandler_get, .put = xhandler_put, \
281 .private_value = SOC_DOUBLE_R_VALUE(reg_left, reg_right, xshift, \
282 xmax, xinvert) }
283 #define SOC_SINGLE_BOOL_EXT(xname, xdata, xhandler_get, xhandler_put) \
284 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
285 .info = snd_soc_info_bool_ext, \
286 .get = xhandler_get, .put = xhandler_put, \
287 .private_value = xdata }
288 #define SOC_ENUM_EXT(xname, xenum, xhandler_get, xhandler_put) \
289 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
290 .info = snd_soc_info_enum_double, \
291 .get = xhandler_get, .put = xhandler_put, \
292 .private_value = (unsigned long)&xenum }
293 #define SOC_VALUE_ENUM_EXT(xname, xenum, xhandler_get, xhandler_put) \
294 SOC_ENUM_EXT(xname, xenum, xhandler_get, xhandler_put)
295
296 #define SND_SOC_BYTES(xname, xbase, xregs) \
297 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
298 .info = snd_soc_bytes_info, .get = snd_soc_bytes_get, \
299 .put = snd_soc_bytes_put, .private_value = \
300 ((unsigned long)&(struct soc_bytes) \
301 {.base = xbase, .num_regs = xregs }) }
302
303 #define SND_SOC_BYTES_MASK(xname, xbase, xregs, xmask) \
304 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
305 .info = snd_soc_bytes_info, .get = snd_soc_bytes_get, \
306 .put = snd_soc_bytes_put, .private_value = \
307 ((unsigned long)&(struct soc_bytes) \
308 {.base = xbase, .num_regs = xregs, \
309 .mask = xmask }) }
310
311
312
313
314 #define SND_SOC_BYTES_EXT(xname, xcount, xhandler_get, xhandler_put) \
315 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
316 .info = snd_soc_bytes_info_ext, \
317 .get = xhandler_get, .put = xhandler_put, \
318 .private_value = (unsigned long)&(struct soc_bytes_ext) \
319 {.max = xcount} }
320 #define SND_SOC_BYTES_TLV(xname, xcount, xhandler_get, xhandler_put) \
321 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
322 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE | \
323 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, \
324 .tlv.c = (snd_soc_bytes_tlv_callback), \
325 .info = snd_soc_bytes_info_ext, \
326 .private_value = (unsigned long)&(struct soc_bytes_ext) \
327 {.max = xcount, .get = xhandler_get, .put = xhandler_put, } }
328 #define SOC_SINGLE_XR_SX(xname, xregbase, xregcount, xnbits, \
329 xmin, xmax, xinvert) \
330 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = (xname), \
331 .info = snd_soc_info_xr_sx, .get = snd_soc_get_xr_sx, \
332 .put = snd_soc_put_xr_sx, \
333 .private_value = (unsigned long)&(struct soc_mreg_control) \
334 {.regbase = xregbase, .regcount = xregcount, .nbits = xnbits, \
335 .invert = xinvert, .min = xmin, .max = xmax} }
336
337 #define SOC_SINGLE_STROBE(xname, xreg, xshift, xinvert) \
338 SOC_SINGLE_EXT(xname, xreg, xshift, 1, xinvert, \
339 snd_soc_get_strobe, snd_soc_put_strobe)
340
341
342
343
344
345 #define SOC_ENUM_DOUBLE_DECL(name, xreg, xshift_l, xshift_r, xtexts) \
346 const struct soc_enum name = SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, \
347 ARRAY_SIZE(xtexts), xtexts)
348 #define SOC_ENUM_SINGLE_DECL(name, xreg, xshift, xtexts) \
349 SOC_ENUM_DOUBLE_DECL(name, xreg, xshift, xshift, xtexts)
350 #define SOC_ENUM_SINGLE_EXT_DECL(name, xtexts) \
351 const struct soc_enum name = SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(xtexts), xtexts)
352 #define SOC_VALUE_ENUM_DOUBLE_DECL(name, xreg, xshift_l, xshift_r, xmask, xtexts, xvalues) \
353 const struct soc_enum name = SOC_VALUE_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmask, \
354 ARRAY_SIZE(xtexts), xtexts, xvalues)
355 #define SOC_VALUE_ENUM_SINGLE_DECL(name, xreg, xshift, xmask, xtexts, xvalues) \
356 SOC_VALUE_ENUM_DOUBLE_DECL(name, xreg, xshift, xshift, xmask, xtexts, xvalues)
357
358 #define SOC_VALUE_ENUM_SINGLE_AUTODISABLE_DECL(name, xreg, xshift, xmask, xtexts, xvalues) \
359 const struct soc_enum name = SOC_VALUE_ENUM_SINGLE_AUTODISABLE(xreg, \
360 xshift, xmask, ARRAY_SIZE(xtexts), xtexts, xvalues)
361
362 #define SOC_ENUM_SINGLE_VIRT_DECL(name, xtexts) \
363 const struct soc_enum name = SOC_ENUM_SINGLE_VIRT(ARRAY_SIZE(xtexts), xtexts)
364
365
366
367
368
369
370
371
372
373
374
375
376 enum snd_soc_bias_level {
377 SND_SOC_BIAS_OFF = 0,
378 SND_SOC_BIAS_STANDBY = 1,
379 SND_SOC_BIAS_PREPARE = 2,
380 SND_SOC_BIAS_ON = 3,
381 };
382
383 struct device_node;
384 struct snd_jack;
385 struct snd_soc_card;
386 struct snd_soc_pcm_stream;
387 struct snd_soc_ops;
388 struct snd_soc_pcm_runtime;
389 struct snd_soc_dai;
390 struct snd_soc_dai_driver;
391 struct snd_soc_dai_link;
392 struct snd_soc_component;
393 struct snd_soc_component_driver;
394 struct soc_enum;
395 struct snd_soc_jack;
396 struct snd_soc_jack_zone;
397 struct snd_soc_jack_pin;
398 #include <sound/soc-dapm.h>
399 #include <sound/soc-dpcm.h>
400 #include <sound/soc-topology.h>
401
402 struct snd_soc_jack_gpio;
403
404 typedef int (*hw_write_t)(void *,const char* ,int);
405
406 enum snd_soc_pcm_subclass {
407 SND_SOC_PCM_CLASS_PCM = 0,
408 SND_SOC_PCM_CLASS_BE = 1,
409 };
410
411 enum snd_soc_card_subclass {
412 SND_SOC_CARD_CLASS_INIT = 0,
413 SND_SOC_CARD_CLASS_RUNTIME = 1,
414 };
415
416 int snd_soc_register_card(struct snd_soc_card *card);
417 int snd_soc_unregister_card(struct snd_soc_card *card);
418 int devm_snd_soc_register_card(struct device *dev, struct snd_soc_card *card);
419 #ifdef CONFIG_PM_SLEEP
420 int snd_soc_suspend(struct device *dev);
421 int snd_soc_resume(struct device *dev);
422 #else
423 static inline int snd_soc_suspend(struct device *dev)
424 {
425 return 0;
426 }
427
428 static inline int snd_soc_resume(struct device *dev)
429 {
430 return 0;
431 }
432 #endif
433 int snd_soc_poweroff(struct device *dev);
434 int snd_soc_add_component(struct device *dev,
435 struct snd_soc_component *component,
436 const struct snd_soc_component_driver *component_driver,
437 struct snd_soc_dai_driver *dai_drv,
438 int num_dai);
439 int snd_soc_register_component(struct device *dev,
440 const struct snd_soc_component_driver *component_driver,
441 struct snd_soc_dai_driver *dai_drv, int num_dai);
442 int devm_snd_soc_register_component(struct device *dev,
443 const struct snd_soc_component_driver *component_driver,
444 struct snd_soc_dai_driver *dai_drv, int num_dai);
445 void snd_soc_unregister_component(struct device *dev);
446 struct snd_soc_component *snd_soc_lookup_component(struct device *dev,
447 const char *driver_name);
448
449 int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num);
450 #ifdef CONFIG_SND_SOC_COMPRESS
451 int snd_soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num);
452 #else
453 static inline int snd_soc_new_compress(struct snd_soc_pcm_runtime *rtd, int num)
454 {
455 return 0;
456 }
457 #endif
458
459 void snd_soc_disconnect_sync(struct device *dev);
460
461 struct snd_pcm_substream *snd_soc_get_dai_substream(struct snd_soc_card *card,
462 const char *dai_link, int stream);
463 struct snd_soc_pcm_runtime *snd_soc_get_pcm_runtime(struct snd_soc_card *card,
464 const char *dai_link);
465
466 bool snd_soc_runtime_ignore_pmdown_time(struct snd_soc_pcm_runtime *rtd);
467 void snd_soc_runtime_activate(struct snd_soc_pcm_runtime *rtd, int stream);
468 void snd_soc_runtime_deactivate(struct snd_soc_pcm_runtime *rtd, int stream);
469
470 int snd_soc_runtime_set_dai_fmt(struct snd_soc_pcm_runtime *rtd,
471 unsigned int dai_fmt);
472
473 #ifdef CONFIG_DMI
474 int snd_soc_set_dmi_name(struct snd_soc_card *card, const char *flavour);
475 #else
476 static inline int snd_soc_set_dmi_name(struct snd_soc_card *card,
477 const char *flavour)
478 {
479 return 0;
480 }
481 #endif
482
483
484 int snd_soc_calc_frame_size(int sample_size, int channels, int tdm_slots);
485 int snd_soc_params_to_frame_size(struct snd_pcm_hw_params *params);
486 int snd_soc_calc_bclk(int fs, int sample_size, int channels, int tdm_slots);
487 int snd_soc_params_to_bclk(struct snd_pcm_hw_params *parms);
488
489
490 int snd_soc_set_runtime_hwparams(struct snd_pcm_substream *substream,
491 const struct snd_pcm_hardware *hw);
492
493
494 int snd_soc_card_jack_new(struct snd_soc_card *card, const char *id, int type,
495 struct snd_soc_jack *jack, struct snd_soc_jack_pin *pins,
496 unsigned int num_pins);
497
498 void snd_soc_jack_report(struct snd_soc_jack *jack, int status, int mask);
499 int snd_soc_jack_add_pins(struct snd_soc_jack *jack, int count,
500 struct snd_soc_jack_pin *pins);
501 void snd_soc_jack_notifier_register(struct snd_soc_jack *jack,
502 struct notifier_block *nb);
503 void snd_soc_jack_notifier_unregister(struct snd_soc_jack *jack,
504 struct notifier_block *nb);
505 int snd_soc_jack_add_zones(struct snd_soc_jack *jack, int count,
506 struct snd_soc_jack_zone *zones);
507 int snd_soc_jack_get_type(struct snd_soc_jack *jack, int micbias_voltage);
508 #ifdef CONFIG_GPIOLIB
509 int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,
510 struct snd_soc_jack_gpio *gpios);
511 int snd_soc_jack_add_gpiods(struct device *gpiod_dev,
512 struct snd_soc_jack *jack,
513 int count, struct snd_soc_jack_gpio *gpios);
514 void snd_soc_jack_free_gpios(struct snd_soc_jack *jack, int count,
515 struct snd_soc_jack_gpio *gpios);
516 #else
517 static inline int snd_soc_jack_add_gpios(struct snd_soc_jack *jack, int count,
518 struct snd_soc_jack_gpio *gpios)
519 {
520 return 0;
521 }
522
523 static inline int snd_soc_jack_add_gpiods(struct device *gpiod_dev,
524 struct snd_soc_jack *jack,
525 int count,
526 struct snd_soc_jack_gpio *gpios)
527 {
528 return 0;
529 }
530
531 static inline void snd_soc_jack_free_gpios(struct snd_soc_jack *jack, int count,
532 struct snd_soc_jack_gpio *gpios)
533 {
534 }
535 #endif
536
537 struct snd_ac97 *snd_soc_alloc_ac97_component(struct snd_soc_component *component);
538 struct snd_ac97 *snd_soc_new_ac97_component(struct snd_soc_component *component,
539 unsigned int id, unsigned int id_mask);
540 void snd_soc_free_ac97_component(struct snd_ac97 *ac97);
541
542 #ifdef CONFIG_SND_SOC_AC97_BUS
543 int snd_soc_set_ac97_ops(struct snd_ac97_bus_ops *ops);
544 int snd_soc_set_ac97_ops_of_reset(struct snd_ac97_bus_ops *ops,
545 struct platform_device *pdev);
546
547 extern struct snd_ac97_bus_ops *soc_ac97_ops;
548 #else
549 static inline int snd_soc_set_ac97_ops_of_reset(struct snd_ac97_bus_ops *ops,
550 struct platform_device *pdev)
551 {
552 return 0;
553 }
554
555 static inline int snd_soc_set_ac97_ops(struct snd_ac97_bus_ops *ops)
556 {
557 return 0;
558 }
559 #endif
560
561
562
563
564 struct snd_kcontrol *snd_soc_cnew(const struct snd_kcontrol_new *_template,
565 void *data, const char *long_name,
566 const char *prefix);
567 struct snd_kcontrol *snd_soc_card_get_kcontrol(struct snd_soc_card *soc_card,
568 const char *name);
569 int snd_soc_add_component_controls(struct snd_soc_component *component,
570 const struct snd_kcontrol_new *controls, unsigned int num_controls);
571 int snd_soc_add_card_controls(struct snd_soc_card *soc_card,
572 const struct snd_kcontrol_new *controls, int num_controls);
573 int snd_soc_add_dai_controls(struct snd_soc_dai *dai,
574 const struct snd_kcontrol_new *controls, int num_controls);
575 int snd_soc_info_enum_double(struct snd_kcontrol *kcontrol,
576 struct snd_ctl_elem_info *uinfo);
577 int snd_soc_get_enum_double(struct snd_kcontrol *kcontrol,
578 struct snd_ctl_elem_value *ucontrol);
579 int snd_soc_put_enum_double(struct snd_kcontrol *kcontrol,
580 struct snd_ctl_elem_value *ucontrol);
581 int snd_soc_info_volsw(struct snd_kcontrol *kcontrol,
582 struct snd_ctl_elem_info *uinfo);
583 int snd_soc_info_volsw_sx(struct snd_kcontrol *kcontrol,
584 struct snd_ctl_elem_info *uinfo);
585 #define snd_soc_info_bool_ext snd_ctl_boolean_mono_info
586 int snd_soc_get_volsw(struct snd_kcontrol *kcontrol,
587 struct snd_ctl_elem_value *ucontrol);
588 int snd_soc_put_volsw(struct snd_kcontrol *kcontrol,
589 struct snd_ctl_elem_value *ucontrol);
590 #define snd_soc_get_volsw_2r snd_soc_get_volsw
591 #define snd_soc_put_volsw_2r snd_soc_put_volsw
592 int snd_soc_get_volsw_sx(struct snd_kcontrol *kcontrol,
593 struct snd_ctl_elem_value *ucontrol);
594 int snd_soc_put_volsw_sx(struct snd_kcontrol *kcontrol,
595 struct snd_ctl_elem_value *ucontrol);
596 int snd_soc_info_volsw_range(struct snd_kcontrol *kcontrol,
597 struct snd_ctl_elem_info *uinfo);
598 int snd_soc_put_volsw_range(struct snd_kcontrol *kcontrol,
599 struct snd_ctl_elem_value *ucontrol);
600 int snd_soc_get_volsw_range(struct snd_kcontrol *kcontrol,
601 struct snd_ctl_elem_value *ucontrol);
602 int snd_soc_limit_volume(struct snd_soc_card *card,
603 const char *name, int max);
604 int snd_soc_bytes_info(struct snd_kcontrol *kcontrol,
605 struct snd_ctl_elem_info *uinfo);
606 int snd_soc_bytes_get(struct snd_kcontrol *kcontrol,
607 struct snd_ctl_elem_value *ucontrol);
608 int snd_soc_bytes_put(struct snd_kcontrol *kcontrol,
609 struct snd_ctl_elem_value *ucontrol);
610 int snd_soc_bytes_info_ext(struct snd_kcontrol *kcontrol,
611 struct snd_ctl_elem_info *ucontrol);
612 int snd_soc_bytes_tlv_callback(struct snd_kcontrol *kcontrol, int op_flag,
613 unsigned int size, unsigned int __user *tlv);
614 int snd_soc_info_xr_sx(struct snd_kcontrol *kcontrol,
615 struct snd_ctl_elem_info *uinfo);
616 int snd_soc_get_xr_sx(struct snd_kcontrol *kcontrol,
617 struct snd_ctl_elem_value *ucontrol);
618 int snd_soc_put_xr_sx(struct snd_kcontrol *kcontrol,
619 struct snd_ctl_elem_value *ucontrol);
620 int snd_soc_get_strobe(struct snd_kcontrol *kcontrol,
621 struct snd_ctl_elem_value *ucontrol);
622 int snd_soc_put_strobe(struct snd_kcontrol *kcontrol,
623 struct snd_ctl_elem_value *ucontrol);
624
625
626
627
628
629
630
631
632
633 struct snd_soc_jack_pin {
634 struct list_head list;
635 const char *pin;
636 int mask;
637 bool invert;
638 };
639
640
641
642
643
644
645
646
647
648
649
650 struct snd_soc_jack_zone {
651 unsigned int min_mv;
652 unsigned int max_mv;
653 unsigned int jack_type;
654 unsigned int debounce_time;
655 struct list_head list;
656 };
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675 struct snd_soc_jack_gpio {
676 unsigned int gpio;
677 unsigned int idx;
678 struct device *gpiod_dev;
679 const char *name;
680 int report;
681 int invert;
682 int debounce_time;
683 bool wake;
684
685
686 struct snd_soc_jack *jack;
687 struct delayed_work work;
688 struct notifier_block pm_notifier;
689 struct gpio_desc *desc;
690
691 void *data;
692
693 int (*jack_status_check)(void *data);
694 };
695
696 struct snd_soc_jack {
697 struct mutex mutex;
698 struct snd_jack *jack;
699 struct snd_soc_card *card;
700 struct list_head pins;
701 int status;
702 struct blocking_notifier_head notifier;
703 struct list_head jack_zones;
704 };
705
706
707 struct snd_soc_pcm_stream {
708 const char *stream_name;
709 u64 formats;
710 unsigned int rates;
711 unsigned int rate_min;
712 unsigned int rate_max;
713 unsigned int channels_min;
714 unsigned int channels_max;
715 unsigned int sig_bits;
716 };
717
718
719 struct snd_soc_ops {
720 int (*startup)(struct snd_pcm_substream *);
721 void (*shutdown)(struct snd_pcm_substream *);
722 int (*hw_params)(struct snd_pcm_substream *, struct snd_pcm_hw_params *);
723 int (*hw_free)(struct snd_pcm_substream *);
724 int (*prepare)(struct snd_pcm_substream *);
725 int (*trigger)(struct snd_pcm_substream *, int);
726 };
727
728 struct snd_soc_compr_ops {
729 int (*startup)(struct snd_compr_stream *);
730 void (*shutdown)(struct snd_compr_stream *);
731 int (*set_params)(struct snd_compr_stream *);
732 int (*trigger)(struct snd_compr_stream *);
733 };
734
735 struct snd_soc_rtdcom_list {
736 struct snd_soc_component *component;
737 struct list_head list;
738 };
739 struct snd_soc_component*
740 snd_soc_rtdcom_lookup(struct snd_soc_pcm_runtime *rtd,
741 const char *driver_name);
742 #define for_each_rtdcom(rtd, rtdcom) \
743 list_for_each_entry(rtdcom, &(rtd)->component_list, list)
744 #define for_each_rtdcom_safe(rtd, rtdcom1, rtdcom2) \
745 list_for_each_entry_safe(rtdcom1, rtdcom2, &(rtd)->component_list, list)
746
747 struct snd_soc_dai_link_component {
748 const char *name;
749 struct device_node *of_node;
750 const char *dai_name;
751 };
752
753 struct snd_soc_dai_link {
754
755 const char *name;
756 const char *stream_name;
757
758
759
760
761
762
763
764
765
766
767
768
769
770 struct snd_soc_dai_link_component *cpus;
771 unsigned int num_cpus;
772
773
774
775
776
777
778 struct snd_soc_dai_link_component *codecs;
779 unsigned int num_codecs;
780
781
782
783
784
785
786 struct snd_soc_dai_link_component *platforms;
787 unsigned int num_platforms;
788
789 int id;
790
791 const struct snd_soc_pcm_stream *params;
792 unsigned int num_params;
793
794 unsigned int dai_fmt;
795
796 enum snd_soc_dpcm_trigger trigger[2];
797
798
799 int (*init)(struct snd_soc_pcm_runtime *rtd);
800
801
802 int (*be_hw_params_fixup)(struct snd_soc_pcm_runtime *rtd,
803 struct snd_pcm_hw_params *params);
804
805
806 const struct snd_soc_ops *ops;
807 const struct snd_soc_compr_ops *compr_ops;
808
809
810 bool nonatomic;
811
812
813 unsigned int playback_only:1;
814 unsigned int capture_only:1;
815
816
817 unsigned int ignore_suspend:1;
818
819
820 unsigned int symmetric_rates:1;
821 unsigned int symmetric_channels:1;
822 unsigned int symmetric_samplebits:1;
823
824
825 unsigned int no_pcm:1;
826
827
828 unsigned int dynamic:1;
829
830
831 unsigned int dpcm_capture:1;
832 unsigned int dpcm_playback:1;
833
834
835 unsigned int dpcm_merged_format:1;
836
837 unsigned int dpcm_merged_chan:1;
838
839 unsigned int dpcm_merged_rate:1;
840
841
842 unsigned int ignore_pmdown_time:1;
843
844
845 unsigned int ignore:1;
846
847 struct list_head list;
848 struct snd_soc_dobj dobj;
849 };
850 #define for_each_link_codecs(link, i, codec) \
851 for ((i) = 0; \
852 ((i) < link->num_codecs) && ((codec) = &link->codecs[i]); \
853 (i)++)
854
855 #define for_each_link_platforms(link, i, platform) \
856 for ((i) = 0; \
857 ((i) < link->num_platforms) && \
858 ((platform) = &link->platforms[i]); \
859 (i)++)
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914 #define SND_SOC_DAILINK_REG1(name) SND_SOC_DAILINK_REG3(name##_cpus, name##_codecs, name##_platforms)
915 #define SND_SOC_DAILINK_REG2(cpu, codec) SND_SOC_DAILINK_REG3(cpu, codec, null_dailink_component)
916 #define SND_SOC_DAILINK_REG3(cpu, codec, platform) \
917 .cpus = cpu, \
918 .num_cpus = ARRAY_SIZE(cpu), \
919 .codecs = codec, \
920 .num_codecs = ARRAY_SIZE(codec), \
921 .platforms = platform, \
922 .num_platforms = ARRAY_SIZE(platform)
923
924 #define SND_SOC_DAILINK_REGx(_1, _2, _3, func, ...) func
925 #define SND_SOC_DAILINK_REG(...) \
926 SND_SOC_DAILINK_REGx(__VA_ARGS__, \
927 SND_SOC_DAILINK_REG3, \
928 SND_SOC_DAILINK_REG2, \
929 SND_SOC_DAILINK_REG1)(__VA_ARGS__)
930
931 #define SND_SOC_DAILINK_DEF(name, def...) \
932 static struct snd_soc_dai_link_component name[] = { def }
933
934 #define SND_SOC_DAILINK_DEFS(name, cpu, codec, platform...) \
935 SND_SOC_DAILINK_DEF(name##_cpus, cpu); \
936 SND_SOC_DAILINK_DEF(name##_codecs, codec); \
937 SND_SOC_DAILINK_DEF(name##_platforms, platform)
938
939 #define DAILINK_COMP_ARRAY(param...) param
940 #define COMP_EMPTY() { }
941 #define COMP_CPU(_dai) { .dai_name = _dai, }
942 #define COMP_CODEC(_name, _dai) { .name = _name, .dai_name = _dai, }
943 #define COMP_PLATFORM(_name) { .name = _name }
944 #define COMP_AUX(_name) { .name = _name }
945 #define COMP_DUMMY() { .name = "snd-soc-dummy", .dai_name = "snd-soc-dummy-dai", }
946
947 extern struct snd_soc_dai_link_component null_dailink_component[0];
948
949
950 struct snd_soc_codec_conf {
951
952
953
954
955 const char *dev_name;
956 struct device_node *of_node;
957
958
959
960
961
962 const char *name_prefix;
963 };
964
965 struct snd_soc_aux_dev {
966
967
968
969
970 struct snd_soc_dai_link_component dlc;
971
972
973 int (*init)(struct snd_soc_component *component);
974 };
975
976
977 struct snd_soc_card {
978 const char *name;
979 const char *long_name;
980 const char *driver_name;
981 char dmi_longname[80];
982 char topology_shortname[32];
983
984 struct device *dev;
985 struct snd_card *snd_card;
986 struct module *owner;
987
988 struct mutex mutex;
989 struct mutex dapm_mutex;
990
991
992 struct mutex pcm_mutex;
993 enum snd_soc_pcm_subclass pcm_subclass;
994
995 spinlock_t dpcm_lock;
996
997 bool instantiated;
998 bool topology_shortname_created;
999
1000 int (*probe)(struct snd_soc_card *card);
1001 int (*late_probe)(struct snd_soc_card *card);
1002 int (*remove)(struct snd_soc_card *card);
1003
1004
1005
1006 int (*suspend_pre)(struct snd_soc_card *card);
1007 int (*suspend_post)(struct snd_soc_card *card);
1008 int (*resume_pre)(struct snd_soc_card *card);
1009 int (*resume_post)(struct snd_soc_card *card);
1010
1011
1012 int (*set_bias_level)(struct snd_soc_card *,
1013 struct snd_soc_dapm_context *dapm,
1014 enum snd_soc_bias_level level);
1015 int (*set_bias_level_post)(struct snd_soc_card *,
1016 struct snd_soc_dapm_context *dapm,
1017 enum snd_soc_bias_level level);
1018
1019 int (*add_dai_link)(struct snd_soc_card *,
1020 struct snd_soc_dai_link *link);
1021 void (*remove_dai_link)(struct snd_soc_card *,
1022 struct snd_soc_dai_link *link);
1023
1024 long pmdown_time;
1025
1026
1027 struct snd_soc_dai_link *dai_link;
1028 int num_links;
1029 struct list_head dai_link_list;
1030
1031 struct list_head rtd_list;
1032 int num_rtd;
1033
1034
1035 struct snd_soc_codec_conf *codec_conf;
1036 int num_configs;
1037
1038
1039
1040
1041
1042 struct snd_soc_aux_dev *aux_dev;
1043 int num_aux_devs;
1044 struct list_head aux_comp_list;
1045
1046 const struct snd_kcontrol_new *controls;
1047 int num_controls;
1048
1049
1050
1051
1052
1053 const struct snd_soc_dapm_widget *dapm_widgets;
1054 int num_dapm_widgets;
1055 const struct snd_soc_dapm_route *dapm_routes;
1056 int num_dapm_routes;
1057 const struct snd_soc_dapm_widget *of_dapm_widgets;
1058 int num_of_dapm_widgets;
1059 const struct snd_soc_dapm_route *of_dapm_routes;
1060 int num_of_dapm_routes;
1061 bool fully_routed;
1062 bool disable_route_checks;
1063
1064
1065 struct list_head component_dev_list;
1066 struct list_head list;
1067
1068 struct list_head widgets;
1069 struct list_head paths;
1070 struct list_head dapm_list;
1071 struct list_head dapm_dirty;
1072
1073
1074 struct list_head dobj_list;
1075
1076
1077 struct snd_soc_dapm_context dapm;
1078 struct snd_soc_dapm_stats dapm_stats;
1079 struct snd_soc_dapm_update *update;
1080
1081 #ifdef CONFIG_DEBUG_FS
1082 struct dentry *debugfs_card_root;
1083 #endif
1084 #ifdef CONFIG_PM_SLEEP
1085 struct work_struct deferred_resume_work;
1086 #endif
1087 u32 pop_time;
1088
1089 void *drvdata;
1090 };
1091 #define for_each_card_prelinks(card, i, link) \
1092 for ((i) = 0; \
1093 ((i) < (card)->num_links) && ((link) = &(card)->dai_link[i]); \
1094 (i)++)
1095 #define for_each_card_pre_auxs(card, i, aux) \
1096 for ((i) = 0; \
1097 ((i) < (card)->num_aux_devs) && ((aux) = &(card)->aux_dev[i]); \
1098 (i)++)
1099
1100 #define for_each_card_links(card, link) \
1101 list_for_each_entry(link, &(card)->dai_link_list, list)
1102 #define for_each_card_links_safe(card, link, _link) \
1103 list_for_each_entry_safe(link, _link, &(card)->dai_link_list, list)
1104
1105 #define for_each_card_rtds(card, rtd) \
1106 list_for_each_entry(rtd, &(card)->rtd_list, list)
1107 #define for_each_card_rtds_safe(card, rtd, _rtd) \
1108 list_for_each_entry_safe(rtd, _rtd, &(card)->rtd_list, list)
1109
1110 #define for_each_card_auxs(card, component) \
1111 list_for_each_entry(component, &card->aux_comp_list, card_aux_list)
1112 #define for_each_card_auxs_safe(card, component, _comp) \
1113 list_for_each_entry_safe(component, _comp, \
1114 &card->aux_comp_list, card_aux_list)
1115
1116 #define for_each_card_components(card, component) \
1117 list_for_each_entry(component, &(card)->component_dev_list, card_list)
1118
1119
1120 struct snd_soc_pcm_runtime {
1121 struct device *dev;
1122 struct snd_soc_card *card;
1123 struct snd_soc_dai_link *dai_link;
1124 struct snd_pcm_ops ops;
1125
1126 unsigned int params_select;
1127
1128
1129 struct snd_soc_dpcm_runtime dpcm[2];
1130
1131 long pmdown_time;
1132
1133
1134 struct snd_pcm *pcm;
1135 struct snd_compr *compr;
1136 struct snd_soc_dai *codec_dai;
1137 struct snd_soc_dai *cpu_dai;
1138
1139 struct snd_soc_dai **codec_dais;
1140 unsigned int num_codecs;
1141
1142 struct delayed_work delayed_work;
1143 #ifdef CONFIG_DEBUG_FS
1144 struct dentry *debugfs_dpcm_root;
1145 #endif
1146
1147 unsigned int num;
1148 struct list_head list;
1149 struct list_head component_list;
1150
1151
1152 unsigned int dev_registered:1;
1153 unsigned int pop_wait:1;
1154 unsigned int fe_compr:1;
1155 };
1156 #define for_each_rtd_codec_dai(rtd, i, dai)\
1157 for ((i) = 0; \
1158 ((i) < rtd->num_codecs) && ((dai) = rtd->codec_dais[i]); \
1159 (i)++)
1160 #define for_each_rtd_codec_dai_rollback(rtd, i, dai) \
1161 for (; ((--i) >= 0) && ((dai) = rtd->codec_dais[i]);)
1162
1163
1164
1165 struct soc_mixer_control {
1166 int min, max, platform_max;
1167 int reg, rreg;
1168 unsigned int shift, rshift;
1169 unsigned int sign_bit;
1170 unsigned int invert:1;
1171 unsigned int autodisable:1;
1172 struct snd_soc_dobj dobj;
1173 };
1174
1175 struct soc_bytes {
1176 int base;
1177 int num_regs;
1178 u32 mask;
1179 };
1180
1181 struct soc_bytes_ext {
1182 int max;
1183 struct snd_soc_dobj dobj;
1184
1185
1186 int (*get)(struct snd_kcontrol *kcontrol, unsigned int __user *bytes,
1187 unsigned int size);
1188 int (*put)(struct snd_kcontrol *kcontrol, const unsigned int __user *bytes,
1189 unsigned int size);
1190 };
1191
1192
1193 struct soc_mreg_control {
1194 long min, max;
1195 unsigned int regbase, regcount, nbits, invert;
1196 };
1197
1198
1199 struct soc_enum {
1200 int reg;
1201 unsigned char shift_l;
1202 unsigned char shift_r;
1203 unsigned int items;
1204 unsigned int mask;
1205 const char * const *texts;
1206 const unsigned int *values;
1207 unsigned int autodisable:1;
1208 struct snd_soc_dobj dobj;
1209 };
1210
1211
1212
1213 static inline void snd_soc_card_set_drvdata(struct snd_soc_card *card,
1214 void *data)
1215 {
1216 card->drvdata = data;
1217 }
1218
1219 static inline void *snd_soc_card_get_drvdata(struct snd_soc_card *card)
1220 {
1221 return card->drvdata;
1222 }
1223
1224 static inline bool snd_soc_volsw_is_stereo(struct soc_mixer_control *mc)
1225 {
1226 if (mc->reg == mc->rreg && mc->shift == mc->rshift)
1227 return 0;
1228
1229
1230
1231
1232
1233 return 1;
1234 }
1235
1236 static inline unsigned int snd_soc_enum_val_to_item(struct soc_enum *e,
1237 unsigned int val)
1238 {
1239 unsigned int i;
1240
1241 if (!e->values)
1242 return val;
1243
1244 for (i = 0; i < e->items; i++)
1245 if (val == e->values[i])
1246 return i;
1247
1248 return 0;
1249 }
1250
1251 static inline unsigned int snd_soc_enum_item_to_val(struct soc_enum *e,
1252 unsigned int item)
1253 {
1254 if (!e->values)
1255 return item;
1256
1257 return e->values[item];
1258 }
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270 static inline struct snd_soc_component *snd_soc_kcontrol_component(
1271 struct snd_kcontrol *kcontrol)
1272 {
1273 return snd_kcontrol_chip(kcontrol);
1274 }
1275
1276 int snd_soc_util_init(void);
1277 void snd_soc_util_exit(void);
1278
1279 int snd_soc_of_parse_card_name(struct snd_soc_card *card,
1280 const char *propname);
1281 int snd_soc_of_parse_audio_simple_widgets(struct snd_soc_card *card,
1282 const char *propname);
1283 int snd_soc_of_get_slot_mask(struct device_node *np,
1284 const char *prop_name,
1285 unsigned int *mask);
1286 int snd_soc_of_parse_tdm_slot(struct device_node *np,
1287 unsigned int *tx_mask,
1288 unsigned int *rx_mask,
1289 unsigned int *slots,
1290 unsigned int *slot_width);
1291 void snd_soc_of_parse_node_prefix(struct device_node *np,
1292 struct snd_soc_codec_conf *codec_conf,
1293 struct device_node *of_node,
1294 const char *propname);
1295 static inline
1296 void snd_soc_of_parse_audio_prefix(struct snd_soc_card *card,
1297 struct snd_soc_codec_conf *codec_conf,
1298 struct device_node *of_node,
1299 const char *propname)
1300 {
1301 snd_soc_of_parse_node_prefix(card->dev->of_node,
1302 codec_conf, of_node, propname);
1303 }
1304
1305 int snd_soc_of_parse_audio_routing(struct snd_soc_card *card,
1306 const char *propname);
1307 unsigned int snd_soc_of_parse_daifmt(struct device_node *np,
1308 const char *prefix,
1309 struct device_node **bitclkmaster,
1310 struct device_node **framemaster);
1311 int snd_soc_get_dai_id(struct device_node *ep);
1312 int snd_soc_get_dai_name(struct of_phandle_args *args,
1313 const char **dai_name);
1314 int snd_soc_of_get_dai_name(struct device_node *of_node,
1315 const char **dai_name);
1316 int snd_soc_of_get_dai_link_codecs(struct device *dev,
1317 struct device_node *of_node,
1318 struct snd_soc_dai_link *dai_link);
1319 void snd_soc_of_put_dai_link_codecs(struct snd_soc_dai_link *dai_link);
1320
1321 int snd_soc_add_dai_link(struct snd_soc_card *card,
1322 struct snd_soc_dai_link *dai_link);
1323 void snd_soc_remove_dai_link(struct snd_soc_card *card,
1324 struct snd_soc_dai_link *dai_link);
1325 struct snd_soc_dai_link *snd_soc_find_dai_link(struct snd_soc_card *card,
1326 int id, const char *name,
1327 const char *stream_name);
1328
1329 int snd_soc_register_dai(struct snd_soc_component *component,
1330 struct snd_soc_dai_driver *dai_drv);
1331
1332 struct snd_soc_dai *snd_soc_find_dai(
1333 const struct snd_soc_dai_link_component *dlc);
1334
1335 #include <sound/soc-dai.h>
1336
1337 static inline
1338 struct snd_soc_dai *snd_soc_card_get_codec_dai(struct snd_soc_card *card,
1339 const char *dai_name)
1340 {
1341 struct snd_soc_pcm_runtime *rtd;
1342
1343 list_for_each_entry(rtd, &card->rtd_list, list) {
1344 if (!strcmp(rtd->codec_dai->name, dai_name))
1345 return rtd->codec_dai;
1346 }
1347
1348 return NULL;
1349 }
1350
1351 static inline
1352 int snd_soc_fixup_dai_links_platform_name(struct snd_soc_card *card,
1353 const char *platform_name)
1354 {
1355 struct snd_soc_dai_link *dai_link;
1356 const char *name;
1357 int i;
1358
1359 if (!platform_name)
1360 return 0;
1361
1362
1363 for_each_card_prelinks(card, i, dai_link) {
1364 name = devm_kstrdup(card->dev, platform_name, GFP_KERNEL);
1365 if (!name)
1366 return -ENOMEM;
1367
1368 if (!dai_link->platforms)
1369 return -EINVAL;
1370
1371
1372 dai_link->platforms->name = name;
1373 }
1374
1375 return 0;
1376 }
1377
1378 #ifdef CONFIG_DEBUG_FS
1379 extern struct dentry *snd_soc_debugfs_root;
1380 #endif
1381
1382 extern const struct dev_pm_ops snd_soc_pm_ops;
1383
1384
1385 static inline void snd_soc_dapm_mutex_lock(struct snd_soc_dapm_context *dapm)
1386 {
1387 mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
1388 }
1389
1390 static inline void snd_soc_dapm_mutex_unlock(struct snd_soc_dapm_context *dapm)
1391 {
1392 mutex_unlock(&dapm->card->dapm_mutex);
1393 }
1394
1395 #include <sound/soc-component.h>
1396
1397 #endif