2 * Universal Interface for Intel High Definition Audio Codec
4 * HD audio interface patch for Realtek ALC codecs
6 * Copyright (c) 2004 Kailang Yang <kailang@realtek.com.tw>
7 * PeiSen Hou <pshou@realtek.com.tw>
8 * Takashi Iwai <tiwai@suse.de>
9 * Jonathan Woithe <jwoithe@physics.adelaide.edu.au>
11 * This driver is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * This driver is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 #include <linux/init.h>
27 #include <linux/delay.h>
28 #include <linux/slab.h>
29 #include <linux/pci.h>
30 #include <sound/core.h>
31 #include <sound/jack.h>
32 #include "hda_codec.h"
33 #include "hda_local.h"
36 /* unsol event tags */
37 #define ALC_FRONT_EVENT 0x01
38 #define ALC_DCVOL_EVENT 0x02
39 #define ALC_HP_EVENT 0x04
40 #define ALC_MIC_EVENT 0x08
43 #define GPIO_MASK 0x03
45 /* extra amp-initialization sequence types */
54 struct alc_customize_define {
56 unsigned char port_connectivity;
57 unsigned char check_sum;
58 unsigned char customization;
59 unsigned char external_amp;
60 unsigned int enable_pcbeep:1;
61 unsigned int platform_type:1;
63 unsigned int override:1;
64 unsigned int fixup:1; /* Means that this sku is set by driver, not read from hw */
70 hda_nid_t pin; /* multi-io widget pin NID */
71 hda_nid_t dac; /* DAC to be connected */
72 unsigned int ctl_in; /* cached input-pin control value */
76 ALC_AUTOMUTE_PIN, /* change the pin control */
77 ALC_AUTOMUTE_AMP, /* mute/unmute the pin AMP */
78 ALC_AUTOMUTE_MIXER, /* mute/unmute mixer widget AMP */
82 /* codec parameterization */
83 const struct snd_kcontrol_new *mixers[5]; /* mixer arrays */
84 unsigned int num_mixers;
85 const struct snd_kcontrol_new *cap_mixer; /* capture mixer */
86 unsigned int beep_amp; /* beep amp value, set via set_beep_amp() */
88 const struct hda_verb *init_verbs[10]; /* initialization verbs
92 unsigned int num_init_verbs;
94 char stream_name_analog[32]; /* analog PCM stream */
95 const struct hda_pcm_stream *stream_analog_playback;
96 const struct hda_pcm_stream *stream_analog_capture;
97 const struct hda_pcm_stream *stream_analog_alt_playback;
98 const struct hda_pcm_stream *stream_analog_alt_capture;
100 char stream_name_digital[32]; /* digital PCM stream */
101 const struct hda_pcm_stream *stream_digital_playback;
102 const struct hda_pcm_stream *stream_digital_capture;
105 struct hda_multi_out multiout; /* playback set-up
106 * max_channels, dacs must be set
107 * dig_out_nid and hp_nid are optional
109 hda_nid_t alt_dac_nid;
110 hda_nid_t slave_dig_outs[3]; /* optional - for auto-parsing */
114 unsigned int num_adc_nids;
115 const hda_nid_t *adc_nids;
116 const hda_nid_t *capsrc_nids;
117 hda_nid_t dig_in_nid; /* digital-in NID; optional */
118 hda_nid_t mixer_nid; /* analog-mixer NID */
120 /* capture setup for dynamic dual-adc switch */
122 unsigned int cur_adc_stream_tag;
123 unsigned int cur_adc_format;
126 unsigned int num_mux_defs;
127 const struct hda_input_mux *input_mux;
128 unsigned int cur_mux[3];
129 hda_nid_t ext_mic_pin;
130 hda_nid_t dock_mic_pin;
131 hda_nid_t int_mic_pin;
134 const struct hda_channel_mode *channel_mode;
135 int num_channel_mode;
137 int const_channel_count;
138 int ext_channel_count;
140 /* PCM information */
141 struct hda_pcm pcm_rec[3]; /* used in alc_build_pcms() */
143 /* dynamic controls, init_verbs and input_mux */
144 struct auto_pin_cfg autocfg;
145 struct alc_customize_define cdefine;
146 struct snd_array kctls;
147 struct hda_input_mux private_imux[3];
148 hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
149 hda_nid_t private_adc_nids[AUTO_CFG_MAX_OUTS];
150 hda_nid_t private_capsrc_nids[AUTO_CFG_MAX_OUTS];
151 hda_nid_t imux_pins[HDA_MAX_NUM_INPUTS];
152 unsigned int dyn_adc_idx[HDA_MAX_NUM_INPUTS];
153 int int_mic_idx, ext_mic_idx, dock_mic_idx; /* for auto-mic */
156 void (*init_hook)(struct hda_codec *codec);
157 void (*unsol_event)(struct hda_codec *codec, unsigned int res);
158 #ifdef CONFIG_SND_HDA_POWER_SAVE
159 void (*power_hook)(struct hda_codec *codec);
161 void (*shutup)(struct hda_codec *codec);
163 /* for pin sensing */
164 unsigned int jack_present: 1;
165 unsigned int line_jack_present:1;
166 unsigned int master_mute:1;
167 unsigned int auto_mic:1;
168 unsigned int auto_mic_valid_imux:1; /* valid imux for auto-mic */
169 unsigned int automute:1; /* HP automute enabled */
170 unsigned int detect_line:1; /* Line-out detection enabled */
171 unsigned int automute_lines:1; /* automute line-out as well; NOP when automute_hp_lo isn't set */
172 unsigned int automute_hp_lo:1; /* both HP and LO available */
175 unsigned int no_analog :1; /* digital I/O only */
176 unsigned int dyn_adc_switch:1; /* switch ADCs (for ALC275) */
177 unsigned int single_input_src:1;
178 unsigned int vol_in_capsrc:1; /* use capsrc volume (ADC has no vol) */
180 /* auto-mute control */
182 hda_nid_t automute_mixer_nid[AUTO_CFG_MAX_OUTS];
185 int codec_variant; /* flag for other variants */
187 /* for virtual master */
188 hda_nid_t vmaster_nid;
189 #ifdef CONFIG_SND_HDA_POWER_SAVE
190 struct hda_loopback_check loopback;
195 unsigned int pll_coef_idx, pll_coef_bit;
199 const struct alc_fixup *fixup_list;
200 const char *fixup_name;
204 struct alc_multi_io multi_io[4];
207 #define ALC_MODEL_AUTO 0 /* common for all chips */
209 static bool check_amp_caps(struct hda_codec *codec, hda_nid_t nid,
210 int dir, unsigned int bits)
214 if (get_wcaps(codec, nid) & (1 << (dir + 1)))
215 if (query_amp_caps(codec, nid, dir) & bits)
220 #define nid_has_mute(codec, nid, dir) \
221 check_amp_caps(codec, nid, dir, AC_AMPCAP_MUTE)
222 #define nid_has_volume(codec, nid, dir) \
223 check_amp_caps(codec, nid, dir, AC_AMPCAP_NUM_STEPS)
228 static int alc_mux_enum_info(struct snd_kcontrol *kcontrol,
229 struct snd_ctl_elem_info *uinfo)
231 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
232 struct alc_spec *spec = codec->spec;
233 unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id);
234 if (mux_idx >= spec->num_mux_defs)
236 if (!spec->input_mux[mux_idx].num_items && mux_idx > 0)
238 return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo);
241 static int alc_mux_enum_get(struct snd_kcontrol *kcontrol,
242 struct snd_ctl_elem_value *ucontrol)
244 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
245 struct alc_spec *spec = codec->spec;
246 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
248 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
252 static bool alc_dyn_adc_pcm_resetup(struct hda_codec *codec, int cur)
254 struct alc_spec *spec = codec->spec;
255 hda_nid_t new_adc = spec->adc_nids[spec->dyn_adc_idx[cur]];
257 if (spec->cur_adc && spec->cur_adc != new_adc) {
258 /* stream is running, let's swap the current ADC */
259 __snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1);
260 spec->cur_adc = new_adc;
261 snd_hda_codec_setup_stream(codec, new_adc,
262 spec->cur_adc_stream_tag, 0,
263 spec->cur_adc_format);
269 /* select the given imux item; either unmute exclusively or select the route */
270 static int alc_mux_select(struct hda_codec *codec, unsigned int adc_idx,
271 unsigned int idx, bool force)
273 struct alc_spec *spec = codec->spec;
274 const struct hda_input_mux *imux;
275 unsigned int mux_idx;
279 mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
280 imux = &spec->input_mux[mux_idx];
281 if (!imux->num_items && mux_idx > 0)
282 imux = &spec->input_mux[0];
284 if (idx >= imux->num_items)
285 idx = imux->num_items - 1;
286 if (spec->cur_mux[adc_idx] == idx && !force)
288 spec->cur_mux[adc_idx] = idx;
290 if (spec->dyn_adc_switch) {
291 alc_dyn_adc_pcm_resetup(codec, idx);
292 adc_idx = spec->dyn_adc_idx[idx];
295 nid = spec->capsrc_nids ?
296 spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx];
299 if (snd_hda_get_conn_list(codec, nid, NULL) <= 1)
302 type = get_wcaps_type(get_wcaps(codec, nid));
303 if (type == AC_WID_AUD_MIX) {
304 /* Matrix-mixer style (e.g. ALC882) */
305 for (i = 0; i < imux->num_items; i++) {
306 unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE;
307 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT,
308 imux->items[i].index,
312 /* MUX style (e.g. ALC880) */
313 snd_hda_codec_write_cache(codec, nid, 0,
314 AC_VERB_SET_CONNECT_SEL,
315 imux->items[idx].index);
320 static int alc_mux_enum_put(struct snd_kcontrol *kcontrol,
321 struct snd_ctl_elem_value *ucontrol)
323 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
324 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
325 return alc_mux_select(codec, adc_idx,
326 ucontrol->value.enumerated.item[0], false);
330 * set up the input pin config (depending on the given auto-pin type)
332 static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid,
335 unsigned int val = PIN_IN;
337 if (auto_pin_type == AUTO_PIN_MIC) {
340 oldval = snd_hda_codec_read(codec, nid, 0,
341 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
342 pincap = snd_hda_query_pin_caps(codec, nid);
343 pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
344 /* if the default pin setup is vref50, we give it priority */
345 if ((pincap & AC_PINCAP_VREF_80) && oldval != PIN_VREF50)
347 else if (pincap & AC_PINCAP_VREF_50)
349 else if (pincap & AC_PINCAP_VREF_100)
351 else if (pincap & AC_PINCAP_VREF_GRD)
354 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val);
358 * Append the given mixer and verb elements for the later use
359 * The mixer array is referred in build_controls(), and init_verbs are
362 static void add_mixer(struct alc_spec *spec, const struct snd_kcontrol_new *mix)
364 if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers)))
366 spec->mixers[spec->num_mixers++] = mix;
369 static void add_verb(struct alc_spec *spec, const struct hda_verb *verb)
371 if (snd_BUG_ON(spec->num_init_verbs >= ARRAY_SIZE(spec->init_verbs)))
373 spec->init_verbs[spec->num_init_verbs++] = verb;
377 * GPIO setup tables, used in initialization
379 /* Enable GPIO mask and set output */
380 static const struct hda_verb alc_gpio1_init_verbs[] = {
381 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
382 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
383 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
387 static const struct hda_verb alc_gpio2_init_verbs[] = {
388 {0x01, AC_VERB_SET_GPIO_MASK, 0x02},
389 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
390 {0x01, AC_VERB_SET_GPIO_DATA, 0x02},
394 static const struct hda_verb alc_gpio3_init_verbs[] = {
395 {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
396 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
397 {0x01, AC_VERB_SET_GPIO_DATA, 0x03},
402 * Fix hardware PLL issue
403 * On some codecs, the analog PLL gating control must be off while
404 * the default value is 1.
406 static void alc_fix_pll(struct hda_codec *codec)
408 struct alc_spec *spec = codec->spec;
413 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
415 val = snd_hda_codec_read(codec, spec->pll_nid, 0,
416 AC_VERB_GET_PROC_COEF, 0);
417 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
419 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF,
420 val & ~(1 << spec->pll_coef_bit));
423 static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
424 unsigned int coef_idx, unsigned int coef_bit)
426 struct alc_spec *spec = codec->spec;
428 spec->pll_coef_idx = coef_idx;
429 spec->pll_coef_bit = coef_bit;
434 * Jack-reporting via input-jack layer
437 /* initialization of jacks; currently checks only a few known pins */
438 static int alc_init_jacks(struct hda_codec *codec)
440 #ifdef CONFIG_SND_HDA_INPUT_JACK
441 struct alc_spec *spec = codec->spec;
443 unsigned int hp_nid = spec->autocfg.hp_pins[0];
444 unsigned int mic_nid = spec->ext_mic_pin;
445 unsigned int dock_nid = spec->dock_mic_pin;
448 err = snd_hda_input_jack_add(codec, hp_nid,
449 SND_JACK_HEADPHONE, NULL);
452 snd_hda_input_jack_report(codec, hp_nid);
456 err = snd_hda_input_jack_add(codec, mic_nid,
457 SND_JACK_MICROPHONE, NULL);
460 snd_hda_input_jack_report(codec, mic_nid);
463 err = snd_hda_input_jack_add(codec, dock_nid,
464 SND_JACK_MICROPHONE, NULL);
467 snd_hda_input_jack_report(codec, dock_nid);
469 #endif /* CONFIG_SND_HDA_INPUT_JACK */
474 * Jack detections for HP auto-mute and mic-switch
477 /* check each pin in the given array; returns true if any of them is plugged */
478 static bool detect_jacks(struct hda_codec *codec, int num_pins, hda_nid_t *pins)
482 for (i = 0; i < num_pins; i++) {
483 hda_nid_t nid = pins[i];
486 snd_hda_input_jack_report(codec, nid);
487 present |= snd_hda_jack_detect(codec, nid);
492 /* standard HP/line-out auto-mute helper */
493 static void do_automute(struct hda_codec *codec, int num_pins, hda_nid_t *pins,
494 bool mute, bool hp_out)
496 struct alc_spec *spec = codec->spec;
497 unsigned int mute_bits = mute ? HDA_AMP_MUTE : 0;
498 unsigned int pin_bits = mute ? 0 : (hp_out ? PIN_HP : PIN_OUT);
501 for (i = 0; i < num_pins; i++) {
502 hda_nid_t nid = pins[i];
505 switch (spec->automute_mode) {
506 case ALC_AUTOMUTE_PIN:
507 snd_hda_codec_write(codec, nid, 0,
508 AC_VERB_SET_PIN_WIDGET_CONTROL,
511 case ALC_AUTOMUTE_AMP:
512 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
513 HDA_AMP_MUTE, mute_bits);
515 case ALC_AUTOMUTE_MIXER:
516 nid = spec->automute_mixer_nid[i];
519 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
520 HDA_AMP_MUTE, mute_bits);
521 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 1,
522 HDA_AMP_MUTE, mute_bits);
528 /* Toggle internal speakers muting */
529 static void update_speakers(struct hda_codec *codec)
531 struct alc_spec *spec = codec->spec;
534 /* Control HP pins/amps depending on master_mute state;
535 * in general, HP pins/amps control should be enabled in all cases,
536 * but currently set only for master_mute, just to be safe
538 do_automute(codec, ARRAY_SIZE(spec->autocfg.hp_pins),
539 spec->autocfg.hp_pins, spec->master_mute, true);
544 on = spec->jack_present | spec->line_jack_present;
545 on |= spec->master_mute;
546 do_automute(codec, ARRAY_SIZE(spec->autocfg.speaker_pins),
547 spec->autocfg.speaker_pins, on, false);
549 /* toggle line-out mutes if needed, too */
550 /* if LO is a copy of either HP or Speaker, don't need to handle it */
551 if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0] ||
552 spec->autocfg.line_out_pins[0] == spec->autocfg.speaker_pins[0])
554 if (!spec->automute || (spec->automute_hp_lo && !spec->automute_lines))
557 on = spec->jack_present;
558 on |= spec->master_mute;
559 do_automute(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),
560 spec->autocfg.line_out_pins, on, false);
563 /* standard HP-automute helper */
564 static void alc_hp_automute(struct hda_codec *codec)
566 struct alc_spec *spec = codec->spec;
569 detect_jacks(codec, ARRAY_SIZE(spec->autocfg.hp_pins),
570 spec->autocfg.hp_pins);
573 update_speakers(codec);
576 /* standard line-out-automute helper */
577 static void alc_line_automute(struct hda_codec *codec)
579 struct alc_spec *spec = codec->spec;
581 spec->line_jack_present =
582 detect_jacks(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),
583 spec->autocfg.line_out_pins);
584 if (!spec->automute || !spec->detect_line)
586 update_speakers(codec);
589 #define get_connection_index(codec, mux, nid) \
590 snd_hda_get_conn_index(codec, mux, nid, 0)
592 /* standard mic auto-switch helper */
593 static void alc_mic_automute(struct hda_codec *codec)
595 struct alc_spec *spec = codec->spec;
596 hda_nid_t *pins = spec->imux_pins;
598 if (!spec->auto_mic || !spec->auto_mic_valid_imux)
600 if (snd_BUG_ON(!spec->adc_nids))
602 if (snd_BUG_ON(spec->int_mic_idx < 0 || spec->ext_mic_idx < 0))
605 if (snd_hda_jack_detect(codec, pins[spec->ext_mic_idx]))
606 alc_mux_select(codec, 0, spec->ext_mic_idx, false);
607 else if (spec->dock_mic_idx >= 0 &&
608 snd_hda_jack_detect(codec, pins[spec->dock_mic_idx]))
609 alc_mux_select(codec, 0, spec->dock_mic_idx, false);
611 alc_mux_select(codec, 0, spec->int_mic_idx, false);
613 snd_hda_input_jack_report(codec, pins[spec->ext_mic_idx]);
614 if (spec->dock_mic_idx >= 0)
615 snd_hda_input_jack_report(codec, pins[spec->dock_mic_idx]);
618 /* unsolicited event for HP jack sensing */
619 static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
621 if (codec->vendor_id == 0x10ec0880)
627 alc_hp_automute(codec);
629 case ALC_FRONT_EVENT:
630 alc_line_automute(codec);
633 alc_mic_automute(codec);
638 /* call init functions of standard auto-mute helpers */
639 static void alc_inithook(struct hda_codec *codec)
641 alc_hp_automute(codec);
642 alc_line_automute(codec);
643 alc_mic_automute(codec);
646 /* additional initialization for ALC888 variants */
647 static void alc888_coef_init(struct hda_codec *codec)
651 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0);
652 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
653 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
654 if ((tmp & 0xf0) == 0x20)
656 snd_hda_codec_read(codec, 0x20, 0,
657 AC_VERB_SET_PROC_COEF, 0x830);
660 snd_hda_codec_read(codec, 0x20, 0,
661 AC_VERB_SET_PROC_COEF, 0x3030);
664 /* additional initialization for ALC889 variants */
665 static void alc889_coef_init(struct hda_codec *codec)
669 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
670 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
671 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
672 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, tmp|0x2010);
675 /* turn on/off EAPD control (only if available) */
676 static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
678 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
680 if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
681 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
685 /* turn on/off EAPD controls of the codec */
686 static void alc_auto_setup_eapd(struct hda_codec *codec, bool on)
688 /* We currently only handle front, HP */
689 static hda_nid_t pins[] = {
690 0x0f, 0x10, 0x14, 0x15, 0
693 for (p = pins; *p; p++)
694 set_eapd(codec, *p, on);
697 /* generic shutup callback;
698 * just turning off EPAD and a little pause for avoiding pop-noise
700 static void alc_eapd_shutup(struct hda_codec *codec)
702 alc_auto_setup_eapd(codec, false);
706 /* generic EAPD initialization */
707 static void alc_auto_init_amp(struct hda_codec *codec, int type)
711 alc_auto_setup_eapd(codec, true);
714 snd_hda_sequence_write(codec, alc_gpio1_init_verbs);
717 snd_hda_sequence_write(codec, alc_gpio2_init_verbs);
720 snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
722 case ALC_INIT_DEFAULT:
723 switch (codec->vendor_id) {
725 snd_hda_codec_write(codec, 0x1a, 0,
726 AC_VERB_SET_COEF_INDEX, 7);
727 tmp = snd_hda_codec_read(codec, 0x1a, 0,
728 AC_VERB_GET_PROC_COEF, 0);
729 snd_hda_codec_write(codec, 0x1a, 0,
730 AC_VERB_SET_COEF_INDEX, 7);
731 snd_hda_codec_write(codec, 0x1a, 0,
732 AC_VERB_SET_PROC_COEF,
741 /*case 0x10ec0889:*/ /* this causes an SPDIF problem */
742 alc889_coef_init(codec);
745 alc888_coef_init(codec);
747 #if 0 /* XXX: This may cause the silent output on speaker on some machines */
750 snd_hda_codec_write(codec, 0x20, 0,
751 AC_VERB_SET_COEF_INDEX, 7);
752 tmp = snd_hda_codec_read(codec, 0x20, 0,
753 AC_VERB_GET_PROC_COEF, 0);
754 snd_hda_codec_write(codec, 0x20, 0,
755 AC_VERB_SET_COEF_INDEX, 7);
756 snd_hda_codec_write(codec, 0x20, 0,
757 AC_VERB_SET_PROC_COEF,
767 * Auto-Mute mode mixer enum support
769 static int alc_automute_mode_info(struct snd_kcontrol *kcontrol,
770 struct snd_ctl_elem_info *uinfo)
772 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
773 struct alc_spec *spec = codec->spec;
774 static const char * const texts2[] = {
775 "Disabled", "Enabled"
777 static const char * const texts3[] = {
778 "Disabled", "Speaker Only", "Line-Out+Speaker"
780 const char * const *texts;
782 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
784 if (spec->automute_hp_lo) {
785 uinfo->value.enumerated.items = 3;
788 uinfo->value.enumerated.items = 2;
791 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
792 uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
793 strcpy(uinfo->value.enumerated.name,
794 texts[uinfo->value.enumerated.item]);
798 static int alc_automute_mode_get(struct snd_kcontrol *kcontrol,
799 struct snd_ctl_elem_value *ucontrol)
801 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
802 struct alc_spec *spec = codec->spec;
806 else if (!spec->automute_hp_lo || !spec->automute_lines)
810 ucontrol->value.enumerated.item[0] = val;
814 static int alc_automute_mode_put(struct snd_kcontrol *kcontrol,
815 struct snd_ctl_elem_value *ucontrol)
817 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
818 struct alc_spec *spec = codec->spec;
820 switch (ucontrol->value.enumerated.item[0]) {
827 if (spec->automute &&
828 (!spec->automute_hp_lo || !spec->automute_lines))
831 spec->automute_lines = 0;
834 if (!spec->automute_hp_lo)
836 if (spec->automute && spec->automute_lines)
839 spec->automute_lines = 1;
844 update_speakers(codec);
848 static const struct snd_kcontrol_new alc_automute_mode_enum = {
849 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
850 .name = "Auto-Mute Mode",
851 .info = alc_automute_mode_info,
852 .get = alc_automute_mode_get,
853 .put = alc_automute_mode_put,
856 static struct snd_kcontrol_new *alc_kcontrol_new(struct alc_spec *spec)
858 snd_array_init(&spec->kctls, sizeof(struct snd_kcontrol_new), 32);
859 return snd_array_new(&spec->kctls);
862 static int alc_add_automute_mode_enum(struct hda_codec *codec)
864 struct alc_spec *spec = codec->spec;
865 struct snd_kcontrol_new *knew;
867 knew = alc_kcontrol_new(spec);
870 *knew = alc_automute_mode_enum;
871 knew->name = kstrdup("Auto-Mute Mode", GFP_KERNEL);
878 * Check the availability of HP/line-out auto-mute;
879 * Set up appropriately if really supported
881 static void alc_init_auto_hp(struct hda_codec *codec)
883 struct alc_spec *spec = codec->spec;
884 struct auto_pin_cfg *cfg = &spec->autocfg;
890 if (cfg->line_out_pins[0])
892 if (cfg->speaker_pins[0])
894 if (present < 2) /* need two different output types */
897 spec->automute_hp_lo = 1; /* both HP and LO automute */
899 if (!cfg->speaker_pins[0] &&
900 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
901 memcpy(cfg->speaker_pins, cfg->line_out_pins,
902 sizeof(cfg->speaker_pins));
903 cfg->speaker_outs = cfg->line_outs;
906 if (!cfg->hp_pins[0] &&
907 cfg->line_out_type == AUTO_PIN_HP_OUT) {
908 memcpy(cfg->hp_pins, cfg->line_out_pins,
909 sizeof(cfg->hp_pins));
910 cfg->hp_outs = cfg->line_outs;
913 for (i = 0; i < cfg->hp_outs; i++) {
914 hda_nid_t nid = cfg->hp_pins[i];
915 if (!is_jack_detectable(codec, nid))
917 snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n",
919 snd_hda_codec_write_cache(codec, nid, 0,
920 AC_VERB_SET_UNSOLICITED_ENABLE,
921 AC_USRSP_EN | ALC_HP_EVENT);
923 spec->automute_mode = ALC_AUTOMUTE_PIN;
925 if (spec->automute && cfg->line_out_pins[0] &&
926 cfg->speaker_pins[0] &&
927 cfg->line_out_pins[0] != cfg->hp_pins[0] &&
928 cfg->line_out_pins[0] != cfg->speaker_pins[0]) {
929 for (i = 0; i < cfg->line_outs; i++) {
930 hda_nid_t nid = cfg->line_out_pins[i];
931 if (!is_jack_detectable(codec, nid))
933 snd_printdd("realtek: Enable Line-Out auto-muting "
934 "on NID 0x%x\n", nid);
935 snd_hda_codec_write_cache(codec, nid, 0,
936 AC_VERB_SET_UNSOLICITED_ENABLE,
937 AC_USRSP_EN | ALC_FRONT_EVENT);
938 spec->detect_line = 1;
940 spec->automute_lines = spec->detect_line;
943 if (spec->automute) {
944 /* create a control for automute mode */
945 alc_add_automute_mode_enum(codec);
946 spec->unsol_event = alc_sku_unsol_event;
950 /* return the position of NID in the list, or -1 if not found */
951 static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
954 for (i = 0; i < nums; i++)
960 /* check whether dynamic ADC-switching is available */
961 static bool alc_check_dyn_adc_switch(struct hda_codec *codec)
963 struct alc_spec *spec = codec->spec;
964 struct hda_input_mux *imux = &spec->private_imux[0];
968 if (imux != spec->input_mux) /* no dynamic imux? */
971 for (n = 0; n < spec->num_adc_nids; n++) {
972 cap = spec->private_capsrc_nids[n];
973 for (i = 0; i < imux->num_items; i++) {
974 pin = spec->imux_pins[i];
977 if (get_connection_index(codec, cap, pin) < 0)
980 if (i >= imux->num_items)
981 return true; /* no ADC-switch is needed */
984 for (i = 0; i < imux->num_items; i++) {
985 pin = spec->imux_pins[i];
986 for (n = 0; n < spec->num_adc_nids; n++) {
987 cap = spec->private_capsrc_nids[n];
988 idx = get_connection_index(codec, cap, pin);
990 imux->items[i].index = idx;
991 spec->dyn_adc_idx[i] = n;
997 snd_printdd("realtek: enabling ADC switching\n");
998 spec->dyn_adc_switch = 1;
1002 /* rebuild imux for matching with the given auto-mic pins (if not yet) */
1003 static bool alc_rebuild_imux_for_auto_mic(struct hda_codec *codec)
1005 struct alc_spec *spec = codec->spec;
1006 struct hda_input_mux *imux;
1007 static char * const texts[3] = {
1008 "Mic", "Internal Mic", "Dock Mic"
1012 if (!spec->auto_mic)
1014 imux = &spec->private_imux[0];
1015 if (spec->input_mux == imux)
1017 spec->imux_pins[0] = spec->ext_mic_pin;
1018 spec->imux_pins[1] = spec->int_mic_pin;
1019 spec->imux_pins[2] = spec->dock_mic_pin;
1020 for (i = 0; i < 3; i++) {
1021 strcpy(imux->items[i].label, texts[i]);
1022 if (spec->imux_pins[i])
1023 imux->num_items = i + 1;
1025 spec->num_mux_defs = 1;
1026 spec->input_mux = imux;
1030 /* check whether all auto-mic pins are valid; setup indices if OK */
1031 static bool alc_auto_mic_check_imux(struct hda_codec *codec)
1033 struct alc_spec *spec = codec->spec;
1034 const struct hda_input_mux *imux;
1036 if (!spec->auto_mic)
1038 if (spec->auto_mic_valid_imux)
1039 return true; /* already checked */
1041 /* fill up imux indices */
1042 if (!alc_check_dyn_adc_switch(codec)) {
1047 imux = spec->input_mux;
1048 spec->ext_mic_idx = find_idx_in_nid_list(spec->ext_mic_pin,
1049 spec->imux_pins, imux->num_items);
1050 spec->int_mic_idx = find_idx_in_nid_list(spec->int_mic_pin,
1051 spec->imux_pins, imux->num_items);
1052 spec->dock_mic_idx = find_idx_in_nid_list(spec->dock_mic_pin,
1053 spec->imux_pins, imux->num_items);
1054 if (spec->ext_mic_idx < 0 || spec->int_mic_idx < 0) {
1056 return false; /* no corresponding imux */
1059 snd_hda_codec_write_cache(codec, spec->ext_mic_pin, 0,
1060 AC_VERB_SET_UNSOLICITED_ENABLE,
1061 AC_USRSP_EN | ALC_MIC_EVENT);
1062 if (spec->dock_mic_pin)
1063 snd_hda_codec_write_cache(codec, spec->dock_mic_pin, 0,
1064 AC_VERB_SET_UNSOLICITED_ENABLE,
1065 AC_USRSP_EN | ALC_MIC_EVENT);
1067 spec->auto_mic_valid_imux = 1;
1073 * Check the availability of auto-mic switch;
1074 * Set up if really supported
1076 static void alc_init_auto_mic(struct hda_codec *codec)
1078 struct alc_spec *spec = codec->spec;
1079 struct auto_pin_cfg *cfg = &spec->autocfg;
1080 hda_nid_t fixed, ext, dock;
1083 spec->ext_mic_idx = spec->int_mic_idx = spec->dock_mic_idx = -1;
1085 fixed = ext = dock = 0;
1086 for (i = 0; i < cfg->num_inputs; i++) {
1087 hda_nid_t nid = cfg->inputs[i].pin;
1088 unsigned int defcfg;
1089 defcfg = snd_hda_codec_get_pincfg(codec, nid);
1090 switch (snd_hda_get_input_pin_attr(defcfg)) {
1091 case INPUT_PIN_ATTR_INT:
1093 return; /* already occupied */
1094 if (cfg->inputs[i].type != AUTO_PIN_MIC)
1095 return; /* invalid type */
1098 case INPUT_PIN_ATTR_UNUSED:
1099 return; /* invalid entry */
1100 case INPUT_PIN_ATTR_DOCK:
1102 return; /* already occupied */
1103 if (cfg->inputs[i].type > AUTO_PIN_LINE_IN)
1104 return; /* invalid type */
1109 return; /* already occupied */
1110 if (cfg->inputs[i].type != AUTO_PIN_MIC)
1111 return; /* invalid type */
1122 if (!is_jack_detectable(codec, ext))
1123 return; /* no unsol support */
1124 if (dock && !is_jack_detectable(codec, dock))
1125 return; /* no unsol support */
1127 /* check imux indices */
1128 spec->ext_mic_pin = ext;
1129 spec->int_mic_pin = fixed;
1130 spec->dock_mic_pin = dock;
1133 if (!alc_auto_mic_check_imux(codec))
1136 snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x/0x%x\n",
1138 spec->unsol_event = alc_sku_unsol_event;
1141 /* check the availabilities of auto-mute and auto-mic switches */
1142 static void alc_auto_check_switches(struct hda_codec *codec)
1144 alc_init_auto_hp(codec);
1145 alc_init_auto_mic(codec);
1149 * Realtek SSID verification
1152 /* Could be any non-zero and even value. When used as fixup, tells
1153 * the driver to ignore any present sku defines.
1155 #define ALC_FIXUP_SKU_IGNORE (2)
1157 static int alc_auto_parse_customize_define(struct hda_codec *codec)
1159 unsigned int ass, tmp, i;
1161 struct alc_spec *spec = codec->spec;
1163 spec->cdefine.enable_pcbeep = 1; /* assume always enabled */
1165 if (spec->cdefine.fixup) {
1166 ass = spec->cdefine.sku_cfg;
1167 if (ass == ALC_FIXUP_SKU_IGNORE)
1172 ass = codec->subsystem_id & 0xffff;
1173 if (ass != codec->bus->pci->subsystem_device && (ass & 1))
1177 if (codec->vendor_id == 0x10ec0260)
1179 ass = snd_hda_codec_get_pincfg(codec, nid);
1182 printk(KERN_INFO "hda_codec: %s: SKU not ready 0x%08x\n",
1183 codec->chip_name, ass);
1189 for (i = 1; i < 16; i++) {
1193 if (((ass >> 16) & 0xf) != tmp)
1196 spec->cdefine.port_connectivity = ass >> 30;
1197 spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
1198 spec->cdefine.check_sum = (ass >> 16) & 0xf;
1199 spec->cdefine.customization = ass >> 8;
1201 spec->cdefine.sku_cfg = ass;
1202 spec->cdefine.external_amp = (ass & 0x38) >> 3;
1203 spec->cdefine.platform_type = (ass & 0x4) >> 2;
1204 spec->cdefine.swap = (ass & 0x2) >> 1;
1205 spec->cdefine.override = ass & 0x1;
1207 snd_printd("SKU: Nid=0x%x sku_cfg=0x%08x\n",
1208 nid, spec->cdefine.sku_cfg);
1209 snd_printd("SKU: port_connectivity=0x%x\n",
1210 spec->cdefine.port_connectivity);
1211 snd_printd("SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
1212 snd_printd("SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
1213 snd_printd("SKU: customization=0x%08x\n", spec->cdefine.customization);
1214 snd_printd("SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
1215 snd_printd("SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
1216 snd_printd("SKU: swap=0x%x\n", spec->cdefine.swap);
1217 snd_printd("SKU: override=0x%x\n", spec->cdefine.override);
1222 /* return true if the given NID is found in the list */
1223 static bool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
1225 return find_idx_in_nid_list(nid, list, nums) >= 0;
1228 /* check subsystem ID and set up device-specific initialization;
1229 * return 1 if initialized, 0 if invalid SSID
1231 /* 32-bit subsystem ID for BIOS loading in HD Audio codec.
1232 * 31 ~ 16 : Manufacture ID
1234 * 7 ~ 0 : Assembly ID
1235 * port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
1237 static int alc_subsystem_id(struct hda_codec *codec,
1238 hda_nid_t porta, hda_nid_t porte,
1239 hda_nid_t portd, hda_nid_t porti)
1241 unsigned int ass, tmp, i;
1243 struct alc_spec *spec = codec->spec;
1245 if (spec->cdefine.fixup) {
1246 ass = spec->cdefine.sku_cfg;
1247 if (ass == ALC_FIXUP_SKU_IGNORE)
1252 ass = codec->subsystem_id & 0xffff;
1253 if ((ass != codec->bus->pci->subsystem_device) && (ass & 1))
1256 /* invalid SSID, check the special NID pin defcfg instead */
1258 * 31~30 : port connectivity
1261 * 19~16 : Check sum (15:1)
1266 if (codec->vendor_id == 0x10ec0260)
1268 ass = snd_hda_codec_get_pincfg(codec, nid);
1269 snd_printd("realtek: No valid SSID, "
1270 "checking pincfg 0x%08x for NID 0x%x\n",
1274 if ((ass >> 30) != 1) /* no physical connection */
1279 for (i = 1; i < 16; i++) {
1283 if (((ass >> 16) & 0xf) != tmp)
1286 snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
1287 ass & 0xffff, codec->vendor_id);
1291 * 2 : 0 --> Desktop, 1 --> Laptop
1292 * 3~5 : External Amplifier control
1295 tmp = (ass & 0x38) >> 3; /* external Amp control */
1298 spec->init_amp = ALC_INIT_GPIO1;
1301 spec->init_amp = ALC_INIT_GPIO2;
1304 spec->init_amp = ALC_INIT_GPIO3;
1308 spec->init_amp = ALC_INIT_DEFAULT;
1312 /* is laptop or Desktop and enable the function "Mute internal speaker
1313 * when the external headphone out jack is plugged"
1315 if (!(ass & 0x8000))
1318 * 10~8 : Jack location
1319 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
1321 * 15 : 1 --> enable the function "Mute internal speaker
1322 * when the external headphone out jack is plugged"
1324 if (!spec->autocfg.hp_pins[0] &&
1325 !(spec->autocfg.line_out_pins[0] &&
1326 spec->autocfg.line_out_type == AUTO_PIN_HP_OUT)) {
1328 tmp = (ass >> 11) & 0x3; /* HP to chassis */
1339 if (found_in_nid_list(nid, spec->autocfg.line_out_pins,
1340 spec->autocfg.line_outs))
1342 spec->autocfg.hp_pins[0] = nid;
1347 /* Check the validity of ALC subsystem-id
1348 * ports contains an array of 4 pin NIDs for port-A, E, D and I */
1349 static void alc_ssid_check(struct hda_codec *codec, const hda_nid_t *ports)
1351 if (!alc_subsystem_id(codec, ports[0], ports[1], ports[2], ports[3])) {
1352 struct alc_spec *spec = codec->spec;
1353 snd_printd("realtek: "
1354 "Enable default setup for auto mode as fallback\n");
1355 spec->init_amp = ALC_INIT_DEFAULT;
1360 * Fix-up pin default configurations and add default verbs
1368 struct alc_model_fixup {
1379 const struct alc_pincfg *pins;
1380 const struct hda_verb *verbs;
1381 void (*func)(struct hda_codec *codec,
1382 const struct alc_fixup *fix,
1396 ALC_FIXUP_ACT_PRE_PROBE,
1397 ALC_FIXUP_ACT_PROBE,
1401 static void alc_apply_fixup(struct hda_codec *codec, int action)
1403 struct alc_spec *spec = codec->spec;
1404 int id = spec->fixup_id;
1405 #ifdef CONFIG_SND_DEBUG_VERBOSE
1406 const char *modelname = spec->fixup_name;
1410 if (!spec->fixup_list)
1414 const struct alc_fixup *fix = spec->fixup_list + id;
1415 const struct alc_pincfg *cfg;
1417 switch (fix->type) {
1419 if (action != ALC_FIXUP_ACT_PRE_PROBE || !fix->v.sku)
1421 snd_printdd(KERN_INFO "hda_codec: %s: "
1422 "Apply sku override for %s\n",
1423 codec->chip_name, modelname);
1424 spec->cdefine.sku_cfg = fix->v.sku;
1425 spec->cdefine.fixup = 1;
1427 case ALC_FIXUP_PINS:
1429 if (action != ALC_FIXUP_ACT_PRE_PROBE || !cfg)
1431 snd_printdd(KERN_INFO "hda_codec: %s: "
1432 "Apply pincfg for %s\n",
1433 codec->chip_name, modelname);
1434 for (; cfg->nid; cfg++)
1435 snd_hda_codec_set_pincfg(codec, cfg->nid,
1438 case ALC_FIXUP_VERBS:
1439 if (action != ALC_FIXUP_ACT_PROBE || !fix->v.verbs)
1441 snd_printdd(KERN_INFO "hda_codec: %s: "
1442 "Apply fix-verbs for %s\n",
1443 codec->chip_name, modelname);
1444 add_verb(codec->spec, fix->v.verbs);
1446 case ALC_FIXUP_FUNC:
1449 snd_printdd(KERN_INFO "hda_codec: %s: "
1450 "Apply fix-func for %s\n",
1451 codec->chip_name, modelname);
1452 fix->v.func(codec, fix, action);
1455 snd_printk(KERN_ERR "hda_codec: %s: "
1456 "Invalid fixup type %d\n",
1457 codec->chip_name, fix->type);
1468 static void alc_pick_fixup(struct hda_codec *codec,
1469 const struct alc_model_fixup *models,
1470 const struct snd_pci_quirk *quirk,
1471 const struct alc_fixup *fixlist)
1473 struct alc_spec *spec = codec->spec;
1475 const char *name = NULL;
1477 if (codec->modelname && models) {
1478 while (models->name) {
1479 if (!strcmp(codec->modelname, models->name)) {
1481 name = models->name;
1488 quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
1491 #ifdef CONFIG_SND_DEBUG_VERBOSE
1497 spec->fixup_id = id;
1499 spec->fixup_list = fixlist;
1500 spec->fixup_name = name;
1505 * COEF access helper functions
1507 static int alc_read_coef_idx(struct hda_codec *codec,
1508 unsigned int coef_idx)
1511 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX,
1513 val = snd_hda_codec_read(codec, 0x20, 0,
1514 AC_VERB_GET_PROC_COEF, 0);
1518 static void alc_write_coef_idx(struct hda_codec *codec, unsigned int coef_idx,
1519 unsigned int coef_val)
1521 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX,
1523 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF,
1528 * Digital I/O handling
1531 /* set right pin controls for digital I/O */
1532 static void alc_auto_init_digital(struct hda_codec *codec)
1534 struct alc_spec *spec = codec->spec;
1538 for (i = 0; i < spec->autocfg.dig_outs; i++) {
1539 pin = spec->autocfg.dig_out_pins[i];
1542 snd_hda_codec_write(codec, pin, 0,
1543 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
1545 dac = spec->multiout.dig_out_nid;
1547 dac = spec->slave_dig_outs[i - 1];
1548 if (!dac || !(get_wcaps(codec, dac) & AC_WCAP_OUT_AMP))
1550 snd_hda_codec_write(codec, dac, 0,
1551 AC_VERB_SET_AMP_GAIN_MUTE,
1554 pin = spec->autocfg.dig_in_pin;
1556 snd_hda_codec_write(codec, pin, 0,
1557 AC_VERB_SET_PIN_WIDGET_CONTROL,
1561 /* parse digital I/Os and set up NIDs in BIOS auto-parse mode */
1562 static void alc_auto_parse_digital(struct hda_codec *codec)
1564 struct alc_spec *spec = codec->spec;
1568 /* support multiple SPDIFs; the secondary is set up as a slave */
1569 for (i = 0; i < spec->autocfg.dig_outs; i++) {
1571 err = snd_hda_get_connections(codec,
1572 spec->autocfg.dig_out_pins[i],
1573 conn, ARRAY_SIZE(conn));
1576 dig_nid = conn[0]; /* assume the first element is audio-out */
1578 spec->multiout.dig_out_nid = dig_nid;
1579 spec->dig_out_type = spec->autocfg.dig_out_type[0];
1581 spec->multiout.slave_dig_outs = spec->slave_dig_outs;
1582 if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
1584 spec->slave_dig_outs[i - 1] = dig_nid;
1588 if (spec->autocfg.dig_in_pin) {
1589 dig_nid = codec->start_nid;
1590 for (i = 0; i < codec->num_nodes; i++, dig_nid++) {
1591 unsigned int wcaps = get_wcaps(codec, dig_nid);
1592 if (get_wcaps_type(wcaps) != AC_WID_AUD_IN)
1594 if (!(wcaps & AC_WCAP_DIGITAL))
1596 if (!(wcaps & AC_WCAP_CONN_LIST))
1598 err = get_connection_index(codec, dig_nid,
1599 spec->autocfg.dig_in_pin);
1601 spec->dig_in_nid = dig_nid;
1609 * capture mixer elements
1611 static int alc_cap_vol_info(struct snd_kcontrol *kcontrol,
1612 struct snd_ctl_elem_info *uinfo)
1614 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1615 struct alc_spec *spec = codec->spec;
1619 mutex_lock(&codec->control_mutex);
1620 if (spec->vol_in_capsrc)
1621 val = HDA_COMPOSE_AMP_VAL(spec->capsrc_nids[0], 3, 0, HDA_OUTPUT);
1623 val = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0, HDA_INPUT);
1624 kcontrol->private_value = val;
1625 err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
1626 mutex_unlock(&codec->control_mutex);
1630 static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
1631 unsigned int size, unsigned int __user *tlv)
1633 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1634 struct alc_spec *spec = codec->spec;
1638 mutex_lock(&codec->control_mutex);
1639 if (spec->vol_in_capsrc)
1640 val = HDA_COMPOSE_AMP_VAL(spec->capsrc_nids[0], 3, 0, HDA_OUTPUT);
1642 val = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0, HDA_INPUT);
1643 kcontrol->private_value = val;
1644 err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
1645 mutex_unlock(&codec->control_mutex);
1649 typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol,
1650 struct snd_ctl_elem_value *ucontrol);
1652 static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol,
1653 struct snd_ctl_elem_value *ucontrol,
1654 getput_call_t func, bool check_adc_switch)
1656 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1657 struct alc_spec *spec = codec->spec;
1660 mutex_lock(&codec->control_mutex);
1661 if (check_adc_switch && spec->dyn_adc_switch) {
1662 for (i = 0; i < spec->num_adc_nids; i++) {
1663 kcontrol->private_value =
1664 HDA_COMPOSE_AMP_VAL(spec->adc_nids[i],
1666 err = func(kcontrol, ucontrol);
1671 i = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1672 if (spec->vol_in_capsrc)
1673 kcontrol->private_value =
1674 HDA_COMPOSE_AMP_VAL(spec->capsrc_nids[i],
1677 kcontrol->private_value =
1678 HDA_COMPOSE_AMP_VAL(spec->adc_nids[i],
1680 err = func(kcontrol, ucontrol);
1683 mutex_unlock(&codec->control_mutex);
1687 static int alc_cap_vol_get(struct snd_kcontrol *kcontrol,
1688 struct snd_ctl_elem_value *ucontrol)
1690 return alc_cap_getput_caller(kcontrol, ucontrol,
1691 snd_hda_mixer_amp_volume_get, false);
1694 static int alc_cap_vol_put(struct snd_kcontrol *kcontrol,
1695 struct snd_ctl_elem_value *ucontrol)
1697 return alc_cap_getput_caller(kcontrol, ucontrol,
1698 snd_hda_mixer_amp_volume_put, true);
1701 /* capture mixer elements */
1702 #define alc_cap_sw_info snd_ctl_boolean_stereo_info
1704 static int alc_cap_sw_get(struct snd_kcontrol *kcontrol,
1705 struct snd_ctl_elem_value *ucontrol)
1707 return alc_cap_getput_caller(kcontrol, ucontrol,
1708 snd_hda_mixer_amp_switch_get, false);
1711 static int alc_cap_sw_put(struct snd_kcontrol *kcontrol,
1712 struct snd_ctl_elem_value *ucontrol)
1714 return alc_cap_getput_caller(kcontrol, ucontrol,
1715 snd_hda_mixer_amp_switch_put, true);
1718 #define _DEFINE_CAPMIX(num) \
1720 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1721 .name = "Capture Switch", \
1722 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
1724 .info = alc_cap_sw_info, \
1725 .get = alc_cap_sw_get, \
1726 .put = alc_cap_sw_put, \
1729 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1730 .name = "Capture Volume", \
1731 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | \
1732 SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
1733 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK), \
1735 .info = alc_cap_vol_info, \
1736 .get = alc_cap_vol_get, \
1737 .put = alc_cap_vol_put, \
1738 .tlv = { .c = alc_cap_vol_tlv }, \
1741 #define _DEFINE_CAPSRC(num) \
1743 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1744 /* .name = "Capture Source", */ \
1745 .name = "Input Source", \
1747 .info = alc_mux_enum_info, \
1748 .get = alc_mux_enum_get, \
1749 .put = alc_mux_enum_put, \
1752 #define DEFINE_CAPMIX(num) \
1753 static const struct snd_kcontrol_new alc_capture_mixer ## num[] = { \
1754 _DEFINE_CAPMIX(num), \
1755 _DEFINE_CAPSRC(num), \
1759 #define DEFINE_CAPMIX_NOSRC(num) \
1760 static const struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \
1761 _DEFINE_CAPMIX(num), \
1765 /* up to three ADCs */
1769 DEFINE_CAPMIX_NOSRC(1);
1770 DEFINE_CAPMIX_NOSRC(2);
1771 DEFINE_CAPMIX_NOSRC(3);
1774 * virtual master controls
1778 * slave controls for virtual master
1780 static const char * const alc_slave_vols[] = {
1781 "Front Playback Volume",
1782 "Surround Playback Volume",
1783 "Center Playback Volume",
1784 "LFE Playback Volume",
1785 "Side Playback Volume",
1786 "Headphone Playback Volume",
1787 "Speaker Playback Volume",
1788 "Mono Playback Volume",
1789 "Line-Out Playback Volume",
1790 "PCM Playback Volume",
1794 static const char * const alc_slave_sws[] = {
1795 "Front Playback Switch",
1796 "Surround Playback Switch",
1797 "Center Playback Switch",
1798 "LFE Playback Switch",
1799 "Side Playback Switch",
1800 "Headphone Playback Switch",
1801 "Speaker Playback Switch",
1802 "Mono Playback Switch",
1803 "IEC958 Playback Switch",
1804 "Line-Out Playback Switch",
1805 "PCM Playback Switch",
1810 * build control elements
1813 #define NID_MAPPING (-1)
1815 #define SUBDEV_SPEAKER_ (0 << 6)
1816 #define SUBDEV_HP_ (1 << 6)
1817 #define SUBDEV_LINE_ (2 << 6)
1818 #define SUBDEV_SPEAKER(x) (SUBDEV_SPEAKER_ | ((x) & 0x3f))
1819 #define SUBDEV_HP(x) (SUBDEV_HP_ | ((x) & 0x3f))
1820 #define SUBDEV_LINE(x) (SUBDEV_LINE_ | ((x) & 0x3f))
1822 static void alc_free_kctls(struct hda_codec *codec);
1824 #ifdef CONFIG_SND_HDA_INPUT_BEEP
1825 /* additional beep mixers; the actual parameters are overwritten at build */
1826 static const struct snd_kcontrol_new alc_beep_mixer[] = {
1827 HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
1828 HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
1833 static int alc_build_controls(struct hda_codec *codec)
1835 struct alc_spec *spec = codec->spec;
1836 struct snd_kcontrol *kctl = NULL;
1837 const struct snd_kcontrol_new *knew;
1842 for (i = 0; i < spec->num_mixers; i++) {
1843 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
1847 if (spec->cap_mixer) {
1848 err = snd_hda_add_new_ctls(codec, spec->cap_mixer);
1852 if (spec->multiout.dig_out_nid) {
1853 err = snd_hda_create_spdif_out_ctls(codec,
1854 spec->multiout.dig_out_nid,
1855 spec->multiout.dig_out_nid);
1858 if (!spec->no_analog) {
1859 err = snd_hda_create_spdif_share_sw(codec,
1863 spec->multiout.share_spdif = 1;
1866 if (spec->dig_in_nid) {
1867 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
1872 #ifdef CONFIG_SND_HDA_INPUT_BEEP
1873 /* create beep controls if needed */
1874 if (spec->beep_amp) {
1875 const struct snd_kcontrol_new *knew;
1876 for (knew = alc_beep_mixer; knew->name; knew++) {
1877 struct snd_kcontrol *kctl;
1878 kctl = snd_ctl_new1(knew, codec);
1881 kctl->private_value = spec->beep_amp;
1882 err = snd_hda_ctl_add(codec, 0, kctl);
1889 /* if we have no master control, let's create it */
1890 if (!spec->no_analog &&
1891 !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
1892 unsigned int vmaster_tlv[4];
1893 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
1894 HDA_OUTPUT, vmaster_tlv);
1895 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
1896 vmaster_tlv, alc_slave_vols);
1900 if (!spec->no_analog &&
1901 !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
1902 err = snd_hda_add_vmaster(codec, "Master Playback Switch",
1903 NULL, alc_slave_sws);
1908 /* assign Capture Source enums to NID */
1909 if (spec->capsrc_nids || spec->adc_nids) {
1910 kctl = snd_hda_find_mixer_ctl(codec, "Capture Source");
1912 kctl = snd_hda_find_mixer_ctl(codec, "Input Source");
1913 for (i = 0; kctl && i < kctl->count; i++) {
1914 const hda_nid_t *nids = spec->capsrc_nids;
1916 nids = spec->adc_nids;
1917 err = snd_hda_add_nid(codec, kctl, i, nids[i]);
1922 if (spec->cap_mixer && spec->adc_nids) {
1923 const char *kname = kctl ? kctl->id.name : NULL;
1924 for (knew = spec->cap_mixer; knew->name; knew++) {
1925 if (kname && strcmp(knew->name, kname) == 0)
1927 kctl = snd_hda_find_mixer_ctl(codec, knew->name);
1928 for (i = 0; kctl && i < kctl->count; i++) {
1929 err = snd_hda_add_nid(codec, kctl, i,
1937 /* other nid->control mapping */
1938 for (i = 0; i < spec->num_mixers; i++) {
1939 for (knew = spec->mixers[i]; knew->name; knew++) {
1940 if (knew->iface != NID_MAPPING)
1942 kctl = snd_hda_find_mixer_ctl(codec, knew->name);
1945 u = knew->subdevice;
1946 for (j = 0; j < 4; j++, u >>= 8) {
1951 case SUBDEV_SPEAKER_:
1952 nid = spec->autocfg.speaker_pins[nid];
1955 nid = spec->autocfg.line_out_pins[nid];
1958 nid = spec->autocfg.hp_pins[nid];
1963 err = snd_hda_add_nid(codec, kctl, 0, nid);
1967 u = knew->private_value;
1968 for (j = 0; j < 4; j++, u >>= 8) {
1972 err = snd_hda_add_nid(codec, kctl, 0, nid);
1979 alc_free_kctls(codec); /* no longer needed */
1989 static void alc_init_special_input_src(struct hda_codec *codec);
1991 static int alc_init(struct hda_codec *codec)
1993 struct alc_spec *spec = codec->spec;
1997 alc_auto_init_amp(codec, spec->init_amp);
1999 for (i = 0; i < spec->num_init_verbs; i++)
2000 snd_hda_sequence_write(codec, spec->init_verbs[i]);
2001 alc_init_special_input_src(codec);
2003 if (spec->init_hook)
2004 spec->init_hook(codec);
2006 alc_apply_fixup(codec, ALC_FIXUP_ACT_INIT);
2008 hda_call_check_power_status(codec, 0x01);
2012 static void alc_unsol_event(struct hda_codec *codec, unsigned int res)
2014 struct alc_spec *spec = codec->spec;
2016 if (spec->unsol_event)
2017 spec->unsol_event(codec, res);
2020 #ifdef CONFIG_SND_HDA_POWER_SAVE
2021 static int alc_check_power_status(struct hda_codec *codec, hda_nid_t nid)
2023 struct alc_spec *spec = codec->spec;
2024 return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
2029 * Analog playback callbacks
2031 static int alc_playback_pcm_open(struct hda_pcm_stream *hinfo,
2032 struct hda_codec *codec,
2033 struct snd_pcm_substream *substream)
2035 struct alc_spec *spec = codec->spec;
2036 return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
2040 static int alc_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
2041 struct hda_codec *codec,
2042 unsigned int stream_tag,
2043 unsigned int format,
2044 struct snd_pcm_substream *substream)
2046 struct alc_spec *spec = codec->spec;
2047 return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
2048 stream_tag, format, substream);
2051 static int alc_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
2052 struct hda_codec *codec,
2053 struct snd_pcm_substream *substream)
2055 struct alc_spec *spec = codec->spec;
2056 return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
2062 static int alc_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
2063 struct hda_codec *codec,
2064 struct snd_pcm_substream *substream)
2066 struct alc_spec *spec = codec->spec;
2067 return snd_hda_multi_out_dig_open(codec, &spec->multiout);
2070 static int alc_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
2071 struct hda_codec *codec,
2072 unsigned int stream_tag,
2073 unsigned int format,
2074 struct snd_pcm_substream *substream)
2076 struct alc_spec *spec = codec->spec;
2077 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
2078 stream_tag, format, substream);
2081 static int alc_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
2082 struct hda_codec *codec,
2083 struct snd_pcm_substream *substream)
2085 struct alc_spec *spec = codec->spec;
2086 return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
2089 static int alc_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
2090 struct hda_codec *codec,
2091 struct snd_pcm_substream *substream)
2093 struct alc_spec *spec = codec->spec;
2094 return snd_hda_multi_out_dig_close(codec, &spec->multiout);
2100 static int alc_alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
2101 struct hda_codec *codec,
2102 unsigned int stream_tag,
2103 unsigned int format,
2104 struct snd_pcm_substream *substream)
2106 struct alc_spec *spec = codec->spec;
2108 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
2109 stream_tag, 0, format);
2113 static int alc_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
2114 struct hda_codec *codec,
2115 struct snd_pcm_substream *substream)
2117 struct alc_spec *spec = codec->spec;
2119 snd_hda_codec_cleanup_stream(codec,
2120 spec->adc_nids[substream->number + 1]);
2124 /* analog capture with dynamic dual-adc changes */
2125 static int dyn_adc_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
2126 struct hda_codec *codec,
2127 unsigned int stream_tag,
2128 unsigned int format,
2129 struct snd_pcm_substream *substream)
2131 struct alc_spec *spec = codec->spec;
2132 spec->cur_adc = spec->adc_nids[spec->dyn_adc_idx[spec->cur_mux[0]]];
2133 spec->cur_adc_stream_tag = stream_tag;
2134 spec->cur_adc_format = format;
2135 snd_hda_codec_setup_stream(codec, spec->cur_adc, stream_tag, 0, format);
2139 static int dyn_adc_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
2140 struct hda_codec *codec,
2141 struct snd_pcm_substream *substream)
2143 struct alc_spec *spec = codec->spec;
2144 snd_hda_codec_cleanup_stream(codec, spec->cur_adc);
2149 static const struct hda_pcm_stream dyn_adc_pcm_analog_capture = {
2153 .nid = 0, /* fill later */
2155 .prepare = dyn_adc_capture_pcm_prepare,
2156 .cleanup = dyn_adc_capture_pcm_cleanup
2162 static const struct hda_pcm_stream alc_pcm_analog_playback = {
2166 /* NID is set in alc_build_pcms */
2168 .open = alc_playback_pcm_open,
2169 .prepare = alc_playback_pcm_prepare,
2170 .cleanup = alc_playback_pcm_cleanup
2174 static const struct hda_pcm_stream alc_pcm_analog_capture = {
2178 /* NID is set in alc_build_pcms */
2181 static const struct hda_pcm_stream alc_pcm_analog_alt_playback = {
2185 /* NID is set in alc_build_pcms */
2188 static const struct hda_pcm_stream alc_pcm_analog_alt_capture = {
2189 .substreams = 2, /* can be overridden */
2192 /* NID is set in alc_build_pcms */
2194 .prepare = alc_alt_capture_pcm_prepare,
2195 .cleanup = alc_alt_capture_pcm_cleanup
2199 static const struct hda_pcm_stream alc_pcm_digital_playback = {
2203 /* NID is set in alc_build_pcms */
2205 .open = alc_dig_playback_pcm_open,
2206 .close = alc_dig_playback_pcm_close,
2207 .prepare = alc_dig_playback_pcm_prepare,
2208 .cleanup = alc_dig_playback_pcm_cleanup
2212 static const struct hda_pcm_stream alc_pcm_digital_capture = {
2216 /* NID is set in alc_build_pcms */
2219 /* Used by alc_build_pcms to flag that a PCM has no playback stream */
2220 static const struct hda_pcm_stream alc_pcm_null_stream = {
2226 static int alc_build_pcms(struct hda_codec *codec)
2228 struct alc_spec *spec = codec->spec;
2229 struct hda_pcm *info = spec->pcm_rec;
2230 const struct hda_pcm_stream *p;
2233 codec->num_pcms = 1;
2234 codec->pcm_info = info;
2236 if (spec->no_analog)
2239 snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog),
2240 "%s Analog", codec->chip_name);
2241 info->name = spec->stream_name_analog;
2243 if (spec->multiout.dac_nids > 0) {
2244 p = spec->stream_analog_playback;
2246 p = &alc_pcm_analog_playback;
2247 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
2248 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
2250 if (spec->adc_nids) {
2251 p = spec->stream_analog_capture;
2253 if (spec->dyn_adc_switch)
2254 p = &dyn_adc_pcm_analog_capture;
2256 p = &alc_pcm_analog_capture;
2258 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
2259 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
2262 if (spec->channel_mode) {
2263 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0;
2264 for (i = 0; i < spec->num_channel_mode; i++) {
2265 if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) {
2266 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels;
2272 /* SPDIF for stream index #1 */
2273 if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
2274 snprintf(spec->stream_name_digital,
2275 sizeof(spec->stream_name_digital),
2276 "%s Digital", codec->chip_name);
2277 codec->num_pcms = 2;
2278 codec->slave_dig_outs = spec->multiout.slave_dig_outs;
2279 info = spec->pcm_rec + 1;
2280 info->name = spec->stream_name_digital;
2281 if (spec->dig_out_type)
2282 info->pcm_type = spec->dig_out_type;
2284 info->pcm_type = HDA_PCM_TYPE_SPDIF;
2285 if (spec->multiout.dig_out_nid) {
2286 p = spec->stream_digital_playback;
2288 p = &alc_pcm_digital_playback;
2289 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
2290 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
2292 if (spec->dig_in_nid) {
2293 p = spec->stream_digital_capture;
2295 p = &alc_pcm_digital_capture;
2296 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
2297 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
2299 /* FIXME: do we need this for all Realtek codec models? */
2300 codec->spdif_status_reset = 1;
2303 if (spec->no_analog)
2306 /* If the use of more than one ADC is requested for the current
2307 * model, configure a second analog capture-only PCM.
2309 /* Additional Analaog capture for index #2 */
2310 if (spec->alt_dac_nid || spec->num_adc_nids > 1) {
2311 codec->num_pcms = 3;
2312 info = spec->pcm_rec + 2;
2313 info->name = spec->stream_name_analog;
2314 if (spec->alt_dac_nid) {
2315 p = spec->stream_analog_alt_playback;
2317 p = &alc_pcm_analog_alt_playback;
2318 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
2319 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
2322 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
2323 alc_pcm_null_stream;
2324 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
2326 if (spec->num_adc_nids > 1) {
2327 p = spec->stream_analog_alt_capture;
2329 p = &alc_pcm_analog_alt_capture;
2330 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
2331 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
2333 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
2334 spec->num_adc_nids - 1;
2336 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
2337 alc_pcm_null_stream;
2338 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
2345 static inline void alc_shutup(struct hda_codec *codec)
2347 struct alc_spec *spec = codec->spec;
2349 if (spec && spec->shutup)
2350 spec->shutup(codec);
2351 snd_hda_shutup_pins(codec);
2354 static void alc_free_kctls(struct hda_codec *codec)
2356 struct alc_spec *spec = codec->spec;
2358 if (spec->kctls.list) {
2359 struct snd_kcontrol_new *kctl = spec->kctls.list;
2361 for (i = 0; i < spec->kctls.used; i++)
2362 kfree(kctl[i].name);
2364 snd_array_free(&spec->kctls);
2367 static void alc_free(struct hda_codec *codec)
2369 struct alc_spec *spec = codec->spec;
2375 snd_hda_input_jack_free(codec);
2376 alc_free_kctls(codec);
2378 snd_hda_detach_beep_device(codec);
2381 #ifdef CONFIG_SND_HDA_POWER_SAVE
2382 static void alc_power_eapd(struct hda_codec *codec)
2384 alc_auto_setup_eapd(codec, false);
2387 static int alc_suspend(struct hda_codec *codec, pm_message_t state)
2389 struct alc_spec *spec = codec->spec;
2391 if (spec && spec->power_hook)
2392 spec->power_hook(codec);
2398 static int alc_resume(struct hda_codec *codec)
2400 msleep(150); /* to avoid pop noise */
2401 codec->patch_ops.init(codec);
2402 snd_hda_codec_resume_amp(codec);
2403 snd_hda_codec_resume_cache(codec);
2404 hda_call_check_power_status(codec, 0x01);
2411 static const struct hda_codec_ops alc_patch_ops = {
2412 .build_controls = alc_build_controls,
2413 .build_pcms = alc_build_pcms,
2416 .unsol_event = alc_unsol_event,
2418 .resume = alc_resume,
2420 #ifdef CONFIG_SND_HDA_POWER_SAVE
2421 .suspend = alc_suspend,
2422 .check_power_status = alc_check_power_status,
2424 .reboot_notify = alc_shutup,
2427 /* replace the codec chip_name with the given string */
2428 static int alc_codec_rename(struct hda_codec *codec, const char *name)
2430 kfree(codec->chip_name);
2431 codec->chip_name = kstrdup(name, GFP_KERNEL);
2432 if (!codec->chip_name) {
2440 * Automatic parse of I/O pins from the BIOS configuration
2445 ALC_CTL_WIDGET_MUTE,
2448 static const struct snd_kcontrol_new alc_control_templates[] = {
2449 HDA_CODEC_VOLUME(NULL, 0, 0, 0),
2450 HDA_CODEC_MUTE(NULL, 0, 0, 0),
2451 HDA_BIND_MUTE(NULL, 0, 0, 0),
2454 /* add dynamic controls */
2455 static int add_control(struct alc_spec *spec, int type, const char *name,
2456 int cidx, unsigned long val)
2458 struct snd_kcontrol_new *knew;
2460 knew = alc_kcontrol_new(spec);
2463 *knew = alc_control_templates[type];
2464 knew->name = kstrdup(name, GFP_KERNEL);
2468 if (get_amp_nid_(val))
2469 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
2470 knew->private_value = val;
2474 static int add_control_with_pfx(struct alc_spec *spec, int type,
2475 const char *pfx, const char *dir,
2476 const char *sfx, int cidx, unsigned long val)
2479 snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
2480 return add_control(spec, type, name, cidx, val);
2483 #define add_pb_vol_ctrl(spec, type, pfx, val) \
2484 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", 0, val)
2485 #define add_pb_sw_ctrl(spec, type, pfx, val) \
2486 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", 0, val)
2487 #define __add_pb_vol_ctrl(spec, type, pfx, cidx, val) \
2488 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", cidx, val)
2489 #define __add_pb_sw_ctrl(spec, type, pfx, cidx, val) \
2490 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", cidx, val)
2492 static const char *alc_get_line_out_pfx(struct alc_spec *spec, int ch,
2493 bool can_be_master, int *index)
2495 struct auto_pin_cfg *cfg = &spec->autocfg;
2496 static const char * const chname[4] = {
2497 "Front", "Surround", NULL /*CLFE*/, "Side"
2501 if (cfg->line_outs == 1 && !spec->multi_ios &&
2502 !cfg->hp_outs && !cfg->speaker_outs && can_be_master)
2505 switch (cfg->line_out_type) {
2506 case AUTO_PIN_SPEAKER_OUT:
2507 if (cfg->line_outs == 1)
2510 case AUTO_PIN_HP_OUT:
2511 /* for multi-io case, only the primary out */
2512 if (ch && spec->multi_ios)
2517 if (cfg->line_outs == 1 && !spec->multi_ios)
2524 /* create input playback/capture controls for the given pin */
2525 static int new_analog_input(struct alc_spec *spec, hda_nid_t pin,
2526 const char *ctlname, int ctlidx,
2527 int idx, hda_nid_t mix_nid)
2531 err = __add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname, ctlidx,
2532 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
2535 err = __add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname, ctlidx,
2536 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
2542 static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid)
2544 unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
2545 return (pincap & AC_PINCAP_IN) != 0;
2548 /* Parse the codec tree and retrieve ADCs and corresponding capsrc MUXs */
2549 static int alc_auto_fill_adc_caps(struct hda_codec *codec)
2551 struct alc_spec *spec = codec->spec;
2553 hda_nid_t *adc_nids = spec->private_adc_nids;
2554 hda_nid_t *cap_nids = spec->private_capsrc_nids;
2555 int max_nums = ARRAY_SIZE(spec->private_adc_nids);
2556 bool indep_capsrc = false;
2559 nid = codec->start_nid;
2560 for (i = 0; i < codec->num_nodes; i++, nid++) {
2562 const hda_nid_t *list;
2563 unsigned int caps = get_wcaps(codec, nid);
2564 int type = get_wcaps_type(caps);
2566 if (type != AC_WID_AUD_IN || (caps & AC_WCAP_DIGITAL))
2568 adc_nids[nums] = nid;
2569 cap_nids[nums] = nid;
2573 type = get_wcaps_type(get_wcaps(codec, src));
2574 if (type == AC_WID_PIN)
2576 if (type == AC_WID_AUD_SEL) {
2577 cap_nids[nums] = src;
2578 indep_capsrc = true;
2581 n = snd_hda_get_conn_list(codec, src, &list);
2583 cap_nids[nums] = src;
2584 indep_capsrc = true;
2590 if (++nums >= max_nums)
2593 spec->adc_nids = spec->private_adc_nids;
2594 spec->capsrc_nids = spec->private_capsrc_nids;
2595 spec->num_adc_nids = nums;
2599 /* create playback/capture controls for input pins */
2600 static int alc_auto_create_input_ctls(struct hda_codec *codec)
2602 struct alc_spec *spec = codec->spec;
2603 const struct auto_pin_cfg *cfg = &spec->autocfg;
2604 hda_nid_t mixer = spec->mixer_nid;
2605 struct hda_input_mux *imux = &spec->private_imux[0];
2607 int i, c, err, idx, type_idx = 0;
2608 const char *prev_label = NULL;
2610 num_adcs = alc_auto_fill_adc_caps(codec);
2614 for (i = 0; i < cfg->num_inputs; i++) {
2618 pin = cfg->inputs[i].pin;
2619 if (!alc_is_input_pin(codec, pin))
2622 label = hda_get_autocfg_input_label(codec, cfg, i);
2623 if (prev_label && !strcmp(label, prev_label))
2630 idx = get_connection_index(codec, mixer, pin);
2632 err = new_analog_input(spec, pin,
2640 for (c = 0; c < num_adcs; c++) {
2641 hda_nid_t cap = spec->capsrc_nids ?
2642 spec->capsrc_nids[c] : spec->adc_nids[c];
2643 idx = get_connection_index(codec, cap, pin);
2645 spec->imux_pins[imux->num_items] = pin;
2646 snd_hda_add_imux_item(imux, label, idx, NULL);
2652 spec->num_mux_defs = 1;
2653 spec->input_mux = imux;
2658 static void alc_set_pin_output(struct hda_codec *codec, hda_nid_t nid,
2659 unsigned int pin_type)
2661 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
2664 if (nid_has_mute(codec, nid, HDA_OUTPUT))
2665 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
2669 static int get_pin_type(int line_out_type)
2671 if (line_out_type == AUTO_PIN_HP_OUT)
2677 static void alc_auto_init_analog_input(struct hda_codec *codec)
2679 struct alc_spec *spec = codec->spec;
2680 struct auto_pin_cfg *cfg = &spec->autocfg;
2683 for (i = 0; i < cfg->num_inputs; i++) {
2684 hda_nid_t nid = cfg->inputs[i].pin;
2685 if (alc_is_input_pin(codec, nid)) {
2686 alc_set_input_pin(codec, nid, cfg->inputs[i].type);
2687 if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
2688 snd_hda_codec_write(codec, nid, 0,
2689 AC_VERB_SET_AMP_GAIN_MUTE,
2694 /* mute all loopback inputs */
2695 if (spec->mixer_nid) {
2696 int nums = snd_hda_get_conn_list(codec, spec->mixer_nid, NULL);
2697 for (i = 0; i < nums; i++)
2698 snd_hda_codec_write(codec, spec->mixer_nid, 0,
2699 AC_VERB_SET_AMP_GAIN_MUTE,
2704 /* convert from MIX nid to DAC */
2705 static hda_nid_t alc_auto_mix_to_dac(struct hda_codec *codec, hda_nid_t nid)
2710 if (get_wcaps_type(get_wcaps(codec, nid)) == AC_WID_AUD_OUT)
2712 num = snd_hda_get_connections(codec, nid, list, ARRAY_SIZE(list));
2713 for (i = 0; i < num; i++) {
2714 if (get_wcaps_type(get_wcaps(codec, list[i])) == AC_WID_AUD_OUT)
2720 /* go down to the selector widget before the mixer */
2721 static hda_nid_t alc_go_down_to_selector(struct hda_codec *codec, hda_nid_t pin)
2724 int num = snd_hda_get_connections(codec, pin, srcs,
2727 get_wcaps_type(get_wcaps(codec, srcs[0])) != AC_WID_AUD_SEL)
2732 /* get MIX nid connected to the given pin targeted to DAC */
2733 static hda_nid_t alc_auto_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
2739 pin = alc_go_down_to_selector(codec, pin);
2740 num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
2741 for (i = 0; i < num; i++) {
2742 if (alc_auto_mix_to_dac(codec, mix[i]) == dac)
2748 /* select the connection from pin to DAC if needed */
2749 static int alc_auto_select_dac(struct hda_codec *codec, hda_nid_t pin,
2755 pin = alc_go_down_to_selector(codec, pin);
2756 num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
2759 for (i = 0; i < num; i++) {
2760 if (alc_auto_mix_to_dac(codec, mix[i]) == dac) {
2761 snd_hda_codec_update_cache(codec, pin, 0,
2762 AC_VERB_SET_CONNECT_SEL, i);
2769 /* look for an empty DAC slot */
2770 static hda_nid_t alc_auto_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
2772 struct alc_spec *spec = codec->spec;
2776 pin = alc_go_down_to_selector(codec, pin);
2777 num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs));
2778 for (i = 0; i < num; i++) {
2779 hda_nid_t nid = alc_auto_mix_to_dac(codec, srcs[i]);
2782 if (found_in_nid_list(nid, spec->multiout.dac_nids,
2783 spec->multiout.num_dacs))
2785 if (spec->multiout.hp_nid == nid)
2787 if (found_in_nid_list(nid, spec->multiout.extra_out_nid,
2788 ARRAY_SIZE(spec->multiout.extra_out_nid)))
2795 static hda_nid_t get_dac_if_single(struct hda_codec *codec, hda_nid_t pin)
2797 hda_nid_t sel = alc_go_down_to_selector(codec, pin);
2798 if (snd_hda_get_conn_list(codec, sel, NULL) == 1)
2799 return alc_auto_look_for_dac(codec, pin);
2803 /* fill in the dac_nids table from the parsed pin configuration */
2804 static int alc_auto_fill_dac_nids(struct hda_codec *codec)
2806 struct alc_spec *spec = codec->spec;
2807 const struct auto_pin_cfg *cfg = &spec->autocfg;
2808 bool redone = false;
2812 /* set num_dacs once to full for alc_auto_look_for_dac() */
2813 spec->multiout.num_dacs = cfg->line_outs;
2814 spec->multiout.hp_nid = 0;
2815 spec->multiout.extra_out_nid[0] = 0;
2816 memset(spec->private_dac_nids, 0, sizeof(spec->private_dac_nids));
2817 spec->multiout.dac_nids = spec->private_dac_nids;
2819 /* fill hard-wired DACs first */
2821 for (i = 0; i < cfg->line_outs; i++)
2822 spec->private_dac_nids[i] =
2823 get_dac_if_single(codec, cfg->line_out_pins[i]);
2825 spec->multiout.hp_nid =
2826 get_dac_if_single(codec, cfg->hp_pins[0]);
2827 if (cfg->speaker_outs)
2828 spec->multiout.extra_out_nid[0] =
2829 get_dac_if_single(codec, cfg->speaker_pins[0]);
2832 for (i = 0; i < cfg->line_outs; i++) {
2833 hda_nid_t pin = cfg->line_out_pins[i];
2834 if (spec->private_dac_nids[i])
2836 spec->private_dac_nids[i] = alc_auto_look_for_dac(codec, pin);
2837 if (!spec->private_dac_nids[i] && !redone) {
2838 /* if we can't find primary DACs, re-probe without
2839 * checking the hard-wired DACs
2846 /* re-count num_dacs and squash invalid entries */
2847 spec->multiout.num_dacs = 0;
2848 for (i = 0; i < cfg->line_outs; i++) {
2849 if (spec->private_dac_nids[i])
2850 spec->multiout.num_dacs++;
2852 memmove(spec->private_dac_nids + i,
2853 spec->private_dac_nids + i + 1,
2854 sizeof(hda_nid_t) * (cfg->line_outs - i - 1));
2857 if (cfg->hp_outs && !spec->multiout.hp_nid)
2858 spec->multiout.hp_nid =
2859 alc_auto_look_for_dac(codec, cfg->hp_pins[0]);
2860 if (cfg->speaker_outs && !spec->multiout.extra_out_nid[0])
2861 spec->multiout.extra_out_nid[0] =
2862 alc_auto_look_for_dac(codec, cfg->speaker_pins[0]);
2867 static int alc_auto_add_vol_ctl(struct hda_codec *codec,
2868 const char *pfx, int cidx,
2869 hda_nid_t nid, unsigned int chs)
2873 return __add_pb_vol_ctrl(codec->spec, ALC_CTL_WIDGET_VOL, pfx, cidx,
2874 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
2877 #define alc_auto_add_stereo_vol(codec, pfx, cidx, nid) \
2878 alc_auto_add_vol_ctl(codec, pfx, cidx, nid, 3)
2880 /* create a mute-switch for the given mixer widget;
2881 * if it has multiple sources (e.g. DAC and loopback), create a bind-mute
2883 static int alc_auto_add_sw_ctl(struct hda_codec *codec,
2884 const char *pfx, int cidx,
2885 hda_nid_t nid, unsigned int chs)
2892 wid_type = get_wcaps_type(get_wcaps(codec, nid));
2893 if (wid_type == AC_WID_PIN || wid_type == AC_WID_AUD_OUT) {
2894 type = ALC_CTL_WIDGET_MUTE;
2895 val = HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT);
2896 } else if (snd_hda_get_conn_list(codec, nid, NULL) == 1) {
2897 type = ALC_CTL_WIDGET_MUTE;
2898 val = HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_INPUT);
2900 type = ALC_CTL_BIND_MUTE;
2901 val = HDA_COMPOSE_AMP_VAL(nid, chs, 2, HDA_INPUT);
2903 return __add_pb_sw_ctrl(codec->spec, type, pfx, cidx, val);
2906 #define alc_auto_add_stereo_sw(codec, pfx, cidx, nid) \
2907 alc_auto_add_sw_ctl(codec, pfx, cidx, nid, 3)
2909 static hda_nid_t alc_look_for_out_mute_nid(struct hda_codec *codec,
2910 hda_nid_t pin, hda_nid_t dac)
2912 hda_nid_t mix = alc_auto_dac_to_mix(codec, pin, dac);
2913 if (nid_has_mute(codec, pin, HDA_OUTPUT))
2915 else if (mix && nid_has_mute(codec, mix, HDA_INPUT))
2917 else if (nid_has_mute(codec, dac, HDA_OUTPUT))
2922 static hda_nid_t alc_look_for_out_vol_nid(struct hda_codec *codec,
2923 hda_nid_t pin, hda_nid_t dac)
2925 hda_nid_t mix = alc_auto_dac_to_mix(codec, pin, dac);
2926 if (nid_has_volume(codec, dac, HDA_OUTPUT))
2928 else if (nid_has_volume(codec, mix, HDA_OUTPUT))
2930 else if (nid_has_volume(codec, pin, HDA_OUTPUT))
2935 /* add playback controls from the parsed DAC table */
2936 static int alc_auto_create_multi_out_ctls(struct hda_codec *codec,
2937 const struct auto_pin_cfg *cfg)
2939 struct alc_spec *spec = codec->spec;
2940 int i, err, noutputs;
2942 noutputs = cfg->line_outs;
2943 if (spec->multi_ios > 0)
2944 noutputs += spec->multi_ios;
2946 for (i = 0; i < noutputs; i++) {
2952 dac = spec->multiout.dac_nids[i];
2955 if (i >= cfg->line_outs)
2956 pin = spec->multi_io[i - 1].pin;
2958 pin = cfg->line_out_pins[i];
2960 sw = alc_look_for_out_mute_nid(codec, pin, dac);
2961 vol = alc_look_for_out_vol_nid(codec, pin, dac);
2962 name = alc_get_line_out_pfx(spec, i, true, &index);
2965 err = alc_auto_add_vol_ctl(codec, "Center", 0, vol, 1);
2968 err = alc_auto_add_vol_ctl(codec, "LFE", 0, vol, 2);
2971 err = alc_auto_add_sw_ctl(codec, "Center", 0, sw, 1);
2974 err = alc_auto_add_sw_ctl(codec, "LFE", 0, sw, 2);
2978 err = alc_auto_add_stereo_vol(codec, name, index, vol);
2981 err = alc_auto_add_stereo_sw(codec, name, index, sw);
2989 /* add playback controls for speaker and HP outputs */
2990 static int alc_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
2991 hda_nid_t dac, const char *pfx)
2993 struct alc_spec *spec = codec->spec;
3000 /* the corresponding DAC is already occupied */
3001 if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP))
3002 return 0; /* no way */
3003 /* create a switch only */
3004 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
3005 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
3008 sw = alc_look_for_out_mute_nid(codec, pin, dac);
3009 vol = alc_look_for_out_vol_nid(codec, pin, dac);
3010 err = alc_auto_add_stereo_vol(codec, pfx, 0, vol);
3013 err = alc_auto_add_stereo_sw(codec, pfx, 0, sw);
3019 static int alc_auto_create_hp_out(struct hda_codec *codec)
3021 struct alc_spec *spec = codec->spec;
3022 return alc_auto_create_extra_out(codec, spec->autocfg.hp_pins[0],
3023 spec->multiout.hp_nid,
3027 static int alc_auto_create_speaker_out(struct hda_codec *codec)
3029 struct alc_spec *spec = codec->spec;
3030 return alc_auto_create_extra_out(codec, spec->autocfg.speaker_pins[0],
3031 spec->multiout.extra_out_nid[0],
3035 static void alc_auto_set_output_and_unmute(struct hda_codec *codec,
3036 hda_nid_t pin, int pin_type,
3040 hda_nid_t nid, mix = 0;
3041 hda_nid_t srcs[HDA_MAX_CONNECTIONS];
3043 alc_set_pin_output(codec, pin, pin_type);
3044 nid = alc_go_down_to_selector(codec, pin);
3045 num = snd_hda_get_connections(codec, nid, srcs, ARRAY_SIZE(srcs));
3046 for (i = 0; i < num; i++) {
3047 if (alc_auto_mix_to_dac(codec, srcs[i]) != dac)
3055 /* need the manual connection? */
3057 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i);
3058 /* unmute mixer widget inputs */
3059 if (nid_has_mute(codec, mix, HDA_INPUT)) {
3060 snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
3062 snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
3065 /* initialize volume */
3066 nid = alc_look_for_out_vol_nid(codec, pin, dac);
3068 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
3072 static void alc_auto_init_multi_out(struct hda_codec *codec)
3074 struct alc_spec *spec = codec->spec;
3075 int pin_type = get_pin_type(spec->autocfg.line_out_type);
3078 for (i = 0; i <= HDA_SIDE; i++) {
3079 hda_nid_t nid = spec->autocfg.line_out_pins[i];
3081 alc_auto_set_output_and_unmute(codec, nid, pin_type,
3082 spec->multiout.dac_nids[i]);
3086 static void alc_auto_init_extra_out(struct hda_codec *codec)
3088 struct alc_spec *spec = codec->spec;
3091 pin = spec->autocfg.hp_pins[0];
3093 dac = spec->multiout.hp_nid;
3095 dac = spec->multiout.dac_nids[0];
3096 alc_auto_set_output_and_unmute(codec, pin, PIN_HP, dac);
3098 pin = spec->autocfg.speaker_pins[0];
3100 dac = spec->multiout.extra_out_nid[0];
3102 dac = spec->multiout.dac_nids[0];
3103 alc_auto_set_output_and_unmute(codec, pin, PIN_OUT, dac);
3110 static int alc_auto_fill_multi_ios(struct hda_codec *codec,
3111 unsigned int location)
3113 struct alc_spec *spec = codec->spec;
3114 struct auto_pin_cfg *cfg = &spec->autocfg;
3115 int type, i, num_pins = 0;
3117 for (type = AUTO_PIN_LINE_IN; type >= AUTO_PIN_MIC; type--) {
3118 for (i = 0; i < cfg->num_inputs; i++) {
3119 hda_nid_t nid = cfg->inputs[i].pin;
3121 unsigned int defcfg, caps;
3122 if (cfg->inputs[i].type != type)
3124 defcfg = snd_hda_codec_get_pincfg(codec, nid);
3125 if (get_defcfg_connect(defcfg) != AC_JACK_PORT_COMPLEX)
3127 if (location && get_defcfg_location(defcfg) != location)
3129 caps = snd_hda_query_pin_caps(codec, nid);
3130 if (!(caps & AC_PINCAP_OUT))
3132 dac = alc_auto_look_for_dac(codec, nid);
3135 spec->multi_io[num_pins].pin = nid;
3136 spec->multi_io[num_pins].dac = dac;
3138 spec->private_dac_nids[spec->multiout.num_dacs++] = dac;
3141 spec->multiout.num_dacs = 1;
3147 static int alc_auto_ch_mode_info(struct snd_kcontrol *kcontrol,
3148 struct snd_ctl_elem_info *uinfo)
3150 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3151 struct alc_spec *spec = codec->spec;
3153 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3155 uinfo->value.enumerated.items = spec->multi_ios + 1;
3156 if (uinfo->value.enumerated.item > spec->multi_ios)
3157 uinfo->value.enumerated.item = spec->multi_ios;
3158 sprintf(uinfo->value.enumerated.name, "%dch",
3159 (uinfo->value.enumerated.item + 1) * 2);
3163 static int alc_auto_ch_mode_get(struct snd_kcontrol *kcontrol,
3164 struct snd_ctl_elem_value *ucontrol)
3166 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3167 struct alc_spec *spec = codec->spec;
3168 ucontrol->value.enumerated.item[0] = (spec->ext_channel_count - 1) / 2;
3172 static int alc_set_multi_io(struct hda_codec *codec, int idx, bool output)
3174 struct alc_spec *spec = codec->spec;
3175 hda_nid_t nid = spec->multi_io[idx].pin;
3177 if (!spec->multi_io[idx].ctl_in)
3178 spec->multi_io[idx].ctl_in =
3179 snd_hda_codec_read(codec, nid, 0,
3180 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3182 snd_hda_codec_update_cache(codec, nid, 0,
3183 AC_VERB_SET_PIN_WIDGET_CONTROL,
3185 if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
3186 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
3188 alc_auto_select_dac(codec, nid, spec->multi_io[idx].dac);
3190 if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
3191 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
3192 HDA_AMP_MUTE, HDA_AMP_MUTE);
3193 snd_hda_codec_update_cache(codec, nid, 0,
3194 AC_VERB_SET_PIN_WIDGET_CONTROL,
3195 spec->multi_io[idx].ctl_in);
3200 static int alc_auto_ch_mode_put(struct snd_kcontrol *kcontrol,
3201 struct snd_ctl_elem_value *ucontrol)
3203 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3204 struct alc_spec *spec = codec->spec;
3207 ch = ucontrol->value.enumerated.item[0];
3208 if (ch < 0 || ch > spec->multi_ios)
3210 if (ch == (spec->ext_channel_count - 1) / 2)
3212 spec->ext_channel_count = (ch + 1) * 2;
3213 for (i = 0; i < spec->multi_ios; i++)
3214 alc_set_multi_io(codec, i, i < ch);
3215 spec->multiout.max_channels = spec->ext_channel_count;
3216 if (spec->need_dac_fix && !spec->const_channel_count)
3217 spec->multiout.num_dacs = spec->multiout.max_channels / 2;
3221 static const struct snd_kcontrol_new alc_auto_channel_mode_enum = {
3222 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3223 .name = "Channel Mode",
3224 .info = alc_auto_ch_mode_info,
3225 .get = alc_auto_ch_mode_get,
3226 .put = alc_auto_ch_mode_put,
3229 static int alc_auto_add_multi_channel_mode(struct hda_codec *codec,
3230 int (*fill_dac)(struct hda_codec *))
3232 struct alc_spec *spec = codec->spec;
3233 struct auto_pin_cfg *cfg = &spec->autocfg;
3234 unsigned int location, defcfg;
3237 if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT && cfg->hp_outs == 1) {
3238 /* use HP as primary out */
3239 cfg->speaker_outs = cfg->line_outs;
3240 memcpy(cfg->speaker_pins, cfg->line_out_pins,
3241 sizeof(cfg->speaker_pins));
3242 cfg->line_outs = cfg->hp_outs;
3243 memcpy(cfg->line_out_pins, cfg->hp_pins, sizeof(cfg->hp_pins));
3245 memset(cfg->hp_pins, 0, sizeof(cfg->hp_pins));
3246 cfg->line_out_type = AUTO_PIN_HP_OUT;
3250 if (cfg->line_outs != 1 ||
3251 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
3254 defcfg = snd_hda_codec_get_pincfg(codec, cfg->line_out_pins[0]);
3255 location = get_defcfg_location(defcfg);
3257 num_pins = alc_auto_fill_multi_ios(codec, location);
3259 struct snd_kcontrol_new *knew;
3261 knew = alc_kcontrol_new(spec);
3264 *knew = alc_auto_channel_mode_enum;
3265 knew->name = kstrdup("Channel Mode", GFP_KERNEL);
3269 spec->multi_ios = num_pins;
3270 spec->ext_channel_count = 2;
3271 spec->multiout.num_dacs = num_pins + 1;
3276 /* filter out invalid adc_nids (and capsrc_nids) that don't give all
3279 static void alc_remove_invalid_adc_nids(struct hda_codec *codec)
3281 struct alc_spec *spec = codec->spec;
3282 const struct hda_input_mux *imux;
3283 hda_nid_t adc_nids[ARRAY_SIZE(spec->private_adc_nids)];
3284 hda_nid_t capsrc_nids[ARRAY_SIZE(spec->private_adc_nids)];
3287 imux = spec->input_mux;
3290 if (spec->dyn_adc_switch)
3294 for (n = 0; n < spec->num_adc_nids; n++) {
3295 hda_nid_t cap = spec->private_capsrc_nids[n];
3296 int num_conns = snd_hda_get_conn_list(codec, cap, NULL);
3297 for (i = 0; i < imux->num_items; i++) {
3298 hda_nid_t pin = spec->imux_pins[i];
3300 if (get_connection_index(codec, cap, pin) < 0)
3302 } else if (num_conns <= imux->items[i].index)
3305 if (i >= imux->num_items) {
3306 adc_nids[nums] = spec->private_adc_nids[n];
3307 capsrc_nids[nums++] = cap;
3311 /* check whether ADC-switch is possible */
3312 if (!alc_check_dyn_adc_switch(codec)) {
3313 printk(KERN_WARNING "hda_codec: %s: no valid ADC found;"
3314 " using fallback 0x%x\n",
3315 codec->chip_name, spec->private_adc_nids[0]);
3316 spec->num_adc_nids = 1;
3320 } else if (nums != spec->num_adc_nids) {
3321 memcpy(spec->private_adc_nids, adc_nids,
3322 nums * sizeof(hda_nid_t));
3323 memcpy(spec->private_capsrc_nids, capsrc_nids,
3324 nums * sizeof(hda_nid_t));
3325 spec->num_adc_nids = nums;
3329 alc_auto_mic_check_imux(codec); /* check auto-mic setups */
3330 else if (spec->input_mux->num_items == 1)
3331 spec->num_adc_nids = 1; /* reduce to a single ADC */
3335 * initialize ADC paths
3337 static void alc_auto_init_adc(struct hda_codec *codec, int adc_idx)
3339 struct alc_spec *spec = codec->spec;
3342 nid = spec->adc_nids[adc_idx];
3344 if (nid_has_mute(codec, nid, HDA_INPUT)) {
3345 snd_hda_codec_write(codec, nid, 0,
3346 AC_VERB_SET_AMP_GAIN_MUTE,
3350 if (!spec->capsrc_nids)
3352 nid = spec->capsrc_nids[adc_idx];
3353 if (nid_has_mute(codec, nid, HDA_OUTPUT))
3354 snd_hda_codec_write(codec, nid, 0,
3355 AC_VERB_SET_AMP_GAIN_MUTE,
3359 static void alc_auto_init_input_src(struct hda_codec *codec)
3361 struct alc_spec *spec = codec->spec;
3364 for (c = 0; c < spec->num_adc_nids; c++)
3365 alc_auto_init_adc(codec, c);
3366 if (spec->dyn_adc_switch)
3369 nums = spec->num_adc_nids;
3370 for (c = 0; c < nums; c++)
3371 alc_mux_select(codec, 0, spec->cur_mux[c], true);
3374 /* add mic boosts if needed */
3375 static int alc_auto_add_mic_boost(struct hda_codec *codec)
3377 struct alc_spec *spec = codec->spec;
3378 struct auto_pin_cfg *cfg = &spec->autocfg;
3382 const char *prev_label = NULL;
3384 for (i = 0; i < cfg->num_inputs; i++) {
3385 if (cfg->inputs[i].type > AUTO_PIN_MIC)
3387 nid = cfg->inputs[i].pin;
3388 if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP) {
3390 char boost_label[32];
3392 label = hda_get_autocfg_input_label(codec, cfg, i);
3393 if (prev_label && !strcmp(label, prev_label))
3399 snprintf(boost_label, sizeof(boost_label),
3400 "%s Boost Volume", label);
3401 err = add_control(spec, ALC_CTL_WIDGET_VOL,
3402 boost_label, type_idx,
3403 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
3411 /* select or unmute the given capsrc route */
3412 static void select_or_unmute_capsrc(struct hda_codec *codec, hda_nid_t cap,
3415 if (get_wcaps_type(get_wcaps(codec, cap)) == AC_WID_AUD_MIX) {
3416 snd_hda_codec_amp_stereo(codec, cap, HDA_INPUT, idx,
3418 } else if (snd_hda_get_conn_list(codec, cap, NULL) > 1) {
3419 snd_hda_codec_write_cache(codec, cap, 0,
3420 AC_VERB_SET_CONNECT_SEL, idx);
3424 /* set the default connection to that pin */
3425 static int init_capsrc_for_pin(struct hda_codec *codec, hda_nid_t pin)
3427 struct alc_spec *spec = codec->spec;
3432 for (i = 0; i < spec->num_adc_nids; i++) {
3433 hda_nid_t cap = spec->capsrc_nids ?
3434 spec->capsrc_nids[i] : spec->adc_nids[i];
3437 idx = get_connection_index(codec, cap, pin);
3440 select_or_unmute_capsrc(codec, cap, idx);
3441 return i; /* return the found index */
3443 return -1; /* not found */
3446 /* initialize some special cases for input sources */
3447 static void alc_init_special_input_src(struct hda_codec *codec)
3449 struct alc_spec *spec = codec->spec;
3452 for (i = 0; i < spec->autocfg.num_inputs; i++)
3453 init_capsrc_for_pin(codec, spec->autocfg.inputs[i].pin);
3456 /* assign appropriate capture mixers */
3457 static void set_capture_mixer(struct hda_codec *codec)
3459 struct alc_spec *spec = codec->spec;
3460 static const struct snd_kcontrol_new *caps[2][3] = {
3461 { alc_capture_mixer_nosrc1,
3462 alc_capture_mixer_nosrc2,
3463 alc_capture_mixer_nosrc3 },
3464 { alc_capture_mixer1,
3466 alc_capture_mixer3 },
3469 /* check whether either of ADC or MUX has a volume control */
3470 if (!nid_has_volume(codec, spec->adc_nids[0], HDA_INPUT)) {
3471 if (!spec->capsrc_nids)
3472 return; /* no volume */
3473 if (!nid_has_volume(codec, spec->capsrc_nids[0], HDA_OUTPUT))
3474 return; /* no volume in capsrc, too */
3475 spec->vol_in_capsrc = 1;
3478 if (spec->num_adc_nids > 0) {
3482 if (spec->input_mux && spec->input_mux->num_items > 1)
3484 if (spec->auto_mic) {
3487 } else if (spec->dyn_adc_switch)
3490 if (spec->num_adc_nids > 3)
3491 spec->num_adc_nids = 3;
3492 else if (!spec->num_adc_nids)
3494 num_adcs = spec->num_adc_nids;
3496 spec->cap_mixer = caps[mux][num_adcs - 1];
3501 * standard auto-parser initializations
3503 static void alc_auto_init_std(struct hda_codec *codec)
3505 struct alc_spec *spec = codec->spec;
3506 alc_auto_init_multi_out(codec);
3507 alc_auto_init_extra_out(codec);
3508 alc_auto_init_analog_input(codec);
3509 alc_auto_init_input_src(codec);
3510 alc_auto_init_digital(codec);
3511 if (spec->unsol_event)
3512 alc_inithook(codec);
3516 * Digital-beep handlers
3518 #ifdef CONFIG_SND_HDA_INPUT_BEEP
3519 #define set_beep_amp(spec, nid, idx, dir) \
3520 ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir))
3522 static const struct snd_pci_quirk beep_white_list[] = {
3523 SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
3524 SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),
3525 SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1),
3526 SND_PCI_QUIRK(0x1043, 0x834a, "EeePC", 1),
3527 SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
3531 static inline int has_cdefine_beep(struct hda_codec *codec)
3533 struct alc_spec *spec = codec->spec;
3534 const struct snd_pci_quirk *q;
3535 q = snd_pci_quirk_lookup(codec->bus->pci, beep_white_list);
3538 return spec->cdefine.enable_pcbeep;
3541 #define set_beep_amp(spec, nid, idx, dir) /* NOP */
3542 #define has_cdefine_beep(codec) 0
3545 /* parse the BIOS configuration and set up the alc_spec */
3546 /* return 1 if successful, 0 if the proper config is not found,
3547 * or a negative error code
3549 static int alc_parse_auto_config(struct hda_codec *codec,
3550 const hda_nid_t *ignore_nids,
3551 const hda_nid_t *ssid_nids)
3553 struct alc_spec *spec = codec->spec;
3556 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
3560 if (!spec->autocfg.line_outs) {
3561 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
3562 spec->multiout.max_channels = 2;
3563 spec->no_analog = 1;
3566 return 0; /* can't find valid BIOS pin config */
3568 err = alc_auto_fill_dac_nids(codec);
3571 err = alc_auto_add_multi_channel_mode(codec, alc_auto_fill_dac_nids);
3574 err = alc_auto_create_multi_out_ctls(codec, &spec->autocfg);
3577 err = alc_auto_create_hp_out(codec);
3580 err = alc_auto_create_speaker_out(codec);
3583 err = alc_auto_create_input_ctls(codec);
3587 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
3590 alc_auto_parse_digital(codec);
3592 if (!spec->no_analog)
3593 alc_remove_invalid_adc_nids(codec);
3596 alc_ssid_check(codec, ssid_nids);
3598 if (!spec->no_analog) {
3599 alc_auto_check_switches(codec);
3600 err = alc_auto_add_mic_boost(codec);
3605 if (spec->kctls.list)
3606 add_mixer(spec, spec->kctls.list);
3611 static int alc880_parse_auto_config(struct hda_codec *codec)
3613 static const hda_nid_t alc880_ignore[] = { 0x1d, 0 };
3614 static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 };
3615 return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids);
3618 #ifdef CONFIG_SND_HDA_POWER_SAVE
3619 static const struct hda_amp_list alc880_loopbacks[] = {
3620 { 0x0b, HDA_INPUT, 0 },
3621 { 0x0b, HDA_INPUT, 1 },
3622 { 0x0b, HDA_INPUT, 2 },
3623 { 0x0b, HDA_INPUT, 3 },
3624 { 0x0b, HDA_INPUT, 4 },
3632 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
3633 #define alc_board_config \
3634 snd_hda_check_board_config
3635 #define alc_board_codec_sid_config \
3636 snd_hda_check_board_codec_sid_config
3637 #include "alc_quirks.c"
3639 #define alc_board_config(codec, nums, models, tbl) -1
3640 #define alc_board_codec_sid_config(codec, nums, models, tbl) -1
3641 #define setup_preset(codec, x) /* NOP */
3645 * OK, here we have finally the patch for ALC880
3647 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
3648 #include "alc880_quirks.c"
3651 static int patch_alc880(struct hda_codec *codec)
3653 struct alc_spec *spec;
3657 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3663 spec->mixer_nid = 0x0b;
3664 spec->need_dac_fix = 1;
3666 board_config = alc_board_config(codec, ALC880_MODEL_LAST,
3667 alc880_models, alc880_cfg_tbl);
3668 if (board_config < 0) {
3669 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
3671 board_config = ALC_MODEL_AUTO;
3674 if (board_config == ALC_MODEL_AUTO) {
3675 /* automatic parse from the BIOS config */
3676 err = alc880_parse_auto_config(codec);
3681 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
3684 "hda_codec: Cannot set up configuration "
3685 "from BIOS. Using 3-stack mode...\n");
3686 board_config = ALC880_3ST;
3691 if (board_config != ALC_MODEL_AUTO)
3692 setup_preset(codec, &alc880_presets[board_config]);
3694 if (!spec->no_analog && !spec->adc_nids) {
3695 alc_auto_fill_adc_caps(codec);
3696 alc_rebuild_imux_for_auto_mic(codec);
3697 alc_remove_invalid_adc_nids(codec);
3700 if (!spec->no_analog && !spec->cap_mixer)
3701 set_capture_mixer(codec);
3703 if (!spec->no_analog) {
3704 err = snd_hda_attach_beep_device(codec, 0x1);
3709 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
3712 spec->vmaster_nid = 0x0c;
3714 codec->patch_ops = alc_patch_ops;
3715 if (board_config == ALC_MODEL_AUTO)
3716 spec->init_hook = alc_auto_init_std;
3717 #ifdef CONFIG_SND_HDA_POWER_SAVE
3718 if (!spec->loopback.amplist)
3719 spec->loopback.amplist = alc880_loopbacks;
3729 static int alc260_parse_auto_config(struct hda_codec *codec)
3731 static const hda_nid_t alc260_ignore[] = { 0x17, 0 };
3732 static const hda_nid_t alc260_ssids[] = { 0x10, 0x15, 0x0f, 0 };
3733 return alc_parse_auto_config(codec, alc260_ignore, alc260_ssids);
3736 #ifdef CONFIG_SND_HDA_POWER_SAVE
3737 static const struct hda_amp_list alc260_loopbacks[] = {
3738 { 0x07, HDA_INPUT, 0 },
3739 { 0x07, HDA_INPUT, 1 },
3740 { 0x07, HDA_INPUT, 2 },
3741 { 0x07, HDA_INPUT, 3 },
3742 { 0x07, HDA_INPUT, 4 },
3754 static const struct alc_fixup alc260_fixups[] = {
3755 [PINFIX_HP_DC5750] = {
3756 .type = ALC_FIXUP_PINS,
3757 .v.pins = (const struct alc_pincfg[]) {
3758 { 0x11, 0x90130110 }, /* speaker */
3764 static const struct snd_pci_quirk alc260_fixup_tbl[] = {
3765 SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", PINFIX_HP_DC5750),
3771 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
3772 #include "alc260_quirks.c"
3775 static int patch_alc260(struct hda_codec *codec)
3777 struct alc_spec *spec;
3778 int err, board_config;
3780 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3786 spec->mixer_nid = 0x07;
3788 board_config = alc_board_config(codec, ALC260_MODEL_LAST,
3789 alc260_models, alc260_cfg_tbl);
3790 if (board_config < 0) {
3791 snd_printd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
3793 board_config = ALC_MODEL_AUTO;
3796 if (board_config == ALC_MODEL_AUTO) {
3797 alc_pick_fixup(codec, NULL, alc260_fixup_tbl, alc260_fixups);
3798 alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
3801 if (board_config == ALC_MODEL_AUTO) {
3802 /* automatic parse from the BIOS config */
3803 err = alc260_parse_auto_config(codec);
3808 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
3811 "hda_codec: Cannot set up configuration "
3812 "from BIOS. Using base mode...\n");
3813 board_config = ALC260_BASIC;
3818 if (board_config != ALC_MODEL_AUTO)
3819 setup_preset(codec, &alc260_presets[board_config]);
3821 if (!spec->no_analog && !spec->adc_nids) {
3822 alc_auto_fill_adc_caps(codec);
3823 alc_rebuild_imux_for_auto_mic(codec);
3824 alc_remove_invalid_adc_nids(codec);
3827 if (!spec->no_analog && !spec->cap_mixer)
3828 set_capture_mixer(codec);
3830 if (!spec->no_analog) {
3831 err = snd_hda_attach_beep_device(codec, 0x1);
3836 set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
3839 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
3841 spec->vmaster_nid = 0x08;
3843 codec->patch_ops = alc_patch_ops;
3844 if (board_config == ALC_MODEL_AUTO)
3845 spec->init_hook = alc_auto_init_std;
3846 spec->shutup = alc_eapd_shutup;
3847 #ifdef CONFIG_SND_HDA_POWER_SAVE
3848 if (!spec->loopback.amplist)
3849 spec->loopback.amplist = alc260_loopbacks;
3857 * ALC882/883/885/888/889 support
3859 * ALC882 is almost identical with ALC880 but has cleaner and more flexible
3860 * configuration. Each pin widget can choose any input DACs and a mixer.
3861 * Each ADC is connected from a mixer of all inputs. This makes possible
3862 * 6-channel independent captures.
3864 * In addition, an independent DAC for the multi-playback (not used in this
3867 #ifdef CONFIG_SND_HDA_POWER_SAVE
3868 #define alc882_loopbacks alc880_loopbacks
3875 PINFIX_ABIT_AW9D_MAX,
3878 PINFIX_ACER_ASPIRE_7736,
3881 static const struct alc_fixup alc882_fixups[] = {
3882 [PINFIX_ABIT_AW9D_MAX] = {
3883 .type = ALC_FIXUP_PINS,
3884 .v.pins = (const struct alc_pincfg[]) {
3885 { 0x15, 0x01080104 }, /* side */
3886 { 0x16, 0x01011012 }, /* rear */
3887 { 0x17, 0x01016011 }, /* clfe */
3891 [PINFIX_LENOVO_Y530] = {
3892 .type = ALC_FIXUP_PINS,
3893 .v.pins = (const struct alc_pincfg[]) {
3894 { 0x15, 0x99130112 }, /* rear int speakers */
3895 { 0x16, 0x99130111 }, /* subwoofer */
3899 [PINFIX_PB_M5210] = {
3900 .type = ALC_FIXUP_VERBS,
3901 .v.verbs = (const struct hda_verb[]) {
3902 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 },
3906 [PINFIX_ACER_ASPIRE_7736] = {
3907 .type = ALC_FIXUP_SKU,
3908 .v.sku = ALC_FIXUP_SKU_IGNORE,
3912 static const struct snd_pci_quirk alc882_fixup_tbl[] = {
3913 SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", PINFIX_PB_M5210),
3914 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", PINFIX_LENOVO_Y530),
3915 SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
3916 SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", PINFIX_ACER_ASPIRE_7736),
3921 * BIOS auto configuration
3923 /* almost identical with ALC880 parser... */
3924 static int alc882_parse_auto_config(struct hda_codec *codec)
3926 static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };
3927 static const hda_nid_t alc882_ssids[] = { 0x15, 0x1b, 0x14, 0 };
3928 return alc_parse_auto_config(codec, alc882_ignore, alc882_ssids);
3933 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
3934 #include "alc882_quirks.c"
3937 static int patch_alc882(struct hda_codec *codec)
3939 struct alc_spec *spec;
3940 int err, board_config;
3942 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3948 spec->mixer_nid = 0x0b;
3950 switch (codec->vendor_id) {
3955 /* ALC883 and variants */
3956 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
3960 board_config = alc_board_config(codec, ALC882_MODEL_LAST,
3961 alc882_models, alc882_cfg_tbl);
3963 if (board_config < 0)
3964 board_config = alc_board_codec_sid_config(codec,
3965 ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl);
3967 if (board_config < 0) {
3968 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
3970 board_config = ALC_MODEL_AUTO;
3973 if (board_config == ALC_MODEL_AUTO) {
3974 alc_pick_fixup(codec, NULL, alc882_fixup_tbl, alc882_fixups);
3975 alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
3978 alc_auto_parse_customize_define(codec);
3980 if (board_config == ALC_MODEL_AUTO) {
3981 /* automatic parse from the BIOS config */
3982 err = alc882_parse_auto_config(codec);
3987 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
3990 "hda_codec: Cannot set up configuration "
3991 "from BIOS. Using base mode...\n");
3992 board_config = ALC882_3ST_DIG;
3997 if (board_config != ALC_MODEL_AUTO)
3998 setup_preset(codec, &alc882_presets[board_config]);
4000 if (!spec->no_analog && !spec->adc_nids) {
4001 alc_auto_fill_adc_caps(codec);
4002 alc_rebuild_imux_for_auto_mic(codec);
4003 alc_remove_invalid_adc_nids(codec);
4006 if (!spec->no_analog && !spec->cap_mixer)
4007 set_capture_mixer(codec);
4009 if (!spec->no_analog && has_cdefine_beep(codec)) {
4010 err = snd_hda_attach_beep_device(codec, 0x1);
4015 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
4018 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
4020 spec->vmaster_nid = 0x0c;
4022 codec->patch_ops = alc_patch_ops;
4023 if (board_config == ALC_MODEL_AUTO)
4024 spec->init_hook = alc_auto_init_std;
4026 alc_init_jacks(codec);
4027 #ifdef CONFIG_SND_HDA_POWER_SAVE
4028 if (!spec->loopback.amplist)
4029 spec->loopback.amplist = alc882_loopbacks;
4039 static int alc262_parse_auto_config(struct hda_codec *codec)
4041 static const hda_nid_t alc262_ignore[] = { 0x1d, 0 };
4042 static const hda_nid_t alc262_ssids[] = { 0x15, 0x1b, 0x14, 0 };
4043 return alc_parse_auto_config(codec, alc262_ignore, alc262_ssids);
4054 static const struct alc_fixup alc262_fixups[] = {
4055 [PINFIX_FSC_H270] = {
4056 .type = ALC_FIXUP_PINS,
4057 .v.pins = (const struct alc_pincfg[]) {
4058 { 0x14, 0x99130110 }, /* speaker */
4059 { 0x15, 0x0221142f }, /* front HP */
4060 { 0x1b, 0x0121141f }, /* rear HP */
4064 [PINFIX_HP_Z200] = {
4065 .type = ALC_FIXUP_PINS,
4066 .v.pins = (const struct alc_pincfg[]) {
4067 { 0x16, 0x99130120 }, /* internal speaker */
4073 static const struct snd_pci_quirk alc262_fixup_tbl[] = {
4074 SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", PINFIX_HP_Z200),
4075 SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", PINFIX_FSC_H270),
4080 #ifdef CONFIG_SND_HDA_POWER_SAVE
4081 #define alc262_loopbacks alc880_loopbacks
4086 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
4087 #include "alc262_quirks.c"
4090 static int patch_alc262(struct hda_codec *codec)
4092 struct alc_spec *spec;
4096 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4102 spec->mixer_nid = 0x0b;
4105 /* pshou 07/11/05 set a zero PCM sample to DAC when FIFO is
4110 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
4111 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
4112 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
4113 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80);
4116 alc_auto_parse_customize_define(codec);
4118 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
4120 board_config = alc_board_config(codec, ALC262_MODEL_LAST,
4121 alc262_models, alc262_cfg_tbl);
4123 if (board_config < 0) {
4124 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
4126 board_config = ALC_MODEL_AUTO;
4129 if (board_config == ALC_MODEL_AUTO) {
4130 alc_pick_fixup(codec, NULL, alc262_fixup_tbl, alc262_fixups);
4131 alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
4134 if (board_config == ALC_MODEL_AUTO) {
4135 /* automatic parse from the BIOS config */
4136 err = alc262_parse_auto_config(codec);
4141 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
4144 "hda_codec: Cannot set up configuration "
4145 "from BIOS. Using base mode...\n");
4146 board_config = ALC262_BASIC;
4151 if (board_config != ALC_MODEL_AUTO)
4152 setup_preset(codec, &alc262_presets[board_config]);
4154 if (!spec->no_analog && !spec->adc_nids) {
4155 alc_auto_fill_adc_caps(codec);
4156 alc_rebuild_imux_for_auto_mic(codec);
4157 alc_remove_invalid_adc_nids(codec);
4160 if (!spec->no_analog && !spec->cap_mixer)
4161 set_capture_mixer(codec);
4163 if (!spec->no_analog && has_cdefine_beep(codec)) {
4164 err = snd_hda_attach_beep_device(codec, 0x1);
4169 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
4172 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
4174 spec->vmaster_nid = 0x0c;
4176 codec->patch_ops = alc_patch_ops;
4177 if (board_config == ALC_MODEL_AUTO)
4178 spec->init_hook = alc_auto_init_std;
4179 spec->shutup = alc_eapd_shutup;
4181 alc_init_jacks(codec);
4182 #ifdef CONFIG_SND_HDA_POWER_SAVE
4183 if (!spec->loopback.amplist)
4184 spec->loopback.amplist = alc262_loopbacks;
4193 /* bind Beep switches of both NID 0x0f and 0x10 */
4194 static const struct hda_bind_ctls alc268_bind_beep_sw = {
4195 .ops = &snd_hda_bind_sw,
4197 HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT),
4198 HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT),
4203 static const struct snd_kcontrol_new alc268_beep_mixer[] = {
4204 HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
4205 HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw),
4209 /* set PCBEEP vol = 0, mute connections */
4210 static const struct hda_verb alc268_beep_init_verbs[] = {
4211 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4212 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4213 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4218 * BIOS auto configuration
4220 static int alc268_parse_auto_config(struct hda_codec *codec)
4222 static const hda_nid_t alc268_ssids[] = { 0x15, 0x1b, 0x14, 0 };
4223 struct alc_spec *spec = codec->spec;
4224 int err = alc_parse_auto_config(codec, NULL, alc268_ssids);
4226 if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d) {
4227 add_mixer(spec, alc268_beep_mixer);
4228 add_verb(spec, alc268_beep_init_verbs);
4236 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
4237 #include "alc268_quirks.c"
4240 static int patch_alc268(struct hda_codec *codec)
4242 struct alc_spec *spec;
4244 int i, has_beep, err;
4246 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4252 /* ALC268 has no aa-loopback mixer */
4254 board_config = alc_board_config(codec, ALC268_MODEL_LAST,
4255 alc268_models, alc268_cfg_tbl);
4257 if (board_config < 0)
4258 board_config = alc_board_codec_sid_config(codec,
4259 ALC268_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl);
4261 if (board_config < 0) {
4262 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
4264 board_config = ALC_MODEL_AUTO;
4267 if (board_config == ALC_MODEL_AUTO) {
4268 /* automatic parse from the BIOS config */
4269 err = alc268_parse_auto_config(codec);
4274 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
4277 "hda_codec: Cannot set up configuration "
4278 "from BIOS. Using base mode...\n");
4279 board_config = ALC268_3ST;
4284 if (board_config != ALC_MODEL_AUTO)
4285 setup_preset(codec, &alc268_presets[board_config]);
4288 for (i = 0; i < spec->num_mixers; i++) {
4289 if (spec->mixers[i] == alc268_beep_mixer) {
4296 err = snd_hda_attach_beep_device(codec, 0x1);
4301 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
4302 /* override the amp caps for beep generator */
4303 snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
4304 (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
4305 (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
4306 (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
4307 (0 << AC_AMPCAP_MUTE_SHIFT));
4310 if (!spec->no_analog && !spec->adc_nids) {
4311 alc_auto_fill_adc_caps(codec);
4312 alc_rebuild_imux_for_auto_mic(codec);
4313 alc_remove_invalid_adc_nids(codec);
4316 if (!spec->no_analog && !spec->cap_mixer)
4317 set_capture_mixer(codec);
4319 spec->vmaster_nid = 0x02;
4321 codec->patch_ops = alc_patch_ops;
4322 if (board_config == ALC_MODEL_AUTO)
4323 spec->init_hook = alc_auto_init_std;
4324 spec->shutup = alc_eapd_shutup;
4326 alc_init_jacks(codec);
4334 #ifdef CONFIG_SND_HDA_POWER_SAVE
4335 #define alc269_loopbacks alc880_loopbacks
4338 static const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
4342 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
4343 /* NID is set in alc_build_pcms */
4345 .open = alc_playback_pcm_open,
4346 .prepare = alc_playback_pcm_prepare,
4347 .cleanup = alc_playback_pcm_cleanup
4351 static const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
4355 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
4356 /* NID is set in alc_build_pcms */
4359 #ifdef CONFIG_SND_HDA_POWER_SAVE
4360 static int alc269_mic2_for_mute_led(struct hda_codec *codec)
4362 switch (codec->subsystem_id) {
4369 static int alc269_mic2_mute_check_ps(struct hda_codec *codec, hda_nid_t nid)
4371 /* update mute-LED according to the speaker mute state */
4372 if (nid == 0x01 || nid == 0x14) {
4374 if (snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0) &
4379 /* mic2 vref pin is used for mute LED control */
4380 snd_hda_codec_update_cache(codec, 0x19, 0,
4381 AC_VERB_SET_PIN_WIDGET_CONTROL,
4384 return alc_check_power_status(codec, nid);
4386 #endif /* CONFIG_SND_HDA_POWER_SAVE */
4388 /* different alc269-variants */
4390 ALC269_TYPE_ALC269VA,
4391 ALC269_TYPE_ALC269VB,
4392 ALC269_TYPE_ALC269VC,
4396 * BIOS auto configuration
4398 static int alc269_parse_auto_config(struct hda_codec *codec)
4400 static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };
4401 static const hda_nid_t alc269_ssids[] = { 0, 0x1b, 0x14, 0x21 };
4402 static const hda_nid_t alc269va_ssids[] = { 0x15, 0x1b, 0x14, 0 };
4403 struct alc_spec *spec = codec->spec;
4404 const hda_nid_t *ssids = spec->codec_variant == ALC269_TYPE_ALC269VA ?
4405 alc269va_ssids : alc269_ssids;
4407 return alc_parse_auto_config(codec, alc269_ignore, ssids);
4410 static void alc269_toggle_power_output(struct hda_codec *codec, int power_up)
4412 int val = alc_read_coef_idx(codec, 0x04);
4417 alc_write_coef_idx(codec, 0x04, val);
4420 static void alc269_shutup(struct hda_codec *codec)
4422 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x017)
4423 alc269_toggle_power_output(codec, 0);
4424 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x018) {
4425 alc269_toggle_power_output(codec, 0);
4431 static int alc269_resume(struct hda_codec *codec)
4433 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x018) {
4434 alc269_toggle_power_output(codec, 0);
4438 codec->patch_ops.init(codec);
4440 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x017) {
4441 alc269_toggle_power_output(codec, 1);
4445 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x018)
4446 alc269_toggle_power_output(codec, 1);
4448 snd_hda_codec_resume_amp(codec);
4449 snd_hda_codec_resume_cache(codec);
4450 hda_call_check_power_status(codec, 0x01);
4453 #endif /* CONFIG_PM */
4455 static void alc269_fixup_hweq(struct hda_codec *codec,
4456 const struct alc_fixup *fix, int action)
4460 if (action != ALC_FIXUP_ACT_INIT)
4462 coef = alc_read_coef_idx(codec, 0x1e);
4463 alc_write_coef_idx(codec, 0x1e, coef | 0x80);
4466 static void alc271_fixup_dmic(struct hda_codec *codec,
4467 const struct alc_fixup *fix, int action)
4469 static const struct hda_verb verbs[] = {
4470 {0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
4471 {0x20, AC_VERB_SET_PROC_COEF, 0x4000},
4476 if (strcmp(codec->chip_name, "ALC271X"))
4478 cfg = snd_hda_codec_get_pincfg(codec, 0x12);
4479 if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
4480 snd_hda_sequence_write(codec, verbs);
4483 static void alc269_fixup_pcm_44k(struct hda_codec *codec,
4484 const struct alc_fixup *fix, int action)
4486 struct alc_spec *spec = codec->spec;
4488 if (action != ALC_FIXUP_ACT_PROBE)
4491 /* Due to a hardware problem on Lenovo Ideadpad, we need to
4492 * fix the sample rate of analog I/O to 44.1kHz
4494 spec->stream_analog_playback = &alc269_44k_pcm_analog_playback;
4495 spec->stream_analog_capture = &alc269_44k_pcm_analog_capture;
4498 static void alc269_fixup_stereo_dmic(struct hda_codec *codec,
4499 const struct alc_fixup *fix, int action)
4503 if (action != ALC_FIXUP_ACT_INIT)
4505 /* The digital-mic unit sends PDM (differential signal) instead of
4506 * the standard PCM, thus you can't record a valid mono stream as is.
4507 * Below is a workaround specific to ALC269 to control the dmic
4508 * signal source as mono.
4510 coef = alc_read_coef_idx(codec, 0x07);
4511 alc_write_coef_idx(codec, 0x07, coef | 0x80);
4515 ALC269_FIXUP_SONY_VAIO,
4516 ALC275_FIXUP_SONY_VAIO_GPIO2,
4517 ALC269_FIXUP_DELL_M101Z,
4518 ALC269_FIXUP_SKU_IGNORE,
4519 ALC269_FIXUP_ASUS_G73JW,
4520 ALC269_FIXUP_LENOVO_EAPD,
4521 ALC275_FIXUP_SONY_HWEQ,
4523 ALC269_FIXUP_PCM_44K,
4524 ALC269_FIXUP_STEREO_DMIC,
4527 static const struct alc_fixup alc269_fixups[] = {
4528 [ALC269_FIXUP_SONY_VAIO] = {
4529 .type = ALC_FIXUP_VERBS,
4530 .v.verbs = (const struct hda_verb[]) {
4531 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD},
4535 [ALC275_FIXUP_SONY_VAIO_GPIO2] = {
4536 .type = ALC_FIXUP_VERBS,
4537 .v.verbs = (const struct hda_verb[]) {
4538 {0x01, AC_VERB_SET_GPIO_MASK, 0x04},
4539 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04},
4540 {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
4544 .chain_id = ALC269_FIXUP_SONY_VAIO
4546 [ALC269_FIXUP_DELL_M101Z] = {
4547 .type = ALC_FIXUP_VERBS,
4548 .v.verbs = (const struct hda_verb[]) {
4549 /* Enables internal speaker */
4550 {0x20, AC_VERB_SET_COEF_INDEX, 13},
4551 {0x20, AC_VERB_SET_PROC_COEF, 0x4040},
4555 [ALC269_FIXUP_SKU_IGNORE] = {
4556 .type = ALC_FIXUP_SKU,
4557 .v.sku = ALC_FIXUP_SKU_IGNORE,
4559 [ALC269_FIXUP_ASUS_G73JW] = {
4560 .type = ALC_FIXUP_PINS,
4561 .v.pins = (const struct alc_pincfg[]) {
4562 { 0x17, 0x99130111 }, /* subwoofer */
4566 [ALC269_FIXUP_LENOVO_EAPD] = {
4567 .type = ALC_FIXUP_VERBS,
4568 .v.verbs = (const struct hda_verb[]) {
4569 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
4573 [ALC275_FIXUP_SONY_HWEQ] = {
4574 .type = ALC_FIXUP_FUNC,
4575 .v.func = alc269_fixup_hweq,
4577 .chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
4579 [ALC271_FIXUP_DMIC] = {
4580 .type = ALC_FIXUP_FUNC,
4581 .v.func = alc271_fixup_dmic,
4583 [ALC269_FIXUP_PCM_44K] = {
4584 .type = ALC_FIXUP_FUNC,
4585 .v.func = alc269_fixup_pcm_44k,
4587 [ALC269_FIXUP_STEREO_DMIC] = {
4588 .type = ALC_FIXUP_FUNC,
4589 .v.func = alc269_fixup_stereo_dmic,
4593 static const struct snd_pci_quirk alc269_fixup_tbl[] = {
4594 SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
4595 SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
4596 SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
4597 SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
4598 SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
4599 SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
4600 SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
4601 SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
4602 SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
4603 SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
4604 SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
4605 SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
4606 SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
4607 SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
4608 SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
4609 SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
4610 SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
4611 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Lenovo Ideapd", ALC269_FIXUP_PCM_44K),
4612 SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
4617 static int alc269_fill_coef(struct hda_codec *codec)
4621 if ((alc_read_coef_idx(codec, 0) & 0x00ff) < 0x015) {
4622 alc_write_coef_idx(codec, 0xf, 0x960b);
4623 alc_write_coef_idx(codec, 0xe, 0x8817);
4626 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x016) {
4627 alc_write_coef_idx(codec, 0xf, 0x960b);
4628 alc_write_coef_idx(codec, 0xe, 0x8814);
4631 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x017) {
4632 val = alc_read_coef_idx(codec, 0x04);
4633 /* Power up output pin */
4634 alc_write_coef_idx(codec, 0x04, val | (1<<11));
4637 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x018) {
4638 val = alc_read_coef_idx(codec, 0xd);
4639 if ((val & 0x0c00) >> 10 != 0x1) {
4640 /* Capless ramp up clock control */
4641 alc_write_coef_idx(codec, 0xd, val | (1<<10));
4643 val = alc_read_coef_idx(codec, 0x17);
4644 if ((val & 0x01c0) >> 6 != 0x4) {
4645 /* Class D power on reset */
4646 alc_write_coef_idx(codec, 0x17, val | (1<<7));
4650 val = alc_read_coef_idx(codec, 0xd); /* Class D */
4651 alc_write_coef_idx(codec, 0xd, val | (1<<14));
4653 val = alc_read_coef_idx(codec, 0x4); /* HP */
4654 alc_write_coef_idx(codec, 0x4, val | (1<<11));
4661 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
4662 #include "alc269_quirks.c"
4665 static int patch_alc269(struct hda_codec *codec)
4667 struct alc_spec *spec;
4668 int board_config, coef;
4671 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4677 spec->mixer_nid = 0x0b;
4679 alc_auto_parse_customize_define(codec);
4681 if (codec->vendor_id == 0x10ec0269) {
4682 spec->codec_variant = ALC269_TYPE_ALC269VA;
4683 coef = alc_read_coef_idx(codec, 0);
4684 if ((coef & 0x00f0) == 0x0010) {
4685 if (codec->bus->pci->subsystem_vendor == 0x1025 &&
4686 spec->cdefine.platform_type == 1) {
4687 alc_codec_rename(codec, "ALC271X");
4688 } else if ((coef & 0xf000) == 0x2000) {
4689 alc_codec_rename(codec, "ALC259");
4690 } else if ((coef & 0xf000) == 0x3000) {
4691 alc_codec_rename(codec, "ALC258");
4692 } else if ((coef & 0xfff0) == 0x3010) {
4693 alc_codec_rename(codec, "ALC277");
4695 alc_codec_rename(codec, "ALC269VB");
4697 spec->codec_variant = ALC269_TYPE_ALC269VB;
4698 } else if ((coef & 0x00f0) == 0x0020) {
4700 alc_codec_rename(codec, "ALC259");
4701 else if (coef == 0x6023)
4702 alc_codec_rename(codec, "ALC281X");
4703 else if (codec->bus->pci->subsystem_vendor == 0x17aa &&
4704 codec->bus->pci->subsystem_device == 0x21f3)
4705 alc_codec_rename(codec, "ALC3202");
4707 alc_codec_rename(codec, "ALC269VC");
4708 spec->codec_variant = ALC269_TYPE_ALC269VC;
4710 alc_fix_pll_init(codec, 0x20, 0x04, 15);
4711 alc269_fill_coef(codec);
4714 board_config = alc_board_config(codec, ALC269_MODEL_LAST,
4715 alc269_models, alc269_cfg_tbl);
4717 if (board_config < 0) {
4718 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
4720 board_config = ALC_MODEL_AUTO;
4723 if (board_config == ALC_MODEL_AUTO) {
4724 alc_pick_fixup(codec, NULL, alc269_fixup_tbl, alc269_fixups);
4725 alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
4728 if (board_config == ALC_MODEL_AUTO) {
4729 /* automatic parse from the BIOS config */
4730 err = alc269_parse_auto_config(codec);
4735 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
4738 "hda_codec: Cannot set up configuration "
4739 "from BIOS. Using base mode...\n");
4740 board_config = ALC269_BASIC;
4745 if (board_config != ALC_MODEL_AUTO)
4746 setup_preset(codec, &alc269_presets[board_config]);
4748 if (!spec->no_analog && !spec->adc_nids) {
4749 alc_auto_fill_adc_caps(codec);
4750 alc_rebuild_imux_for_auto_mic(codec);
4751 alc_remove_invalid_adc_nids(codec);
4754 if (!spec->no_analog && !spec->cap_mixer)
4755 set_capture_mixer(codec);
4757 if (!spec->no_analog && has_cdefine_beep(codec)) {
4758 err = snd_hda_attach_beep_device(codec, 0x1);
4763 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
4766 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
4768 spec->vmaster_nid = 0x02;
4770 codec->patch_ops = alc_patch_ops;
4772 codec->patch_ops.resume = alc269_resume;
4774 if (board_config == ALC_MODEL_AUTO)
4775 spec->init_hook = alc_auto_init_std;
4776 spec->shutup = alc269_shutup;
4778 alc_init_jacks(codec);
4779 #ifdef CONFIG_SND_HDA_POWER_SAVE
4780 if (!spec->loopback.amplist)
4781 spec->loopback.amplist = alc269_loopbacks;
4782 if (alc269_mic2_for_mute_led(codec))
4783 codec->patch_ops.check_power_status = alc269_mic2_mute_check_ps;
4793 static int alc861_parse_auto_config(struct hda_codec *codec)
4795 static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
4796 static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 };
4797 return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids);
4800 #ifdef CONFIG_SND_HDA_POWER_SAVE
4801 static const struct hda_amp_list alc861_loopbacks[] = {
4802 { 0x15, HDA_INPUT, 0 },
4803 { 0x15, HDA_INPUT, 1 },
4804 { 0x15, HDA_INPUT, 2 },
4805 { 0x15, HDA_INPUT, 3 },
4811 /* Pin config fixes */
4813 PINFIX_FSC_AMILO_PI1505,
4816 static const struct alc_fixup alc861_fixups[] = {
4817 [PINFIX_FSC_AMILO_PI1505] = {
4818 .type = ALC_FIXUP_PINS,
4819 .v.pins = (const struct alc_pincfg[]) {
4820 { 0x0b, 0x0221101f }, /* HP */
4821 { 0x0f, 0x90170310 }, /* speaker */
4827 static const struct snd_pci_quirk alc861_fixup_tbl[] = {
4828 SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505),
4834 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
4835 #include "alc861_quirks.c"
4838 static int patch_alc861(struct hda_codec *codec)
4840 struct alc_spec *spec;
4844 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4850 spec->mixer_nid = 0x15;
4852 board_config = alc_board_config(codec, ALC861_MODEL_LAST,
4853 alc861_models, alc861_cfg_tbl);
4855 if (board_config < 0) {
4856 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
4858 board_config = ALC_MODEL_AUTO;
4861 if (board_config == ALC_MODEL_AUTO) {
4862 alc_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
4863 alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
4866 if (board_config == ALC_MODEL_AUTO) {
4867 /* automatic parse from the BIOS config */
4868 err = alc861_parse_auto_config(codec);
4873 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
4876 "hda_codec: Cannot set up configuration "
4877 "from BIOS. Using base mode...\n");
4878 board_config = ALC861_3ST_DIG;
4883 if (board_config != ALC_MODEL_AUTO)
4884 setup_preset(codec, &alc861_presets[board_config]);
4886 if (!spec->no_analog && !spec->adc_nids) {
4887 alc_auto_fill_adc_caps(codec);
4888 alc_rebuild_imux_for_auto_mic(codec);
4889 alc_remove_invalid_adc_nids(codec);
4892 if (!spec->no_analog && !spec->cap_mixer)
4893 set_capture_mixer(codec);
4895 if (!spec->no_analog) {
4896 err = snd_hda_attach_beep_device(codec, 0x23);
4901 set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
4904 spec->vmaster_nid = 0x03;
4906 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
4908 codec->patch_ops = alc_patch_ops;
4909 if (board_config == ALC_MODEL_AUTO) {
4910 spec->init_hook = alc_auto_init_std;
4911 #ifdef CONFIG_SND_HDA_POWER_SAVE
4912 spec->power_hook = alc_power_eapd;
4915 #ifdef CONFIG_SND_HDA_POWER_SAVE
4916 if (!spec->loopback.amplist)
4917 spec->loopback.amplist = alc861_loopbacks;
4928 * In addition, an independent DAC
4930 #ifdef CONFIG_SND_HDA_POWER_SAVE
4931 #define alc861vd_loopbacks alc880_loopbacks
4934 static int alc861vd_parse_auto_config(struct hda_codec *codec)
4936 static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
4937 static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 };
4938 return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids);
4942 ALC660VD_FIX_ASUS_GPIO1
4946 static const struct alc_fixup alc861vd_fixups[] = {
4947 [ALC660VD_FIX_ASUS_GPIO1] = {
4948 .type = ALC_FIXUP_VERBS,
4949 .v.verbs = (const struct hda_verb[]) {
4950 {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
4951 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
4952 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
4958 static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
4959 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
4963 static const struct hda_verb alc660vd_eapd_verbs[] = {
4964 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
4965 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
4971 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
4972 #include "alc861vd_quirks.c"
4975 static int patch_alc861vd(struct hda_codec *codec)
4977 struct alc_spec *spec;
4978 int err, board_config;
4980 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4986 spec->mixer_nid = 0x0b;
4988 board_config = alc_board_config(codec, ALC861VD_MODEL_LAST,
4989 alc861vd_models, alc861vd_cfg_tbl);
4991 if (board_config < 0) {
4992 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
4994 board_config = ALC_MODEL_AUTO;
4997 if (board_config == ALC_MODEL_AUTO) {
4998 alc_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
4999 alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
5002 if (board_config == ALC_MODEL_AUTO) {
5003 /* automatic parse from the BIOS config */
5004 err = alc861vd_parse_auto_config(codec);
5009 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
5012 "hda_codec: Cannot set up configuration "
5013 "from BIOS. Using base mode...\n");
5014 board_config = ALC861VD_3ST;
5019 if (board_config != ALC_MODEL_AUTO)
5020 setup_preset(codec, &alc861vd_presets[board_config]);
5022 if (codec->vendor_id == 0x10ec0660) {
5023 /* always turn on EAPD */
5024 add_verb(spec, alc660vd_eapd_verbs);
5027 if (!spec->no_analog && !spec->adc_nids) {
5028 alc_auto_fill_adc_caps(codec);
5029 alc_rebuild_imux_for_auto_mic(codec);
5030 alc_remove_invalid_adc_nids(codec);
5033 if (!spec->no_analog && !spec->cap_mixer)
5034 set_capture_mixer(codec);
5036 if (!spec->no_analog) {
5037 err = snd_hda_attach_beep_device(codec, 0x23);
5042 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
5045 spec->vmaster_nid = 0x02;
5047 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
5049 codec->patch_ops = alc_patch_ops;
5051 if (board_config == ALC_MODEL_AUTO)
5052 spec->init_hook = alc_auto_init_std;
5053 spec->shutup = alc_eapd_shutup;
5054 #ifdef CONFIG_SND_HDA_POWER_SAVE
5055 if (!spec->loopback.amplist)
5056 spec->loopback.amplist = alc861vd_loopbacks;
5065 * ALC662 is almost identical with ALC880 but has cleaner and more flexible
5066 * configuration. Each pin widget can choose any input DACs and a mixer.
5067 * Each ADC is connected from a mixer of all inputs. This makes possible
5068 * 6-channel independent captures.
5070 * In addition, an independent DAC for the multi-playback (not used in this
5073 #ifdef CONFIG_SND_HDA_POWER_SAVE
5074 #define alc662_loopbacks alc880_loopbacks
5078 * BIOS auto configuration
5081 static int alc662_parse_auto_config(struct hda_codec *codec)
5083 static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
5084 static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 };
5085 static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 };
5086 const hda_nid_t *ssids;
5088 if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
5089 codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670)
5090 ssids = alc663_ssids;
5092 ssids = alc662_ssids;
5093 return alc_parse_auto_config(codec, alc662_ignore, ssids);
5096 static void alc272_fixup_mario(struct hda_codec *codec,
5097 const struct alc_fixup *fix, int action)
5099 if (action != ALC_FIXUP_ACT_PROBE)
5101 if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
5102 (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
5103 (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
5104 (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
5105 (0 << AC_AMPCAP_MUTE_SHIFT)))
5107 "hda_codec: failed to override amp caps for NID 0x2\n");
5111 ALC662_FIXUP_ASPIRE,
5112 ALC662_FIXUP_IDEAPAD,
5114 ALC662_FIXUP_CZC_P10T,
5115 ALC662_FIXUP_SKU_IGNORE,
5116 ALC662_FIXUP_HP_RP5800,
5119 static const struct alc_fixup alc662_fixups[] = {
5120 [ALC662_FIXUP_ASPIRE] = {
5121 .type = ALC_FIXUP_PINS,
5122 .v.pins = (const struct alc_pincfg[]) {
5123 { 0x15, 0x99130112 }, /* subwoofer */
5127 [ALC662_FIXUP_IDEAPAD] = {
5128 .type = ALC_FIXUP_PINS,
5129 .v.pins = (const struct alc_pincfg[]) {
5130 { 0x17, 0x99130112 }, /* subwoofer */
5134 [ALC272_FIXUP_MARIO] = {
5135 .type = ALC_FIXUP_FUNC,
5136 .v.func = alc272_fixup_mario,
5138 [ALC662_FIXUP_CZC_P10T] = {
5139 .type = ALC_FIXUP_VERBS,
5140 .v.verbs = (const struct hda_verb[]) {
5141 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
5145 [ALC662_FIXUP_SKU_IGNORE] = {
5146 .type = ALC_FIXUP_SKU,
5147 .v.sku = ALC_FIXUP_SKU_IGNORE,
5149 [ALC662_FIXUP_HP_RP5800] = {
5150 .type = ALC_FIXUP_PINS,
5151 .v.pins = (const struct alc_pincfg[]) {
5152 { 0x14, 0x0221201f }, /* HP out */
5156 .chain_id = ALC662_FIXUP_SKU_IGNORE
5160 static const struct snd_pci_quirk alc662_fixup_tbl[] = {
5161 SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
5162 SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
5163 SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
5164 SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
5165 SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
5166 SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
5167 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
5168 SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
5172 static const struct alc_model_fixup alc662_fixup_models[] = {
5173 {.id = ALC272_FIXUP_MARIO, .name = "mario"},
5180 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
5181 #include "alc662_quirks.c"
5184 static int patch_alc662(struct hda_codec *codec)
5186 struct alc_spec *spec;
5187 int err, board_config;
5190 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5196 spec->mixer_nid = 0x0b;
5198 alc_auto_parse_customize_define(codec);
5200 alc_fix_pll_init(codec, 0x20, 0x04, 15);
5202 coef = alc_read_coef_idx(codec, 0);
5203 if (coef == 0x8020 || coef == 0x8011)
5204 alc_codec_rename(codec, "ALC661");
5205 else if (coef & (1 << 14) &&
5206 codec->bus->pci->subsystem_vendor == 0x1025 &&
5207 spec->cdefine.platform_type == 1)
5208 alc_codec_rename(codec, "ALC272X");
5209 else if (coef == 0x4011)
5210 alc_codec_rename(codec, "ALC656");
5212 board_config = alc_board_config(codec, ALC662_MODEL_LAST,
5213 alc662_models, alc662_cfg_tbl);
5214 if (board_config < 0) {
5215 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5217 board_config = ALC_MODEL_AUTO;
5220 if (board_config == ALC_MODEL_AUTO) {
5221 alc_pick_fixup(codec, alc662_fixup_models,
5222 alc662_fixup_tbl, alc662_fixups);
5223 alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
5224 /* automatic parse from the BIOS config */
5225 err = alc662_parse_auto_config(codec);
5230 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
5233 "hda_codec: Cannot set up configuration "
5234 "from BIOS. Using base mode...\n");
5235 board_config = ALC662_3ST_2ch_DIG;
5240 if (board_config != ALC_MODEL_AUTO)
5241 setup_preset(codec, &alc662_presets[board_config]);
5243 if (!spec->no_analog && !spec->adc_nids) {
5244 alc_auto_fill_adc_caps(codec);
5245 alc_rebuild_imux_for_auto_mic(codec);
5246 alc_remove_invalid_adc_nids(codec);
5249 if (!spec->no_analog && !spec->cap_mixer)
5250 set_capture_mixer(codec);
5252 if (!spec->no_analog && has_cdefine_beep(codec)) {
5253 err = snd_hda_attach_beep_device(codec, 0x1);
5258 switch (codec->vendor_id) {
5260 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
5265 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
5268 set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
5272 spec->vmaster_nid = 0x02;
5274 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
5276 codec->patch_ops = alc_patch_ops;
5277 if (board_config == ALC_MODEL_AUTO)
5278 spec->init_hook = alc_auto_init_std;
5279 spec->shutup = alc_eapd_shutup;
5281 alc_init_jacks(codec);
5283 #ifdef CONFIG_SND_HDA_POWER_SAVE
5284 if (!spec->loopback.amplist)
5285 spec->loopback.amplist = alc662_loopbacks;
5291 static int patch_alc888(struct hda_codec *codec)
5293 if ((alc_read_coef_idx(codec, 0) & 0x00f0)==0x0030){
5294 kfree(codec->chip_name);
5295 if (codec->vendor_id == 0x10ec0887)
5296 codec->chip_name = kstrdup("ALC887-VD", GFP_KERNEL);
5298 codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL);
5299 if (!codec->chip_name) {
5303 return patch_alc662(codec);
5305 return patch_alc882(codec);
5308 static int patch_alc899(struct hda_codec *codec)
5310 if ((alc_read_coef_idx(codec, 0) & 0x2000) != 0x2000) {
5311 kfree(codec->chip_name);
5312 codec->chip_name = kstrdup("ALC898", GFP_KERNEL);
5314 return patch_alc882(codec);
5321 static int alc680_parse_auto_config(struct hda_codec *codec)
5323 return alc_parse_auto_config(codec, NULL, NULL);
5328 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
5329 #include "alc680_quirks.c"
5332 static int patch_alc680(struct hda_codec *codec)
5334 struct alc_spec *spec;
5338 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5344 /* ALC680 has no aa-loopback mixer */
5346 board_config = alc_board_config(codec, ALC680_MODEL_LAST,
5347 alc680_models, alc680_cfg_tbl);
5349 if (board_config < 0) {
5350 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5352 board_config = ALC_MODEL_AUTO;
5355 if (board_config == ALC_MODEL_AUTO) {
5356 /* automatic parse from the BIOS config */
5357 err = alc680_parse_auto_config(codec);
5362 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
5365 "hda_codec: Cannot set up configuration "
5366 "from BIOS. Using base mode...\n");
5367 board_config = ALC680_BASE;
5372 if (board_config != ALC_MODEL_AUTO) {
5373 setup_preset(codec, &alc680_presets[board_config]);
5374 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
5375 spec->stream_analog_capture = &alc680_pcm_analog_auto_capture;
5379 if (!spec->no_analog && !spec->adc_nids) {
5380 alc_auto_fill_adc_caps(codec);
5381 alc_rebuild_imux_for_auto_mic(codec);
5382 alc_remove_invalid_adc_nids(codec);
5385 if (!spec->no_analog && !spec->cap_mixer)
5386 set_capture_mixer(codec);
5388 spec->vmaster_nid = 0x02;
5390 codec->patch_ops = alc_patch_ops;
5391 if (board_config == ALC_MODEL_AUTO)
5392 spec->init_hook = alc_auto_init_std;
5400 static const struct hda_codec_preset snd_hda_preset_realtek[] = {
5401 { .id = 0x10ec0221, .name = "ALC221", .patch = patch_alc269 },
5402 { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
5403 { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
5404 { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
5405 { .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
5406 { .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
5407 { .id = 0x10ec0270, .name = "ALC270", .patch = patch_alc269 },
5408 { .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
5409 { .id = 0x10ec0275, .name = "ALC275", .patch = patch_alc269 },
5410 { .id = 0x10ec0276, .name = "ALC276", .patch = patch_alc269 },
5411 { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
5412 .patch = patch_alc861 },
5413 { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
5414 { .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 },
5415 { .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd },
5416 { .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2",
5417 .patch = patch_alc882 },
5418 { .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1",
5419 .patch = patch_alc662 },
5420 { .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
5421 { .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 },
5422 { .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 },
5423 { .id = 0x10ec0680, .name = "ALC680", .patch = patch_alc680 },
5424 { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
5425 { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
5426 { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
5427 { .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
5428 .patch = patch_alc882 },
5429 { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
5430 .patch = patch_alc882 },
5431 { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
5432 { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc888 },
5433 { .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200",
5434 .patch = patch_alc882 },
5435 { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 },
5436 { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
5437 { .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 },
5438 { .id = 0x10ec0899, .name = "ALC899", .patch = patch_alc899 },
5442 MODULE_ALIAS("snd-hda-codec-id:10ec*");
5444 MODULE_LICENSE("GPL");
5445 MODULE_DESCRIPTION("Realtek HD-audio codec");
5447 static struct hda_codec_preset_list realtek_list = {
5448 .preset = snd_hda_preset_realtek,
5449 .owner = THIS_MODULE,
5452 static int __init patch_realtek_init(void)
5454 return snd_hda_add_codec_preset(&realtek_list);
5457 static void __exit patch_realtek_exit(void)
5459 snd_hda_delete_codec_preset(&realtek_list);
5462 module_init(patch_realtek_init)
5463 module_exit(patch_realtek_exit)