Merge tag 'clk-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-block.git] / sound / pci / hda / hda_local.h
CommitLineData
1da177e4
LT
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
9c96fa59
TI
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)
9e3fd871 34#define HDA_SUBDEV_AMP_FLAG (1U << 30)
9c96fa59 35
1da177e4
LT
36/*
37 * for mixer controls
38 */
29fdbec2
TI
39#define HDA_COMPOSE_AMP_VAL_OFS(nid,chs,idx,dir,ofs) \
40 ((nid) | ((chs)<<16) | ((dir)<<18) | ((idx)<<19) | ((ofs)<<23))
de8c85f7 41#define HDA_AMP_VAL_MIN_MUTE (1<<29)
d01ce99f 42#define HDA_COMPOSE_AMP_VAL(nid,chs,idx,dir) \
29fdbec2 43 HDA_COMPOSE_AMP_VAL_OFS(nid, chs, idx, dir, 0)
985be54b 44/* mono volume with index (index=0,1,...) (channel=1,2) */
de8c85f7 45#define HDA_CODEC_VOLUME_MONO_IDX(xname, xcidx, nid, channel, xindex, dir, flags) \
1da177e4 46 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xcidx, \
5e26dfd0 47 .subdevice = HDA_SUBDEV_AMP_FLAG, \
302e9c5a
JK
48 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
49 SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
50 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, \
1da177e4
LT
51 .info = snd_hda_mixer_amp_volume_info, \
52 .get = snd_hda_mixer_amp_volume_get, \
53 .put = snd_hda_mixer_amp_volume_put, \
7cf0a953 54 .tlv = { .c = snd_hda_mixer_amp_tlv }, \
de8c85f7 55 .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, xindex, dir) | flags }
985be54b 56/* stereo volume with index */
1da177e4 57#define HDA_CODEC_VOLUME_IDX(xname, xcidx, nid, xindex, direction) \
de8c85f7 58 HDA_CODEC_VOLUME_MONO_IDX(xname, xcidx, nid, 3, xindex, direction, 0)
985be54b 59/* mono volume */
1da177e4 60#define HDA_CODEC_VOLUME_MONO(xname, nid, channel, xindex, direction) \
de8c85f7 61 HDA_CODEC_VOLUME_MONO_IDX(xname, 0, nid, channel, xindex, direction, 0)
985be54b 62/* stereo volume */
1da177e4
LT
63#define HDA_CODEC_VOLUME(xname, nid, xindex, direction) \
64 HDA_CODEC_VOLUME_MONO(xname, nid, 3, xindex, direction)
de8c85f7
CL
65/* stereo volume with min=mute */
66#define HDA_CODEC_VOLUME_MIN_MUTE(xname, nid, xindex, direction) \
67 HDA_CODEC_VOLUME_MONO_IDX(xname, 0, nid, 3, xindex, direction, \
68 HDA_AMP_VAL_MIN_MUTE)
985be54b 69/* mono mute switch with index (index=0,1,...) (channel=1,2) */
1da177e4
LT
70#define HDA_CODEC_MUTE_MONO_IDX(xname, xcidx, nid, channel, xindex, direction) \
71 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xcidx, \
5e26dfd0 72 .subdevice = HDA_SUBDEV_AMP_FLAG, \
1da177e4
LT
73 .info = snd_hda_mixer_amp_switch_info, \
74 .get = snd_hda_mixer_amp_switch_get, \
75 .put = snd_hda_mixer_amp_switch_put, \
76 .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, xindex, direction) }
985be54b 77/* stereo mute switch with index */
1da177e4
LT
78#define HDA_CODEC_MUTE_IDX(xname, xcidx, nid, xindex, direction) \
79 HDA_CODEC_MUTE_MONO_IDX(xname, xcidx, nid, 3, xindex, direction)
985be54b 80/* mono mute switch */
1da177e4
LT
81#define HDA_CODEC_MUTE_MONO(xname, nid, channel, xindex, direction) \
82 HDA_CODEC_MUTE_MONO_IDX(xname, 0, nid, channel, xindex, direction)
985be54b 83/* stereo mute switch */
1da177e4
LT
84#define HDA_CODEC_MUTE(xname, nid, xindex, direction) \
85 HDA_CODEC_MUTE_MONO(xname, nid, 3, xindex, direction)
67d634c0 86#ifdef CONFIG_SND_HDA_INPUT_BEEP
123c07ae
JK
87/* special beep mono mute switch with index (index=0,1,...) (channel=1,2) */
88#define HDA_CODEC_MUTE_BEEP_MONO_IDX(xname, xcidx, nid, channel, xindex, direction) \
89 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = xcidx, \
5e26dfd0 90 .subdevice = HDA_SUBDEV_AMP_FLAG, \
123c07ae 91 .info = snd_hda_mixer_amp_switch_info, \
0401e854 92 .get = snd_hda_mixer_amp_switch_get_beep, \
123c07ae
JK
93 .put = snd_hda_mixer_amp_switch_put_beep, \
94 .private_value = HDA_COMPOSE_AMP_VAL(nid, channel, xindex, direction) }
67d634c0
TI
95#else
96/* no digital beep - just the standard one */
97#define HDA_CODEC_MUTE_BEEP_MONO_IDX(xname, xcidx, nid, ch, xidx, dir) \
98 HDA_CODEC_MUTE_MONO_IDX(xname, xcidx, nid, ch, xidx, dir)
99#endif /* CONFIG_SND_HDA_INPUT_BEEP */
123c07ae
JK
100/* special beep mono mute switch */
101#define HDA_CODEC_MUTE_BEEP_MONO(xname, nid, channel, xindex, direction) \
102 HDA_CODEC_MUTE_BEEP_MONO_IDX(xname, 0, nid, channel, xindex, direction)
103/* special beep stereo mute switch */
104#define HDA_CODEC_MUTE_BEEP(xname, nid, xindex, direction) \
105 HDA_CODEC_MUTE_BEEP_MONO(xname, nid, 3, xindex, direction)
1da177e4 106
85dd662f
JK
107extern const char *snd_hda_pcm_type_name[];
108
d01ce99f
TI
109int snd_hda_mixer_amp_volume_info(struct snd_kcontrol *kcontrol,
110 struct snd_ctl_elem_info *uinfo);
111int snd_hda_mixer_amp_volume_get(struct snd_kcontrol *kcontrol,
112 struct snd_ctl_elem_value *ucontrol);
113int snd_hda_mixer_amp_volume_put(struct snd_kcontrol *kcontrol,
114 struct snd_ctl_elem_value *ucontrol);
115int snd_hda_mixer_amp_tlv(struct snd_kcontrol *kcontrol, int op_flag,
116 unsigned int size, unsigned int __user *tlv);
117int snd_hda_mixer_amp_switch_info(struct snd_kcontrol *kcontrol,
118 struct snd_ctl_elem_info *uinfo);
119int snd_hda_mixer_amp_switch_get(struct snd_kcontrol *kcontrol,
120 struct snd_ctl_elem_value *ucontrol);
121int snd_hda_mixer_amp_switch_put(struct snd_kcontrol *kcontrol,
122 struct snd_ctl_elem_value *ucontrol);
67d634c0 123#ifdef CONFIG_SND_HDA_INPUT_BEEP
0401e854
TI
124int snd_hda_mixer_amp_switch_get_beep(struct snd_kcontrol *kcontrol,
125 struct snd_ctl_elem_value *ucontrol);
123c07ae
JK
126int snd_hda_mixer_amp_switch_put_beep(struct snd_kcontrol *kcontrol,
127 struct snd_ctl_elem_value *ucontrol);
67d634c0 128#endif
834be88d 129/* lowlevel accessor with caching; use carefully */
eeecd9d1
TI
130#define snd_hda_codec_amp_read(codec, nid, ch, dir, idx) \
131 snd_hdac_regmap_get_amp(&(codec)->core, nid, ch, dir, idx)
a686ec4c
TI
132int snd_hda_codec_amp_update(struct hda_codec *codec, hda_nid_t nid,
133 int ch, int dir, int idx, int mask, int val);
47fd830a
TI
134int snd_hda_codec_amp_stereo(struct hda_codec *codec, hda_nid_t nid,
135 int dir, int idx, int mask, int val);
280e57d5
TI
136int snd_hda_codec_amp_init(struct hda_codec *codec, hda_nid_t nid, int ch,
137 int direction, int idx, int mask, int val);
138int snd_hda_codec_amp_init_stereo(struct hda_codec *codec, hda_nid_t nid,
139 int dir, int idx, int mask, int val);
2134ea4f
TI
140void snd_hda_set_vmaster_tlv(struct hda_codec *codec, hda_nid_t nid, int dir,
141 unsigned int *tlv);
142struct snd_kcontrol *snd_hda_find_mixer_ctl(struct hda_codec *codec,
143 const char *name);
18478e8b 144int __snd_hda_add_vmaster(struct hda_codec *codec, char *name,
29e5853d
TI
145 unsigned int *tlv, const char * const *slaves,
146 const char *suffix, bool init_slave_vol,
147 struct snd_kcontrol **ctl_ret);
18478e8b 148#define snd_hda_add_vmaster(codec, name, tlv, slaves, suffix) \
29e5853d 149 __snd_hda_add_vmaster(codec, name, tlv, slaves, suffix, true, NULL)
a65d629c 150int snd_hda_codec_reset(struct hda_codec *codec);
c4c2533f 151void snd_hda_codec_register(struct hda_codec *codec);
9a6246ff 152void snd_hda_codec_cleanup_for_unbind(struct hda_codec *codec);
2134ea4f 153
d2f344b5
TI
154enum {
155 HDA_VMUTE_OFF,
156 HDA_VMUTE_ON,
157 HDA_VMUTE_FOLLOW_MASTER,
158};
159
160struct hda_vmaster_mute_hook {
161 /* below two fields must be filled by the caller of
162 * snd_hda_add_vmaster_hook() beforehand
163 */
164 struct snd_kcontrol *sw_kctl;
165 void (*hook)(void *, int);
166 /* below are initialized automatically */
167 unsigned int mute_mode; /* HDA_VMUTE_XXX */
168 struct hda_codec *codec;
169};
170
171int snd_hda_add_vmaster_hook(struct hda_codec *codec,
f29735cb
TI
172 struct hda_vmaster_mute_hook *hook,
173 bool expose_enum_ctl);
d2f344b5
TI
174void snd_hda_sync_vmaster_hook(struct hda_vmaster_mute_hook *hook);
175
47fd830a
TI
176/* amp value bits */
177#define HDA_AMP_MUTE 0x80
178#define HDA_AMP_UNMUTE 0x00
179#define HDA_AMP_VOLMASK 0x7f
180
532d5381
TI
181/*
182 * SPDIF I/O
183 */
dcda5806
TI
184int snd_hda_create_dig_out_ctls(struct hda_codec *codec,
185 hda_nid_t associated_nid,
186 hda_nid_t cvt_nid, int type);
187#define snd_hda_create_spdif_out_ctls(codec, anid, cnid) \
188 snd_hda_create_dig_out_ctls(codec, anid, cnid, HDA_PCM_TYPE_SPDIF)
1da177e4
LT
189int snd_hda_create_spdif_in_ctls(struct hda_codec *codec, hda_nid_t nid);
190
191/*
192 * input MUX helper
193 */
54d17403 194#define HDA_MAX_NUM_INPUTS 16
1da177e4 195struct hda_input_mux_item {
b5786e85 196 char label[32];
1da177e4
LT
197 unsigned int index;
198};
199struct hda_input_mux {
200 unsigned int num_items;
201 struct hda_input_mux_item items[HDA_MAX_NUM_INPUTS];
202};
203
d01ce99f
TI
204int snd_hda_input_mux_info(const struct hda_input_mux *imux,
205 struct snd_ctl_elem_info *uinfo);
206int snd_hda_input_mux_put(struct hda_codec *codec,
207 const struct hda_input_mux *imux,
c8b6bf9b 208 struct snd_ctl_elem_value *ucontrol, hda_nid_t nid,
1da177e4 209 unsigned int *cur_val);
6194b99d
TI
210int snd_hda_add_imux_item(struct hda_codec *codec,
211 struct hda_input_mux *imux, const char *label,
128bc4ba 212 int index, int *type_index_ret);
1da177e4
LT
213
214/*
215 * Multi-channel / digital-out PCM helper
216 */
217
218enum { HDA_FRONT, HDA_REAR, HDA_CLFE, HDA_SIDE }; /* index for dac_nidx */
219enum { HDA_DIG_NONE, HDA_DIG_EXCLUSIVE, HDA_DIG_ANALOG_DUP }; /* dig_out_used */
220
a06dbfc2
TI
221#define HDA_MAX_OUTS 5
222
1da177e4
LT
223struct hda_multi_out {
224 int num_dacs; /* # of DACs, must be more than 1 */
dda14410 225 const hda_nid_t *dac_nids; /* DAC list */
1da177e4 226 hda_nid_t hp_nid; /* optional DAC for HP, 0 when not exists */
a06dbfc2
TI
227 hda_nid_t hp_out_nid[HDA_MAX_OUTS]; /* DACs for multiple HPs */
228 hda_nid_t extra_out_nid[HDA_MAX_OUTS]; /* other (e.g. speaker) DACs */
1da177e4 229 hda_nid_t dig_out_nid; /* digital out audio widget */
dda14410 230 const hda_nid_t *slave_dig_outs;
1da177e4
LT
231 int max_channels; /* currently supported analog channels */
232 int dig_out_used; /* current usage of digital out (HDA_DIG_XXX) */
d29240ce 233 int no_share_stream; /* don't share a stream with multiple pins */
9a08160b
TI
234 int share_spdif; /* share SPDIF pin */
235 /* PCM information for both analog and SPDIF DACs */
236 unsigned int analog_rates;
237 unsigned int analog_maxbps;
238 u64 analog_formats;
239 unsigned int spdif_rates;
240 unsigned int spdif_maxbps;
241 u64 spdif_formats;
1da177e4
LT
242};
243
9a08160b
TI
244int snd_hda_create_spdif_share_sw(struct hda_codec *codec,
245 struct hda_multi_out *mout);
d01ce99f
TI
246int snd_hda_multi_out_dig_open(struct hda_codec *codec,
247 struct hda_multi_out *mout);
248int snd_hda_multi_out_dig_close(struct hda_codec *codec,
249 struct hda_multi_out *mout);
6b97eb45
TI
250int snd_hda_multi_out_dig_prepare(struct hda_codec *codec,
251 struct hda_multi_out *mout,
252 unsigned int stream_tag,
253 unsigned int format,
254 struct snd_pcm_substream *substream);
9411e21c
TI
255int snd_hda_multi_out_dig_cleanup(struct hda_codec *codec,
256 struct hda_multi_out *mout);
d01ce99f
TI
257int snd_hda_multi_out_analog_open(struct hda_codec *codec,
258 struct hda_multi_out *mout,
9a08160b
TI
259 struct snd_pcm_substream *substream,
260 struct hda_pcm_stream *hinfo);
d01ce99f
TI
261int snd_hda_multi_out_analog_prepare(struct hda_codec *codec,
262 struct hda_multi_out *mout,
1da177e4
LT
263 unsigned int stream_tag,
264 unsigned int format,
c8b6bf9b 265 struct snd_pcm_substream *substream);
d01ce99f
TI
266int snd_hda_multi_out_analog_cleanup(struct hda_codec *codec,
267 struct hda_multi_out *mout);
1da177e4 268
1da177e4
LT
269/*
270 * generic proc interface
271 */
cd6a6503 272#ifdef CONFIG_SND_PROC_FS
1da177e4
LT
273int snd_hda_codec_proc_new(struct hda_codec *codec);
274#else
275static inline int snd_hda_codec_proc_new(struct hda_codec *codec) { return 0; }
276#endif
277
d39b4352
WF
278#define SND_PRINT_BITS_ADVISED_BUFSIZE 16
279void snd_print_pcm_bits(int pcm, char *buf, int buflen);
280
1da177e4
LT
281/*
282 * Misc
283 */
d01ce99f 284int snd_hda_add_new_ctls(struct hda_codec *codec,
031024ee 285 const struct snd_kcontrol_new *knew);
1da177e4 286
c9ce6b26
TI
287/*
288 * Fix-up pin default configurations and add default verbs
289 */
290
291struct hda_pintbl {
292 hda_nid_t nid;
293 u32 val;
294};
295
296struct hda_model_fixup {
297 const int id;
298 const char *name;
299};
300
301struct hda_fixup {
302 int type;
1f578250
TI
303 bool chained:1; /* call the chained fixup(s) after this */
304 bool chained_before:1; /* call the chained fixup(s) before this */
c9ce6b26
TI
305 int chain_id;
306 union {
307 const struct hda_pintbl *pins;
308 const struct hda_verb *verbs;
309 void (*func)(struct hda_codec *codec,
310 const struct hda_fixup *fix,
311 int action);
312 } v;
313};
314
20531415
DH
315struct snd_hda_pin_quirk {
316 unsigned int codec; /* Codec vendor/device ID */
317 unsigned short subvendor; /* PCI subvendor ID */
318 const struct hda_pintbl *pins; /* list of matching pins */
319#ifdef CONFIG_SND_DEBUG_VERBOSE
320 const char *name;
321#endif
322 int value; /* quirk value */
323};
324
a2d2fa02
DH
325#ifdef CONFIG_SND_DEBUG_VERBOSE
326
327#define SND_HDA_PIN_QUIRK(_codec, _subvendor, _name, _value, _pins...) \
328 { .codec = _codec,\
329 .subvendor = _subvendor,\
330 .name = _name,\
331 .value = _value,\
fb54a645 332 .pins = (const struct hda_pintbl[]) { _pins, {0, 0}} \
a2d2fa02
DH
333 }
334#else
335
336#define SND_HDA_PIN_QUIRK(_codec, _subvendor, _name, _value, _pins...) \
337 { .codec = _codec,\
338 .subvendor = _subvendor,\
339 .value = _value,\
fb54a645 340 .pins = (const struct hda_pintbl[]) { _pins, {0, 0}} \
a2d2fa02
DH
341 }
342
343#endif
344
f5662e1c
DH
345#define HDA_FIXUP_ID_NOT_SET -1
346#define HDA_FIXUP_ID_NO_FIXUP -2
a2d2fa02 347
c9ce6b26
TI
348/* fixup types */
349enum {
350 HDA_FIXUP_INVALID,
351 HDA_FIXUP_PINS,
352 HDA_FIXUP_VERBS,
353 HDA_FIXUP_FUNC,
fd108215 354 HDA_FIXUP_PINCTLS,
c9ce6b26
TI
355};
356
357/* fixup action definitions */
358enum {
359 HDA_FIXUP_ACT_PRE_PROBE,
360 HDA_FIXUP_ACT_PROBE,
361 HDA_FIXUP_ACT_INIT,
362 HDA_FIXUP_ACT_BUILD,
360fec28 363 HDA_FIXUP_ACT_FREE,
c9ce6b26
TI
364};
365
366int snd_hda_add_verbs(struct hda_codec *codec, const struct hda_verb *list);
367void snd_hda_apply_verbs(struct hda_codec *codec);
368void snd_hda_apply_pincfgs(struct hda_codec *codec,
369 const struct hda_pintbl *cfg);
370void snd_hda_apply_fixup(struct hda_codec *codec, int action);
371void snd_hda_pick_fixup(struct hda_codec *codec,
372 const struct hda_model_fixup *models,
373 const struct snd_pci_quirk *quirk,
374 const struct hda_fixup *fixlist);
20531415
DH
375void snd_hda_pick_pin_fixup(struct hda_codec *codec,
376 const struct snd_hda_pin_quirk *pin_quirk,
377 const struct hda_fixup *fixlist);
378
128bc4ba 379/* helper macros to retrieve pin default-config values */
d01ce99f
TI
380#define get_defcfg_connect(cfg) \
381 ((cfg & AC_DEFCFG_PORT_CONN) >> AC_DEFCFG_PORT_CONN_SHIFT)
382#define get_defcfg_association(cfg) \
383 ((cfg & AC_DEFCFG_DEF_ASSOC) >> AC_DEFCFG_ASSOC_SHIFT)
384#define get_defcfg_location(cfg) \
385 ((cfg & AC_DEFCFG_LOCATION) >> AC_DEFCFG_LOCATION_SHIFT)
386#define get_defcfg_sequence(cfg) \
387 (cfg & AC_DEFCFG_SEQUENCE)
388#define get_defcfg_device(cfg) \
389 ((cfg & AC_DEFCFG_DEVICE) >> AC_DEFCFG_DEVICE_SHIFT)
08a1f5eb
TI
390#define get_defcfg_misc(cfg) \
391 ((cfg & AC_DEFCFG_MISC) >> AC_DEFCFG_MISC_SHIFT)
d01ce99f 392
8d88bc3d
TI
393/* amp values */
394#define AMP_IN_MUTE(idx) (0x7080 | ((idx)<<8))
395#define AMP_IN_UNMUTE(idx) (0x7000 | ((idx)<<8))
d301fc32
TI
396#define AMP_OUT_MUTE 0xb080
397#define AMP_OUT_UNMUTE 0xb000
398#define AMP_OUT_ZERO 0xb000
8d88bc3d 399/* pinctl values */
35e8901e 400#define PIN_IN (AC_PINCTL_IN_EN)
d301fc32 401#define PIN_VREFHIZ (AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ)
35e8901e 402#define PIN_VREF50 (AC_PINCTL_IN_EN | AC_PINCTL_VREF_50)
d301fc32 403#define PIN_VREFGRD (AC_PINCTL_IN_EN | AC_PINCTL_VREF_GRD)
35e8901e 404#define PIN_VREF80 (AC_PINCTL_IN_EN | AC_PINCTL_VREF_80)
d301fc32
TI
405#define PIN_VREF100 (AC_PINCTL_IN_EN | AC_PINCTL_VREF_100)
406#define PIN_OUT (AC_PINCTL_OUT_EN)
35e8901e
RJ
407#define PIN_HP (AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN)
408#define PIN_HP_AMP (AC_PINCTL_HP_EN)
8d88bc3d 409
4740860b 410unsigned int snd_hda_get_default_vref(struct hda_codec *codec, hda_nid_t pin);
62f3a2f7
TI
411unsigned int snd_hda_correct_pin_ctl(struct hda_codec *codec,
412 hda_nid_t pin, unsigned int val);
cdd03ced
TI
413int _snd_hda_set_pin_ctl(struct hda_codec *codec, hda_nid_t pin,
414 unsigned int val, bool cached);
415
416/**
417 * _snd_hda_set_pin_ctl - Set a pin-control value safely
418 * @codec: the codec instance
419 * @pin: the pin NID to set the control
420 * @val: the pin-control value (AC_PINCTL_* bits)
421 *
422 * This function sets the pin-control value to the given pin, but
423 * filters out the invalid pin-control bits when the pin has no such
424 * capabilities. For example, when PIN_HP is passed but the pin has no
425 * HP-drive capability, the HP bit is omitted.
426 *
427 * The function doesn't check the input VREF capability bits, though.
4740860b 428 * Use snd_hda_get_default_vref() to guess the right value.
cdd03ced
TI
429 * Also, this function is only for analog pins, not for HDMI pins.
430 */
431static inline int
432snd_hda_set_pin_ctl(struct hda_codec *codec, hda_nid_t pin, unsigned int val)
433{
434 return _snd_hda_set_pin_ctl(codec, pin, val, false);
435}
436
437/**
438 * snd_hda_set_pin_ctl_cache - Set a pin-control value safely
439 * @codec: the codec instance
440 * @pin: the pin NID to set the control
441 * @val: the pin-control value (AC_PINCTL_* bits)
442 *
443 * Just like snd_hda_set_pin_ctl() but write to cache as well.
444 */
445static inline int
446snd_hda_set_pin_ctl_cache(struct hda_codec *codec, hda_nid_t pin,
447 unsigned int val)
448{
449 return _snd_hda_set_pin_ctl(codec, pin, val, true);
450}
451
d7fdc00a
TI
452int snd_hda_codec_get_pin_target(struct hda_codec *codec, hda_nid_t nid);
453int snd_hda_codec_set_pin_target(struct hda_codec *codec, hda_nid_t nid,
454 unsigned int val);
455
7639a06c
TI
456#define for_each_hda_codec_node(nid, codec) \
457 for ((nid) = (codec)->core.start_nid; (nid) < (codec)->core.end_nid; (nid)++)
458
54d17403
TI
459/*
460 * get widget capabilities
461 */
462static inline u32 get_wcaps(struct hda_codec *codec, hda_nid_t nid)
463{
7639a06c
TI
464 if (nid < codec->core.start_nid ||
465 nid >= codec->core.start_nid + codec->core.num_nodes)
dca008f3 466 return 0;
7639a06c 467 return codec->wcaps[nid - codec->core.start_nid];
54d17403
TI
468}
469
a22d543a 470/* get the widget type from widget capability bits */
3a90274d
TI
471static inline int get_wcaps_type(unsigned int wcaps)
472{
473 if (!wcaps)
474 return -1; /* invalid type */
475 return (wcaps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
476}
a22d543a 477
fd72d008
WF
478static inline unsigned int get_wcaps_channels(u32 wcaps)
479{
480 unsigned int chans;
481
482 chans = (wcaps & AC_WCAP_CHAN_CNT_EXT) >> 13;
483 chans = ((chans << 1) | 1) + 1;
484
485 return chans;
486}
487
d045c5dc
TI
488static inline void snd_hda_override_wcaps(struct hda_codec *codec,
489 hda_nid_t nid, u32 val)
490{
7639a06c
TI
491 if (nid >= codec->core.start_nid &&
492 nid < codec->core.start_nid + codec->core.num_nodes)
493 codec->wcaps[nid - codec->core.start_nid] = val;
d045c5dc
TI
494}
495
09a99959 496u32 query_amp_caps(struct hda_codec *codec, hda_nid_t nid, int direction);
897cc188
TI
497int snd_hda_override_amp_caps(struct hda_codec *codec, hda_nid_t nid, int dir,
498 unsigned int caps);
faa75f8a
TI
499/**
500 * snd_hda_query_pin_caps - Query PIN capabilities
501 * @codec: the HD-auio codec
502 * @nid: the NID to query
503 *
504 * Query PIN capabilities for the given widget.
505 * Returns the obtained capability bits.
506 *
507 * When cap bits have been already read, this doesn't read again but
508 * returns the cached value.
509 */
510static inline u32
511snd_hda_query_pin_caps(struct hda_codec *codec, hda_nid_t nid)
512{
513 return snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP);
514
515}
516
517/**
518 * snd_hda_override_pin_caps - Override the pin capabilities
519 * @codec: the CODEC
520 * @nid: the NID to override
521 * @caps: the capability bits to set
522 *
523 * Override the cached PIN capabilitiy bits value by the given one.
524 *
525 * Returns zero if successful or a negative error code.
526 */
527static inline int
528snd_hda_override_pin_caps(struct hda_codec *codec, hda_nid_t nid,
529 unsigned int caps)
530{
531 return snd_hdac_override_parm(&codec->core, nid, AC_PAR_PIN_CAP, caps);
532}
533
861a04ed
DH
534bool snd_hda_check_amp_caps(struct hda_codec *codec, hda_nid_t nid,
535 int dir, unsigned int bits);
536
537#define nid_has_mute(codec, nid, dir) \
538 snd_hda_check_amp_caps(codec, nid, dir, (AC_AMPCAP_MUTE | AC_AMPCAP_MIN_MUTE))
539#define nid_has_volume(codec, nid, dir) \
540 snd_hda_check_amp_caps(codec, nid, dir, AC_AMPCAP_NUM_STEPS)
541
03697e2a 542
9e3fd871
JK
543/* flags for hda_nid_item */
544#define HDA_NID_ITEM_AMP (1<<0)
545
3911a4c1
JK
546struct hda_nid_item {
547 struct snd_kcontrol *kctl;
5b0cb1d8 548 unsigned int index;
3911a4c1 549 hda_nid_t nid;
9e3fd871 550 unsigned short flags;
3911a4c1
JK
551};
552
553int snd_hda_ctl_add(struct hda_codec *codec, hda_nid_t nid,
554 struct snd_kcontrol *kctl);
5b0cb1d8
JK
555int snd_hda_add_nid(struct hda_codec *codec, struct snd_kcontrol *kctl,
556 unsigned int index, hda_nid_t nid);
d13bd412
TI
557void snd_hda_ctls_clear(struct hda_codec *codec);
558
2807314d
TI
559/*
560 * hwdep interface
561 */
d7ffba19 562#ifdef CONFIG_SND_HDA_HWDEP
2807314d 563int snd_hda_create_hwdep(struct hda_codec *codec);
d7ffba19
TI
564#else
565static inline int snd_hda_create_hwdep(struct hda_codec *codec) { return 0; }
566#endif
2807314d 567
648a8d27
TI
568void snd_hda_sysfs_init(struct hda_codec *codec);
569void snd_hda_sysfs_clear(struct hda_codec *codec);
570
571extern const struct attribute_group *snd_hda_dev_attr_groups[];
572
43b62713
TI
573#ifdef CONFIG_SND_HDA_RECONFIG
574const char *snd_hda_get_hint(struct hda_codec *codec, const char *key);
575int snd_hda_get_bool_hint(struct hda_codec *codec, const char *key);
bc759721 576int snd_hda_get_int_hint(struct hda_codec *codec, const char *key, int *valp);
43b62713
TI
577#else
578static inline
579const char *snd_hda_get_hint(struct hda_codec *codec, const char *key)
580{
581 return NULL;
582}
583
584static inline
585int snd_hda_get_bool_hint(struct hda_codec *codec, const char *key)
586{
587 return -ENOENT;
588}
bc759721
TI
589
590static inline
591int snd_hda_get_int_hint(struct hda_codec *codec, const char *key, int *valp)
592{
593 return -ENOENT;
594}
43b62713
TI
595#endif
596
cb53c626
TI
597/*
598 * power-management
599 */
600
cb53c626
TI
601void snd_hda_schedule_power_save(struct hda_codec *codec);
602
603struct hda_amp_list {
604 hda_nid_t nid;
605 unsigned char dir;
606 unsigned char idx;
607};
608
609struct hda_loopback_check {
031024ee 610 const struct hda_amp_list *amplist;
cb53c626
TI
611 int power_on;
612};
613
614int snd_hda_check_amp_list_power(struct hda_codec *codec,
615 struct hda_loopback_check *check,
616 hda_nid_t nid);
cb53c626 617
9040d102
TI
618/* check whether the actual power state matches with the target state */
619static inline bool
620snd_hda_check_power_state(struct hda_codec *codec, hda_nid_t nid,
621 unsigned int target_state)
622{
70b4891c 623 return snd_hdac_check_power_state(&codec->core, nid, target_state);
9040d102 624}
009f8c90
LW
625
626static inline unsigned int snd_hda_sync_power_state(struct hda_codec *codec,
627 hda_nid_t nid,
628 unsigned int target_state)
3b5b899c
AK
629{
630 return snd_hdac_sync_power_state(&codec->core, nid, target_state);
631}
ba615b86
TI
632unsigned int snd_hda_codec_eapd_power_filter(struct hda_codec *codec,
633 hda_nid_t nid,
634 unsigned int power_state);
635
89385035
MR
636/*
637 * AMP control callbacks
638 */
639/* retrieve parameters from private_value */
3911a4c1
JK
640#define get_amp_nid_(pv) ((pv) & 0xffff)
641#define get_amp_nid(kc) get_amp_nid_((kc)->private_value)
89385035 642#define get_amp_channels(kc) (((kc)->private_value >> 16) & 0x3)
527e4d73
TI
643#define get_amp_direction_(pv) (((pv) >> 18) & 0x1)
644#define get_amp_direction(kc) get_amp_direction_((kc)->private_value)
130e5f06
TI
645#define get_amp_index_(pv) (((pv) >> 19) & 0xf)
646#define get_amp_index(kc) get_amp_index_((kc)->private_value)
29fdbec2 647#define get_amp_offset(kc) (((kc)->private_value >> 23) & 0x3f)
de8c85f7 648#define get_amp_min_mute(kc) (((kc)->private_value >> 29) & 0x1)
89385035 649
dda415d4
TI
650/*
651 * enum control helper
652 */
653int snd_hda_enum_helper_info(struct snd_kcontrol *kcontrol,
654 struct snd_ctl_elem_info *uinfo,
655 int num_entries, const char * const *texts);
656#define snd_hda_enum_bool_helper_info(kcontrol, uinfo) \
657 snd_hda_enum_helper_info(kcontrol, uinfo, 0, NULL)
658
7f4a9f43
WF
659/*
660 * CEA Short Audio Descriptor data
661 */
662struct cea_sad {
663 int channels;
664 int format; /* (format == 0) indicates invalid SAD */
665 int rates;
666 int sample_bits; /* for LPCM */
667 int max_bitrate; /* for AC3...ATRAC */
668 int profile; /* for WMAPRO */
669};
670
671#define ELD_FIXED_BYTES 20
14bc52b8 672#define ELD_MAX_SIZE 256
7f4a9f43
WF
673#define ELD_MAX_MNL 16
674#define ELD_MAX_SAD 16
675
676/*
677 * ELD: EDID Like Data
678 */
1613d6b4
DH
679struct parsed_hdmi_eld {
680 /*
681 * all fields will be cleared before updating ELD
682 */
7f4a9f43 683 int baseline_len;
23ccc2bd 684 int eld_ver;
7f4a9f43
WF
685 int cea_edid_ver;
686 char monitor_name[ELD_MAX_MNL + 1];
687 int manufacture_id;
688 int product_id;
689 u64 port_id;
690 int support_hdcp;
691 int support_ai;
692 int conn_type;
693 int aud_synch_delay;
694 int spk_alloc;
695 int sad_count;
696 struct cea_sad sad[ELD_MAX_SAD];
1613d6b4
DH
697};
698
699struct hdmi_eld {
700 bool monitor_present;
701 bool eld_valid;
702 int eld_size;
14bc52b8 703 char eld_buffer[ELD_MAX_SIZE];
1613d6b4 704 struct parsed_hdmi_eld info;
7f4a9f43
WF
705};
706
707int snd_hdmi_get_eld_size(struct hda_codec *codec, hda_nid_t nid);
1613d6b4
DH
708int snd_hdmi_get_eld(struct hda_codec *codec, hda_nid_t nid,
709 unsigned char *buf, int *eld_size);
79514d47 710int snd_hdmi_parse_eld(struct hda_codec *codec, struct parsed_hdmi_eld *e,
1613d6b4 711 const unsigned char *buf, int size);
79514d47 712void snd_hdmi_show_eld(struct hda_codec *codec, struct parsed_hdmi_eld *e);
1613d6b4 713void snd_hdmi_eld_update_pcm_info(struct parsed_hdmi_eld *e,
2def8172 714 struct hda_pcm_stream *hinfo);
7f4a9f43 715
89250f84
AH
716int snd_hdmi_get_eld_ati(struct hda_codec *codec, hda_nid_t nid,
717 unsigned char *buf, int *eld_size,
718 bool rev3_or_later);
719
cd6a6503 720#ifdef CONFIG_SND_PROC_FS
a4e9a38b
TI
721void snd_hdmi_print_eld_info(struct hdmi_eld *eld,
722 struct snd_info_buffer *buffer);
723void snd_hdmi_write_eld_info(struct hdmi_eld *eld,
724 struct snd_info_buffer *buffer);
5f1e71b1
WF
725#endif
726
903b21d8
WF
727#define SND_PRINT_CHANNEL_ALLOCATION_ADVISED_BUFSIZE 80
728void snd_print_channel_allocation(int spk_alloc, char *buf, int buflen);
729
4e76a883
TI
730/*
731 */
d8a766a1
TI
732#define codec_err(codec, fmt, args...) \
733 dev_err(hda_codec_dev(codec), fmt, ##args)
734#define codec_warn(codec, fmt, args...) \
735 dev_warn(hda_codec_dev(codec), fmt, ##args)
736#define codec_info(codec, fmt, args...) \
737 dev_info(hda_codec_dev(codec), fmt, ##args)
738#define codec_dbg(codec, fmt, args...) \
739 dev_dbg(hda_codec_dev(codec), fmt, ##args)
4e76a883 740
1da177e4 741#endif /* __SOUND_HDA_LOCAL_H */