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 */
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 */
212 static int alc_mux_enum_info(struct snd_kcontrol *kcontrol,
213 struct snd_ctl_elem_info *uinfo)
215 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
216 struct alc_spec *spec = codec->spec;
217 unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id);
218 if (mux_idx >= spec->num_mux_defs)
220 if (!spec->input_mux[mux_idx].num_items && mux_idx > 0)
222 return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo);
225 static int alc_mux_enum_get(struct snd_kcontrol *kcontrol,
226 struct snd_ctl_elem_value *ucontrol)
228 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
229 struct alc_spec *spec = codec->spec;
230 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
232 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
236 static bool alc_dyn_adc_pcm_resetup(struct hda_codec *codec, int cur)
238 struct alc_spec *spec = codec->spec;
239 hda_nid_t new_adc = spec->adc_nids[spec->dyn_adc_idx[cur]];
241 if (spec->cur_adc && spec->cur_adc != new_adc) {
242 /* stream is running, let's swap the current ADC */
243 __snd_hda_codec_cleanup_stream(codec, spec->cur_adc, 1);
244 spec->cur_adc = new_adc;
245 snd_hda_codec_setup_stream(codec, new_adc,
246 spec->cur_adc_stream_tag, 0,
247 spec->cur_adc_format);
253 /* select the given imux item; either unmute exclusively or select the route */
254 static int alc_mux_select(struct hda_codec *codec, unsigned int adc_idx,
255 unsigned int idx, bool force)
257 struct alc_spec *spec = codec->spec;
258 const struct hda_input_mux *imux;
259 unsigned int mux_idx;
263 mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
264 imux = &spec->input_mux[mux_idx];
265 if (!imux->num_items && mux_idx > 0)
266 imux = &spec->input_mux[0];
268 if (idx >= imux->num_items)
269 idx = imux->num_items - 1;
270 if (spec->cur_mux[adc_idx] == idx && !force)
272 spec->cur_mux[adc_idx] = idx;
274 if (spec->dyn_adc_switch) {
275 alc_dyn_adc_pcm_resetup(codec, idx);
276 adc_idx = spec->dyn_adc_idx[idx];
279 nid = spec->capsrc_nids ?
280 spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx];
283 if (snd_hda_get_conn_list(codec, nid, NULL) <= 1)
286 type = get_wcaps_type(get_wcaps(codec, nid));
287 if (type == AC_WID_AUD_MIX) {
288 /* Matrix-mixer style (e.g. ALC882) */
289 for (i = 0; i < imux->num_items; i++) {
290 unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE;
291 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT,
292 imux->items[i].index,
296 /* MUX style (e.g. ALC880) */
297 snd_hda_codec_write_cache(codec, nid, 0,
298 AC_VERB_SET_CONNECT_SEL,
299 imux->items[idx].index);
304 static int alc_mux_enum_put(struct snd_kcontrol *kcontrol,
305 struct snd_ctl_elem_value *ucontrol)
307 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
308 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
309 return alc_mux_select(codec, adc_idx,
310 ucontrol->value.enumerated.item[0], false);
314 * set up the input pin config (depending on the given auto-pin type)
316 static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid,
319 unsigned int val = PIN_IN;
321 if (auto_pin_type == AUTO_PIN_MIC) {
324 oldval = snd_hda_codec_read(codec, nid, 0,
325 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
326 pincap = snd_hda_query_pin_caps(codec, nid);
327 pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
328 /* if the default pin setup is vref50, we give it priority */
329 if ((pincap & AC_PINCAP_VREF_80) && oldval != PIN_VREF50)
331 else if (pincap & AC_PINCAP_VREF_50)
333 else if (pincap & AC_PINCAP_VREF_100)
335 else if (pincap & AC_PINCAP_VREF_GRD)
338 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val);
342 * Append the given mixer and verb elements for the later use
343 * The mixer array is referred in build_controls(), and init_verbs are
346 static void add_mixer(struct alc_spec *spec, const struct snd_kcontrol_new *mix)
348 if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers)))
350 spec->mixers[spec->num_mixers++] = mix;
353 static void add_verb(struct alc_spec *spec, const struct hda_verb *verb)
355 if (snd_BUG_ON(spec->num_init_verbs >= ARRAY_SIZE(spec->init_verbs)))
357 spec->init_verbs[spec->num_init_verbs++] = verb;
361 * GPIO setup tables, used in initialization
363 /* Enable GPIO mask and set output */
364 static const struct hda_verb alc_gpio1_init_verbs[] = {
365 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
366 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
367 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
371 static const struct hda_verb alc_gpio2_init_verbs[] = {
372 {0x01, AC_VERB_SET_GPIO_MASK, 0x02},
373 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
374 {0x01, AC_VERB_SET_GPIO_DATA, 0x02},
378 static const struct hda_verb alc_gpio3_init_verbs[] = {
379 {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
380 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
381 {0x01, AC_VERB_SET_GPIO_DATA, 0x03},
386 * Fix hardware PLL issue
387 * On some codecs, the analog PLL gating control must be off while
388 * the default value is 1.
390 static void alc_fix_pll(struct hda_codec *codec)
392 struct alc_spec *spec = codec->spec;
397 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
399 val = snd_hda_codec_read(codec, spec->pll_nid, 0,
400 AC_VERB_GET_PROC_COEF, 0);
401 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
403 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF,
404 val & ~(1 << spec->pll_coef_bit));
407 static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
408 unsigned int coef_idx, unsigned int coef_bit)
410 struct alc_spec *spec = codec->spec;
412 spec->pll_coef_idx = coef_idx;
413 spec->pll_coef_bit = coef_bit;
418 * Jack-reporting via input-jack layer
421 /* initialization of jacks; currently checks only a few known pins */
422 static int alc_init_jacks(struct hda_codec *codec)
424 #ifdef CONFIG_SND_HDA_INPUT_JACK
425 struct alc_spec *spec = codec->spec;
427 unsigned int hp_nid = spec->autocfg.hp_pins[0];
428 unsigned int mic_nid = spec->ext_mic_pin;
429 unsigned int dock_nid = spec->dock_mic_pin;
432 err = snd_hda_input_jack_add(codec, hp_nid,
433 SND_JACK_HEADPHONE, NULL);
436 snd_hda_input_jack_report(codec, hp_nid);
440 err = snd_hda_input_jack_add(codec, mic_nid,
441 SND_JACK_MICROPHONE, NULL);
444 snd_hda_input_jack_report(codec, mic_nid);
447 err = snd_hda_input_jack_add(codec, dock_nid,
448 SND_JACK_MICROPHONE, NULL);
451 snd_hda_input_jack_report(codec, dock_nid);
453 #endif /* CONFIG_SND_HDA_INPUT_JACK */
458 * Jack detections for HP auto-mute and mic-switch
461 /* check each pin in the given array; returns true if any of them is plugged */
462 static bool detect_jacks(struct hda_codec *codec, int num_pins, hda_nid_t *pins)
466 for (i = 0; i < num_pins; i++) {
467 hda_nid_t nid = pins[i];
470 snd_hda_input_jack_report(codec, nid);
471 present |= snd_hda_jack_detect(codec, nid);
476 /* standard HP/line-out auto-mute helper */
477 static void do_automute(struct hda_codec *codec, int num_pins, hda_nid_t *pins,
478 bool mute, bool hp_out)
480 struct alc_spec *spec = codec->spec;
481 unsigned int mute_bits = mute ? HDA_AMP_MUTE : 0;
482 unsigned int pin_bits = mute ? 0 : (hp_out ? PIN_HP : PIN_OUT);
485 for (i = 0; i < num_pins; i++) {
486 hda_nid_t nid = pins[i];
489 switch (spec->automute_mode) {
490 case ALC_AUTOMUTE_PIN:
491 snd_hda_codec_write(codec, nid, 0,
492 AC_VERB_SET_PIN_WIDGET_CONTROL,
495 case ALC_AUTOMUTE_AMP:
496 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
497 HDA_AMP_MUTE, mute_bits);
499 case ALC_AUTOMUTE_MIXER:
500 nid = spec->automute_mixer_nid[i];
503 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
504 HDA_AMP_MUTE, mute_bits);
505 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 1,
506 HDA_AMP_MUTE, mute_bits);
512 /* Toggle internal speakers muting */
513 static void update_speakers(struct hda_codec *codec)
515 struct alc_spec *spec = codec->spec;
518 /* Control HP pins/amps depending on master_mute state;
519 * in general, HP pins/amps control should be enabled in all cases,
520 * but currently set only for master_mute, just to be safe
522 do_automute(codec, ARRAY_SIZE(spec->autocfg.hp_pins),
523 spec->autocfg.hp_pins, spec->master_mute, true);
528 on = spec->jack_present | spec->line_jack_present;
529 on |= spec->master_mute;
530 do_automute(codec, ARRAY_SIZE(spec->autocfg.speaker_pins),
531 spec->autocfg.speaker_pins, on, false);
533 /* toggle line-out mutes if needed, too */
534 /* if LO is a copy of either HP or Speaker, don't need to handle it */
535 if (spec->autocfg.line_out_pins[0] == spec->autocfg.hp_pins[0] ||
536 spec->autocfg.line_out_pins[0] == spec->autocfg.speaker_pins[0])
538 if (!spec->automute_lines || !spec->automute)
541 on = spec->jack_present;
542 on |= spec->master_mute;
543 do_automute(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),
544 spec->autocfg.line_out_pins, on, false);
547 /* standard HP-automute helper */
548 static void alc_hp_automute(struct hda_codec *codec)
550 struct alc_spec *spec = codec->spec;
555 detect_jacks(codec, ARRAY_SIZE(spec->autocfg.hp_pins),
556 spec->autocfg.hp_pins);
557 update_speakers(codec);
560 /* standard line-out-automute helper */
561 static void alc_line_automute(struct hda_codec *codec)
563 struct alc_spec *spec = codec->spec;
565 if (!spec->automute || !spec->detect_line)
567 spec->line_jack_present =
568 detect_jacks(codec, ARRAY_SIZE(spec->autocfg.line_out_pins),
569 spec->autocfg.line_out_pins);
570 update_speakers(codec);
573 #define get_connection_index(codec, mux, nid) \
574 snd_hda_get_conn_index(codec, mux, nid, 0)
576 /* standard mic auto-switch helper */
577 static void alc_mic_automute(struct hda_codec *codec)
579 struct alc_spec *spec = codec->spec;
580 hda_nid_t *pins = spec->imux_pins;
582 if (!spec->auto_mic || !spec->auto_mic_valid_imux)
584 if (snd_BUG_ON(!spec->adc_nids))
586 if (snd_BUG_ON(spec->int_mic_idx < 0 || spec->ext_mic_idx < 0))
589 if (snd_hda_jack_detect(codec, pins[spec->ext_mic_idx]))
590 alc_mux_select(codec, 0, spec->ext_mic_idx, false);
591 else if (spec->dock_mic_idx >= 0 &&
592 snd_hda_jack_detect(codec, pins[spec->dock_mic_idx]))
593 alc_mux_select(codec, 0, spec->dock_mic_idx, false);
595 alc_mux_select(codec, 0, spec->int_mic_idx, false);
597 snd_hda_input_jack_report(codec, pins[spec->ext_mic_idx]);
598 if (spec->dock_mic_idx >= 0)
599 snd_hda_input_jack_report(codec, pins[spec->dock_mic_idx]);
602 /* unsolicited event for HP jack sensing */
603 static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
605 if (codec->vendor_id == 0x10ec0880)
611 alc_hp_automute(codec);
613 case ALC_FRONT_EVENT:
614 alc_line_automute(codec);
617 alc_mic_automute(codec);
622 /* call init functions of standard auto-mute helpers */
623 static void alc_inithook(struct hda_codec *codec)
625 alc_hp_automute(codec);
626 alc_line_automute(codec);
627 alc_mic_automute(codec);
630 /* additional initialization for ALC888 variants */
631 static void alc888_coef_init(struct hda_codec *codec)
635 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0);
636 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
637 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
638 if ((tmp & 0xf0) == 0x20)
640 snd_hda_codec_read(codec, 0x20, 0,
641 AC_VERB_SET_PROC_COEF, 0x830);
644 snd_hda_codec_read(codec, 0x20, 0,
645 AC_VERB_SET_PROC_COEF, 0x3030);
648 /* additional initialization for ALC889 variants */
649 static void alc889_coef_init(struct hda_codec *codec)
653 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
654 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
655 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
656 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, tmp|0x2010);
659 /* turn on/off EAPD control (only if available) */
660 static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
662 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
664 if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
665 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
669 /* turn on/off EAPD controls of the codec */
670 static void alc_auto_setup_eapd(struct hda_codec *codec, bool on)
672 /* We currently only handle front, HP */
673 static hda_nid_t pins[] = {
674 0x0f, 0x10, 0x14, 0x15, 0
677 for (p = pins; *p; p++)
678 set_eapd(codec, *p, on);
681 /* generic shutup callback;
682 * just turning off EPAD and a little pause for avoiding pop-noise
684 static void alc_eapd_shutup(struct hda_codec *codec)
686 alc_auto_setup_eapd(codec, false);
690 /* generic EAPD initialization */
691 static void alc_auto_init_amp(struct hda_codec *codec, int type)
695 alc_auto_setup_eapd(codec, true);
698 snd_hda_sequence_write(codec, alc_gpio1_init_verbs);
701 snd_hda_sequence_write(codec, alc_gpio2_init_verbs);
704 snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
706 case ALC_INIT_DEFAULT:
707 switch (codec->vendor_id) {
709 snd_hda_codec_write(codec, 0x1a, 0,
710 AC_VERB_SET_COEF_INDEX, 7);
711 tmp = snd_hda_codec_read(codec, 0x1a, 0,
712 AC_VERB_GET_PROC_COEF, 0);
713 snd_hda_codec_write(codec, 0x1a, 0,
714 AC_VERB_SET_COEF_INDEX, 7);
715 snd_hda_codec_write(codec, 0x1a, 0,
716 AC_VERB_SET_PROC_COEF,
725 /*case 0x10ec0889:*/ /* this causes an SPDIF problem */
726 alc889_coef_init(codec);
729 alc888_coef_init(codec);
731 #if 0 /* XXX: This may cause the silent output on speaker on some machines */
734 snd_hda_codec_write(codec, 0x20, 0,
735 AC_VERB_SET_COEF_INDEX, 7);
736 tmp = snd_hda_codec_read(codec, 0x20, 0,
737 AC_VERB_GET_PROC_COEF, 0);
738 snd_hda_codec_write(codec, 0x20, 0,
739 AC_VERB_SET_COEF_INDEX, 7);
740 snd_hda_codec_write(codec, 0x20, 0,
741 AC_VERB_SET_PROC_COEF,
751 * Auto-Mute mode mixer enum support
753 static int alc_automute_mode_info(struct snd_kcontrol *kcontrol,
754 struct snd_ctl_elem_info *uinfo)
756 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
757 struct alc_spec *spec = codec->spec;
758 static const char * const texts2[] = {
759 "Disabled", "Enabled"
761 static const char * const texts3[] = {
762 "Disabled", "Speaker Only", "Line-Out+Speaker"
764 const char * const *texts;
766 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
768 if (spec->automute_hp_lo) {
769 uinfo->value.enumerated.items = 3;
772 uinfo->value.enumerated.items = 2;
775 if (uinfo->value.enumerated.item >= uinfo->value.enumerated.items)
776 uinfo->value.enumerated.item = uinfo->value.enumerated.items - 1;
777 strcpy(uinfo->value.enumerated.name,
778 texts[uinfo->value.enumerated.item]);
782 static int alc_automute_mode_get(struct snd_kcontrol *kcontrol,
783 struct snd_ctl_elem_value *ucontrol)
785 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
786 struct alc_spec *spec = codec->spec;
790 else if (!spec->automute_lines)
794 ucontrol->value.enumerated.item[0] = val;
798 static int alc_automute_mode_put(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;
804 switch (ucontrol->value.enumerated.item[0]) {
811 if (spec->automute && !spec->automute_lines)
814 spec->automute_lines = 0;
817 if (!spec->automute_hp_lo)
819 if (spec->automute && spec->automute_lines)
822 spec->automute_lines = 1;
827 update_speakers(codec);
831 static const struct snd_kcontrol_new alc_automute_mode_enum = {
832 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
833 .name = "Auto-Mute Mode",
834 .info = alc_automute_mode_info,
835 .get = alc_automute_mode_get,
836 .put = alc_automute_mode_put,
839 static struct snd_kcontrol_new *alc_kcontrol_new(struct alc_spec *spec)
841 snd_array_init(&spec->kctls, sizeof(struct snd_kcontrol_new), 32);
842 return snd_array_new(&spec->kctls);
845 static int alc_add_automute_mode_enum(struct hda_codec *codec)
847 struct alc_spec *spec = codec->spec;
848 struct snd_kcontrol_new *knew;
850 knew = alc_kcontrol_new(spec);
853 *knew = alc_automute_mode_enum;
854 knew->name = kstrdup("Auto-Mute Mode", GFP_KERNEL);
861 * Check the availability of HP/line-out auto-mute;
862 * Set up appropriately if really supported
864 static void alc_init_auto_hp(struct hda_codec *codec)
866 struct alc_spec *spec = codec->spec;
867 struct auto_pin_cfg *cfg = &spec->autocfg;
873 if (cfg->line_out_pins[0])
875 if (cfg->speaker_pins[0])
877 if (present < 2) /* need two different output types */
880 spec->automute_hp_lo = 1; /* both HP and LO automute */
882 if (!cfg->speaker_pins[0]) {
883 memcpy(cfg->speaker_pins, cfg->line_out_pins,
884 sizeof(cfg->speaker_pins));
885 cfg->speaker_outs = cfg->line_outs;
888 if (!cfg->hp_pins[0]) {
889 memcpy(cfg->hp_pins, cfg->line_out_pins,
890 sizeof(cfg->hp_pins));
891 cfg->hp_outs = cfg->line_outs;
894 for (i = 0; i < cfg->hp_outs; i++) {
895 hda_nid_t nid = cfg->hp_pins[i];
896 if (!is_jack_detectable(codec, nid))
898 snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n",
900 snd_hda_codec_write_cache(codec, nid, 0,
901 AC_VERB_SET_UNSOLICITED_ENABLE,
902 AC_USRSP_EN | ALC_HP_EVENT);
904 spec->automute_mode = ALC_AUTOMUTE_PIN;
906 if (spec->automute && cfg->line_out_pins[0] &&
907 cfg->line_out_pins[0] != cfg->hp_pins[0] &&
908 cfg->line_out_pins[0] != cfg->speaker_pins[0]) {
909 for (i = 0; i < cfg->line_outs; i++) {
910 hda_nid_t nid = cfg->line_out_pins[i];
911 if (!is_jack_detectable(codec, nid))
913 snd_printdd("realtek: Enable Line-Out auto-muting "
914 "on NID 0x%x\n", nid);
915 snd_hda_codec_write_cache(codec, nid, 0,
916 AC_VERB_SET_UNSOLICITED_ENABLE,
917 AC_USRSP_EN | ALC_FRONT_EVENT);
918 spec->detect_line = 1;
920 spec->automute_lines = spec->detect_line;
923 if (spec->automute) {
924 /* create a control for automute mode */
925 alc_add_automute_mode_enum(codec);
926 spec->unsol_event = alc_sku_unsol_event;
930 /* return the position of NID in the list, or -1 if not found */
931 static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
934 for (i = 0; i < nums; i++)
940 /* check whether dynamic ADC-switching is available */
941 static bool alc_check_dyn_adc_switch(struct hda_codec *codec)
943 struct alc_spec *spec = codec->spec;
944 struct hda_input_mux *imux = &spec->private_imux[0];
948 if (imux != spec->input_mux) /* no dynamic imux? */
951 for (n = 0; n < spec->num_adc_nids; n++) {
952 cap = spec->private_capsrc_nids[n];
953 for (i = 0; i < imux->num_items; i++) {
954 pin = spec->imux_pins[i];
957 if (get_connection_index(codec, cap, pin) < 0)
960 if (i >= imux->num_items)
961 return false; /* no ADC-switch is needed */
964 for (i = 0; i < imux->num_items; i++) {
965 pin = spec->imux_pins[i];
966 for (n = 0; n < spec->num_adc_nids; n++) {
967 cap = spec->private_capsrc_nids[n];
968 idx = get_connection_index(codec, cap, pin);
970 imux->items[i].index = idx;
971 spec->dyn_adc_idx[i] = n;
977 snd_printdd("realtek: enabling ADC switching\n");
978 spec->dyn_adc_switch = 1;
982 /* rebuild imux for matching with the given auto-mic pins (if not yet) */
983 static bool alc_rebuild_imux_for_auto_mic(struct hda_codec *codec)
985 struct alc_spec *spec = codec->spec;
986 struct hda_input_mux *imux;
987 static char * const texts[3] = {
988 "Mic", "Internal Mic", "Dock Mic"
994 imux = &spec->private_imux[0];
995 if (spec->input_mux == imux)
997 spec->imux_pins[0] = spec->ext_mic_pin;
998 spec->imux_pins[1] = spec->int_mic_pin;
999 spec->imux_pins[2] = spec->dock_mic_pin;
1000 for (i = 0; i < 3; i++) {
1001 strcpy(imux->items[i].label, texts[i]);
1002 if (spec->imux_pins[i])
1003 imux->num_items = i + 1;
1005 spec->num_mux_defs = 1;
1006 spec->input_mux = imux;
1010 /* check whether all auto-mic pins are valid; setup indices if OK */
1011 static bool alc_auto_mic_check_imux(struct hda_codec *codec)
1013 struct alc_spec *spec = codec->spec;
1014 const struct hda_input_mux *imux;
1016 if (!spec->auto_mic)
1018 if (spec->auto_mic_valid_imux)
1019 return true; /* already checked */
1021 /* fill up imux indices */
1022 if (!alc_check_dyn_adc_switch(codec)) {
1027 imux = spec->input_mux;
1028 spec->ext_mic_idx = find_idx_in_nid_list(spec->ext_mic_pin,
1029 spec->imux_pins, imux->num_items);
1030 spec->int_mic_idx = find_idx_in_nid_list(spec->int_mic_pin,
1031 spec->imux_pins, imux->num_items);
1032 spec->dock_mic_idx = find_idx_in_nid_list(spec->dock_mic_pin,
1033 spec->imux_pins, imux->num_items);
1034 if (spec->ext_mic_idx < 0 || spec->int_mic_idx < 0) {
1036 return false; /* no corresponding imux */
1039 snd_hda_codec_write_cache(codec, spec->ext_mic_pin, 0,
1040 AC_VERB_SET_UNSOLICITED_ENABLE,
1041 AC_USRSP_EN | ALC_MIC_EVENT);
1042 if (spec->dock_mic_pin)
1043 snd_hda_codec_write_cache(codec, spec->dock_mic_pin, 0,
1044 AC_VERB_SET_UNSOLICITED_ENABLE,
1045 AC_USRSP_EN | ALC_MIC_EVENT);
1047 spec->auto_mic_valid_imux = 1;
1053 * Check the availability of auto-mic switch;
1054 * Set up if really supported
1056 static void alc_init_auto_mic(struct hda_codec *codec)
1058 struct alc_spec *spec = codec->spec;
1059 struct auto_pin_cfg *cfg = &spec->autocfg;
1060 hda_nid_t fixed, ext, dock;
1063 spec->ext_mic_idx = spec->int_mic_idx = spec->dock_mic_idx = -1;
1065 fixed = ext = dock = 0;
1066 for (i = 0; i < cfg->num_inputs; i++) {
1067 hda_nid_t nid = cfg->inputs[i].pin;
1068 unsigned int defcfg;
1069 defcfg = snd_hda_codec_get_pincfg(codec, nid);
1070 switch (snd_hda_get_input_pin_attr(defcfg)) {
1071 case INPUT_PIN_ATTR_INT:
1073 return; /* already occupied */
1074 if (cfg->inputs[i].type != AUTO_PIN_MIC)
1075 return; /* invalid type */
1078 case INPUT_PIN_ATTR_UNUSED:
1079 return; /* invalid entry */
1080 case INPUT_PIN_ATTR_DOCK:
1082 return; /* already occupied */
1083 if (cfg->inputs[i].type > AUTO_PIN_LINE_IN)
1084 return; /* invalid type */
1089 return; /* already occupied */
1090 if (cfg->inputs[i].type != AUTO_PIN_MIC)
1091 return; /* invalid type */
1102 if (!is_jack_detectable(codec, ext))
1103 return; /* no unsol support */
1104 if (dock && !is_jack_detectable(codec, dock))
1105 return; /* no unsol support */
1107 /* check imux indices */
1108 spec->ext_mic_pin = ext;
1109 spec->int_mic_pin = fixed;
1110 spec->dock_mic_pin = dock;
1113 if (!alc_auto_mic_check_imux(codec))
1116 snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x/0x%x\n",
1118 spec->unsol_event = alc_sku_unsol_event;
1121 /* check the availabilities of auto-mute and auto-mic switches */
1122 static void alc_auto_check_switches(struct hda_codec *codec)
1124 alc_init_auto_hp(codec);
1125 alc_init_auto_mic(codec);
1129 * Realtek SSID verification
1132 /* Could be any non-zero and even value. When used as fixup, tells
1133 * the driver to ignore any present sku defines.
1135 #define ALC_FIXUP_SKU_IGNORE (2)
1137 static int alc_auto_parse_customize_define(struct hda_codec *codec)
1139 unsigned int ass, tmp, i;
1141 struct alc_spec *spec = codec->spec;
1143 spec->cdefine.enable_pcbeep = 1; /* assume always enabled */
1145 if (spec->cdefine.fixup) {
1146 ass = spec->cdefine.sku_cfg;
1147 if (ass == ALC_FIXUP_SKU_IGNORE)
1152 ass = codec->subsystem_id & 0xffff;
1153 if (ass != codec->bus->pci->subsystem_device && (ass & 1))
1157 if (codec->vendor_id == 0x10ec0260)
1159 ass = snd_hda_codec_get_pincfg(codec, nid);
1162 printk(KERN_INFO "hda_codec: %s: SKU not ready 0x%08x\n",
1163 codec->chip_name, ass);
1169 for (i = 1; i < 16; i++) {
1173 if (((ass >> 16) & 0xf) != tmp)
1176 spec->cdefine.port_connectivity = ass >> 30;
1177 spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
1178 spec->cdefine.check_sum = (ass >> 16) & 0xf;
1179 spec->cdefine.customization = ass >> 8;
1181 spec->cdefine.sku_cfg = ass;
1182 spec->cdefine.external_amp = (ass & 0x38) >> 3;
1183 spec->cdefine.platform_type = (ass & 0x4) >> 2;
1184 spec->cdefine.swap = (ass & 0x2) >> 1;
1185 spec->cdefine.override = ass & 0x1;
1187 snd_printd("SKU: Nid=0x%x sku_cfg=0x%08x\n",
1188 nid, spec->cdefine.sku_cfg);
1189 snd_printd("SKU: port_connectivity=0x%x\n",
1190 spec->cdefine.port_connectivity);
1191 snd_printd("SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
1192 snd_printd("SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
1193 snd_printd("SKU: customization=0x%08x\n", spec->cdefine.customization);
1194 snd_printd("SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
1195 snd_printd("SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
1196 snd_printd("SKU: swap=0x%x\n", spec->cdefine.swap);
1197 snd_printd("SKU: override=0x%x\n", spec->cdefine.override);
1202 /* return true if the given NID is found in the list */
1203 static bool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
1205 return find_idx_in_nid_list(nid, list, nums) >= 0;
1208 /* check subsystem ID and set up device-specific initialization;
1209 * return 1 if initialized, 0 if invalid SSID
1211 /* 32-bit subsystem ID for BIOS loading in HD Audio codec.
1212 * 31 ~ 16 : Manufacture ID
1214 * 7 ~ 0 : Assembly ID
1215 * port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
1217 static int alc_subsystem_id(struct hda_codec *codec,
1218 hda_nid_t porta, hda_nid_t porte,
1219 hda_nid_t portd, hda_nid_t porti)
1221 unsigned int ass, tmp, i;
1223 struct alc_spec *spec = codec->spec;
1225 if (spec->cdefine.fixup) {
1226 ass = spec->cdefine.sku_cfg;
1227 if (ass == ALC_FIXUP_SKU_IGNORE)
1232 ass = codec->subsystem_id & 0xffff;
1233 if ((ass != codec->bus->pci->subsystem_device) && (ass & 1))
1236 /* invalid SSID, check the special NID pin defcfg instead */
1238 * 31~30 : port connectivity
1241 * 19~16 : Check sum (15:1)
1246 if (codec->vendor_id == 0x10ec0260)
1248 ass = snd_hda_codec_get_pincfg(codec, nid);
1249 snd_printd("realtek: No valid SSID, "
1250 "checking pincfg 0x%08x for NID 0x%x\n",
1254 if ((ass >> 30) != 1) /* no physical connection */
1259 for (i = 1; i < 16; i++) {
1263 if (((ass >> 16) & 0xf) != tmp)
1266 snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
1267 ass & 0xffff, codec->vendor_id);
1271 * 2 : 0 --> Desktop, 1 --> Laptop
1272 * 3~5 : External Amplifier control
1275 tmp = (ass & 0x38) >> 3; /* external Amp control */
1278 spec->init_amp = ALC_INIT_GPIO1;
1281 spec->init_amp = ALC_INIT_GPIO2;
1284 spec->init_amp = ALC_INIT_GPIO3;
1288 spec->init_amp = ALC_INIT_DEFAULT;
1292 /* is laptop or Desktop and enable the function "Mute internal speaker
1293 * when the external headphone out jack is plugged"
1295 if (!(ass & 0x8000))
1298 * 10~8 : Jack location
1299 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
1301 * 15 : 1 --> enable the function "Mute internal speaker
1302 * when the external headphone out jack is plugged"
1304 if (!spec->autocfg.hp_pins[0]) {
1306 tmp = (ass >> 11) & 0x3; /* HP to chassis */
1317 if (found_in_nid_list(nid, spec->autocfg.line_out_pins,
1318 spec->autocfg.line_outs))
1320 spec->autocfg.hp_pins[0] = nid;
1325 static void alc_ssid_check(struct hda_codec *codec,
1326 hda_nid_t porta, hda_nid_t porte,
1327 hda_nid_t portd, hda_nid_t porti)
1329 if (!alc_subsystem_id(codec, porta, porte, portd, porti)) {
1330 struct alc_spec *spec = codec->spec;
1331 snd_printd("realtek: "
1332 "Enable default setup for auto mode as fallback\n");
1333 spec->init_amp = ALC_INIT_DEFAULT;
1338 * Fix-up pin default configurations and add default verbs
1346 struct alc_model_fixup {
1357 const struct alc_pincfg *pins;
1358 const struct hda_verb *verbs;
1359 void (*func)(struct hda_codec *codec,
1360 const struct alc_fixup *fix,
1374 ALC_FIXUP_ACT_PRE_PROBE,
1375 ALC_FIXUP_ACT_PROBE,
1379 static void alc_apply_fixup(struct hda_codec *codec, int action)
1381 struct alc_spec *spec = codec->spec;
1382 int id = spec->fixup_id;
1383 #ifdef CONFIG_SND_DEBUG_VERBOSE
1384 const char *modelname = spec->fixup_name;
1388 if (!spec->fixup_list)
1392 const struct alc_fixup *fix = spec->fixup_list + id;
1393 const struct alc_pincfg *cfg;
1395 switch (fix->type) {
1397 if (action != ALC_FIXUP_ACT_PRE_PROBE || !fix->v.sku)
1399 snd_printdd(KERN_INFO "hda_codec: %s: "
1400 "Apply sku override for %s\n",
1401 codec->chip_name, modelname);
1402 spec->cdefine.sku_cfg = fix->v.sku;
1403 spec->cdefine.fixup = 1;
1405 case ALC_FIXUP_PINS:
1407 if (action != ALC_FIXUP_ACT_PRE_PROBE || !cfg)
1409 snd_printdd(KERN_INFO "hda_codec: %s: "
1410 "Apply pincfg for %s\n",
1411 codec->chip_name, modelname);
1412 for (; cfg->nid; cfg++)
1413 snd_hda_codec_set_pincfg(codec, cfg->nid,
1416 case ALC_FIXUP_VERBS:
1417 if (action != ALC_FIXUP_ACT_PROBE || !fix->v.verbs)
1419 snd_printdd(KERN_INFO "hda_codec: %s: "
1420 "Apply fix-verbs for %s\n",
1421 codec->chip_name, modelname);
1422 add_verb(codec->spec, fix->v.verbs);
1424 case ALC_FIXUP_FUNC:
1427 snd_printdd(KERN_INFO "hda_codec: %s: "
1428 "Apply fix-func for %s\n",
1429 codec->chip_name, modelname);
1430 fix->v.func(codec, fix, action);
1433 snd_printk(KERN_ERR "hda_codec: %s: "
1434 "Invalid fixup type %d\n",
1435 codec->chip_name, fix->type);
1446 static void alc_pick_fixup(struct hda_codec *codec,
1447 const struct alc_model_fixup *models,
1448 const struct snd_pci_quirk *quirk,
1449 const struct alc_fixup *fixlist)
1451 struct alc_spec *spec = codec->spec;
1453 const char *name = NULL;
1455 if (codec->modelname && models) {
1456 while (models->name) {
1457 if (!strcmp(codec->modelname, models->name)) {
1459 name = models->name;
1466 quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
1469 #ifdef CONFIG_SND_DEBUG_VERBOSE
1475 spec->fixup_id = id;
1477 spec->fixup_list = fixlist;
1478 spec->fixup_name = name;
1483 * COEF access helper functions
1485 static int alc_read_coef_idx(struct hda_codec *codec,
1486 unsigned int coef_idx)
1489 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX,
1491 val = snd_hda_codec_read(codec, 0x20, 0,
1492 AC_VERB_GET_PROC_COEF, 0);
1496 static void alc_write_coef_idx(struct hda_codec *codec, unsigned int coef_idx,
1497 unsigned int coef_val)
1499 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX,
1501 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF,
1506 * Digital I/O handling
1509 /* set right pin controls for digital I/O */
1510 static void alc_auto_init_digital(struct hda_codec *codec)
1512 struct alc_spec *spec = codec->spec;
1516 for (i = 0; i < spec->autocfg.dig_outs; i++) {
1517 pin = spec->autocfg.dig_out_pins[i];
1520 snd_hda_codec_write(codec, pin, 0,
1521 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
1523 dac = spec->multiout.dig_out_nid;
1525 dac = spec->slave_dig_outs[i - 1];
1526 if (!dac || !(get_wcaps(codec, dac) & AC_WCAP_OUT_AMP))
1528 snd_hda_codec_write(codec, dac, 0,
1529 AC_VERB_SET_AMP_GAIN_MUTE,
1532 pin = spec->autocfg.dig_in_pin;
1534 snd_hda_codec_write(codec, pin, 0,
1535 AC_VERB_SET_PIN_WIDGET_CONTROL,
1539 /* parse digital I/Os and set up NIDs in BIOS auto-parse mode */
1540 static void alc_auto_parse_digital(struct hda_codec *codec)
1542 struct alc_spec *spec = codec->spec;
1546 /* support multiple SPDIFs; the secondary is set up as a slave */
1547 for (i = 0; i < spec->autocfg.dig_outs; i++) {
1549 err = snd_hda_get_connections(codec,
1550 spec->autocfg.dig_out_pins[i],
1551 conn, ARRAY_SIZE(conn));
1554 dig_nid = conn[0]; /* assume the first element is audio-out */
1556 spec->multiout.dig_out_nid = dig_nid;
1557 spec->dig_out_type = spec->autocfg.dig_out_type[0];
1559 spec->multiout.slave_dig_outs = spec->slave_dig_outs;
1560 if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
1562 spec->slave_dig_outs[i - 1] = dig_nid;
1566 if (spec->autocfg.dig_in_pin) {
1567 dig_nid = codec->start_nid;
1568 for (i = 0; i < codec->num_nodes; i++, dig_nid++) {
1569 unsigned int wcaps = get_wcaps(codec, dig_nid);
1570 if (get_wcaps_type(wcaps) != AC_WID_AUD_IN)
1572 if (!(wcaps & AC_WCAP_DIGITAL))
1574 if (!(wcaps & AC_WCAP_CONN_LIST))
1576 err = get_connection_index(codec, dig_nid,
1577 spec->autocfg.dig_in_pin);
1579 spec->dig_in_nid = dig_nid;
1587 * capture mixer elements
1589 static int alc_cap_vol_info(struct snd_kcontrol *kcontrol,
1590 struct snd_ctl_elem_info *uinfo)
1592 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1593 struct alc_spec *spec = codec->spec;
1597 mutex_lock(&codec->control_mutex);
1598 if (spec->vol_in_capsrc)
1599 val = HDA_COMPOSE_AMP_VAL(spec->capsrc_nids[0], 3, 0, HDA_OUTPUT);
1601 val = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0, HDA_INPUT);
1602 kcontrol->private_value = val;
1603 err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
1604 mutex_unlock(&codec->control_mutex);
1608 static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
1609 unsigned int size, unsigned int __user *tlv)
1611 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1612 struct alc_spec *spec = codec->spec;
1616 mutex_lock(&codec->control_mutex);
1617 if (spec->vol_in_capsrc)
1618 val = HDA_COMPOSE_AMP_VAL(spec->capsrc_nids[0], 3, 0, HDA_OUTPUT);
1620 val = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0, HDA_INPUT);
1621 kcontrol->private_value = val;
1622 err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
1623 mutex_unlock(&codec->control_mutex);
1627 typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol,
1628 struct snd_ctl_elem_value *ucontrol);
1630 static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol,
1631 struct snd_ctl_elem_value *ucontrol,
1632 getput_call_t func, bool check_adc_switch)
1634 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1635 struct alc_spec *spec = codec->spec;
1638 mutex_lock(&codec->control_mutex);
1639 if (check_adc_switch && spec->dyn_adc_switch) {
1640 for (i = 0; i < spec->num_adc_nids; i++) {
1641 kcontrol->private_value =
1642 HDA_COMPOSE_AMP_VAL(spec->adc_nids[i],
1644 err = func(kcontrol, ucontrol);
1649 i = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1650 if (spec->vol_in_capsrc)
1651 kcontrol->private_value =
1652 HDA_COMPOSE_AMP_VAL(spec->capsrc_nids[i],
1655 kcontrol->private_value =
1656 HDA_COMPOSE_AMP_VAL(spec->adc_nids[i],
1658 err = func(kcontrol, ucontrol);
1661 mutex_unlock(&codec->control_mutex);
1665 static int alc_cap_vol_get(struct snd_kcontrol *kcontrol,
1666 struct snd_ctl_elem_value *ucontrol)
1668 return alc_cap_getput_caller(kcontrol, ucontrol,
1669 snd_hda_mixer_amp_volume_get, false);
1672 static int alc_cap_vol_put(struct snd_kcontrol *kcontrol,
1673 struct snd_ctl_elem_value *ucontrol)
1675 return alc_cap_getput_caller(kcontrol, ucontrol,
1676 snd_hda_mixer_amp_volume_put, true);
1679 /* capture mixer elements */
1680 #define alc_cap_sw_info snd_ctl_boolean_stereo_info
1682 static int alc_cap_sw_get(struct snd_kcontrol *kcontrol,
1683 struct snd_ctl_elem_value *ucontrol)
1685 return alc_cap_getput_caller(kcontrol, ucontrol,
1686 snd_hda_mixer_amp_switch_get, false);
1689 static int alc_cap_sw_put(struct snd_kcontrol *kcontrol,
1690 struct snd_ctl_elem_value *ucontrol)
1692 return alc_cap_getput_caller(kcontrol, ucontrol,
1693 snd_hda_mixer_amp_switch_put, true);
1696 #define _DEFINE_CAPMIX(num) \
1698 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1699 .name = "Capture Switch", \
1700 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
1702 .info = alc_cap_sw_info, \
1703 .get = alc_cap_sw_get, \
1704 .put = alc_cap_sw_put, \
1707 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1708 .name = "Capture Volume", \
1709 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | \
1710 SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
1711 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK), \
1713 .info = alc_cap_vol_info, \
1714 .get = alc_cap_vol_get, \
1715 .put = alc_cap_vol_put, \
1716 .tlv = { .c = alc_cap_vol_tlv }, \
1719 #define _DEFINE_CAPSRC(num) \
1721 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
1722 /* .name = "Capture Source", */ \
1723 .name = "Input Source", \
1725 .info = alc_mux_enum_info, \
1726 .get = alc_mux_enum_get, \
1727 .put = alc_mux_enum_put, \
1730 #define DEFINE_CAPMIX(num) \
1731 static const struct snd_kcontrol_new alc_capture_mixer ## num[] = { \
1732 _DEFINE_CAPMIX(num), \
1733 _DEFINE_CAPSRC(num), \
1737 #define DEFINE_CAPMIX_NOSRC(num) \
1738 static const struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \
1739 _DEFINE_CAPMIX(num), \
1743 /* up to three ADCs */
1747 DEFINE_CAPMIX_NOSRC(1);
1748 DEFINE_CAPMIX_NOSRC(2);
1749 DEFINE_CAPMIX_NOSRC(3);
1752 * virtual master controls
1756 * slave controls for virtual master
1758 static const char * const alc_slave_vols[] = {
1759 "Front Playback Volume",
1760 "Surround Playback Volume",
1761 "Center Playback Volume",
1762 "LFE Playback Volume",
1763 "Side Playback Volume",
1764 "Headphone Playback Volume",
1765 "Speaker Playback Volume",
1766 "Mono Playback Volume",
1767 "Line-Out Playback Volume",
1771 static const char * const alc_slave_sws[] = {
1772 "Front Playback Switch",
1773 "Surround Playback Switch",
1774 "Center Playback Switch",
1775 "LFE Playback Switch",
1776 "Side Playback Switch",
1777 "Headphone Playback Switch",
1778 "Speaker Playback Switch",
1779 "Mono Playback Switch",
1780 "IEC958 Playback Switch",
1781 "Line-Out Playback Switch",
1786 * build control elements
1789 #define NID_MAPPING (-1)
1791 #define SUBDEV_SPEAKER_ (0 << 6)
1792 #define SUBDEV_HP_ (1 << 6)
1793 #define SUBDEV_LINE_ (2 << 6)
1794 #define SUBDEV_SPEAKER(x) (SUBDEV_SPEAKER_ | ((x) & 0x3f))
1795 #define SUBDEV_HP(x) (SUBDEV_HP_ | ((x) & 0x3f))
1796 #define SUBDEV_LINE(x) (SUBDEV_LINE_ | ((x) & 0x3f))
1798 static void alc_free_kctls(struct hda_codec *codec);
1800 #ifdef CONFIG_SND_HDA_INPUT_BEEP
1801 /* additional beep mixers; the actual parameters are overwritten at build */
1802 static const struct snd_kcontrol_new alc_beep_mixer[] = {
1803 HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
1804 HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
1809 static int alc_build_controls(struct hda_codec *codec)
1811 struct alc_spec *spec = codec->spec;
1812 struct snd_kcontrol *kctl = NULL;
1813 const struct snd_kcontrol_new *knew;
1818 for (i = 0; i < spec->num_mixers; i++) {
1819 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
1823 if (spec->cap_mixer) {
1824 err = snd_hda_add_new_ctls(codec, spec->cap_mixer);
1828 if (spec->multiout.dig_out_nid) {
1829 err = snd_hda_create_spdif_out_ctls(codec,
1830 spec->multiout.dig_out_nid,
1831 spec->multiout.dig_out_nid);
1834 if (!spec->no_analog) {
1835 err = snd_hda_create_spdif_share_sw(codec,
1839 spec->multiout.share_spdif = 1;
1842 if (spec->dig_in_nid) {
1843 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
1848 #ifdef CONFIG_SND_HDA_INPUT_BEEP
1849 /* create beep controls if needed */
1850 if (spec->beep_amp) {
1851 const struct snd_kcontrol_new *knew;
1852 for (knew = alc_beep_mixer; knew->name; knew++) {
1853 struct snd_kcontrol *kctl;
1854 kctl = snd_ctl_new1(knew, codec);
1857 kctl->private_value = spec->beep_amp;
1858 err = snd_hda_ctl_add(codec, 0, kctl);
1865 /* if we have no master control, let's create it */
1866 if (!spec->no_analog &&
1867 !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
1868 unsigned int vmaster_tlv[4];
1869 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
1870 HDA_OUTPUT, vmaster_tlv);
1871 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
1872 vmaster_tlv, alc_slave_vols);
1876 if (!spec->no_analog &&
1877 !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
1878 err = snd_hda_add_vmaster(codec, "Master Playback Switch",
1879 NULL, alc_slave_sws);
1884 /* assign Capture Source enums to NID */
1885 if (spec->capsrc_nids || spec->adc_nids) {
1886 kctl = snd_hda_find_mixer_ctl(codec, "Capture Source");
1888 kctl = snd_hda_find_mixer_ctl(codec, "Input Source");
1889 for (i = 0; kctl && i < kctl->count; i++) {
1890 const hda_nid_t *nids = spec->capsrc_nids;
1892 nids = spec->adc_nids;
1893 err = snd_hda_add_nid(codec, kctl, i, nids[i]);
1898 if (spec->cap_mixer) {
1899 const char *kname = kctl ? kctl->id.name : NULL;
1900 for (knew = spec->cap_mixer; knew->name; knew++) {
1901 if (kname && strcmp(knew->name, kname) == 0)
1903 kctl = snd_hda_find_mixer_ctl(codec, knew->name);
1904 for (i = 0; kctl && i < kctl->count; i++) {
1905 err = snd_hda_add_nid(codec, kctl, i,
1913 /* other nid->control mapping */
1914 for (i = 0; i < spec->num_mixers; i++) {
1915 for (knew = spec->mixers[i]; knew->name; knew++) {
1916 if (knew->iface != NID_MAPPING)
1918 kctl = snd_hda_find_mixer_ctl(codec, knew->name);
1921 u = knew->subdevice;
1922 for (j = 0; j < 4; j++, u >>= 8) {
1927 case SUBDEV_SPEAKER_:
1928 nid = spec->autocfg.speaker_pins[nid];
1931 nid = spec->autocfg.line_out_pins[nid];
1934 nid = spec->autocfg.hp_pins[nid];
1939 err = snd_hda_add_nid(codec, kctl, 0, nid);
1943 u = knew->private_value;
1944 for (j = 0; j < 4; j++, u >>= 8) {
1948 err = snd_hda_add_nid(codec, kctl, 0, nid);
1955 alc_free_kctls(codec); /* no longer needed */
1965 static void alc_init_special_input_src(struct hda_codec *codec);
1967 static int alc_init(struct hda_codec *codec)
1969 struct alc_spec *spec = codec->spec;
1973 alc_auto_init_amp(codec, spec->init_amp);
1975 for (i = 0; i < spec->num_init_verbs; i++)
1976 snd_hda_sequence_write(codec, spec->init_verbs[i]);
1977 alc_init_special_input_src(codec);
1979 if (spec->init_hook)
1980 spec->init_hook(codec);
1982 alc_apply_fixup(codec, ALC_FIXUP_ACT_INIT);
1984 hda_call_check_power_status(codec, 0x01);
1988 static void alc_unsol_event(struct hda_codec *codec, unsigned int res)
1990 struct alc_spec *spec = codec->spec;
1992 if (spec->unsol_event)
1993 spec->unsol_event(codec, res);
1996 #ifdef CONFIG_SND_HDA_POWER_SAVE
1997 static int alc_check_power_status(struct hda_codec *codec, hda_nid_t nid)
1999 struct alc_spec *spec = codec->spec;
2000 return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
2005 * Analog playback callbacks
2007 static int alc_playback_pcm_open(struct hda_pcm_stream *hinfo,
2008 struct hda_codec *codec,
2009 struct snd_pcm_substream *substream)
2011 struct alc_spec *spec = codec->spec;
2012 return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
2016 static int alc_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
2017 struct hda_codec *codec,
2018 unsigned int stream_tag,
2019 unsigned int format,
2020 struct snd_pcm_substream *substream)
2022 struct alc_spec *spec = codec->spec;
2023 return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
2024 stream_tag, format, substream);
2027 static int alc_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
2028 struct hda_codec *codec,
2029 struct snd_pcm_substream *substream)
2031 struct alc_spec *spec = codec->spec;
2032 return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
2038 static int alc_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
2039 struct hda_codec *codec,
2040 struct snd_pcm_substream *substream)
2042 struct alc_spec *spec = codec->spec;
2043 return snd_hda_multi_out_dig_open(codec, &spec->multiout);
2046 static int alc_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
2047 struct hda_codec *codec,
2048 unsigned int stream_tag,
2049 unsigned int format,
2050 struct snd_pcm_substream *substream)
2052 struct alc_spec *spec = codec->spec;
2053 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
2054 stream_tag, format, substream);
2057 static int alc_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
2058 struct hda_codec *codec,
2059 struct snd_pcm_substream *substream)
2061 struct alc_spec *spec = codec->spec;
2062 return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
2065 static int alc_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
2066 struct hda_codec *codec,
2067 struct snd_pcm_substream *substream)
2069 struct alc_spec *spec = codec->spec;
2070 return snd_hda_multi_out_dig_close(codec, &spec->multiout);
2076 static int alc_alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
2077 struct hda_codec *codec,
2078 unsigned int stream_tag,
2079 unsigned int format,
2080 struct snd_pcm_substream *substream)
2082 struct alc_spec *spec = codec->spec;
2084 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
2085 stream_tag, 0, format);
2089 static int alc_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
2090 struct hda_codec *codec,
2091 struct snd_pcm_substream *substream)
2093 struct alc_spec *spec = codec->spec;
2095 snd_hda_codec_cleanup_stream(codec,
2096 spec->adc_nids[substream->number + 1]);
2100 /* analog capture with dynamic dual-adc changes */
2101 static int dyn_adc_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
2102 struct hda_codec *codec,
2103 unsigned int stream_tag,
2104 unsigned int format,
2105 struct snd_pcm_substream *substream)
2107 struct alc_spec *spec = codec->spec;
2108 spec->cur_adc = spec->adc_nids[spec->dyn_adc_idx[spec->cur_mux[0]]];
2109 spec->cur_adc_stream_tag = stream_tag;
2110 spec->cur_adc_format = format;
2111 snd_hda_codec_setup_stream(codec, spec->cur_adc, stream_tag, 0, format);
2115 static int dyn_adc_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
2116 struct hda_codec *codec,
2117 struct snd_pcm_substream *substream)
2119 struct alc_spec *spec = codec->spec;
2120 snd_hda_codec_cleanup_stream(codec, spec->cur_adc);
2125 static const struct hda_pcm_stream dyn_adc_pcm_analog_capture = {
2129 .nid = 0, /* fill later */
2131 .prepare = dyn_adc_capture_pcm_prepare,
2132 .cleanup = dyn_adc_capture_pcm_cleanup
2138 static const struct hda_pcm_stream alc_pcm_analog_playback = {
2142 /* NID is set in alc_build_pcms */
2144 .open = alc_playback_pcm_open,
2145 .prepare = alc_playback_pcm_prepare,
2146 .cleanup = alc_playback_pcm_cleanup
2150 static const struct hda_pcm_stream alc_pcm_analog_capture = {
2154 /* NID is set in alc_build_pcms */
2157 static const struct hda_pcm_stream alc_pcm_analog_alt_playback = {
2161 /* NID is set in alc_build_pcms */
2164 static const struct hda_pcm_stream alc_pcm_analog_alt_capture = {
2165 .substreams = 2, /* can be overridden */
2168 /* NID is set in alc_build_pcms */
2170 .prepare = alc_alt_capture_pcm_prepare,
2171 .cleanup = alc_alt_capture_pcm_cleanup
2175 static const struct hda_pcm_stream alc_pcm_digital_playback = {
2179 /* NID is set in alc_build_pcms */
2181 .open = alc_dig_playback_pcm_open,
2182 .close = alc_dig_playback_pcm_close,
2183 .prepare = alc_dig_playback_pcm_prepare,
2184 .cleanup = alc_dig_playback_pcm_cleanup
2188 static const struct hda_pcm_stream alc_pcm_digital_capture = {
2192 /* NID is set in alc_build_pcms */
2195 /* Used by alc_build_pcms to flag that a PCM has no playback stream */
2196 static const struct hda_pcm_stream alc_pcm_null_stream = {
2202 static int alc_build_pcms(struct hda_codec *codec)
2204 struct alc_spec *spec = codec->spec;
2205 struct hda_pcm *info = spec->pcm_rec;
2206 const struct hda_pcm_stream *p;
2209 codec->num_pcms = 1;
2210 codec->pcm_info = info;
2212 if (spec->no_analog)
2215 snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog),
2216 "%s Analog", codec->chip_name);
2217 info->name = spec->stream_name_analog;
2219 if (spec->multiout.dac_nids > 0) {
2220 p = spec->stream_analog_playback;
2222 p = &alc_pcm_analog_playback;
2223 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
2224 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
2226 if (spec->adc_nids) {
2227 p = spec->stream_analog_capture;
2229 if (spec->dyn_adc_switch)
2230 p = &dyn_adc_pcm_analog_capture;
2232 p = &alc_pcm_analog_capture;
2234 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
2235 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
2238 if (spec->channel_mode) {
2239 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0;
2240 for (i = 0; i < spec->num_channel_mode; i++) {
2241 if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) {
2242 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels;
2248 /* SPDIF for stream index #1 */
2249 if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
2250 snprintf(spec->stream_name_digital,
2251 sizeof(spec->stream_name_digital),
2252 "%s Digital", codec->chip_name);
2253 codec->num_pcms = 2;
2254 codec->slave_dig_outs = spec->multiout.slave_dig_outs;
2255 info = spec->pcm_rec + 1;
2256 info->name = spec->stream_name_digital;
2257 if (spec->dig_out_type)
2258 info->pcm_type = spec->dig_out_type;
2260 info->pcm_type = HDA_PCM_TYPE_SPDIF;
2261 if (spec->multiout.dig_out_nid) {
2262 p = spec->stream_digital_playback;
2264 p = &alc_pcm_digital_playback;
2265 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
2266 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
2268 if (spec->dig_in_nid) {
2269 p = spec->stream_digital_capture;
2271 p = &alc_pcm_digital_capture;
2272 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
2273 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
2275 /* FIXME: do we need this for all Realtek codec models? */
2276 codec->spdif_status_reset = 1;
2279 if (spec->no_analog)
2282 /* If the use of more than one ADC is requested for the current
2283 * model, configure a second analog capture-only PCM.
2285 /* Additional Analaog capture for index #2 */
2286 if (spec->alt_dac_nid || spec->num_adc_nids > 1) {
2287 codec->num_pcms = 3;
2288 info = spec->pcm_rec + 2;
2289 info->name = spec->stream_name_analog;
2290 if (spec->alt_dac_nid) {
2291 p = spec->stream_analog_alt_playback;
2293 p = &alc_pcm_analog_alt_playback;
2294 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *p;
2295 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
2298 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
2299 alc_pcm_null_stream;
2300 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
2302 if (spec->num_adc_nids > 1) {
2303 p = spec->stream_analog_alt_capture;
2305 p = &alc_pcm_analog_alt_capture;
2306 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *p;
2307 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
2309 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
2310 spec->num_adc_nids - 1;
2312 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
2313 alc_pcm_null_stream;
2314 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
2321 static inline void alc_shutup(struct hda_codec *codec)
2323 struct alc_spec *spec = codec->spec;
2325 if (spec && spec->shutup)
2326 spec->shutup(codec);
2327 snd_hda_shutup_pins(codec);
2330 static void alc_free_kctls(struct hda_codec *codec)
2332 struct alc_spec *spec = codec->spec;
2334 if (spec->kctls.list) {
2335 struct snd_kcontrol_new *kctl = spec->kctls.list;
2337 for (i = 0; i < spec->kctls.used; i++)
2338 kfree(kctl[i].name);
2340 snd_array_free(&spec->kctls);
2343 static void alc_free(struct hda_codec *codec)
2345 struct alc_spec *spec = codec->spec;
2351 snd_hda_input_jack_free(codec);
2352 alc_free_kctls(codec);
2354 snd_hda_detach_beep_device(codec);
2357 #ifdef CONFIG_SND_HDA_POWER_SAVE
2358 static void alc_power_eapd(struct hda_codec *codec)
2360 alc_auto_setup_eapd(codec, false);
2363 static int alc_suspend(struct hda_codec *codec, pm_message_t state)
2365 struct alc_spec *spec = codec->spec;
2367 if (spec && spec->power_hook)
2368 spec->power_hook(codec);
2373 #ifdef SND_HDA_NEEDS_RESUME
2374 static int alc_resume(struct hda_codec *codec)
2376 msleep(150); /* to avoid pop noise */
2377 codec->patch_ops.init(codec);
2378 snd_hda_codec_resume_amp(codec);
2379 snd_hda_codec_resume_cache(codec);
2380 hda_call_check_power_status(codec, 0x01);
2387 static const struct hda_codec_ops alc_patch_ops = {
2388 .build_controls = alc_build_controls,
2389 .build_pcms = alc_build_pcms,
2392 .unsol_event = alc_unsol_event,
2393 #ifdef SND_HDA_NEEDS_RESUME
2394 .resume = alc_resume,
2396 #ifdef CONFIG_SND_HDA_POWER_SAVE
2397 .suspend = alc_suspend,
2398 .check_power_status = alc_check_power_status,
2400 .reboot_notify = alc_shutup,
2403 /* replace the codec chip_name with the given string */
2404 static int alc_codec_rename(struct hda_codec *codec, const char *name)
2406 kfree(codec->chip_name);
2407 codec->chip_name = kstrdup(name, GFP_KERNEL);
2408 if (!codec->chip_name) {
2416 * Automatic parse of I/O pins from the BIOS configuration
2421 ALC_CTL_WIDGET_MUTE,
2424 static const struct snd_kcontrol_new alc_control_templates[] = {
2425 HDA_CODEC_VOLUME(NULL, 0, 0, 0),
2426 HDA_CODEC_MUTE(NULL, 0, 0, 0),
2427 HDA_BIND_MUTE(NULL, 0, 0, 0),
2430 /* add dynamic controls */
2431 static int add_control(struct alc_spec *spec, int type, const char *name,
2432 int cidx, unsigned long val)
2434 struct snd_kcontrol_new *knew;
2436 knew = alc_kcontrol_new(spec);
2439 *knew = alc_control_templates[type];
2440 knew->name = kstrdup(name, GFP_KERNEL);
2444 if (get_amp_nid_(val))
2445 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
2446 knew->private_value = val;
2450 static int add_control_with_pfx(struct alc_spec *spec, int type,
2451 const char *pfx, const char *dir,
2452 const char *sfx, int cidx, unsigned long val)
2455 snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
2456 return add_control(spec, type, name, cidx, val);
2459 #define add_pb_vol_ctrl(spec, type, pfx, val) \
2460 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", 0, val)
2461 #define add_pb_sw_ctrl(spec, type, pfx, val) \
2462 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", 0, val)
2463 #define __add_pb_vol_ctrl(spec, type, pfx, cidx, val) \
2464 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", cidx, val)
2465 #define __add_pb_sw_ctrl(spec, type, pfx, cidx, val) \
2466 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", cidx, val)
2468 static const char *alc_get_line_out_pfx(struct alc_spec *spec, int ch,
2469 bool can_be_master, int *index)
2471 struct auto_pin_cfg *cfg = &spec->autocfg;
2472 static const char * const chname[4] = {
2473 "Front", "Surround", NULL /*CLFE*/, "Side"
2477 if (cfg->line_outs == 1 && !spec->multi_ios &&
2478 !cfg->hp_outs && !cfg->speaker_outs && can_be_master)
2481 switch (cfg->line_out_type) {
2482 case AUTO_PIN_SPEAKER_OUT:
2483 if (cfg->line_outs == 1)
2486 case AUTO_PIN_HP_OUT:
2487 /* for multi-io case, only the primary out */
2488 if (ch && spec->multi_ios)
2493 if (cfg->line_outs == 1 && !spec->multi_ios)
2500 /* create input playback/capture controls for the given pin */
2501 static int new_analog_input(struct alc_spec *spec, hda_nid_t pin,
2502 const char *ctlname, int ctlidx,
2503 int idx, hda_nid_t mix_nid)
2507 err = __add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname, ctlidx,
2508 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
2511 err = __add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname, ctlidx,
2512 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
2518 static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid)
2520 unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
2521 return (pincap & AC_PINCAP_IN) != 0;
2524 /* Parse the codec tree and retrieve ADCs and corresponding capsrc MUXs */
2525 static int alc_auto_fill_adc_caps(struct hda_codec *codec)
2527 struct alc_spec *spec = codec->spec;
2529 hda_nid_t *adc_nids = spec->private_adc_nids;
2530 hda_nid_t *cap_nids = spec->private_capsrc_nids;
2531 int max_nums = ARRAY_SIZE(spec->private_adc_nids);
2532 bool indep_capsrc = false;
2535 nid = codec->start_nid;
2536 for (i = 0; i < codec->num_nodes; i++, nid++) {
2538 const hda_nid_t *list;
2539 unsigned int caps = get_wcaps(codec, nid);
2540 int type = get_wcaps_type(caps);
2542 if (type != AC_WID_AUD_IN || (caps & AC_WCAP_DIGITAL))
2544 adc_nids[nums] = nid;
2545 cap_nids[nums] = nid;
2549 type = get_wcaps_type(get_wcaps(codec, src));
2550 if (type == AC_WID_PIN)
2552 if (type == AC_WID_AUD_SEL) {
2553 cap_nids[nums] = src;
2554 indep_capsrc = true;
2557 n = snd_hda_get_conn_list(codec, src, &list);
2559 cap_nids[nums] = src;
2560 indep_capsrc = true;
2566 if (++nums >= max_nums)
2569 spec->adc_nids = spec->private_adc_nids;
2570 spec->capsrc_nids = spec->private_capsrc_nids;
2571 spec->num_adc_nids = nums;
2575 /* create playback/capture controls for input pins */
2576 static int alc_auto_create_input_ctls(struct hda_codec *codec)
2578 struct alc_spec *spec = codec->spec;
2579 const struct auto_pin_cfg *cfg = &spec->autocfg;
2580 hda_nid_t mixer = spec->mixer_nid;
2581 struct hda_input_mux *imux = &spec->private_imux[0];
2583 int i, c, err, idx, type_idx = 0;
2584 const char *prev_label = NULL;
2586 num_adcs = alc_auto_fill_adc_caps(codec);
2590 for (i = 0; i < cfg->num_inputs; i++) {
2594 pin = cfg->inputs[i].pin;
2595 if (!alc_is_input_pin(codec, pin))
2598 label = hda_get_autocfg_input_label(codec, cfg, i);
2599 if (prev_label && !strcmp(label, prev_label))
2606 idx = get_connection_index(codec, mixer, pin);
2608 err = new_analog_input(spec, pin,
2616 for (c = 0; c < num_adcs; c++) {
2617 hda_nid_t cap = spec->capsrc_nids ?
2618 spec->capsrc_nids[c] : spec->adc_nids[c];
2619 idx = get_connection_index(codec, cap, pin);
2621 spec->imux_pins[imux->num_items] = pin;
2622 snd_hda_add_imux_item(imux, label, idx, NULL);
2628 spec->num_mux_defs = 1;
2629 spec->input_mux = imux;
2634 static void alc_set_pin_output(struct hda_codec *codec, hda_nid_t nid,
2635 unsigned int pin_type)
2637 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
2640 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
2644 static int get_pin_type(int line_out_type)
2646 if (line_out_type == AUTO_PIN_HP_OUT)
2652 static void alc_auto_init_analog_input(struct hda_codec *codec)
2654 struct alc_spec *spec = codec->spec;
2655 struct auto_pin_cfg *cfg = &spec->autocfg;
2658 for (i = 0; i < cfg->num_inputs; i++) {
2659 hda_nid_t nid = cfg->inputs[i].pin;
2660 if (alc_is_input_pin(codec, nid)) {
2661 alc_set_input_pin(codec, nid, cfg->inputs[i].type);
2662 if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
2663 snd_hda_codec_write(codec, nid, 0,
2664 AC_VERB_SET_AMP_GAIN_MUTE,
2669 /* mute all loopback inputs */
2670 if (spec->mixer_nid) {
2671 int nums = snd_hda_get_conn_list(codec, spec->mixer_nid, NULL);
2672 for (i = 0; i < nums; i++)
2673 snd_hda_codec_write(codec, spec->mixer_nid, 0,
2674 AC_VERB_SET_AMP_GAIN_MUTE,
2679 /* convert from MIX nid to DAC */
2680 static hda_nid_t alc_auto_mix_to_dac(struct hda_codec *codec, hda_nid_t nid)
2685 if (get_wcaps_type(get_wcaps(codec, nid)) == AC_WID_AUD_OUT)
2687 num = snd_hda_get_connections(codec, nid, list, ARRAY_SIZE(list));
2688 for (i = 0; i < num; i++) {
2689 if (get_wcaps_type(get_wcaps(codec, list[i])) == AC_WID_AUD_OUT)
2695 /* go down to the selector widget before the mixer */
2696 static hda_nid_t alc_go_down_to_selector(struct hda_codec *codec, hda_nid_t pin)
2699 int num = snd_hda_get_connections(codec, pin, srcs,
2702 get_wcaps_type(get_wcaps(codec, srcs[0])) != AC_WID_AUD_SEL)
2707 /* get MIX nid connected to the given pin targeted to DAC */
2708 static hda_nid_t alc_auto_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
2714 pin = alc_go_down_to_selector(codec, pin);
2715 num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
2716 for (i = 0; i < num; i++) {
2717 if (alc_auto_mix_to_dac(codec, mix[i]) == dac)
2723 /* select the connection from pin to DAC if needed */
2724 static int alc_auto_select_dac(struct hda_codec *codec, hda_nid_t pin,
2730 pin = alc_go_down_to_selector(codec, pin);
2731 num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
2734 for (i = 0; i < num; i++) {
2735 if (alc_auto_mix_to_dac(codec, mix[i]) == dac) {
2736 snd_hda_codec_update_cache(codec, pin, 0,
2737 AC_VERB_SET_CONNECT_SEL, i);
2744 /* look for an empty DAC slot */
2745 static hda_nid_t alc_auto_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
2747 struct alc_spec *spec = codec->spec;
2751 pin = alc_go_down_to_selector(codec, pin);
2752 num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs));
2753 for (i = 0; i < num; i++) {
2754 hda_nid_t nid = alc_auto_mix_to_dac(codec, srcs[i]);
2757 if (found_in_nid_list(nid, spec->multiout.dac_nids,
2758 spec->multiout.num_dacs))
2760 if (spec->multiout.hp_nid == nid)
2762 if (found_in_nid_list(nid, spec->multiout.extra_out_nid,
2763 ARRAY_SIZE(spec->multiout.extra_out_nid)))
2770 static hda_nid_t get_dac_if_single(struct hda_codec *codec, hda_nid_t pin)
2772 hda_nid_t sel = alc_go_down_to_selector(codec, pin);
2773 if (snd_hda_get_conn_list(codec, sel, NULL) == 1)
2774 return alc_auto_look_for_dac(codec, pin);
2778 /* fill in the dac_nids table from the parsed pin configuration */
2779 static int alc_auto_fill_dac_nids(struct hda_codec *codec)
2781 struct alc_spec *spec = codec->spec;
2782 const struct auto_pin_cfg *cfg = &spec->autocfg;
2783 bool redone = false;
2787 spec->multiout.num_dacs = 0;
2788 spec->multiout.hp_nid = 0;
2789 spec->multiout.extra_out_nid[0] = 0;
2790 memset(spec->private_dac_nids, 0, sizeof(spec->private_dac_nids));
2791 spec->multiout.dac_nids = spec->private_dac_nids;
2793 /* fill hard-wired DACs first */
2795 for (i = 0; i < cfg->line_outs; i++)
2796 spec->private_dac_nids[i] =
2797 get_dac_if_single(codec, cfg->line_out_pins[i]);
2799 spec->multiout.hp_nid =
2800 get_dac_if_single(codec, cfg->hp_pins[0]);
2801 if (cfg->speaker_outs)
2802 spec->multiout.extra_out_nid[0] =
2803 get_dac_if_single(codec, cfg->speaker_pins[0]);
2806 for (i = 0; i < cfg->line_outs; i++) {
2807 hda_nid_t pin = cfg->line_out_pins[i];
2808 if (spec->private_dac_nids[i])
2810 spec->private_dac_nids[i] = alc_auto_look_for_dac(codec, pin);
2811 if (!spec->private_dac_nids[i] && !redone) {
2812 /* if we can't find primary DACs, re-probe without
2813 * checking the hard-wired DACs
2820 for (i = 0; i < cfg->line_outs; i++) {
2821 if (spec->private_dac_nids[i])
2822 spec->multiout.num_dacs++;
2824 memmove(spec->private_dac_nids + i,
2825 spec->private_dac_nids + i + 1,
2826 sizeof(hda_nid_t) * (cfg->line_outs - i - 1));
2829 if (cfg->hp_outs && !spec->multiout.hp_nid)
2830 spec->multiout.hp_nid =
2831 alc_auto_look_for_dac(codec, cfg->hp_pins[0]);
2832 if (cfg->speaker_outs && !spec->multiout.extra_out_nid[0])
2833 spec->multiout.extra_out_nid[0] =
2834 alc_auto_look_for_dac(codec, cfg->speaker_pins[0]);
2839 static int alc_auto_add_vol_ctl(struct hda_codec *codec,
2840 const char *pfx, int cidx,
2841 hda_nid_t nid, unsigned int chs)
2845 return __add_pb_vol_ctrl(codec->spec, ALC_CTL_WIDGET_VOL, pfx, cidx,
2846 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
2849 #define alc_auto_add_stereo_vol(codec, pfx, cidx, nid) \
2850 alc_auto_add_vol_ctl(codec, pfx, cidx, nid, 3)
2852 /* create a mute-switch for the given mixer widget;
2853 * if it has multiple sources (e.g. DAC and loopback), create a bind-mute
2855 static int alc_auto_add_sw_ctl(struct hda_codec *codec,
2856 const char *pfx, int cidx,
2857 hda_nid_t nid, unsigned int chs)
2864 wid_type = get_wcaps_type(get_wcaps(codec, nid));
2865 if (wid_type == AC_WID_PIN || wid_type == AC_WID_AUD_OUT) {
2866 type = ALC_CTL_WIDGET_MUTE;
2867 val = HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT);
2868 } else if (snd_hda_get_conn_list(codec, nid, NULL) == 1) {
2869 type = ALC_CTL_WIDGET_MUTE;
2870 val = HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_INPUT);
2872 type = ALC_CTL_BIND_MUTE;
2873 val = HDA_COMPOSE_AMP_VAL(nid, chs, 2, HDA_INPUT);
2875 return __add_pb_sw_ctrl(codec->spec, type, pfx, cidx, val);
2878 #define alc_auto_add_stereo_sw(codec, pfx, cidx, nid) \
2879 alc_auto_add_sw_ctl(codec, pfx, cidx, nid, 3)
2881 #define nid_has_mute(codec, nid, dir) \
2882 (query_amp_caps(codec, nid, dir) & AC_AMPCAP_MUTE)
2883 #define nid_has_volume(codec, nid, dir) \
2884 (query_amp_caps(codec, nid, dir) & AC_AMPCAP_NUM_STEPS)
2886 static hda_nid_t alc_look_for_out_mute_nid(struct hda_codec *codec,
2887 hda_nid_t pin, hda_nid_t dac)
2889 hda_nid_t mix = alc_auto_dac_to_mix(codec, pin, dac);
2890 if (nid_has_mute(codec, pin, HDA_OUTPUT))
2892 else if (mix && nid_has_mute(codec, mix, HDA_INPUT))
2894 else if (nid_has_mute(codec, dac, HDA_OUTPUT))
2899 static hda_nid_t alc_look_for_out_vol_nid(struct hda_codec *codec,
2900 hda_nid_t pin, hda_nid_t dac)
2902 hda_nid_t mix = alc_auto_dac_to_mix(codec, pin, dac);
2903 if (nid_has_volume(codec, dac, HDA_OUTPUT))
2905 else if (nid_has_volume(codec, mix, HDA_OUTPUT))
2907 else if (nid_has_volume(codec, pin, HDA_OUTPUT))
2912 /* add playback controls from the parsed DAC table */
2913 static int alc_auto_create_multi_out_ctls(struct hda_codec *codec,
2914 const struct auto_pin_cfg *cfg)
2916 struct alc_spec *spec = codec->spec;
2917 int i, err, noutputs;
2919 noutputs = cfg->line_outs;
2920 if (spec->multi_ios > 0)
2921 noutputs += spec->multi_ios;
2923 for (i = 0; i < noutputs; i++) {
2929 dac = spec->multiout.dac_nids[i];
2932 if (i >= cfg->line_outs)
2933 pin = spec->multi_io[i - 1].pin;
2935 pin = cfg->line_out_pins[i];
2937 sw = alc_look_for_out_mute_nid(codec, pin, dac);
2938 vol = alc_look_for_out_vol_nid(codec, pin, dac);
2939 name = alc_get_line_out_pfx(spec, i, true, &index);
2942 err = alc_auto_add_vol_ctl(codec, "Center", 0, vol, 1);
2945 err = alc_auto_add_vol_ctl(codec, "LFE", 0, vol, 2);
2948 err = alc_auto_add_sw_ctl(codec, "Center", 0, sw, 1);
2951 err = alc_auto_add_sw_ctl(codec, "LFE", 0, sw, 2);
2955 err = alc_auto_add_stereo_vol(codec, name, index, vol);
2958 err = alc_auto_add_stereo_sw(codec, name, index, sw);
2966 /* add playback controls for speaker and HP outputs */
2967 static int alc_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
2968 hda_nid_t dac, const char *pfx)
2970 struct alc_spec *spec = codec->spec;
2977 /* the corresponding DAC is already occupied */
2978 if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP))
2979 return 0; /* no way */
2980 /* create a switch only */
2981 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
2982 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
2985 sw = alc_look_for_out_mute_nid(codec, pin, dac);
2986 vol = alc_look_for_out_vol_nid(codec, pin, dac);
2987 err = alc_auto_add_stereo_vol(codec, pfx, 0, vol);
2990 err = alc_auto_add_stereo_sw(codec, pfx, 0, sw);
2996 static int alc_auto_create_hp_out(struct hda_codec *codec)
2998 struct alc_spec *spec = codec->spec;
2999 return alc_auto_create_extra_out(codec, spec->autocfg.hp_pins[0],
3000 spec->multiout.hp_nid,
3004 static int alc_auto_create_speaker_out(struct hda_codec *codec)
3006 struct alc_spec *spec = codec->spec;
3007 return alc_auto_create_extra_out(codec, spec->autocfg.speaker_pins[0],
3008 spec->multiout.extra_out_nid[0],
3012 static void alc_auto_set_output_and_unmute(struct hda_codec *codec,
3013 hda_nid_t pin, int pin_type,
3017 hda_nid_t nid, mix = 0;
3018 hda_nid_t srcs[HDA_MAX_CONNECTIONS];
3020 alc_set_pin_output(codec, pin, pin_type);
3021 nid = alc_go_down_to_selector(codec, pin);
3022 num = snd_hda_get_connections(codec, nid, srcs, ARRAY_SIZE(srcs));
3023 for (i = 0; i < num; i++) {
3024 if (alc_auto_mix_to_dac(codec, srcs[i]) != dac)
3032 /* need the manual connection? */
3034 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i);
3035 /* unmute mixer widget inputs */
3036 if (nid_has_mute(codec, mix, HDA_INPUT)) {
3037 snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
3039 snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
3042 /* initialize volume */
3043 nid = alc_look_for_out_vol_nid(codec, pin, dac);
3045 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
3049 static void alc_auto_init_multi_out(struct hda_codec *codec)
3051 struct alc_spec *spec = codec->spec;
3052 int pin_type = get_pin_type(spec->autocfg.line_out_type);
3055 for (i = 0; i <= HDA_SIDE; i++) {
3056 hda_nid_t nid = spec->autocfg.line_out_pins[i];
3058 alc_auto_set_output_and_unmute(codec, nid, pin_type,
3059 spec->multiout.dac_nids[i]);
3063 static void alc_auto_init_extra_out(struct hda_codec *codec)
3065 struct alc_spec *spec = codec->spec;
3068 pin = spec->autocfg.hp_pins[0];
3070 alc_auto_set_output_and_unmute(codec, pin, PIN_HP,
3071 spec->multiout.hp_nid);
3072 pin = spec->autocfg.speaker_pins[0];
3074 alc_auto_set_output_and_unmute(codec, pin, PIN_OUT,
3075 spec->multiout.extra_out_nid[0]);
3081 static int alc_auto_fill_multi_ios(struct hda_codec *codec,
3082 unsigned int location)
3084 struct alc_spec *spec = codec->spec;
3085 struct auto_pin_cfg *cfg = &spec->autocfg;
3086 int type, i, num_pins = 0;
3088 for (type = AUTO_PIN_LINE_IN; type >= AUTO_PIN_MIC; type--) {
3089 for (i = 0; i < cfg->num_inputs; i++) {
3090 hda_nid_t nid = cfg->inputs[i].pin;
3092 unsigned int defcfg, caps;
3093 if (cfg->inputs[i].type != type)
3095 defcfg = snd_hda_codec_get_pincfg(codec, nid);
3096 if (get_defcfg_connect(defcfg) != AC_JACK_PORT_COMPLEX)
3098 if (location && get_defcfg_location(defcfg) != location)
3100 caps = snd_hda_query_pin_caps(codec, nid);
3101 if (!(caps & AC_PINCAP_OUT))
3103 dac = alc_auto_look_for_dac(codec, nid);
3106 spec->multi_io[num_pins].pin = nid;
3107 spec->multi_io[num_pins].dac = dac;
3109 spec->private_dac_nids[spec->multiout.num_dacs++] = dac;
3112 spec->multiout.num_dacs = 1;
3118 static int alc_auto_ch_mode_info(struct snd_kcontrol *kcontrol,
3119 struct snd_ctl_elem_info *uinfo)
3121 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3122 struct alc_spec *spec = codec->spec;
3124 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3126 uinfo->value.enumerated.items = spec->multi_ios + 1;
3127 if (uinfo->value.enumerated.item > spec->multi_ios)
3128 uinfo->value.enumerated.item = spec->multi_ios;
3129 sprintf(uinfo->value.enumerated.name, "%dch",
3130 (uinfo->value.enumerated.item + 1) * 2);
3134 static int alc_auto_ch_mode_get(struct snd_kcontrol *kcontrol,
3135 struct snd_ctl_elem_value *ucontrol)
3137 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3138 struct alc_spec *spec = codec->spec;
3139 ucontrol->value.enumerated.item[0] = (spec->ext_channel_count - 1) / 2;
3143 static int alc_set_multi_io(struct hda_codec *codec, int idx, bool output)
3145 struct alc_spec *spec = codec->spec;
3146 hda_nid_t nid = spec->multi_io[idx].pin;
3148 if (!spec->multi_io[idx].ctl_in)
3149 spec->multi_io[idx].ctl_in =
3150 snd_hda_codec_read(codec, nid, 0,
3151 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3153 snd_hda_codec_update_cache(codec, nid, 0,
3154 AC_VERB_SET_PIN_WIDGET_CONTROL,
3156 if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
3157 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
3159 alc_auto_select_dac(codec, nid, spec->multi_io[idx].dac);
3161 if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
3162 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
3163 HDA_AMP_MUTE, HDA_AMP_MUTE);
3164 snd_hda_codec_update_cache(codec, nid, 0,
3165 AC_VERB_SET_PIN_WIDGET_CONTROL,
3166 spec->multi_io[idx].ctl_in);
3171 static int alc_auto_ch_mode_put(struct snd_kcontrol *kcontrol,
3172 struct snd_ctl_elem_value *ucontrol)
3174 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3175 struct alc_spec *spec = codec->spec;
3178 ch = ucontrol->value.enumerated.item[0];
3179 if (ch < 0 || ch > spec->multi_ios)
3181 if (ch == (spec->ext_channel_count - 1) / 2)
3183 spec->ext_channel_count = (ch + 1) * 2;
3184 for (i = 0; i < spec->multi_ios; i++)
3185 alc_set_multi_io(codec, i, i < ch);
3186 spec->multiout.max_channels = spec->ext_channel_count;
3190 static const struct snd_kcontrol_new alc_auto_channel_mode_enum = {
3191 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3192 .name = "Channel Mode",
3193 .info = alc_auto_ch_mode_info,
3194 .get = alc_auto_ch_mode_get,
3195 .put = alc_auto_ch_mode_put,
3198 static int alc_auto_add_multi_channel_mode(struct hda_codec *codec,
3199 int (*fill_dac)(struct hda_codec *))
3201 struct alc_spec *spec = codec->spec;
3202 struct auto_pin_cfg *cfg = &spec->autocfg;
3203 unsigned int location, defcfg;
3206 if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT && cfg->hp_outs == 1) {
3207 /* use HP as primary out */
3208 cfg->speaker_outs = cfg->line_outs;
3209 memcpy(cfg->speaker_pins, cfg->line_out_pins,
3210 sizeof(cfg->speaker_pins));
3211 cfg->line_outs = cfg->hp_outs;
3212 memcpy(cfg->line_out_pins, cfg->hp_pins, sizeof(cfg->hp_pins));
3214 memset(cfg->hp_pins, 0, sizeof(cfg->hp_pins));
3215 cfg->line_out_type = AUTO_PIN_HP_OUT;
3219 if (cfg->line_outs != 1 ||
3220 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
3223 defcfg = snd_hda_codec_get_pincfg(codec, cfg->line_out_pins[0]);
3224 location = get_defcfg_location(defcfg);
3226 num_pins = alc_auto_fill_multi_ios(codec, location);
3228 struct snd_kcontrol_new *knew;
3230 knew = alc_kcontrol_new(spec);
3233 *knew = alc_auto_channel_mode_enum;
3234 knew->name = kstrdup("Channel Mode", GFP_KERNEL);
3238 spec->multi_ios = num_pins;
3239 spec->ext_channel_count = 2;
3240 spec->multiout.num_dacs = num_pins + 1;
3245 /* filter out invalid adc_nids (and capsrc_nids) that don't give all
3248 static void alc_remove_invalid_adc_nids(struct hda_codec *codec)
3250 struct alc_spec *spec = codec->spec;
3251 const struct hda_input_mux *imux;
3252 hda_nid_t adc_nids[ARRAY_SIZE(spec->private_adc_nids)];
3253 hda_nid_t capsrc_nids[ARRAY_SIZE(spec->private_adc_nids)];
3256 imux = spec->input_mux;
3259 if (spec->dyn_adc_switch)
3263 for (n = 0; n < spec->num_adc_nids; n++) {
3264 hda_nid_t cap = spec->private_capsrc_nids[n];
3265 int num_conns = snd_hda_get_conn_list(codec, cap, NULL);
3266 for (i = 0; i < imux->num_items; i++) {
3267 hda_nid_t pin = spec->imux_pins[i];
3269 if (get_connection_index(codec, cap, pin) < 0)
3271 } else if (num_conns <= imux->items[i].index)
3274 if (i >= imux->num_items) {
3275 adc_nids[nums] = spec->private_adc_nids[n];
3276 capsrc_nids[nums++] = cap;
3280 /* check whether ADC-switch is possible */
3281 if (!alc_check_dyn_adc_switch(codec)) {
3282 printk(KERN_WARNING "hda_codec: %s: no valid ADC found;"
3283 " using fallback 0x%x\n",
3284 codec->chip_name, spec->private_adc_nids[0]);
3285 spec->num_adc_nids = 1;
3289 } else if (nums != spec->num_adc_nids) {
3290 memcpy(spec->private_adc_nids, adc_nids,
3291 nums * sizeof(hda_nid_t));
3292 memcpy(spec->private_capsrc_nids, capsrc_nids,
3293 nums * sizeof(hda_nid_t));
3294 spec->num_adc_nids = nums;
3298 alc_auto_mic_check_imux(codec); /* check auto-mic setups */
3299 else if (spec->input_mux->num_items == 1)
3300 spec->num_adc_nids = 1; /* reduce to a single ADC */
3304 * initialize ADC paths
3306 static void alc_auto_init_adc(struct hda_codec *codec, int adc_idx)
3308 struct alc_spec *spec = codec->spec;
3311 nid = spec->adc_nids[adc_idx];
3313 if (query_amp_caps(codec, nid, HDA_INPUT) & AC_AMPCAP_MUTE) {
3314 snd_hda_codec_write(codec, nid, 0,
3315 AC_VERB_SET_AMP_GAIN_MUTE,
3319 if (!spec->capsrc_nids)
3321 nid = spec->capsrc_nids[adc_idx];
3322 if (query_amp_caps(codec, nid, HDA_OUTPUT) & AC_AMPCAP_MUTE)
3323 snd_hda_codec_write(codec, nid, 0,
3324 AC_VERB_SET_AMP_GAIN_MUTE,
3328 static void alc_auto_init_input_src(struct hda_codec *codec)
3330 struct alc_spec *spec = codec->spec;
3333 for (c = 0; c < spec->num_adc_nids; c++)
3334 alc_auto_init_adc(codec, c);
3335 if (spec->dyn_adc_switch)
3338 nums = spec->num_adc_nids;
3339 for (c = 0; c < nums; c++)
3340 alc_mux_select(codec, 0, spec->cur_mux[c], true);
3343 /* add mic boosts if needed */
3344 static int alc_auto_add_mic_boost(struct hda_codec *codec)
3346 struct alc_spec *spec = codec->spec;
3347 struct auto_pin_cfg *cfg = &spec->autocfg;
3351 const char *prev_label = NULL;
3353 for (i = 0; i < cfg->num_inputs; i++) {
3354 if (cfg->inputs[i].type > AUTO_PIN_MIC)
3356 nid = cfg->inputs[i].pin;
3357 if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP) {
3359 char boost_label[32];
3361 label = hda_get_autocfg_input_label(codec, cfg, i);
3362 if (prev_label && !strcmp(label, prev_label))
3368 snprintf(boost_label, sizeof(boost_label),
3369 "%s Boost Volume", label);
3370 err = add_control(spec, ALC_CTL_WIDGET_VOL,
3371 boost_label, type_idx,
3372 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
3380 /* select or unmute the given capsrc route */
3381 static void select_or_unmute_capsrc(struct hda_codec *codec, hda_nid_t cap,
3384 if (get_wcaps_type(get_wcaps(codec, cap)) == AC_WID_AUD_MIX) {
3385 snd_hda_codec_amp_stereo(codec, cap, HDA_INPUT, idx,
3387 } else if (snd_hda_get_conn_list(codec, cap, NULL) > 1) {
3388 snd_hda_codec_write_cache(codec, cap, 0,
3389 AC_VERB_SET_CONNECT_SEL, idx);
3393 /* set the default connection to that pin */
3394 static int init_capsrc_for_pin(struct hda_codec *codec, hda_nid_t pin)
3396 struct alc_spec *spec = codec->spec;
3401 for (i = 0; i < spec->num_adc_nids; i++) {
3402 hda_nid_t cap = spec->capsrc_nids ?
3403 spec->capsrc_nids[i] : spec->adc_nids[i];
3406 idx = get_connection_index(codec, cap, pin);
3409 select_or_unmute_capsrc(codec, cap, idx);
3410 return i; /* return the found index */
3412 return -1; /* not found */
3415 /* initialize some special cases for input sources */
3416 static void alc_init_special_input_src(struct hda_codec *codec)
3418 struct alc_spec *spec = codec->spec;
3421 for (i = 0; i < spec->autocfg.num_inputs; i++)
3422 init_capsrc_for_pin(codec, spec->autocfg.inputs[i].pin);
3425 /* assign appropriate capture mixers */
3426 static void set_capture_mixer(struct hda_codec *codec)
3428 struct alc_spec *spec = codec->spec;
3429 static const struct snd_kcontrol_new *caps[2][3] = {
3430 { alc_capture_mixer_nosrc1,
3431 alc_capture_mixer_nosrc2,
3432 alc_capture_mixer_nosrc3 },
3433 { alc_capture_mixer1,
3435 alc_capture_mixer3 },
3438 /* check whether either of ADC or MUX has a volume control */
3439 if (!(query_amp_caps(codec, spec->adc_nids[0], HDA_INPUT) &
3440 AC_AMPCAP_NUM_STEPS)) {
3441 if (!spec->capsrc_nids)
3442 return; /* no volume */
3443 if (!(query_amp_caps(codec, spec->capsrc_nids[0], HDA_OUTPUT) &
3444 AC_AMPCAP_NUM_STEPS))
3445 return; /* no volume in capsrc, too */
3446 spec->vol_in_capsrc = 1;
3449 if (spec->num_adc_nids > 0) {
3453 if (spec->input_mux && spec->input_mux->num_items > 1)
3455 if (spec->auto_mic) {
3458 } else if (spec->dyn_adc_switch)
3461 if (spec->num_adc_nids > 3)
3462 spec->num_adc_nids = 3;
3463 else if (!spec->num_adc_nids)
3465 num_adcs = spec->num_adc_nids;
3467 spec->cap_mixer = caps[mux][num_adcs - 1];
3472 * Digital-beep handlers
3474 #ifdef CONFIG_SND_HDA_INPUT_BEEP
3475 #define set_beep_amp(spec, nid, idx, dir) \
3476 ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir))
3478 static const struct snd_pci_quirk beep_white_list[] = {
3479 SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
3480 SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),
3481 SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1),
3482 SND_PCI_QUIRK(0x1043, 0x834a, "EeePC", 1),
3483 SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
3487 static inline int has_cdefine_beep(struct hda_codec *codec)
3489 struct alc_spec *spec = codec->spec;
3490 const struct snd_pci_quirk *q;
3491 q = snd_pci_quirk_lookup(codec->bus->pci, beep_white_list);
3494 return spec->cdefine.enable_pcbeep;
3497 #define set_beep_amp(spec, nid, idx, dir) /* NOP */
3498 #define has_cdefine_beep(codec) 0
3501 /* parse the BIOS configuration and set up the alc_spec */
3502 /* return 1 if successful, 0 if the proper config is not found,
3503 * or a negative error code
3505 static int alc880_parse_auto_config(struct hda_codec *codec)
3507 struct alc_spec *spec = codec->spec;
3509 static const hda_nid_t alc880_ignore[] = { 0x1d, 0 };
3511 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
3515 if (!spec->autocfg.line_outs)
3516 return 0; /* can't find valid BIOS pin config */
3518 err = alc_auto_fill_dac_nids(codec);
3521 err = alc_auto_add_multi_channel_mode(codec, alc_auto_fill_dac_nids);
3524 err = alc_auto_create_multi_out_ctls(codec, &spec->autocfg);
3527 err = alc_auto_create_hp_out(codec);
3530 err = alc_auto_create_speaker_out(codec);
3533 err = alc_auto_create_input_ctls(codec);
3537 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
3539 alc_auto_parse_digital(codec);
3541 if (spec->kctls.list)
3542 add_mixer(spec, spec->kctls.list);
3544 alc_remove_invalid_adc_nids(codec);
3546 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
3547 alc_auto_check_switches(codec);
3552 /* additional initialization for auto-configuration model */
3553 static void alc880_auto_init(struct hda_codec *codec)
3555 struct alc_spec *spec = codec->spec;
3556 alc_auto_init_multi_out(codec);
3557 alc_auto_init_extra_out(codec);
3558 alc_auto_init_analog_input(codec);
3559 alc_auto_init_input_src(codec);
3560 alc_auto_init_digital(codec);
3561 if (spec->unsol_event)
3562 alc_inithook(codec);
3565 #ifdef CONFIG_SND_HDA_POWER_SAVE
3566 static const struct hda_amp_list alc880_loopbacks[] = {
3567 { 0x0b, HDA_INPUT, 0 },
3568 { 0x0b, HDA_INPUT, 1 },
3569 { 0x0b, HDA_INPUT, 2 },
3570 { 0x0b, HDA_INPUT, 3 },
3571 { 0x0b, HDA_INPUT, 4 },
3579 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
3580 #define alc_board_config \
3581 snd_hda_check_board_config
3582 #define alc_board_codec_sid_config \
3583 snd_hda_check_board_codec_sid_config
3584 #include "alc_quirks.c"
3586 #define alc_board_config(codec, nums, models, tbl) -1
3587 #define alc_board_codec_sid_config(codec, nums, models, tbl) -1
3588 #define setup_preset(codec, x) /* NOP */
3592 * OK, here we have finally the patch for ALC880
3594 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
3595 #include "alc880_quirks.c"
3598 static int patch_alc880(struct hda_codec *codec)
3600 struct alc_spec *spec;
3604 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3610 spec->mixer_nid = 0x0b;
3612 board_config = alc_board_config(codec, ALC880_MODEL_LAST,
3613 alc880_models, alc880_cfg_tbl);
3614 if (board_config < 0) {
3615 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
3617 board_config = ALC_MODEL_AUTO;
3620 if (board_config == ALC_MODEL_AUTO) {
3621 /* automatic parse from the BIOS config */
3622 err = alc880_parse_auto_config(codec);
3627 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
3630 "hda_codec: Cannot set up configuration "
3631 "from BIOS. Using 3-stack mode...\n");
3632 board_config = ALC880_3ST;
3637 err = snd_hda_attach_beep_device(codec, 0x1);
3643 if (board_config != ALC_MODEL_AUTO)
3644 setup_preset(codec, &alc880_presets[board_config]);
3646 if (!spec->adc_nids && spec->input_mux) {
3647 alc_auto_fill_adc_caps(codec);
3648 alc_rebuild_imux_for_auto_mic(codec);
3649 alc_remove_invalid_adc_nids(codec);
3651 set_capture_mixer(codec);
3652 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
3654 spec->vmaster_nid = 0x0c;
3656 codec->patch_ops = alc_patch_ops;
3657 if (board_config == ALC_MODEL_AUTO)
3658 spec->init_hook = alc880_auto_init;
3659 #ifdef CONFIG_SND_HDA_POWER_SAVE
3660 if (!spec->loopback.amplist)
3661 spec->loopback.amplist = alc880_loopbacks;
3672 /* convert from pin to volume-mixer widget */
3673 static hda_nid_t alc260_pin_to_vol_mix(hda_nid_t nid)
3675 if (nid >= 0x0f && nid <= 0x11)
3677 else if (nid >= 0x12 && nid <= 0x15)
3683 static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid,
3684 const char *pfx, int *vol_bits)
3687 unsigned long vol_val, sw_val;
3690 nid_vol = alc260_pin_to_vol_mix(nid);
3697 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, chs, 0, HDA_OUTPUT);
3698 sw_val = HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT);
3700 if (!(*vol_bits & (1 << nid_vol))) {
3701 /* first control for the volume widget */
3702 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, vol_val);
3705 *vol_bits |= (1 << nid_vol);
3707 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, sw_val);
3713 /* add playback controls from the parsed DAC table */
3714 static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec,
3715 const struct auto_pin_cfg *cfg)
3721 spec->multiout.num_dacs = 1;
3722 spec->multiout.dac_nids = spec->private_dac_nids;
3723 spec->private_dac_nids[0] = 0x02;
3725 nid = cfg->line_out_pins[0];
3729 pfx = alc_get_line_out_pfx(spec, 0, true, &index);
3730 err = alc260_add_playback_controls(spec, nid, pfx, &vols);
3735 nid = cfg->speaker_pins[0];
3737 err = alc260_add_playback_controls(spec, nid, "Speaker", &vols);
3742 nid = cfg->hp_pins[0];
3744 err = alc260_add_playback_controls(spec, nid, "Headphone",
3752 static void alc260_auto_set_output_and_unmute(struct hda_codec *codec,
3753 hda_nid_t nid, int pin_type,
3758 alc_set_pin_output(codec, nid, pin_type);
3759 /* need the manual connection? */
3761 int idx = nid - 0x12;
3762 snd_hda_codec_write(codec, idx + 0x0b, 0,
3763 AC_VERB_SET_CONNECT_SEL, sel_idx);
3766 mix = alc260_pin_to_vol_mix(nid);
3769 snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
3771 snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
3773 snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
3777 static void alc260_auto_init_multi_out(struct hda_codec *codec)
3779 struct alc_spec *spec = codec->spec;
3782 nid = spec->autocfg.line_out_pins[0];
3784 int pin_type = get_pin_type(spec->autocfg.line_out_type);
3785 alc260_auto_set_output_and_unmute(codec, nid, pin_type, 0);
3788 nid = spec->autocfg.speaker_pins[0];
3790 alc260_auto_set_output_and_unmute(codec, nid, PIN_OUT, 0);
3792 nid = spec->autocfg.hp_pins[0];
3794 alc260_auto_set_output_and_unmute(codec, nid, PIN_HP, 0);
3797 static int alc260_parse_auto_config(struct hda_codec *codec)
3799 struct alc_spec *spec = codec->spec;
3801 static const hda_nid_t alc260_ignore[] = { 0x17, 0 };
3803 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
3807 err = alc260_auto_create_multi_out_ctls(spec, &spec->autocfg);
3810 if (!spec->kctls.list)
3811 return 0; /* can't find valid BIOS pin config */
3812 err = alc_auto_create_input_ctls(codec);
3816 spec->multiout.max_channels = 2;
3818 alc_auto_parse_digital(codec);
3820 if (spec->kctls.list)
3821 add_mixer(spec, spec->kctls.list);
3823 alc_remove_invalid_adc_nids(codec);
3825 alc_ssid_check(codec, 0x10, 0x15, 0x0f, 0);
3826 alc_auto_check_switches(codec);
3831 /* additional initialization for auto-configuration model */
3832 static void alc260_auto_init(struct hda_codec *codec)
3834 struct alc_spec *spec = codec->spec;
3835 alc260_auto_init_multi_out(codec);
3836 alc_auto_init_analog_input(codec);
3837 alc_auto_init_input_src(codec);
3838 alc_auto_init_digital(codec);
3839 if (spec->unsol_event)
3840 alc_inithook(codec);
3843 #ifdef CONFIG_SND_HDA_POWER_SAVE
3844 static const struct hda_amp_list alc260_loopbacks[] = {
3845 { 0x07, HDA_INPUT, 0 },
3846 { 0x07, HDA_INPUT, 1 },
3847 { 0x07, HDA_INPUT, 2 },
3848 { 0x07, HDA_INPUT, 3 },
3849 { 0x07, HDA_INPUT, 4 },
3861 static const struct alc_fixup alc260_fixups[] = {
3862 [PINFIX_HP_DC5750] = {
3863 .type = ALC_FIXUP_PINS,
3864 .v.pins = (const struct alc_pincfg[]) {
3865 { 0x11, 0x90130110 }, /* speaker */
3871 static const struct snd_pci_quirk alc260_fixup_tbl[] = {
3872 SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", PINFIX_HP_DC5750),
3878 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
3879 #include "alc260_quirks.c"
3882 static int patch_alc260(struct hda_codec *codec)
3884 struct alc_spec *spec;
3885 int err, board_config;
3887 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
3893 spec->mixer_nid = 0x07;
3895 board_config = alc_board_config(codec, ALC260_MODEL_LAST,
3896 alc260_models, alc260_cfg_tbl);
3897 if (board_config < 0) {
3898 snd_printd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
3900 board_config = ALC_MODEL_AUTO;
3903 if (board_config == ALC_MODEL_AUTO) {
3904 alc_pick_fixup(codec, NULL, alc260_fixup_tbl, alc260_fixups);
3905 alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
3908 if (board_config == ALC_MODEL_AUTO) {
3909 /* automatic parse from the BIOS config */
3910 err = alc260_parse_auto_config(codec);
3915 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
3918 "hda_codec: Cannot set up configuration "
3919 "from BIOS. Using base mode...\n");
3920 board_config = ALC260_BASIC;
3925 err = snd_hda_attach_beep_device(codec, 0x1);
3931 if (board_config != ALC_MODEL_AUTO)
3932 setup_preset(codec, &alc260_presets[board_config]);
3934 if (!spec->adc_nids && spec->input_mux) {
3935 alc_auto_fill_adc_caps(codec);
3936 alc_rebuild_imux_for_auto_mic(codec);
3937 alc_remove_invalid_adc_nids(codec);
3939 set_capture_mixer(codec);
3940 set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
3942 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
3944 spec->vmaster_nid = 0x08;
3946 codec->patch_ops = alc_patch_ops;
3947 if (board_config == ALC_MODEL_AUTO)
3948 spec->init_hook = alc260_auto_init;
3949 spec->shutup = alc_eapd_shutup;
3950 #ifdef CONFIG_SND_HDA_POWER_SAVE
3951 if (!spec->loopback.amplist)
3952 spec->loopback.amplist = alc260_loopbacks;
3960 * ALC882/883/885/888/889 support
3962 * ALC882 is almost identical with ALC880 but has cleaner and more flexible
3963 * configuration. Each pin widget can choose any input DACs and a mixer.
3964 * Each ADC is connected from a mixer of all inputs. This makes possible
3965 * 6-channel independent captures.
3967 * In addition, an independent DAC for the multi-playback (not used in this
3970 #ifdef CONFIG_SND_HDA_POWER_SAVE
3971 #define alc882_loopbacks alc880_loopbacks
3978 PINFIX_ABIT_AW9D_MAX,
3981 PINFIX_ACER_ASPIRE_7736,
3984 static const struct alc_fixup alc882_fixups[] = {
3985 [PINFIX_ABIT_AW9D_MAX] = {
3986 .type = ALC_FIXUP_PINS,
3987 .v.pins = (const struct alc_pincfg[]) {
3988 { 0x15, 0x01080104 }, /* side */
3989 { 0x16, 0x01011012 }, /* rear */
3990 { 0x17, 0x01016011 }, /* clfe */
3994 [PINFIX_LENOVO_Y530] = {
3995 .type = ALC_FIXUP_PINS,
3996 .v.pins = (const struct alc_pincfg[]) {
3997 { 0x15, 0x99130112 }, /* rear int speakers */
3998 { 0x16, 0x99130111 }, /* subwoofer */
4002 [PINFIX_PB_M5210] = {
4003 .type = ALC_FIXUP_VERBS,
4004 .v.verbs = (const struct hda_verb[]) {
4005 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 },
4009 [PINFIX_ACER_ASPIRE_7736] = {
4010 .type = ALC_FIXUP_SKU,
4011 .v.sku = ALC_FIXUP_SKU_IGNORE,
4015 static const struct snd_pci_quirk alc882_fixup_tbl[] = {
4016 SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", PINFIX_PB_M5210),
4017 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", PINFIX_LENOVO_Y530),
4018 SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
4019 SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", PINFIX_ACER_ASPIRE_7736),
4024 * BIOS auto configuration
4026 /* almost identical with ALC880 parser... */
4027 static int alc882_parse_auto_config(struct hda_codec *codec)
4029 struct alc_spec *spec = codec->spec;
4030 static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };
4033 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
4037 if (!spec->autocfg.line_outs)
4038 return 0; /* can't find valid BIOS pin config */
4040 err = alc_auto_fill_dac_nids(codec);
4043 err = alc_auto_add_multi_channel_mode(codec, alc_auto_fill_dac_nids);
4046 err = alc_auto_create_multi_out_ctls(codec, &spec->autocfg);
4049 err = alc_auto_create_hp_out(codec);
4052 err = alc_auto_create_speaker_out(codec);
4055 err = alc_auto_create_input_ctls(codec);
4059 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
4061 alc_auto_parse_digital(codec);
4063 if (spec->kctls.list)
4064 add_mixer(spec, spec->kctls.list);
4066 err = alc_auto_add_mic_boost(codec);
4070 alc_remove_invalid_adc_nids(codec);
4072 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
4073 alc_auto_check_switches(codec);
4075 return 1; /* config found */
4078 /* additional initialization for auto-configuration model */
4079 static void alc882_auto_init(struct hda_codec *codec)
4081 struct alc_spec *spec = codec->spec;
4082 alc_auto_init_multi_out(codec);
4083 alc_auto_init_extra_out(codec);
4084 alc_auto_init_analog_input(codec);
4085 alc_auto_init_input_src(codec);
4086 alc_auto_init_digital(codec);
4087 if (spec->unsol_event)
4088 alc_inithook(codec);
4093 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
4094 #include "alc882_quirks.c"
4097 static int patch_alc882(struct hda_codec *codec)
4099 struct alc_spec *spec;
4100 int err, board_config;
4102 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4108 spec->mixer_nid = 0x0b;
4110 switch (codec->vendor_id) {
4115 /* ALC883 and variants */
4116 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
4120 board_config = alc_board_config(codec, ALC882_MODEL_LAST,
4121 alc882_models, alc882_cfg_tbl);
4123 if (board_config < 0)
4124 board_config = alc_board_codec_sid_config(codec,
4125 ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl);
4127 if (board_config < 0) {
4128 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
4130 board_config = ALC_MODEL_AUTO;
4133 if (board_config == ALC_MODEL_AUTO) {
4134 alc_pick_fixup(codec, NULL, alc882_fixup_tbl, alc882_fixups);
4135 alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
4138 alc_auto_parse_customize_define(codec);
4140 if (board_config == ALC_MODEL_AUTO) {
4141 /* automatic parse from the BIOS config */
4142 err = alc882_parse_auto_config(codec);
4147 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
4150 "hda_codec: Cannot set up configuration "
4151 "from BIOS. Using base mode...\n");
4152 board_config = ALC882_3ST_DIG;
4157 if (has_cdefine_beep(codec)) {
4158 err = snd_hda_attach_beep_device(codec, 0x1);
4165 if (board_config != ALC_MODEL_AUTO)
4166 setup_preset(codec, &alc882_presets[board_config]);
4168 if (!spec->adc_nids && spec->input_mux) {
4169 alc_auto_fill_adc_caps(codec);
4170 alc_rebuild_imux_for_auto_mic(codec);
4171 alc_remove_invalid_adc_nids(codec);
4174 set_capture_mixer(codec);
4176 if (has_cdefine_beep(codec))
4177 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
4179 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
4181 spec->vmaster_nid = 0x0c;
4183 codec->patch_ops = alc_patch_ops;
4184 if (board_config == ALC_MODEL_AUTO)
4185 spec->init_hook = alc882_auto_init;
4187 alc_init_jacks(codec);
4188 #ifdef CONFIG_SND_HDA_POWER_SAVE
4189 if (!spec->loopback.amplist)
4190 spec->loopback.amplist = alc882_loopbacks;
4201 /* We use two mixers depending on the output pin; 0x16 is a mono output
4202 * and thus it's bound with a different mixer.
4203 * This function returns which mixer amp should be used.
4205 static int alc262_check_volbit(hda_nid_t nid)
4209 else if (nid == 0x16)
4215 static int alc262_add_out_vol_ctl(struct alc_spec *spec, hda_nid_t nid,
4216 const char *pfx, int *vbits, int idx)
4221 vbit = alc262_check_volbit(nid);
4224 if (*vbits & vbit) /* a volume control for this mixer already there */
4228 val = HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, HDA_OUTPUT);
4230 val = HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT);
4231 return __add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, idx, val);
4234 static int alc262_add_out_sw_ctl(struct alc_spec *spec, hda_nid_t nid,
4235 const char *pfx, int idx)
4242 val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
4244 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
4245 return __add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, idx, val);
4248 /* add playback controls from the parsed DAC table */
4249 static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
4250 const struct auto_pin_cfg *cfg)
4256 spec->multiout.num_dacs = 1; /* only use one dac */
4257 spec->multiout.dac_nids = spec->private_dac_nids;
4258 spec->private_dac_nids[0] = 2;
4260 for (i = 0; i < 2; i++) {
4261 pfx = alc_get_line_out_pfx(spec, i, true, &index);
4264 err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[i], pfx,
4268 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
4269 err = alc262_add_out_sw_ctl(spec, cfg->speaker_pins[i],
4274 if (cfg->line_out_type != AUTO_PIN_HP_OUT) {
4275 err = alc262_add_out_sw_ctl(spec, cfg->hp_pins[i],
4282 vbits = alc262_check_volbit(cfg->line_out_pins[0]) |
4283 alc262_check_volbit(cfg->speaker_pins[0]) |
4284 alc262_check_volbit(cfg->hp_pins[0]);
4286 for (i = 0; i < 2; i++) {
4287 pfx = alc_get_line_out_pfx(spec, i, true, &index);
4290 err = alc262_add_out_vol_ctl(spec, cfg->line_out_pins[i], pfx,
4294 if (cfg->line_out_type != AUTO_PIN_SPEAKER_OUT) {
4295 err = alc262_add_out_vol_ctl(spec, cfg->speaker_pins[i],
4296 "Speaker", &vbits, i);
4300 if (cfg->line_out_type != AUTO_PIN_HP_OUT) {
4301 err = alc262_add_out_vol_ctl(spec, cfg->hp_pins[i],
4302 "Headphone", &vbits, i);
4311 * BIOS auto configuration
4313 static int alc262_parse_auto_config(struct hda_codec *codec)
4315 struct alc_spec *spec = codec->spec;
4317 static const hda_nid_t alc262_ignore[] = { 0x1d, 0 };
4319 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
4323 if (!spec->autocfg.line_outs) {
4324 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
4325 spec->multiout.max_channels = 2;
4326 spec->no_analog = 1;
4329 return 0; /* can't find valid BIOS pin config */
4331 err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg);
4334 err = alc_auto_create_input_ctls(codec);
4338 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
4341 alc_auto_parse_digital(codec);
4343 if (spec->kctls.list)
4344 add_mixer(spec, spec->kctls.list);
4346 err = alc_auto_add_mic_boost(codec);
4350 alc_remove_invalid_adc_nids(codec);
4352 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
4353 alc_auto_check_switches(codec);
4366 static const struct alc_fixup alc262_fixups[] = {
4367 [PINFIX_FSC_H270] = {
4368 .type = ALC_FIXUP_PINS,
4369 .v.pins = (const struct alc_pincfg[]) {
4370 { 0x14, 0x99130110 }, /* speaker */
4371 { 0x15, 0x0221142f }, /* front HP */
4372 { 0x1b, 0x0121141f }, /* rear HP */
4376 [PINFIX_HP_Z200] = {
4377 .type = ALC_FIXUP_PINS,
4378 .v.pins = (const struct alc_pincfg[]) {
4379 { 0x16, 0x99130120 }, /* internal speaker */
4385 static const struct snd_pci_quirk alc262_fixup_tbl[] = {
4386 SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", PINFIX_HP_Z200),
4387 SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", PINFIX_FSC_H270),
4392 #ifdef CONFIG_SND_HDA_POWER_SAVE
4393 #define alc262_loopbacks alc880_loopbacks
4396 /* init callback for auto-configuration model -- overriding the default init */
4397 static void alc262_auto_init(struct hda_codec *codec)
4399 struct alc_spec *spec = codec->spec;
4400 alc_auto_init_multi_out(codec);
4401 alc_auto_init_extra_out(codec);
4402 alc_auto_init_analog_input(codec);
4403 alc_auto_init_input_src(codec);
4404 alc_auto_init_digital(codec);
4405 if (spec->unsol_event)
4406 alc_inithook(codec);
4411 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
4412 #include "alc262_quirks.c"
4415 static int patch_alc262(struct hda_codec *codec)
4417 struct alc_spec *spec;
4421 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4427 spec->mixer_nid = 0x0b;
4430 /* pshou 07/11/05 set a zero PCM sample to DAC when FIFO is
4435 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
4436 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
4437 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
4438 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80);
4441 alc_auto_parse_customize_define(codec);
4443 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
4445 board_config = alc_board_config(codec, ALC262_MODEL_LAST,
4446 alc262_models, alc262_cfg_tbl);
4448 if (board_config < 0) {
4449 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
4451 board_config = ALC_MODEL_AUTO;
4454 if (board_config == ALC_MODEL_AUTO) {
4455 alc_pick_fixup(codec, NULL, alc262_fixup_tbl, alc262_fixups);
4456 alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
4459 if (board_config == ALC_MODEL_AUTO) {
4460 /* automatic parse from the BIOS config */
4461 err = alc262_parse_auto_config(codec);
4466 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
4469 "hda_codec: Cannot set up configuration "
4470 "from BIOS. Using base mode...\n");
4471 board_config = ALC262_BASIC;
4476 if (!spec->no_analog && has_cdefine_beep(codec)) {
4477 err = snd_hda_attach_beep_device(codec, 0x1);
4484 if (board_config != ALC_MODEL_AUTO)
4485 setup_preset(codec, &alc262_presets[board_config]);
4487 if (!spec->adc_nids && spec->input_mux) {
4488 alc_auto_fill_adc_caps(codec);
4489 alc_rebuild_imux_for_auto_mic(codec);
4490 alc_remove_invalid_adc_nids(codec);
4492 if (!spec->cap_mixer && !spec->no_analog)
4493 set_capture_mixer(codec);
4494 if (!spec->no_analog && has_cdefine_beep(codec))
4495 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
4497 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
4499 spec->vmaster_nid = 0x0c;
4501 codec->patch_ops = alc_patch_ops;
4502 if (board_config == ALC_MODEL_AUTO)
4503 spec->init_hook = alc262_auto_init;
4504 spec->shutup = alc_eapd_shutup;
4506 alc_init_jacks(codec);
4507 #ifdef CONFIG_SND_HDA_POWER_SAVE
4508 if (!spec->loopback.amplist)
4509 spec->loopback.amplist = alc262_loopbacks;
4518 /* create input playback/capture controls for the given pin */
4519 static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
4520 const char *ctlname, int idx)
4531 case 0x1a: /* ALC259/269 only */
4532 case 0x1b: /* ALC259/269 only */
4533 case 0x21: /* ALC269vb has this pin, too */
4537 snd_printd(KERN_WARNING "hda_codec: "
4538 "ignoring pin 0x%x as unknown\n", nid);
4541 if (spec->multiout.dac_nids[0] != dac &&
4542 spec->multiout.dac_nids[1] != dac) {
4543 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
4544 HDA_COMPOSE_AMP_VAL(dac, 3, idx,
4548 spec->private_dac_nids[spec->multiout.num_dacs++] = dac;
4552 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
4553 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
4555 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
4556 HDA_COMPOSE_AMP_VAL(nid, 2, idx, HDA_OUTPUT));
4562 /* add playback controls from the parsed DAC table */
4563 static int alc268_auto_create_multi_out_ctls(struct alc_spec *spec,
4564 const struct auto_pin_cfg *cfg)
4569 spec->multiout.dac_nids = spec->private_dac_nids;
4571 nid = cfg->line_out_pins[0];
4575 name = alc_get_line_out_pfx(spec, 0, true, &index);
4576 err = alc268_new_analog_output(spec, nid, name, 0);
4581 nid = cfg->speaker_pins[0];
4583 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, "Speaker",
4584 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
4588 err = alc268_new_analog_output(spec, nid, "Speaker", 0);
4592 nid = cfg->hp_pins[0];
4594 err = alc268_new_analog_output(spec, nid, "Headphone", 0);
4599 nid = cfg->line_out_pins[1] | cfg->line_out_pins[2];
4601 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, "Mono",
4602 HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT));
4609 static void alc268_auto_set_output_and_unmute(struct hda_codec *codec,
4610 hda_nid_t nid, int pin_type)
4614 alc_set_pin_output(codec, nid, pin_type);
4615 if (snd_hda_get_conn_list(codec, nid, NULL) <= 1)
4617 if (nid == 0x14 || nid == 0x16)
4621 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
4624 static void alc268_auto_init_dac(struct hda_codec *codec, hda_nid_t nid)
4628 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
4632 static void alc268_auto_init_multi_out(struct hda_codec *codec)
4634 struct alc_spec *spec = codec->spec;
4637 for (i = 0; i < spec->autocfg.line_outs; i++) {
4638 hda_nid_t nid = spec->autocfg.line_out_pins[i];
4639 int pin_type = get_pin_type(spec->autocfg.line_out_type);
4640 alc268_auto_set_output_and_unmute(codec, nid, pin_type);
4643 for (i = 0; i < spec->multiout.num_dacs; i++)
4644 alc268_auto_init_dac(codec, spec->multiout.dac_nids[i]);
4647 static void alc268_auto_init_hp_out(struct hda_codec *codec)
4649 struct alc_spec *spec = codec->spec;
4653 for (i = 0; i < spec->autocfg.hp_outs; i++) {
4654 pin = spec->autocfg.hp_pins[i];
4655 alc268_auto_set_output_and_unmute(codec, pin, PIN_HP);
4657 for (i = 0; i < spec->autocfg.speaker_outs; i++) {
4658 pin = spec->autocfg.speaker_pins[i];
4659 alc268_auto_set_output_and_unmute(codec, pin, PIN_OUT);
4661 if (spec->autocfg.mono_out_pin)
4662 snd_hda_codec_write(codec, spec->autocfg.mono_out_pin, 0,
4663 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
4665 alc268_auto_init_dac(codec, spec->multiout.hp_nid);
4666 for (i = 0; i < ARRAY_SIZE(spec->multiout.extra_out_nid); i++)
4667 alc268_auto_init_dac(codec, spec->multiout.extra_out_nid[i]);
4670 static void alc268_auto_init_mono_speaker_out(struct hda_codec *codec)
4672 struct alc_spec *spec = codec->spec;
4673 hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
4674 hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
4675 hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
4676 unsigned int dac_vol1, dac_vol2;
4678 if (line_nid == 0x1d || speaker_nid == 0x1d) {
4679 snd_hda_codec_write(codec, speaker_nid, 0,
4680 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
4681 /* mute mixer inputs from 0x1d */
4682 snd_hda_codec_write(codec, 0x0f, 0,
4683 AC_VERB_SET_AMP_GAIN_MUTE,
4685 snd_hda_codec_write(codec, 0x10, 0,
4686 AC_VERB_SET_AMP_GAIN_MUTE,
4689 /* unmute mixer inputs from 0x1d */
4690 snd_hda_codec_write(codec, 0x0f, 0,
4691 AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
4692 snd_hda_codec_write(codec, 0x10, 0,
4693 AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
4696 dac_vol1 = dac_vol2 = 0xb000 | 0x40; /* set max volume */
4697 if (line_nid == 0x14)
4698 dac_vol2 = AMP_OUT_ZERO;
4699 else if (line_nid == 0x15)
4700 dac_vol1 = AMP_OUT_ZERO;
4702 dac_vol2 = AMP_OUT_ZERO;
4703 else if (hp_nid == 0x15)
4704 dac_vol1 = AMP_OUT_ZERO;
4705 if (line_nid != 0x16 || hp_nid != 0x16 ||
4706 spec->autocfg.line_out_pins[1] != 0x16 ||
4707 spec->autocfg.line_out_pins[2] != 0x16)
4708 dac_vol1 = dac_vol2 = AMP_OUT_ZERO;
4710 snd_hda_codec_write(codec, 0x02, 0,
4711 AC_VERB_SET_AMP_GAIN_MUTE, dac_vol1);
4712 snd_hda_codec_write(codec, 0x03, 0,
4713 AC_VERB_SET_AMP_GAIN_MUTE, dac_vol2);
4716 /* bind Beep switches of both NID 0x0f and 0x10 */
4717 static const struct hda_bind_ctls alc268_bind_beep_sw = {
4718 .ops = &snd_hda_bind_sw,
4720 HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT),
4721 HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT),
4726 static const struct snd_kcontrol_new alc268_beep_mixer[] = {
4727 HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
4728 HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw),
4732 /* set PCBEEP vol = 0, mute connections */
4733 static const struct hda_verb alc268_beep_init_verbs[] = {
4734 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4735 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4736 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4741 * BIOS auto configuration
4743 static int alc268_parse_auto_config(struct hda_codec *codec)
4745 struct alc_spec *spec = codec->spec;
4747 static const hda_nid_t alc268_ignore[] = { 0 };
4749 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
4753 if (!spec->autocfg.line_outs) {
4754 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
4755 spec->multiout.max_channels = 2;
4756 spec->no_analog = 1;
4759 return 0; /* can't find valid BIOS pin config */
4761 err = alc268_auto_create_multi_out_ctls(spec, &spec->autocfg);
4764 err = alc_auto_create_input_ctls(codec);
4768 spec->multiout.max_channels = 2;
4771 /* digital only support output */
4772 alc_auto_parse_digital(codec);
4773 if (spec->kctls.list)
4774 add_mixer(spec, spec->kctls.list);
4776 if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d) {
4777 add_mixer(spec, alc268_beep_mixer);
4778 add_verb(spec, alc268_beep_init_verbs);
4781 err = alc_auto_add_mic_boost(codec);
4785 alc_remove_invalid_adc_nids(codec);
4787 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
4788 alc_auto_check_switches(codec);
4793 /* init callback for auto-configuration model -- overriding the default init */
4794 static void alc268_auto_init(struct hda_codec *codec)
4796 struct alc_spec *spec = codec->spec;
4797 alc268_auto_init_multi_out(codec);
4798 alc268_auto_init_hp_out(codec);
4799 alc268_auto_init_mono_speaker_out(codec);
4800 alc_auto_init_analog_input(codec);
4801 alc_auto_init_input_src(codec);
4802 alc_auto_init_digital(codec);
4803 if (spec->unsol_event)
4804 alc_inithook(codec);
4809 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
4810 #include "alc268_quirks.c"
4813 static int patch_alc268(struct hda_codec *codec)
4815 struct alc_spec *spec;
4817 int i, has_beep, err;
4819 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4825 /* ALC268 has no aa-loopback mixer */
4827 board_config = alc_board_config(codec, ALC268_MODEL_LAST,
4828 alc268_models, alc268_cfg_tbl);
4830 if (board_config < 0)
4831 board_config = alc_board_codec_sid_config(codec,
4832 ALC268_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl);
4834 if (board_config < 0) {
4835 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
4837 board_config = ALC_MODEL_AUTO;
4840 if (board_config == ALC_MODEL_AUTO) {
4841 /* automatic parse from the BIOS config */
4842 err = alc268_parse_auto_config(codec);
4847 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
4850 "hda_codec: Cannot set up configuration "
4851 "from BIOS. Using base mode...\n");
4852 board_config = ALC268_3ST;
4857 if (board_config != ALC_MODEL_AUTO)
4858 setup_preset(codec, &alc268_presets[board_config]);
4861 for (i = 0; i < spec->num_mixers; i++) {
4862 if (spec->mixers[i] == alc268_beep_mixer) {
4869 err = snd_hda_attach_beep_device(codec, 0x1);
4874 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
4875 /* override the amp caps for beep generator */
4876 snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
4877 (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
4878 (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
4879 (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
4880 (0 << AC_AMPCAP_MUTE_SHIFT));
4883 if (!spec->no_analog && !spec->adc_nids && spec->input_mux) {
4884 alc_auto_fill_adc_caps(codec);
4885 alc_rebuild_imux_for_auto_mic(codec);
4886 alc_remove_invalid_adc_nids(codec);
4889 if (!spec->cap_mixer && !spec->no_analog)
4890 set_capture_mixer(codec);
4892 spec->vmaster_nid = 0x02;
4894 codec->patch_ops = alc_patch_ops;
4895 if (board_config == ALC_MODEL_AUTO)
4896 spec->init_hook = alc268_auto_init;
4897 spec->shutup = alc_eapd_shutup;
4899 alc_init_jacks(codec);
4907 #define alc269_auto_create_multi_out_ctls \
4908 alc268_auto_create_multi_out_ctls
4910 #ifdef CONFIG_SND_HDA_POWER_SAVE
4911 #define alc269_loopbacks alc880_loopbacks
4914 static const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
4918 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
4919 /* NID is set in alc_build_pcms */
4921 .open = alc_playback_pcm_open,
4922 .prepare = alc_playback_pcm_prepare,
4923 .cleanup = alc_playback_pcm_cleanup
4927 static const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
4931 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
4932 /* NID is set in alc_build_pcms */
4935 #ifdef CONFIG_SND_HDA_POWER_SAVE
4936 static int alc269_mic2_for_mute_led(struct hda_codec *codec)
4938 switch (codec->subsystem_id) {
4945 static int alc269_mic2_mute_check_ps(struct hda_codec *codec, hda_nid_t nid)
4947 /* update mute-LED according to the speaker mute state */
4948 if (nid == 0x01 || nid == 0x14) {
4950 if (snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0) &
4955 /* mic2 vref pin is used for mute LED control */
4956 snd_hda_codec_update_cache(codec, 0x19, 0,
4957 AC_VERB_SET_PIN_WIDGET_CONTROL,
4960 return alc_check_power_status(codec, nid);
4962 #endif /* CONFIG_SND_HDA_POWER_SAVE */
4964 /* different alc269-variants */
4966 ALC269_TYPE_ALC269VA,
4967 ALC269_TYPE_ALC269VB,
4968 ALC269_TYPE_ALC269VC,
4972 * BIOS auto configuration
4974 static int alc269_parse_auto_config(struct hda_codec *codec)
4976 struct alc_spec *spec = codec->spec;
4978 static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };
4980 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
4985 err = alc269_auto_create_multi_out_ctls(spec, &spec->autocfg);
4988 err = alc_auto_create_input_ctls(codec);
4992 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
4994 alc_auto_parse_digital(codec);
4996 if (spec->kctls.list)
4997 add_mixer(spec, spec->kctls.list);
4999 alc_remove_invalid_adc_nids(codec);
5001 if (spec->codec_variant != ALC269_TYPE_ALC269VA)
5002 alc_ssid_check(codec, 0, 0x1b, 0x14, 0x21);
5004 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
5005 alc_auto_check_switches(codec);
5007 err = alc_auto_add_mic_boost(codec);
5011 if (!spec->cap_mixer && !spec->no_analog)
5012 set_capture_mixer(codec);
5017 #define alc269_auto_init_multi_out alc268_auto_init_multi_out
5018 #define alc269_auto_init_hp_out alc268_auto_init_hp_out
5021 /* init callback for auto-configuration model -- overriding the default init */
5022 static void alc269_auto_init(struct hda_codec *codec)
5024 struct alc_spec *spec = codec->spec;
5025 alc269_auto_init_multi_out(codec);
5026 alc269_auto_init_hp_out(codec);
5027 alc_auto_init_analog_input(codec);
5028 alc_auto_init_input_src(codec);
5029 alc_auto_init_digital(codec);
5030 if (spec->unsol_event)
5031 alc_inithook(codec);
5034 static void alc269_toggle_power_output(struct hda_codec *codec, int power_up)
5036 int val = alc_read_coef_idx(codec, 0x04);
5041 alc_write_coef_idx(codec, 0x04, val);
5044 static void alc269_shutup(struct hda_codec *codec)
5046 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x017)
5047 alc269_toggle_power_output(codec, 0);
5048 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x018) {
5049 alc269_toggle_power_output(codec, 0);
5054 #ifdef SND_HDA_NEEDS_RESUME
5055 static int alc269_resume(struct hda_codec *codec)
5057 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x018) {
5058 alc269_toggle_power_output(codec, 0);
5062 codec->patch_ops.init(codec);
5064 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x017) {
5065 alc269_toggle_power_output(codec, 1);
5069 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x018)
5070 alc269_toggle_power_output(codec, 1);
5072 snd_hda_codec_resume_amp(codec);
5073 snd_hda_codec_resume_cache(codec);
5074 hda_call_check_power_status(codec, 0x01);
5077 #endif /* SND_HDA_NEEDS_RESUME */
5079 static void alc269_fixup_hweq(struct hda_codec *codec,
5080 const struct alc_fixup *fix, int action)
5084 if (action != ALC_FIXUP_ACT_INIT)
5086 coef = alc_read_coef_idx(codec, 0x1e);
5087 alc_write_coef_idx(codec, 0x1e, coef | 0x80);
5090 static void alc271_fixup_dmic(struct hda_codec *codec,
5091 const struct alc_fixup *fix, int action)
5093 static const struct hda_verb verbs[] = {
5094 {0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
5095 {0x20, AC_VERB_SET_PROC_COEF, 0x4000},
5100 if (strcmp(codec->chip_name, "ALC271X"))
5102 cfg = snd_hda_codec_get_pincfg(codec, 0x12);
5103 if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
5104 snd_hda_sequence_write(codec, verbs);
5108 ALC269_FIXUP_SONY_VAIO,
5109 ALC275_FIXUP_SONY_VAIO_GPIO2,
5110 ALC269_FIXUP_DELL_M101Z,
5111 ALC269_FIXUP_SKU_IGNORE,
5112 ALC269_FIXUP_ASUS_G73JW,
5113 ALC269_FIXUP_LENOVO_EAPD,
5114 ALC275_FIXUP_SONY_HWEQ,
5118 static const struct alc_fixup alc269_fixups[] = {
5119 [ALC269_FIXUP_SONY_VAIO] = {
5120 .type = ALC_FIXUP_VERBS,
5121 .v.verbs = (const struct hda_verb[]) {
5122 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD},
5126 [ALC275_FIXUP_SONY_VAIO_GPIO2] = {
5127 .type = ALC_FIXUP_VERBS,
5128 .v.verbs = (const struct hda_verb[]) {
5129 {0x01, AC_VERB_SET_GPIO_MASK, 0x04},
5130 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04},
5131 {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
5135 .chain_id = ALC269_FIXUP_SONY_VAIO
5137 [ALC269_FIXUP_DELL_M101Z] = {
5138 .type = ALC_FIXUP_VERBS,
5139 .v.verbs = (const struct hda_verb[]) {
5140 /* Enables internal speaker */
5141 {0x20, AC_VERB_SET_COEF_INDEX, 13},
5142 {0x20, AC_VERB_SET_PROC_COEF, 0x4040},
5146 [ALC269_FIXUP_SKU_IGNORE] = {
5147 .type = ALC_FIXUP_SKU,
5148 .v.sku = ALC_FIXUP_SKU_IGNORE,
5150 [ALC269_FIXUP_ASUS_G73JW] = {
5151 .type = ALC_FIXUP_PINS,
5152 .v.pins = (const struct alc_pincfg[]) {
5153 { 0x17, 0x99130111 }, /* subwoofer */
5157 [ALC269_FIXUP_LENOVO_EAPD] = {
5158 .type = ALC_FIXUP_VERBS,
5159 .v.verbs = (const struct hda_verb[]) {
5160 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
5164 [ALC275_FIXUP_SONY_HWEQ] = {
5165 .type = ALC_FIXUP_FUNC,
5166 .v.func = alc269_fixup_hweq,
5168 .chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
5170 [ALC271_FIXUP_DMIC] = {
5171 .type = ALC_FIXUP_FUNC,
5172 .v.func = alc271_fixup_dmic,
5176 static const struct snd_pci_quirk alc269_fixup_tbl[] = {
5177 SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
5178 SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
5179 SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
5180 SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
5181 SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
5182 SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
5183 SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
5184 SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
5185 SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
5186 SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
5187 SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
5188 SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
5189 SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
5194 static int alc269_fill_coef(struct hda_codec *codec)
5198 if ((alc_read_coef_idx(codec, 0) & 0x00ff) < 0x015) {
5199 alc_write_coef_idx(codec, 0xf, 0x960b);
5200 alc_write_coef_idx(codec, 0xe, 0x8817);
5203 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x016) {
5204 alc_write_coef_idx(codec, 0xf, 0x960b);
5205 alc_write_coef_idx(codec, 0xe, 0x8814);
5208 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x017) {
5209 val = alc_read_coef_idx(codec, 0x04);
5210 /* Power up output pin */
5211 alc_write_coef_idx(codec, 0x04, val | (1<<11));
5214 if ((alc_read_coef_idx(codec, 0) & 0x00ff) == 0x018) {
5215 val = alc_read_coef_idx(codec, 0xd);
5216 if ((val & 0x0c00) >> 10 != 0x1) {
5217 /* Capless ramp up clock control */
5218 alc_write_coef_idx(codec, 0xd, val | (1<<10));
5220 val = alc_read_coef_idx(codec, 0x17);
5221 if ((val & 0x01c0) >> 6 != 0x4) {
5222 /* Class D power on reset */
5223 alc_write_coef_idx(codec, 0x17, val | (1<<7));
5227 val = alc_read_coef_idx(codec, 0xd); /* Class D */
5228 alc_write_coef_idx(codec, 0xd, val | (1<<14));
5230 val = alc_read_coef_idx(codec, 0x4); /* HP */
5231 alc_write_coef_idx(codec, 0x4, val | (1<<11));
5238 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
5239 #include "alc269_quirks.c"
5242 static int patch_alc269(struct hda_codec *codec)
5244 struct alc_spec *spec;
5245 int board_config, coef;
5248 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5254 spec->mixer_nid = 0x0b;
5256 alc_auto_parse_customize_define(codec);
5258 if (codec->vendor_id == 0x10ec0269) {
5259 spec->codec_variant = ALC269_TYPE_ALC269VA;
5260 coef = alc_read_coef_idx(codec, 0);
5261 if ((coef & 0x00f0) == 0x0010) {
5262 if (codec->bus->pci->subsystem_vendor == 0x1025 &&
5263 spec->cdefine.platform_type == 1) {
5264 alc_codec_rename(codec, "ALC271X");
5265 } else if ((coef & 0xf000) == 0x2000) {
5266 alc_codec_rename(codec, "ALC259");
5267 } else if ((coef & 0xf000) == 0x3000) {
5268 alc_codec_rename(codec, "ALC258");
5269 } else if ((coef & 0xfff0) == 0x3010) {
5270 alc_codec_rename(codec, "ALC277");
5272 alc_codec_rename(codec, "ALC269VB");
5274 spec->codec_variant = ALC269_TYPE_ALC269VB;
5275 } else if ((coef & 0x00f0) == 0x0020) {
5277 alc_codec_rename(codec, "ALC259");
5278 else if (coef == 0x6023)
5279 alc_codec_rename(codec, "ALC281X");
5280 else if (codec->bus->pci->subsystem_vendor == 0x17aa &&
5281 codec->bus->pci->subsystem_device == 0x21f3)
5282 alc_codec_rename(codec, "ALC3202");
5284 alc_codec_rename(codec, "ALC269VC");
5285 spec->codec_variant = ALC269_TYPE_ALC269VC;
5287 alc_fix_pll_init(codec, 0x20, 0x04, 15);
5288 alc269_fill_coef(codec);
5291 board_config = alc_board_config(codec, ALC269_MODEL_LAST,
5292 alc269_models, alc269_cfg_tbl);
5294 if (board_config < 0) {
5295 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5297 board_config = ALC_MODEL_AUTO;
5300 if (board_config == ALC_MODEL_AUTO) {
5301 alc_pick_fixup(codec, NULL, alc269_fixup_tbl, alc269_fixups);
5302 alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
5305 if (board_config == ALC_MODEL_AUTO) {
5306 /* automatic parse from the BIOS config */
5307 err = alc269_parse_auto_config(codec);
5312 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
5315 "hda_codec: Cannot set up configuration "
5316 "from BIOS. Using base mode...\n");
5317 board_config = ALC269_BASIC;
5322 if (has_cdefine_beep(codec)) {
5323 err = snd_hda_attach_beep_device(codec, 0x1);
5330 if (board_config != ALC_MODEL_AUTO)
5331 setup_preset(codec, &alc269_presets[board_config]);
5334 if (board_config == ALC269_QUANTA_FL1) {
5335 /* Due to a hardware problem on Lenovo Ideadpad, we need to
5336 * fix the sample rate of analog I/O to 44.1kHz
5338 spec->stream_analog_playback = &alc269_44k_pcm_analog_playback;
5339 spec->stream_analog_capture = &alc269_44k_pcm_analog_capture;
5343 if (!spec->adc_nids) { /* wasn't filled automatically? use default */
5344 alc_auto_fill_adc_caps(codec);
5345 alc_rebuild_imux_for_auto_mic(codec);
5346 alc_remove_invalid_adc_nids(codec);
5349 if (!spec->cap_mixer)
5350 set_capture_mixer(codec);
5351 if (has_cdefine_beep(codec))
5352 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
5354 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
5356 spec->vmaster_nid = 0x02;
5358 codec->patch_ops = alc_patch_ops;
5359 #ifdef SND_HDA_NEEDS_RESUME
5360 codec->patch_ops.resume = alc269_resume;
5362 if (board_config == ALC_MODEL_AUTO)
5363 spec->init_hook = alc269_auto_init;
5364 spec->shutup = alc269_shutup;
5366 alc_init_jacks(codec);
5367 #ifdef CONFIG_SND_HDA_POWER_SAVE
5368 if (!spec->loopback.amplist)
5369 spec->loopback.amplist = alc269_loopbacks;
5370 if (alc269_mic2_for_mute_led(codec))
5371 codec->patch_ops.check_power_status = alc269_mic2_mute_check_ps;
5381 static hda_nid_t alc861_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
5383 struct alc_spec *spec = codec->spec;
5384 hda_nid_t mix, srcs[5];
5387 if (snd_hda_get_connections(codec, pin, &mix, 1) != 1)
5389 num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
5392 for (i = 0; i < num; i++) {
5394 type = get_wcaps_type(get_wcaps(codec, srcs[i]));
5395 if (type != AC_WID_AUD_OUT)
5397 if (!found_in_nid_list(srcs[i], spec->multiout.dac_nids,
5398 spec->multiout.num_dacs))
5404 /* fill in the dac_nids table from the parsed pin configuration */
5405 static int alc861_auto_fill_dac_nids(struct hda_codec *codec)
5407 struct alc_spec *spec = codec->spec;
5408 const struct auto_pin_cfg *cfg = &spec->autocfg;
5412 spec->multiout.dac_nids = spec->private_dac_nids;
5413 for (i = 0; i < cfg->line_outs; i++) {
5414 nid = cfg->line_out_pins[i];
5415 dac = alc861_look_for_dac(codec, nid);
5418 spec->private_dac_nids[spec->multiout.num_dacs++] = dac;
5423 static int __alc861_create_out_sw(struct hda_codec *codec, const char *pfx,
5424 hda_nid_t nid, int idx, unsigned int chs)
5426 return __add_pb_sw_ctrl(codec->spec, ALC_CTL_WIDGET_MUTE, pfx, idx,
5427 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
5430 #define alc861_create_out_sw(codec, pfx, nid, chs) \
5431 __alc861_create_out_sw(codec, pfx, nid, 0, chs)
5433 /* add playback controls from the parsed DAC table */
5434 static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
5435 const struct auto_pin_cfg *cfg)
5437 struct alc_spec *spec = codec->spec;
5439 int i, err, noutputs;
5441 noutputs = cfg->line_outs;
5442 if (spec->multi_ios > 0)
5443 noutputs += spec->multi_ios;
5445 for (i = 0; i < noutputs; i++) {
5448 nid = spec->multiout.dac_nids[i];
5451 name = alc_get_line_out_pfx(spec, i, true, &index);
5454 err = alc861_create_out_sw(codec, "Center", nid, 1);
5457 err = alc861_create_out_sw(codec, "LFE", nid, 2);
5461 err = __alc861_create_out_sw(codec, name, nid, index, 3);
5469 static int alc861_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin)
5471 struct alc_spec *spec = codec->spec;
5478 if ((pin >= 0x0b && pin <= 0x10) || pin == 0x1f || pin == 0x20) {
5479 nid = alc861_look_for_dac(codec, pin);
5481 err = alc861_create_out_sw(codec, "Headphone", nid, 3);
5484 spec->multiout.hp_nid = nid;
5490 static void alc861_auto_set_output_and_unmute(struct hda_codec *codec,
5492 int pin_type, hda_nid_t dac)
5494 hda_nid_t mix, srcs[5];
5497 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5499 snd_hda_codec_write(codec, dac, 0, AC_VERB_SET_AMP_GAIN_MUTE,
5501 if (snd_hda_get_connections(codec, nid, &mix, 1) != 1)
5503 num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
5506 for (i = 0; i < num; i++) {
5508 if (srcs[i] == dac || srcs[i] == 0x15)
5509 mute = AMP_IN_UNMUTE(i);
5511 mute = AMP_IN_MUTE(i);
5512 snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
5517 static void alc861_auto_init_multi_out(struct hda_codec *codec)
5519 struct alc_spec *spec = codec->spec;
5522 for (i = 0; i < spec->autocfg.line_outs + spec->multi_ios; i++) {
5523 hda_nid_t nid = spec->autocfg.line_out_pins[i];
5524 int pin_type = get_pin_type(spec->autocfg.line_out_type);
5526 alc861_auto_set_output_and_unmute(codec, nid, pin_type,
5527 spec->multiout.dac_nids[i]);
5531 static void alc861_auto_init_hp_out(struct hda_codec *codec)
5533 struct alc_spec *spec = codec->spec;
5535 if (spec->autocfg.hp_outs)
5536 alc861_auto_set_output_and_unmute(codec,
5537 spec->autocfg.hp_pins[0],
5539 spec->multiout.hp_nid);
5540 if (spec->autocfg.speaker_outs)
5541 alc861_auto_set_output_and_unmute(codec,
5542 spec->autocfg.speaker_pins[0],
5544 spec->multiout.dac_nids[0]);
5547 /* parse the BIOS configuration and set up the alc_spec */
5548 /* return 1 if successful, 0 if the proper config is not found,
5549 * or a negative error code
5551 static int alc861_parse_auto_config(struct hda_codec *codec)
5553 struct alc_spec *spec = codec->spec;
5555 static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
5557 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
5561 if (!spec->autocfg.line_outs)
5562 return 0; /* can't find valid BIOS pin config */
5564 err = alc861_auto_fill_dac_nids(codec);
5567 err = alc_auto_add_multi_channel_mode(codec, alc861_auto_fill_dac_nids);
5570 err = alc861_auto_create_multi_out_ctls(codec, &spec->autocfg);
5573 err = alc861_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]);
5576 err = alc_auto_create_input_ctls(codec);
5580 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
5582 alc_auto_parse_digital(codec);
5584 if (spec->kctls.list)
5585 add_mixer(spec, spec->kctls.list);
5587 alc_remove_invalid_adc_nids(codec);
5589 alc_ssid_check(codec, 0x0e, 0x0f, 0x0b, 0);
5590 alc_auto_check_switches(codec);
5592 set_capture_mixer(codec);
5597 /* additional initialization for auto-configuration model */
5598 static void alc861_auto_init(struct hda_codec *codec)
5600 struct alc_spec *spec = codec->spec;
5601 alc861_auto_init_multi_out(codec);
5602 alc861_auto_init_hp_out(codec);
5603 alc_auto_init_analog_input(codec);
5604 alc_auto_init_digital(codec);
5605 if (spec->unsol_event)
5606 alc_inithook(codec);
5609 #ifdef CONFIG_SND_HDA_POWER_SAVE
5610 static const struct hda_amp_list alc861_loopbacks[] = {
5611 { 0x15, HDA_INPUT, 0 },
5612 { 0x15, HDA_INPUT, 1 },
5613 { 0x15, HDA_INPUT, 2 },
5614 { 0x15, HDA_INPUT, 3 },
5620 /* Pin config fixes */
5622 PINFIX_FSC_AMILO_PI1505,
5625 static const struct alc_fixup alc861_fixups[] = {
5626 [PINFIX_FSC_AMILO_PI1505] = {
5627 .type = ALC_FIXUP_PINS,
5628 .v.pins = (const struct alc_pincfg[]) {
5629 { 0x0b, 0x0221101f }, /* HP */
5630 { 0x0f, 0x90170310 }, /* speaker */
5636 static const struct snd_pci_quirk alc861_fixup_tbl[] = {
5637 SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505),
5643 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
5644 #include "alc861_quirks.c"
5647 static int patch_alc861(struct hda_codec *codec)
5649 struct alc_spec *spec;
5653 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5659 spec->mixer_nid = 0x15;
5661 board_config = alc_board_config(codec, ALC861_MODEL_LAST,
5662 alc861_models, alc861_cfg_tbl);
5664 if (board_config < 0) {
5665 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5667 board_config = ALC_MODEL_AUTO;
5670 if (board_config == ALC_MODEL_AUTO) {
5671 alc_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
5672 alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
5675 if (board_config == ALC_MODEL_AUTO) {
5676 /* automatic parse from the BIOS config */
5677 err = alc861_parse_auto_config(codec);
5682 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
5685 "hda_codec: Cannot set up configuration "
5686 "from BIOS. Using base mode...\n");
5687 board_config = ALC861_3ST_DIG;
5692 err = snd_hda_attach_beep_device(codec, 0x23);
5698 if (board_config != ALC_MODEL_AUTO)
5699 setup_preset(codec, &alc861_presets[board_config]);
5701 if (!spec->adc_nids) {
5702 alc_auto_fill_adc_caps(codec);
5703 alc_rebuild_imux_for_auto_mic(codec);
5704 alc_remove_invalid_adc_nids(codec);
5707 if (!spec->cap_mixer)
5708 set_capture_mixer(codec);
5709 set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
5711 spec->vmaster_nid = 0x03;
5713 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
5715 codec->patch_ops = alc_patch_ops;
5716 if (board_config == ALC_MODEL_AUTO) {
5717 spec->init_hook = alc861_auto_init;
5718 #ifdef CONFIG_SND_HDA_POWER_SAVE
5719 spec->power_hook = alc_power_eapd;
5722 #ifdef CONFIG_SND_HDA_POWER_SAVE
5723 if (!spec->loopback.amplist)
5724 spec->loopback.amplist = alc861_loopbacks;
5735 * In addition, an independent DAC
5737 #ifdef CONFIG_SND_HDA_POWER_SAVE
5738 #define alc861vd_loopbacks alc880_loopbacks
5742 * BIOS auto configuration
5744 #define alc861vd_is_fixed_pin(nid) ((nid) >= 0x14 && (nid) <= 0x17)
5745 #define alc861vd_fixed_pin_idx(nid) ((nid) - 0x14)
5746 #define alc861vd_is_multi_pin(nid) ((nid) >= 0x18)
5747 #define alc861vd_multi_pin_idx(nid) ((nid) - 0x18)
5748 #define alc861vd_idx_to_dac(nid) ((nid) + 0x02)
5749 #define alc861vd_dac_to_idx(nid) ((nid) - 0x02)
5750 #define alc861vd_idx_to_mixer_vol(nid) ((nid) + 0x02)
5751 #define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c)
5753 /* add playback controls from the parsed DAC table */
5754 /* Based on ALC880 version. But ALC861VD has separate,
5755 * different NIDs for mute/unmute switch and volume control */
5756 static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
5757 const struct auto_pin_cfg *cfg)
5759 hda_nid_t nid_v, nid_s;
5760 int i, err, noutputs;
5762 noutputs = cfg->line_outs;
5763 if (spec->multi_ios > 0)
5764 noutputs += spec->multi_ios;
5766 for (i = 0; i < noutputs; i++) {
5769 if (!spec->multiout.dac_nids[i])
5771 nid_v = alc861vd_idx_to_mixer_vol(
5772 alc861vd_dac_to_idx(
5773 spec->multiout.dac_nids[i]));
5774 nid_s = alc861vd_idx_to_mixer_switch(
5775 alc861vd_dac_to_idx(
5776 spec->multiout.dac_nids[i]));
5778 name = alc_get_line_out_pfx(spec, i, true, &index);
5781 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
5783 HDA_COMPOSE_AMP_VAL(nid_v, 1, 0,
5787 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
5789 HDA_COMPOSE_AMP_VAL(nid_v, 2, 0,
5793 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
5795 HDA_COMPOSE_AMP_VAL(nid_s, 1, 2,
5799 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
5801 HDA_COMPOSE_AMP_VAL(nid_s, 2, 2,
5806 err = __add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
5808 HDA_COMPOSE_AMP_VAL(nid_v, 3, 0,
5812 err = __add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
5814 HDA_COMPOSE_AMP_VAL(nid_s, 3, 2,
5823 /* add playback controls for speaker and HP outputs */
5824 /* Based on ALC880 version. But ALC861VD has separate,
5825 * different NIDs for mute/unmute switch and volume control */
5826 static int alc861vd_auto_create_extra_out(struct alc_spec *spec,
5827 hda_nid_t pin, const char *pfx)
5829 hda_nid_t nid_v, nid_s;
5835 if (alc861vd_is_fixed_pin(pin)) {
5836 nid_v = alc861vd_idx_to_dac(alc861vd_fixed_pin_idx(pin));
5837 /* specify the DAC as the extra output */
5838 if (!spec->multiout.hp_nid)
5839 spec->multiout.hp_nid = nid_v;
5841 spec->multiout.extra_out_nid[0] = nid_v;
5842 /* control HP volume/switch on the output mixer amp */
5843 nid_v = alc861vd_idx_to_mixer_vol(
5844 alc861vd_fixed_pin_idx(pin));
5845 nid_s = alc861vd_idx_to_mixer_switch(
5846 alc861vd_fixed_pin_idx(pin));
5848 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
5849 HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, HDA_OUTPUT));
5852 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
5853 HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, HDA_INPUT));
5856 } else if (alc861vd_is_multi_pin(pin)) {
5857 /* set manual connection */
5858 /* we have only a switch on HP-out PIN */
5859 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
5860 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
5867 /* parse the BIOS configuration and set up the alc_spec
5868 * return 1 if successful, 0 if the proper config is not found,
5869 * or a negative error code
5870 * Based on ALC880 version - had to change it to override
5871 * alc880_auto_create_extra_out and alc880_auto_create_multi_out_ctls */
5872 static int alc861vd_parse_auto_config(struct hda_codec *codec)
5874 struct alc_spec *spec = codec->spec;
5876 static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
5878 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
5882 if (!spec->autocfg.line_outs)
5883 return 0; /* can't find valid BIOS pin config */
5885 err = alc_auto_fill_dac_nids(codec);
5888 err = alc_auto_add_multi_channel_mode(codec, alc_auto_fill_dac_nids);
5891 err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg);
5894 err = alc861vd_auto_create_extra_out(spec,
5895 spec->autocfg.speaker_pins[0],
5899 err = alc861vd_auto_create_extra_out(spec,
5900 spec->autocfg.hp_pins[0],
5904 err = alc_auto_create_input_ctls(codec);
5908 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
5910 alc_auto_parse_digital(codec);
5912 if (spec->kctls.list)
5913 add_mixer(spec, spec->kctls.list);
5915 alc_remove_invalid_adc_nids(codec);
5917 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
5918 alc_auto_check_switches(codec);
5920 err = alc_auto_add_mic_boost(codec);
5927 /* additional initialization for auto-configuration model */
5928 static void alc861vd_auto_init(struct hda_codec *codec)
5930 struct alc_spec *spec = codec->spec;
5931 alc_auto_init_multi_out(codec);
5932 alc_auto_init_extra_out(codec);
5933 alc_auto_init_analog_input(codec);
5934 alc_auto_init_input_src(codec);
5935 alc_auto_init_digital(codec);
5936 if (spec->unsol_event)
5937 alc_inithook(codec);
5941 ALC660VD_FIX_ASUS_GPIO1
5945 static const struct alc_fixup alc861vd_fixups[] = {
5946 [ALC660VD_FIX_ASUS_GPIO1] = {
5947 .type = ALC_FIXUP_VERBS,
5948 .v.verbs = (const struct hda_verb[]) {
5949 {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
5950 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5951 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5957 static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
5958 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
5962 static const struct hda_verb alc660vd_eapd_verbs[] = {
5963 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
5964 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
5970 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
5971 #include "alc861vd_quirks.c"
5974 static int patch_alc861vd(struct hda_codec *codec)
5976 struct alc_spec *spec;
5977 int err, board_config;
5979 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5985 spec->mixer_nid = 0x0b;
5987 board_config = alc_board_config(codec, ALC861VD_MODEL_LAST,
5988 alc861vd_models, alc861vd_cfg_tbl);
5990 if (board_config < 0) {
5991 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5993 board_config = ALC_MODEL_AUTO;
5996 if (board_config == ALC_MODEL_AUTO) {
5997 alc_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
5998 alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
6001 if (board_config == ALC_MODEL_AUTO) {
6002 /* automatic parse from the BIOS config */
6003 err = alc861vd_parse_auto_config(codec);
6008 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
6011 "hda_codec: Cannot set up configuration "
6012 "from BIOS. Using base mode...\n");
6013 board_config = ALC861VD_3ST;
6018 err = snd_hda_attach_beep_device(codec, 0x23);
6024 if (board_config != ALC_MODEL_AUTO)
6025 setup_preset(codec, &alc861vd_presets[board_config]);
6027 if (codec->vendor_id == 0x10ec0660) {
6028 /* always turn on EAPD */
6029 add_verb(spec, alc660vd_eapd_verbs);
6032 if (!spec->adc_nids) {
6033 alc_auto_fill_adc_caps(codec);
6034 alc_rebuild_imux_for_auto_mic(codec);
6035 alc_remove_invalid_adc_nids(codec);
6038 set_capture_mixer(codec);
6039 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
6041 spec->vmaster_nid = 0x02;
6043 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
6045 codec->patch_ops = alc_patch_ops;
6047 if (board_config == ALC_MODEL_AUTO)
6048 spec->init_hook = alc861vd_auto_init;
6049 spec->shutup = alc_eapd_shutup;
6050 #ifdef CONFIG_SND_HDA_POWER_SAVE
6051 if (!spec->loopback.amplist)
6052 spec->loopback.amplist = alc861vd_loopbacks;
6061 * ALC662 is almost identical with ALC880 but has cleaner and more flexible
6062 * configuration. Each pin widget can choose any input DACs and a mixer.
6063 * Each ADC is connected from a mixer of all inputs. This makes possible
6064 * 6-channel independent captures.
6066 * In addition, an independent DAC for the multi-playback (not used in this
6069 #ifdef CONFIG_SND_HDA_POWER_SAVE
6070 #define alc662_loopbacks alc880_loopbacks
6074 * BIOS auto configuration
6077 static int alc662_parse_auto_config(struct hda_codec *codec)
6079 struct alc_spec *spec = codec->spec;
6081 static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
6083 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
6087 if (!spec->autocfg.line_outs)
6088 return 0; /* can't find valid BIOS pin config */
6090 err = alc_auto_fill_dac_nids(codec);
6093 err = alc_auto_add_multi_channel_mode(codec, alc_auto_fill_dac_nids);
6096 err = alc_auto_create_multi_out_ctls(codec, &spec->autocfg);
6099 err = alc_auto_create_extra_out(codec,
6100 spec->autocfg.speaker_pins[0],
6101 spec->multiout.extra_out_nid[0],
6105 err = alc_auto_create_extra_out(codec, spec->autocfg.hp_pins[0],
6106 spec->multiout.hp_nid,
6110 err = alc_auto_create_input_ctls(codec);
6114 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
6116 alc_auto_parse_digital(codec);
6118 if (spec->kctls.list)
6119 add_mixer(spec, spec->kctls.list);
6121 alc_remove_invalid_adc_nids(codec);
6123 if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
6124 codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670)
6125 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0x21);
6127 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
6128 alc_auto_check_switches(codec);
6130 err = alc_auto_add_mic_boost(codec);
6137 /* additional initialization for auto-configuration model */
6138 static void alc662_auto_init(struct hda_codec *codec)
6140 struct alc_spec *spec = codec->spec;
6141 alc_auto_init_multi_out(codec);
6142 alc_auto_init_extra_out(codec);
6143 alc_auto_init_analog_input(codec);
6144 alc_auto_init_input_src(codec);
6145 alc_auto_init_digital(codec);
6146 if (spec->unsol_event)
6147 alc_inithook(codec);
6150 static void alc272_fixup_mario(struct hda_codec *codec,
6151 const struct alc_fixup *fix, int action)
6153 if (action != ALC_FIXUP_ACT_PROBE)
6155 if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
6156 (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
6157 (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
6158 (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
6159 (0 << AC_AMPCAP_MUTE_SHIFT)))
6161 "hda_codec: failed to override amp caps for NID 0x2\n");
6165 ALC662_FIXUP_ASPIRE,
6166 ALC662_FIXUP_IDEAPAD,
6168 ALC662_FIXUP_CZC_P10T,
6169 ALC662_FIXUP_SKU_IGNORE,
6170 ALC662_FIXUP_HP_RP5800,
6173 static const struct alc_fixup alc662_fixups[] = {
6174 [ALC662_FIXUP_ASPIRE] = {
6175 .type = ALC_FIXUP_PINS,
6176 .v.pins = (const struct alc_pincfg[]) {
6177 { 0x15, 0x99130112 }, /* subwoofer */
6181 [ALC662_FIXUP_IDEAPAD] = {
6182 .type = ALC_FIXUP_PINS,
6183 .v.pins = (const struct alc_pincfg[]) {
6184 { 0x17, 0x99130112 }, /* subwoofer */
6188 [ALC272_FIXUP_MARIO] = {
6189 .type = ALC_FIXUP_FUNC,
6190 .v.func = alc272_fixup_mario,
6192 [ALC662_FIXUP_CZC_P10T] = {
6193 .type = ALC_FIXUP_VERBS,
6194 .v.verbs = (const struct hda_verb[]) {
6195 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
6199 [ALC662_FIXUP_SKU_IGNORE] = {
6200 .type = ALC_FIXUP_SKU,
6201 .v.sku = ALC_FIXUP_SKU_IGNORE,
6203 [ALC662_FIXUP_HP_RP5800] = {
6204 .type = ALC_FIXUP_PINS,
6205 .v.pins = (const struct alc_pincfg[]) {
6206 { 0x14, 0x0221201f }, /* HP out */
6210 .chain_id = ALC662_FIXUP_SKU_IGNORE
6214 static const struct snd_pci_quirk alc662_fixup_tbl[] = {
6215 SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
6216 SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
6217 SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
6218 SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
6219 SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
6220 SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
6221 SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
6222 SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
6226 static const struct alc_model_fixup alc662_fixup_models[] = {
6227 {.id = ALC272_FIXUP_MARIO, .name = "mario"},
6234 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
6235 #include "alc662_quirks.c"
6238 static int patch_alc662(struct hda_codec *codec)
6240 struct alc_spec *spec;
6241 int err, board_config;
6244 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
6250 spec->mixer_nid = 0x0b;
6252 alc_auto_parse_customize_define(codec);
6254 alc_fix_pll_init(codec, 0x20, 0x04, 15);
6256 coef = alc_read_coef_idx(codec, 0);
6257 if (coef == 0x8020 || coef == 0x8011)
6258 alc_codec_rename(codec, "ALC661");
6259 else if (coef & (1 << 14) &&
6260 codec->bus->pci->subsystem_vendor == 0x1025 &&
6261 spec->cdefine.platform_type == 1)
6262 alc_codec_rename(codec, "ALC272X");
6263 else if (coef == 0x4011)
6264 alc_codec_rename(codec, "ALC656");
6266 board_config = alc_board_config(codec, ALC662_MODEL_LAST,
6267 alc662_models, alc662_cfg_tbl);
6268 if (board_config < 0) {
6269 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
6271 board_config = ALC_MODEL_AUTO;
6274 if (board_config == ALC_MODEL_AUTO) {
6275 alc_pick_fixup(codec, alc662_fixup_models,
6276 alc662_fixup_tbl, alc662_fixups);
6277 alc_apply_fixup(codec, ALC_FIXUP_ACT_PRE_PROBE);
6278 /* automatic parse from the BIOS config */
6279 err = alc662_parse_auto_config(codec);
6284 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
6287 "hda_codec: Cannot set up configuration "
6288 "from BIOS. Using base mode...\n");
6289 board_config = ALC662_3ST_2ch_DIG;
6294 if (has_cdefine_beep(codec)) {
6295 err = snd_hda_attach_beep_device(codec, 0x1);
6302 if (board_config != ALC_MODEL_AUTO)
6303 setup_preset(codec, &alc662_presets[board_config]);
6305 if (!spec->adc_nids) {
6306 alc_auto_fill_adc_caps(codec);
6307 alc_rebuild_imux_for_auto_mic(codec);
6308 alc_remove_invalid_adc_nids(codec);
6311 if (!spec->cap_mixer)
6312 set_capture_mixer(codec);
6314 if (has_cdefine_beep(codec)) {
6315 switch (codec->vendor_id) {
6317 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
6322 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
6325 set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
6329 spec->vmaster_nid = 0x02;
6331 alc_apply_fixup(codec, ALC_FIXUP_ACT_PROBE);
6333 codec->patch_ops = alc_patch_ops;
6334 if (board_config == ALC_MODEL_AUTO)
6335 spec->init_hook = alc662_auto_init;
6336 spec->shutup = alc_eapd_shutup;
6338 alc_init_jacks(codec);
6340 #ifdef CONFIG_SND_HDA_POWER_SAVE
6341 if (!spec->loopback.amplist)
6342 spec->loopback.amplist = alc662_loopbacks;
6348 static int patch_alc888(struct hda_codec *codec)
6350 if ((alc_read_coef_idx(codec, 0) & 0x00f0)==0x0030){
6351 kfree(codec->chip_name);
6352 if (codec->vendor_id == 0x10ec0887)
6353 codec->chip_name = kstrdup("ALC887-VD", GFP_KERNEL);
6355 codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL);
6356 if (!codec->chip_name) {
6360 return patch_alc662(codec);
6362 return patch_alc882(codec);
6365 static int patch_alc899(struct hda_codec *codec)
6367 if ((alc_read_coef_idx(codec, 0) & 0x2000) != 0x2000) {
6368 kfree(codec->chip_name);
6369 codec->chip_name = kstrdup("ALC898", GFP_KERNEL);
6371 return patch_alc882(codec);
6378 static int alc680_parse_auto_config(struct hda_codec *codec)
6380 struct alc_spec *spec = codec->spec;
6382 static const hda_nid_t alc680_ignore[] = { 0 };
6384 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
6389 if (!spec->autocfg.line_outs) {
6390 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
6391 spec->multiout.max_channels = 2;
6392 spec->no_analog = 1;
6395 return 0; /* can't find valid BIOS pin config */
6398 err = alc_auto_fill_dac_nids(codec);
6402 err = alc_auto_create_multi_out_ctls(codec, &spec->autocfg);
6406 err = alc_auto_create_hp_out(codec);
6410 err = alc_auto_create_speaker_out(codec);
6414 err = alc_auto_create_input_ctls(codec);
6418 spec->multiout.max_channels = 2;
6421 /* digital only support output */
6422 alc_auto_parse_digital(codec);
6423 if (spec->kctls.list)
6424 add_mixer(spec, spec->kctls.list);
6426 alc_remove_invalid_adc_nids(codec);
6428 alc_auto_check_switches(codec);
6430 err = alc_auto_add_mic_boost(codec);
6437 /* init callback for auto-configuration model -- overriding the default init */
6438 static void alc680_auto_init(struct hda_codec *codec)
6440 struct alc_spec *spec = codec->spec;
6441 alc_auto_init_multi_out(codec);
6442 alc_auto_init_extra_out(codec);
6443 alc_auto_init_analog_input(codec);
6444 alc_auto_init_input_src(codec);
6445 alc_auto_init_digital(codec);
6446 if (spec->unsol_event)
6447 alc_inithook(codec);
6452 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
6453 #include "alc680_quirks.c"
6456 static int patch_alc680(struct hda_codec *codec)
6458 struct alc_spec *spec;
6462 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
6468 /* ALC680 has no aa-loopback mixer */
6470 board_config = alc_board_config(codec, ALC680_MODEL_LAST,
6471 alc680_models, alc680_cfg_tbl);
6473 if (board_config < 0) {
6474 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
6476 board_config = ALC_MODEL_AUTO;
6479 if (board_config == ALC_MODEL_AUTO) {
6480 /* automatic parse from the BIOS config */
6481 err = alc680_parse_auto_config(codec);
6486 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
6489 "hda_codec: Cannot set up configuration "
6490 "from BIOS. Using base mode...\n");
6491 board_config = ALC680_BASE;
6496 if (board_config != ALC_MODEL_AUTO) {
6497 setup_preset(codec, &alc680_presets[board_config]);
6498 #ifdef CONFIG_SND_HDA_ENABLE_REALTEK_QUIRKS
6499 spec->stream_analog_capture = &alc680_pcm_analog_auto_capture;
6503 if (!spec->adc_nids) {
6504 alc_auto_fill_adc_caps(codec);
6505 alc_rebuild_imux_for_auto_mic(codec);
6506 alc_remove_invalid_adc_nids(codec);
6509 if (!spec->cap_mixer)
6510 set_capture_mixer(codec);
6512 spec->vmaster_nid = 0x02;
6514 codec->patch_ops = alc_patch_ops;
6515 if (board_config == ALC_MODEL_AUTO)
6516 spec->init_hook = alc680_auto_init;
6524 static const struct hda_codec_preset snd_hda_preset_realtek[] = {
6525 { .id = 0x10ec0221, .name = "ALC221", .patch = patch_alc269 },
6526 { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
6527 { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
6528 { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
6529 { .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
6530 { .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
6531 { .id = 0x10ec0270, .name = "ALC270", .patch = patch_alc269 },
6532 { .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
6533 { .id = 0x10ec0275, .name = "ALC275", .patch = patch_alc269 },
6534 { .id = 0x10ec0276, .name = "ALC276", .patch = patch_alc269 },
6535 { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
6536 .patch = patch_alc861 },
6537 { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
6538 { .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 },
6539 { .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd },
6540 { .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2",
6541 .patch = patch_alc882 },
6542 { .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1",
6543 .patch = patch_alc662 },
6544 { .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
6545 { .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 },
6546 { .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 },
6547 { .id = 0x10ec0680, .name = "ALC680", .patch = patch_alc680 },
6548 { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
6549 { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
6550 { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
6551 { .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
6552 .patch = patch_alc882 },
6553 { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
6554 .patch = patch_alc882 },
6555 { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
6556 { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc888 },
6557 { .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200",
6558 .patch = patch_alc882 },
6559 { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 },
6560 { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
6561 { .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 },
6562 { .id = 0x10ec0899, .name = "ALC899", .patch = patch_alc899 },
6566 MODULE_ALIAS("snd-hda-codec-id:10ec*");
6568 MODULE_LICENSE("GPL");
6569 MODULE_DESCRIPTION("Realtek HD-audio codec");
6571 static struct hda_codec_preset_list realtek_list = {
6572 .preset = snd_hda_preset_realtek,
6573 .owner = THIS_MODULE,
6576 static int __init patch_realtek_init(void)
6578 return snd_hda_add_codec_preset(&realtek_list);
6581 static void __exit patch_realtek_exit(void)
6583 snd_hda_delete_codec_preset(&realtek_list);
6586 module_init(patch_realtek_init)
6587 module_exit(patch_realtek_exit)