2 * Universal Interface for Intel High Definition Audio Codec
4 * Local helper functions
6 * Copyright (c) 2004 Takashi Iwai <tiwai@suse.de>
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)
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
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.
23 #ifndef __SOUND_HDA_LOCAL_H
24 #define __SOUND_HDA_LOCAL_H
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)
49 #define HDA_CODEC_VOLUME_MONO(xname, nid, channel, xindex, direction) \
50 HDA_CODEC_VOLUME_MONO_IDX(xname, 0, nid, channel, xindex, direction)
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)
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
);
113 void snd_hda_set_vmaster_tlv(struct hda_codec
*codec
, hda_nid_t nid
, int dir
,
115 struct snd_kcontrol
*snd_hda_find_mixer_ctl(struct hda_codec
*codec
,
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
);
122 #define HDA_AMP_MUTE 0x80
123 #define HDA_AMP_UNMUTE 0x00
124 #define HDA_AMP_VOLMASK 0x7f
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) }
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)
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
);
143 /* more generic bound controls */
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
;
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 */
154 struct hda_bind_ctls
{
155 struct hda_ctl_ops
*ops
;
156 unsigned long values
[];
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
);
168 #define HDA_BIND_VOL(xname, bindrec) \
169 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
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,\
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) }
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
);
196 #define HDA_MAX_NUM_INPUTS 16
197 struct hda_input_mux_item
{
201 struct hda_input_mux
{
202 unsigned int num_items
;
203 struct hda_input_mux_item items
[HDA_MAX_NUM_INPUTS
];
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
);
214 * Channel mode helper
216 struct hda_channel_mode
{
218 const struct hda_verb
*sequence
;
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
,
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
,
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
,
237 * Multi-channel / digital-out PCM helper
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 */
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
;
258 unsigned int spdif_rates
;
259 unsigned int spdif_maxbps
;
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
,
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
,
284 struct snd_pcm_substream
*substream
);
285 int snd_hda_multi_out_analog_cleanup(struct hda_codec
*codec
,
286 struct hda_multi_out
*mout
);
289 * generic codec parser
291 #ifdef CONFIG_SND_HDA_GENERIC
292 int snd_hda_parse_generic_codec(struct hda_codec
*codec
);
294 static inline int snd_hda_parse_generic_codec(struct hda_codec
*codec
)
301 * generic proc interface
303 #ifdef CONFIG_PROC_FS
304 int snd_hda_codec_proc_new(struct hda_codec
*codec
);
306 static inline int snd_hda_codec_proc_new(struct hda_codec
*codec
) { return 0; }
309 #define SND_PRINT_RATES_ADVISED_BUFSIZE 80
310 void snd_print_pcm_rates(int pcm
, char *buf
, int buflen
);
312 #define SND_PRINT_BITS_ADVISED_BUFSIZE 16
313 void snd_print_pcm_bits(int pcm
, char *buf
, int buflen
);
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
);
328 * unsolicited event handler
331 #define HDA_UNSOL_QUEUE_SIZE 64
333 struct hda_bus_unsolicited
{
335 u32 queue
[HDA_UNSOL_QUEUE_SIZE
* 2];
339 struct work_struct work
;
344 * Helper for automatic ping configuration
359 AUTO_PIN_SPEAKER_OUT
,
363 extern const char *auto_pin_cfg_labels
[AUTO_PIN_LAST
];
365 #define AUTO_CFG_MAX_OUTS 5
367 struct auto_pin_cfg
{
369 /* sorted in the order of Front/Surr/CLFE/Side */
370 hda_nid_t line_out_pins
[AUTO_CFG_MAX_OUTS
];
372 hda_nid_t speaker_pins
[AUTO_CFG_MAX_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
];
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 */
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)
396 int snd_hda_parse_pin_def_config(struct hda_codec
*codec
,
397 struct auto_pin_cfg
*cfg
,
398 hda_nid_t
*ignore_nids
);
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
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)
418 * get widget capabilities
420 static inline u32
get_wcaps(struct hda_codec
*codec
, hda_nid_t nid
)
422 if (nid
< codec
->start_nid
||
423 nid
>= codec
->start_nid
+ codec
->num_nodes
)
425 return codec
->wcaps
[nid
- codec
->start_nid
];
428 /* get the widget type from widget capability bits */
429 #define get_wcaps_type(wcaps) (((wcaps) & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT)
431 static inline unsigned int get_wcaps_channels(u32 wcaps
)
435 chans
= (wcaps
& AC_WCAP_CHAN_CNT_EXT
) >> 13;
436 chans
= ((chans
<< 1) | 1) + 1;
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
,
444 u32
snd_hda_query_pin_caps(struct hda_codec
*codec
, hda_nid_t nid
);
446 struct hda_nid_item
{
447 struct snd_kcontrol
*kctl
;
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
);
458 #ifdef CONFIG_SND_HDA_HWDEP
459 int snd_hda_create_hwdep(struct hda_codec
*codec
);
461 static inline int snd_hda_create_hwdep(struct hda_codec
*codec
) { return 0; }
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
);
467 static inline int snd_hda_hwdep_add_power_sysfs(struct hda_codec
*codec
)
473 #ifdef CONFIG_SND_HDA_RECONFIG
474 int snd_hda_hwdep_add_sysfs(struct hda_codec
*codec
);
476 static inline int snd_hda_hwdep_add_sysfs(struct hda_codec
*codec
)
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
);
487 const char *snd_hda_get_hint(struct hda_codec
*codec
, const char *key
)
493 int snd_hda_get_bool_hint(struct hda_codec
*codec
, const char *key
)
503 #ifdef CONFIG_SND_HDA_POWER_SAVE
504 void snd_hda_schedule_power_save(struct hda_codec
*codec
);
506 struct hda_amp_list
{
512 struct hda_loopback_check
{
513 struct hda_amp_list
*amplist
;
517 int snd_hda_check_amp_list_power(struct hda_codec
*codec
,
518 struct hda_loopback_check
*check
,
520 #endif /* CONFIG_SND_HDA_POWER_SAVE */
523 * AMP control callbacks
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)
534 * CEA Short Audio Descriptor data
538 int format
; /* (format == 0) indicates invalid SAD */
540 int sample_bits
; /* for LPCM */
541 int max_bitrate
; /* for AC3...ATRAC */
542 int profile
; /* for WMAPRO */
545 #define ELD_FIXED_BYTES 20
546 #define ELD_MAX_MNL 16
547 #define ELD_MAX_SAD 16
550 * ELD: EDID Like Data
555 int eld_ver
; /* (eld_ver == 0) indicates invalid ELD */
557 char monitor_name
[ELD_MAX_MNL
+ 1];
567 struct cea_sad sad
[ELD_MAX_SAD
];
568 #ifdef CONFIG_PROC_FS
569 struct snd_info_entry
*proc_entry
;
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
);
577 #ifdef CONFIG_PROC_FS
578 int snd_hda_eld_proc_new(struct hda_codec
*codec
, struct hdmi_eld
*eld
,
580 void snd_hda_eld_proc_free(struct hda_codec
*codec
, struct hdmi_eld
*eld
);
582 static inline int snd_hda_eld_proc_new(struct hda_codec
*codec
,
583 struct hdmi_eld
*eld
,
588 static inline void snd_hda_eld_proc_free(struct hda_codec
*codec
,
589 struct hdmi_eld
*eld
)
594 #define SND_PRINT_CHANNEL_ALLOCATION_ADVISED_BUFSIZE 80
595 void snd_print_channel_allocation(int spk_alloc
, char *buf
, int buflen
);
597 #endif /* __SOUND_HDA_LOCAL_H */