]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - sound/pci/hda/hda_local.h
ALSA: hda - proc - add support for dynamic controls to mixer<->NID mapping
[mirror_ubuntu-bionic-kernel.git] / sound / pci / hda / hda_local.h
1 /*
2 * Universal Interface for Intel High Definition Audio Codec
3 *
4 * Local helper functions
5 *
6 * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de>
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the Free
10 * Software Foundation; either version 2 of the License, or (at your option)
11 * any later version.
12 *
13 * This program is distributed in the hope that it will be useful, but WITHOUT
14 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
16 * more details.
17 *
18 * You should have received a copy of the GNU General Public License along with
19 * this program; if not, write to the Free Software Foundation, Inc., 59
20 * Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 */
22
23 #ifndef __SOUND_HDA_LOCAL_H
24 #define __SOUND_HDA_LOCAL_H
25
26 /*
27 * for mixer controls
28 */
29 #define HDA_COMPOSE_AMP_VAL_OFS(nid,chs,idx,dir,ofs) \
30 ((nid) | ((chs)<<16) | ((dir)<<18) | ((idx)<<19) | ((ofs)<<23))
31 #define HDA_COMPOSE_AMP_VAL(nid,chs,idx,dir) \
32 HDA_COMPOSE_AMP_VAL_OFS(nid, chs, idx, dir, 0)
33 /* mono volume with index (index=0,1,...) (channel=1,2) */
34 #define HDA_CODEC_VOLUME_MONO_IDX(xname, xcidx, nid, channel, xindex, direction) \
35 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xcidx, \
36 .subdevice = (1<<31)|(nid), \
37 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
38 SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
39 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, \
40 .info = snd_hda_mixer_amp_volume_info, \
41 .get = snd_hda_mixer_amp_volume_get, \
42 .put = snd_hda_mixer_amp_volume_put, \
43 .tlv = { .c = snd_hda_mixer_amp_tlv }, \
44 .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, xindex, direction) }
45 /* stereo volume with index */
46 #define HDA_CODEC_VOLUME_IDX(xname, xcidx, nid, xindex, direction) \
47 HDA_CODEC_VOLUME_MONO_IDX(xname, xcidx, nid, 3, xindex, direction)
48 /* mono volume */
49 #define HDA_CODEC_VOLUME_MONO(xname, nid, channel, xindex, direction) \
50 HDA_CODEC_VOLUME_MONO_IDX(xname, 0, nid, channel, xindex, direction)
51 /* stereo volume */
52 #define HDA_CODEC_VOLUME(xname, nid, xindex, direction) \
53 HDA_CODEC_VOLUME_MONO(xname, nid, 3, xindex, direction)
54 /* mono mute switch with index (index=0,1,...) (channel=1,2) */
55 #define HDA_CODEC_MUTE_MONO_IDX(xname, xcidx, nid, channel, xindex, direction) \
56 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xcidx, \
57 .subdevice = (1<<31)|(nid), \
58 .info = snd_hda_mixer_amp_switch_info, \
59 .get = snd_hda_mixer_amp_switch_get, \
60 .put = snd_hda_mixer_amp_switch_put, \
61 .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, xindex, direction) }
62 /* stereo mute switch with index */
63 #define HDA_CODEC_MUTE_IDX(xname, xcidx, nid, xindex, direction) \
64 HDA_CODEC_MUTE_MONO_IDX(xname, xcidx, nid, 3, xindex, direction)
65 /* mono mute switch */
66 #define HDA_CODEC_MUTE_MONO(xname, nid, channel, xindex, direction) \
67 HDA_CODEC_MUTE_MONO_IDX(xname, 0, nid, channel, xindex, direction)
68 /* stereo mute switch */
69 #define HDA_CODEC_MUTE(xname, nid, xindex, direction) \
70 HDA_CODEC_MUTE_MONO(xname, nid, 3, xindex, direction)
71 /* special beep mono mute switch with index (index=0,1,...) (channel=1,2) */
72 #define HDA_CODEC_MUTE_BEEP_MONO_IDX(xname, xcidx, nid, channel, xindex, direction) \
73 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xcidx, \
74 .subdevice = (1<<31)|(nid), \
75 .info = snd_hda_mixer_amp_switch_info, \
76 .get = snd_hda_mixer_amp_switch_get, \
77 .put = snd_hda_mixer_amp_switch_put_beep, \
78 .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, xindex, direction) }
79 /* special beep mono mute switch */
80 #define HDA_CODEC_MUTE_BEEP_MONO(xname, nid, channel, xindex, direction) \
81 HDA_CODEC_MUTE_BEEP_MONO_IDX(xname, 0, nid, channel, xindex, direction)
82 /* special beep stereo mute switch */
83 #define HDA_CODEC_MUTE_BEEP(xname, nid, xindex, direction) \
84 HDA_CODEC_MUTE_BEEP_MONO(xname, nid, 3, xindex, direction)
85
86 int snd_hda_mixer_amp_volume_info(struct snd_kcontrol *kcontrol,
87 struct snd_ctl_elem_info *uinfo);
88 int snd_hda_mixer_amp_volume_get(struct snd_kcontrol *kcontrol,
89 struct snd_ctl_elem_value *ucontrol);
90 int snd_hda_mixer_amp_volume_put(struct snd_kcontrol *kcontrol,
91 struct snd_ctl_elem_value *ucontrol);
92 int snd_hda_mixer_amp_tlv(struct snd_kcontrol *kcontrol, int op_flag,
93 unsigned int size, unsigned int __user *tlv);
94 int snd_hda_mixer_amp_switch_info(struct snd_kcontrol *kcontrol,
95 struct snd_ctl_elem_info *uinfo);
96 int snd_hda_mixer_amp_switch_get(struct snd_kcontrol *kcontrol,
97 struct snd_ctl_elem_value *ucontrol);
98 int snd_hda_mixer_amp_switch_put(struct snd_kcontrol *kcontrol,
99 struct snd_ctl_elem_value *ucontrol);
100 int snd_hda_mixer_amp_switch_put_beep(struct snd_kcontrol *kcontrol,
101 struct snd_ctl_elem_value *ucontrol);
102 /* lowlevel accessor with caching; use carefully */
103 int snd_hda_codec_amp_read(struct hda_codec *codec, hda_nid_t nid, int ch,
104 int direction, int index);
105 int snd_hda_codec_amp_update(struct hda_codec *codec, hda_nid_t nid, int ch,
106 int direction, int idx, int mask, int val);
107 int snd_hda_codec_amp_stereo(struct hda_codec *codec, hda_nid_t nid,
108 int dir, int idx, int mask, int val);
109 #ifdef SND_HDA_NEEDS_RESUME
110 void snd_hda_codec_resume_amp(struct hda_codec *codec);
111 #endif
112
113 void snd_hda_set_vmaster_tlv(struct hda_codec *codec, hda_nid_t nid, int dir,
114 unsigned int *tlv);
115 struct snd_kcontrol *snd_hda_find_mixer_ctl(struct hda_codec *codec,
116 const char *name);
117 int snd_hda_add_vmaster(struct hda_codec *codec, char *name,
118 unsigned int *tlv, const char **slaves);
119 int snd_hda_codec_reset(struct hda_codec *codec);
120
121 /* amp value bits */
122 #define HDA_AMP_MUTE 0x80
123 #define HDA_AMP_UNMUTE 0x00
124 #define HDA_AMP_VOLMASK 0x7f
125
126 /* mono switch binding multiple inputs */
127 #define HDA_BIND_MUTE_MONO(xname, nid, channel, indices, direction) \
128 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
129 .info = snd_hda_mixer_amp_switch_info, \
130 .get = snd_hda_mixer_bind_switch_get, \
131 .put = snd_hda_mixer_bind_switch_put, \
132 .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, indices, direction) }
133
134 /* stereo switch binding multiple inputs */
135 #define HDA_BIND_MUTE(xname,nid,indices,dir) \
136 HDA_BIND_MUTE_MONO(xname,nid,3,indices,dir)
137
138 int snd_hda_mixer_bind_switch_get(struct snd_kcontrol *kcontrol,
139 struct snd_ctl_elem_value *ucontrol);
140 int snd_hda_mixer_bind_switch_put(struct snd_kcontrol *kcontrol,
141 struct snd_ctl_elem_value *ucontrol);
142
143 /* more generic bound controls */
144 struct hda_ctl_ops {
145 snd_kcontrol_info_t *info;
146 snd_kcontrol_get_t *get;
147 snd_kcontrol_put_t *put;
148 snd_kcontrol_tlv_rw_t *tlv;
149 };
150
151 extern struct hda_ctl_ops snd_hda_bind_vol; /* for bind-volume with TLV */
152 extern struct hda_ctl_ops snd_hda_bind_sw; /* for bind-switch */
153
154 struct hda_bind_ctls {
155 struct hda_ctl_ops *ops;
156 unsigned long values[];
157 };
158
159 int snd_hda_mixer_bind_ctls_info(struct snd_kcontrol *kcontrol,
160 struct snd_ctl_elem_info *uinfo);
161 int snd_hda_mixer_bind_ctls_get(struct snd_kcontrol *kcontrol,
162 struct snd_ctl_elem_value *ucontrol);
163 int snd_hda_mixer_bind_ctls_put(struct snd_kcontrol *kcontrol,
164 struct snd_ctl_elem_value *ucontrol);
165 int snd_hda_mixer_bind_tlv(struct snd_kcontrol *kcontrol, int op_flag,
166 unsigned int size, unsigned int __user *tlv);
167
168 #define HDA_BIND_VOL(xname, bindrec) \
169 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
170 .name = xname, \
171 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE |\
172 SNDRV_CTL_ELEM_ACCESS_TLV_READ |\
173 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK,\
174 .info = snd_hda_mixer_bind_ctls_info,\
175 .get = snd_hda_mixer_bind_ctls_get,\
176 .put = snd_hda_mixer_bind_ctls_put,\
177 .tlv = { .c = snd_hda_mixer_bind_tlv },\
178 .private_value = (long) (bindrec) }
179 #define HDA_BIND_SW(xname, bindrec) \
180 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER,\
181 .name = xname, \
182 .info = snd_hda_mixer_bind_ctls_info,\
183 .get = snd_hda_mixer_bind_ctls_get,\
184 .put = snd_hda_mixer_bind_ctls_put,\
185 .private_value = (long) (bindrec) }
186
187 /*
188 * SPDIF I/O
189 */
190 int snd_hda_create_spdif_out_ctls(struct hda_codec *codec, hda_nid_t nid);
191 int snd_hda_create_spdif_in_ctls(struct hda_codec *codec, hda_nid_t nid);
192
193 /*
194 * input MUX helper
195 */
196 #define HDA_MAX_NUM_INPUTS 16
197 struct hda_input_mux_item {
198 const char *label;
199 unsigned int index;
200 };
201 struct hda_input_mux {
202 unsigned int num_items;
203 struct hda_input_mux_item items[HDA_MAX_NUM_INPUTS];
204 };
205
206 int snd_hda_input_mux_info(const struct hda_input_mux *imux,
207 struct snd_ctl_elem_info *uinfo);
208 int snd_hda_input_mux_put(struct hda_codec *codec,
209 const struct hda_input_mux *imux,
210 struct snd_ctl_elem_value *ucontrol, hda_nid_t nid,
211 unsigned int *cur_val);
212
213 /*
214 * Channel mode helper
215 */
216 struct hda_channel_mode {
217 int channels;
218 const struct hda_verb *sequence;
219 };
220
221 int snd_hda_ch_mode_info(struct hda_codec *codec,
222 struct snd_ctl_elem_info *uinfo,
223 const struct hda_channel_mode *chmode,
224 int num_chmodes);
225 int snd_hda_ch_mode_get(struct hda_codec *codec,
226 struct snd_ctl_elem_value *ucontrol,
227 const struct hda_channel_mode *chmode,
228 int num_chmodes,
229 int max_channels);
230 int snd_hda_ch_mode_put(struct hda_codec *codec,
231 struct snd_ctl_elem_value *ucontrol,
232 const struct hda_channel_mode *chmode,
233 int num_chmodes,
234 int *max_channelsp);
235
236 /*
237 * Multi-channel / digital-out PCM helper
238 */
239
240 enum { HDA_FRONT, HDA_REAR, HDA_CLFE, HDA_SIDE }; /* index for dac_nidx */
241 enum { HDA_DIG_NONE, HDA_DIG_EXCLUSIVE, HDA_DIG_ANALOG_DUP }; /* dig_out_used */
242
243 struct hda_multi_out {
244 int num_dacs; /* # of DACs, must be more than 1 */
245 hda_nid_t *dac_nids; /* DAC list */
246 hda_nid_t hp_nid; /* optional DAC for HP, 0 when not exists */
247 hda_nid_t extra_out_nid[3]; /* optional DACs, 0 when not exists */
248 hda_nid_t dig_out_nid; /* digital out audio widget */
249 hda_nid_t *slave_dig_outs;
250 int max_channels; /* currently supported analog channels */
251 int dig_out_used; /* current usage of digital out (HDA_DIG_XXX) */
252 int no_share_stream; /* don't share a stream with multiple pins */
253 int share_spdif; /* share SPDIF pin */
254 /* PCM information for both analog and SPDIF DACs */
255 unsigned int analog_rates;
256 unsigned int analog_maxbps;
257 u64 analog_formats;
258 unsigned int spdif_rates;
259 unsigned int spdif_maxbps;
260 u64 spdif_formats;
261 };
262
263 int snd_hda_create_spdif_share_sw(struct hda_codec *codec,
264 struct hda_multi_out *mout);
265 int snd_hda_multi_out_dig_open(struct hda_codec *codec,
266 struct hda_multi_out *mout);
267 int snd_hda_multi_out_dig_close(struct hda_codec *codec,
268 struct hda_multi_out *mout);
269 int snd_hda_multi_out_dig_prepare(struct hda_codec *codec,
270 struct hda_multi_out *mout,
271 unsigned int stream_tag,
272 unsigned int format,
273 struct snd_pcm_substream *substream);
274 int snd_hda_multi_out_dig_cleanup(struct hda_codec *codec,
275 struct hda_multi_out *mout);
276 int snd_hda_multi_out_analog_open(struct hda_codec *codec,
277 struct hda_multi_out *mout,
278 struct snd_pcm_substream *substream,
279 struct hda_pcm_stream *hinfo);
280 int snd_hda_multi_out_analog_prepare(struct hda_codec *codec,
281 struct hda_multi_out *mout,
282 unsigned int stream_tag,
283 unsigned int format,
284 struct snd_pcm_substream *substream);
285 int snd_hda_multi_out_analog_cleanup(struct hda_codec *codec,
286 struct hda_multi_out *mout);
287
288 /*
289 * generic codec parser
290 */
291 #ifdef CONFIG_SND_HDA_GENERIC
292 int snd_hda_parse_generic_codec(struct hda_codec *codec);
293 #else
294 static inline int snd_hda_parse_generic_codec(struct hda_codec *codec)
295 {
296 return -ENODEV;
297 }
298 #endif
299
300 /*
301 * generic proc interface
302 */
303 #ifdef CONFIG_PROC_FS
304 int snd_hda_codec_proc_new(struct hda_codec *codec);
305 #else
306 static inline int snd_hda_codec_proc_new(struct hda_codec *codec) { return 0; }
307 #endif
308
309 #define SND_PRINT_RATES_ADVISED_BUFSIZE 80
310 void snd_print_pcm_rates(int pcm, char *buf, int buflen);
311
312 #define SND_PRINT_BITS_ADVISED_BUFSIZE 16
313 void snd_print_pcm_bits(int pcm, char *buf, int buflen);
314
315 /*
316 * Misc
317 */
318 int snd_hda_check_board_config(struct hda_codec *codec, int num_configs,
319 const char **modelnames,
320 const struct snd_pci_quirk *pci_list);
321 int snd_hda_check_board_codec_sid_config(struct hda_codec *codec,
322 int num_configs, const char **models,
323 const struct snd_pci_quirk *tbl);
324 int snd_hda_add_new_ctls(struct hda_codec *codec,
325 struct snd_kcontrol_new *knew);
326
327 /*
328 * unsolicited event handler
329 */
330
331 #define HDA_UNSOL_QUEUE_SIZE 64
332
333 struct hda_bus_unsolicited {
334 /* ring buffer */
335 u32 queue[HDA_UNSOL_QUEUE_SIZE * 2];
336 unsigned int rp, wp;
337
338 /* workqueue */
339 struct work_struct work;
340 struct hda_bus *bus;
341 };
342
343 /*
344 * Helper for automatic ping configuration
345 */
346
347 enum {
348 AUTO_PIN_MIC,
349 AUTO_PIN_FRONT_MIC,
350 AUTO_PIN_LINE,
351 AUTO_PIN_FRONT_LINE,
352 AUTO_PIN_CD,
353 AUTO_PIN_AUX,
354 AUTO_PIN_LAST
355 };
356
357 enum {
358 AUTO_PIN_LINE_OUT,
359 AUTO_PIN_SPEAKER_OUT,
360 AUTO_PIN_HP_OUT
361 };
362
363 extern const char *auto_pin_cfg_labels[AUTO_PIN_LAST];
364
365 #define AUTO_CFG_MAX_OUTS 5
366
367 struct auto_pin_cfg {
368 int line_outs;
369 /* sorted in the order of Front/Surr/CLFE/Side */
370 hda_nid_t line_out_pins[AUTO_CFG_MAX_OUTS];
371 int speaker_outs;
372 hda_nid_t speaker_pins[AUTO_CFG_MAX_OUTS];
373 int hp_outs;
374 int line_out_type; /* AUTO_PIN_XXX_OUT */
375 hda_nid_t hp_pins[AUTO_CFG_MAX_OUTS];
376 hda_nid_t input_pins[AUTO_PIN_LAST];
377 int dig_outs;
378 hda_nid_t dig_out_pins[2];
379 hda_nid_t dig_in_pin;
380 hda_nid_t mono_out_pin;
381 int dig_out_type[2]; /* HDA_PCM_TYPE_XXX */
382 int dig_in_type; /* HDA_PCM_TYPE_XXX */
383 };
384
385 #define get_defcfg_connect(cfg) \
386 ((cfg & AC_DEFCFG_PORT_CONN) >> AC_DEFCFG_PORT_CONN_SHIFT)
387 #define get_defcfg_association(cfg) \
388 ((cfg & AC_DEFCFG_DEF_ASSOC) >> AC_DEFCFG_ASSOC_SHIFT)
389 #define get_defcfg_location(cfg) \
390 ((cfg & AC_DEFCFG_LOCATION) >> AC_DEFCFG_LOCATION_SHIFT)
391 #define get_defcfg_sequence(cfg) \
392 (cfg & AC_DEFCFG_SEQUENCE)
393 #define get_defcfg_device(cfg) \
394 ((cfg & AC_DEFCFG_DEVICE) >> AC_DEFCFG_DEVICE_SHIFT)
395
396 int snd_hda_parse_pin_def_config(struct hda_codec *codec,
397 struct auto_pin_cfg *cfg,
398 hda_nid_t *ignore_nids);
399
400 /* amp values */
401 #define AMP_IN_MUTE(idx) (0x7080 | ((idx)<<8))
402 #define AMP_IN_UNMUTE(idx) (0x7000 | ((idx)<<8))
403 #define AMP_OUT_MUTE 0xb080
404 #define AMP_OUT_UNMUTE 0xb000
405 #define AMP_OUT_ZERO 0xb000
406 /* pinctl values */
407 #define PIN_IN (AC_PINCTL_IN_EN)
408 #define PIN_VREFHIZ (AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ)
409 #define PIN_VREF50 (AC_PINCTL_IN_EN | AC_PINCTL_VREF_50)
410 #define PIN_VREFGRD (AC_PINCTL_IN_EN | AC_PINCTL_VREF_GRD)
411 #define PIN_VREF80 (AC_PINCTL_IN_EN | AC_PINCTL_VREF_80)
412 #define PIN_VREF100 (AC_PINCTL_IN_EN | AC_PINCTL_VREF_100)
413 #define PIN_OUT (AC_PINCTL_OUT_EN)
414 #define PIN_HP (AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN)
415 #define PIN_HP_AMP (AC_PINCTL_HP_EN)
416
417 /*
418 * get widget capabilities
419 */
420 static inline u32 get_wcaps(struct hda_codec *codec, hda_nid_t nid)
421 {
422 if (nid < codec->start_nid ||
423 nid >= codec->start_nid + codec->num_nodes)
424 return 0;
425 return codec->wcaps[nid - codec->start_nid];
426 }
427
428 /* get the widget type from widget capability bits */
429 #define get_wcaps_type(wcaps) (((wcaps) & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT)
430
431 static inline unsigned int get_wcaps_channels(u32 wcaps)
432 {
433 unsigned int chans;
434
435 chans = (wcaps & AC_WCAP_CHAN_CNT_EXT) >> 13;
436 chans = ((chans << 1) | 1) + 1;
437
438 return chans;
439 }
440
441 u32 query_amp_caps(struct hda_codec *codec, hda_nid_t nid, int direction);
442 int snd_hda_override_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir,
443 unsigned int caps);
444 u32 snd_hda_query_pin_caps(struct hda_codec *codec, hda_nid_t nid);
445
446 struct hda_nid_item {
447 struct snd_kcontrol *kctl;
448 hda_nid_t nid;
449 };
450
451 int snd_hda_ctl_add(struct hda_codec *codec, hda_nid_t nid,
452 struct snd_kcontrol *kctl);
453 void snd_hda_ctls_clear(struct hda_codec *codec);
454
455 /*
456 * hwdep interface
457 */
458 #ifdef CONFIG_SND_HDA_HWDEP
459 int snd_hda_create_hwdep(struct hda_codec *codec);
460 #else
461 static inline int snd_hda_create_hwdep(struct hda_codec *codec) { return 0; }
462 #endif
463
464 #if defined(CONFIG_SND_HDA_POWER_SAVE) && defined(CONFIG_SND_HDA_HWDEP)
465 int snd_hda_hwdep_add_power_sysfs(struct hda_codec *codec);
466 #else
467 static inline int snd_hda_hwdep_add_power_sysfs(struct hda_codec *codec)
468 {
469 return 0;
470 }
471 #endif
472
473 #ifdef CONFIG_SND_HDA_RECONFIG
474 int snd_hda_hwdep_add_sysfs(struct hda_codec *codec);
475 #else
476 static inline int snd_hda_hwdep_add_sysfs(struct hda_codec *codec)
477 {
478 return 0;
479 }
480 #endif
481
482 #ifdef CONFIG_SND_HDA_RECONFIG
483 const char *snd_hda_get_hint(struct hda_codec *codec, const char *key);
484 int snd_hda_get_bool_hint(struct hda_codec *codec, const char *key);
485 #else
486 static inline
487 const char *snd_hda_get_hint(struct hda_codec *codec, const char *key)
488 {
489 return NULL;
490 }
491
492 static inline
493 int snd_hda_get_bool_hint(struct hda_codec *codec, const char *key)
494 {
495 return -ENOENT;
496 }
497 #endif
498
499 /*
500 * power-management
501 */
502
503 #ifdef CONFIG_SND_HDA_POWER_SAVE
504 void snd_hda_schedule_power_save(struct hda_codec *codec);
505
506 struct hda_amp_list {
507 hda_nid_t nid;
508 unsigned char dir;
509 unsigned char idx;
510 };
511
512 struct hda_loopback_check {
513 struct hda_amp_list *amplist;
514 int power_on;
515 };
516
517 int snd_hda_check_amp_list_power(struct hda_codec *codec,
518 struct hda_loopback_check *check,
519 hda_nid_t nid);
520 #endif /* CONFIG_SND_HDA_POWER_SAVE */
521
522 /*
523 * AMP control callbacks
524 */
525 /* retrieve parameters from private_value */
526 #define get_amp_nid_(pv) ((pv) & 0xffff)
527 #define get_amp_nid(kc) get_amp_nid_((kc)->private_value)
528 #define get_amp_channels(kc) (((kc)->private_value >> 16) & 0x3)
529 #define get_amp_direction(kc) (((kc)->private_value >> 18) & 0x1)
530 #define get_amp_index(kc) (((kc)->private_value >> 19) & 0xf)
531 #define get_amp_offset(kc) (((kc)->private_value >> 23) & 0x3f)
532
533 /*
534 * CEA Short Audio Descriptor data
535 */
536 struct cea_sad {
537 int channels;
538 int format; /* (format == 0) indicates invalid SAD */
539 int rates;
540 int sample_bits; /* for LPCM */
541 int max_bitrate; /* for AC3...ATRAC */
542 int profile; /* for WMAPRO */
543 };
544
545 #define ELD_FIXED_BYTES 20
546 #define ELD_MAX_MNL 16
547 #define ELD_MAX_SAD 16
548
549 /*
550 * ELD: EDID Like Data
551 */
552 struct hdmi_eld {
553 int eld_size;
554 int baseline_len;
555 int eld_ver; /* (eld_ver == 0) indicates invalid ELD */
556 int cea_edid_ver;
557 char monitor_name[ELD_MAX_MNL + 1];
558 int manufacture_id;
559 int product_id;
560 u64 port_id;
561 int support_hdcp;
562 int support_ai;
563 int conn_type;
564 int aud_synch_delay;
565 int spk_alloc;
566 int sad_count;
567 struct cea_sad sad[ELD_MAX_SAD];
568 #ifdef CONFIG_PROC_FS
569 struct snd_info_entry *proc_entry;
570 #endif
571 };
572
573 int snd_hdmi_get_eld_size(struct hda_codec *codec, hda_nid_t nid);
574 int snd_hdmi_get_eld(struct hdmi_eld *, struct hda_codec *, hda_nid_t);
575 void snd_hdmi_show_eld(struct hdmi_eld *eld);
576
577 #ifdef CONFIG_PROC_FS
578 int snd_hda_eld_proc_new(struct hda_codec *codec, struct hdmi_eld *eld,
579 int index);
580 void snd_hda_eld_proc_free(struct hda_codec *codec, struct hdmi_eld *eld);
581 #else
582 static inline int snd_hda_eld_proc_new(struct hda_codec *codec,
583 struct hdmi_eld *eld,
584 int index)
585 {
586 return 0;
587 }
588 static inline void snd_hda_eld_proc_free(struct hda_codec *codec,
589 struct hdmi_eld *eld)
590 {
591 }
592 #endif
593
594 #define SND_PRINT_CHANNEL_ALLOCATION_ADVISED_BUFSIZE 80
595 void snd_print_channel_allocation(int spk_alloc, char *buf, int buflen);
596
597 #endif /* __SOUND_HDA_LOCAL_H */