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