2 * Universal Interface for Intel High Definition Audio Codec
4 * HD audio interface patch for ALC 260/880/882 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 "hda_codec.h"
32 #include "hda_local.h"
35 #define ALC880_FRONT_EVENT 0x01
36 #define ALC880_DCVOL_EVENT 0x02
37 #define ALC880_HP_EVENT 0x04
38 #define ALC880_MIC_EVENT 0x08
40 /* ALC880 board config type */
64 #ifdef CONFIG_SND_DEBUG
68 ALC880_MODEL_LAST /* last tag */
82 #ifdef CONFIG_SND_DEBUG
86 ALC260_MODEL_LAST /* last tag */
96 ALC262_HP_BPC_D7000_WL,
97 ALC262_HP_BPC_D7000_WF,
110 ALC262_MODEL_LAST /* last tag */
120 ALC268_ACER_ASPIRE_ONE,
123 #ifdef CONFIG_SND_DEBUG
127 ALC268_MODEL_LAST /* last tag */
139 ALC269_MODEL_LAST /* last tag */
156 /* ALC861-VD models */
178 ALC662_ASUS_EEEPC_P701,
179 ALC662_ASUS_EEEPC_EP20,
219 ALC883_TARGA_2ch_DIG,
220 ALC883_TARGA_8ch_DIG,
223 ALC888_ACER_ASPIRE_4930G,
224 ALC888_ACER_ASPIRE_6530G,
225 ALC888_ACER_ASPIRE_8930G,
226 ALC888_ACER_ASPIRE_7730G,
230 ALC883_LENOVO_101E_2ch,
231 ALC883_LENOVO_NB0763,
232 ALC888_LENOVO_MS7195_DIG,
240 ALC883_FUJITSU_PI2515,
241 ALC888_FUJITSU_XA3530,
242 ALC883_3ST_6ch_INTEL,
255 #define GPIO_MASK 0x03
257 /* extra amp-initialization sequence types */
266 struct alc_mic_route {
268 unsigned char mux_idx;
269 unsigned char amix_idx;
272 #define MUX_IDX_UNDEF ((unsigned char)-1)
275 /* codec parameterization */
276 struct snd_kcontrol_new *mixers[5]; /* mixer arrays */
277 unsigned int num_mixers;
278 struct snd_kcontrol_new *cap_mixer; /* capture mixer */
279 unsigned int beep_amp; /* beep amp value, set via set_beep_amp() */
281 const struct hda_verb *init_verbs[10]; /* initialization verbs
285 unsigned int num_init_verbs;
287 char stream_name_analog[32]; /* analog PCM stream */
288 struct hda_pcm_stream *stream_analog_playback;
289 struct hda_pcm_stream *stream_analog_capture;
290 struct hda_pcm_stream *stream_analog_alt_playback;
291 struct hda_pcm_stream *stream_analog_alt_capture;
293 char stream_name_digital[32]; /* digital PCM stream */
294 struct hda_pcm_stream *stream_digital_playback;
295 struct hda_pcm_stream *stream_digital_capture;
298 struct hda_multi_out multiout; /* playback set-up
299 * max_channels, dacs must be set
300 * dig_out_nid and hp_nid are optional
302 hda_nid_t alt_dac_nid;
303 hda_nid_t slave_dig_outs[3]; /* optional - for auto-parsing */
307 unsigned int num_adc_nids;
309 hda_nid_t *capsrc_nids;
310 hda_nid_t dig_in_nid; /* digital-in NID; optional */
313 unsigned int num_mux_defs;
314 const struct hda_input_mux *input_mux;
315 unsigned int cur_mux[3];
316 struct alc_mic_route ext_mic;
317 struct alc_mic_route int_mic;
320 const struct hda_channel_mode *channel_mode;
321 int num_channel_mode;
323 int const_channel_count;
324 int ext_channel_count;
326 /* PCM information */
327 struct hda_pcm pcm_rec[3]; /* used in alc_build_pcms() */
329 /* dynamic controls, init_verbs and input_mux */
330 struct auto_pin_cfg autocfg;
331 struct snd_array kctls;
332 struct hda_input_mux private_imux[3];
333 hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
334 hda_nid_t private_adc_nids[AUTO_CFG_MAX_OUTS];
335 hda_nid_t private_capsrc_nids[AUTO_CFG_MAX_OUTS];
338 void (*init_hook)(struct hda_codec *codec);
339 void (*unsol_event)(struct hda_codec *codec, unsigned int res);
340 #ifdef CONFIG_SND_HDA_POWER_SAVE
341 void (*power_hook)(struct hda_codec *codec, int power);
344 /* for pin sensing */
345 unsigned int sense_updated: 1;
346 unsigned int jack_present: 1;
347 unsigned int master_sw: 1;
348 unsigned int auto_mic:1;
351 unsigned int no_analog :1; /* digital I/O only */
354 /* for virtual master */
355 hda_nid_t vmaster_nid;
356 #ifdef CONFIG_SND_HDA_POWER_SAVE
357 struct hda_loopback_check loopback;
362 unsigned int pll_coef_idx, pll_coef_bit;
366 * configuration template - to be copied to the spec instance
368 struct alc_config_preset {
369 struct snd_kcontrol_new *mixers[5]; /* should be identical size
372 struct snd_kcontrol_new *cap_mixer; /* capture mixer */
373 const struct hda_verb *init_verbs[5];
374 unsigned int num_dacs;
376 hda_nid_t dig_out_nid; /* optional */
377 hda_nid_t hp_nid; /* optional */
378 hda_nid_t *slave_dig_outs;
379 unsigned int num_adc_nids;
381 hda_nid_t *capsrc_nids;
382 hda_nid_t dig_in_nid;
383 unsigned int num_channel_mode;
384 const struct hda_channel_mode *channel_mode;
386 int const_channel_count;
387 unsigned int num_mux_defs;
388 const struct hda_input_mux *input_mux;
389 void (*unsol_event)(struct hda_codec *, unsigned int);
390 void (*setup)(struct hda_codec *);
391 void (*init_hook)(struct hda_codec *);
392 #ifdef CONFIG_SND_HDA_POWER_SAVE
393 struct hda_amp_list *loopbacks;
394 void (*power_hook)(struct hda_codec *codec, int power);
402 static int alc_mux_enum_info(struct snd_kcontrol *kcontrol,
403 struct snd_ctl_elem_info *uinfo)
405 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
406 struct alc_spec *spec = codec->spec;
407 unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id);
408 if (mux_idx >= spec->num_mux_defs)
410 return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo);
413 static int alc_mux_enum_get(struct snd_kcontrol *kcontrol,
414 struct snd_ctl_elem_value *ucontrol)
416 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
417 struct alc_spec *spec = codec->spec;
418 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
420 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
424 static int alc_mux_enum_put(struct snd_kcontrol *kcontrol,
425 struct snd_ctl_elem_value *ucontrol)
427 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
428 struct alc_spec *spec = codec->spec;
429 const struct hda_input_mux *imux;
430 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
431 unsigned int mux_idx;
432 hda_nid_t nid = spec->capsrc_nids ?
433 spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx];
436 mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
437 imux = &spec->input_mux[mux_idx];
439 type = get_wcaps_type(get_wcaps(codec, nid));
440 if (type == AC_WID_AUD_MIX) {
441 /* Matrix-mixer style (e.g. ALC882) */
442 unsigned int *cur_val = &spec->cur_mux[adc_idx];
445 idx = ucontrol->value.enumerated.item[0];
446 if (idx >= imux->num_items)
447 idx = imux->num_items - 1;
450 for (i = 0; i < imux->num_items; i++) {
451 unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE;
452 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT,
453 imux->items[i].index,
459 /* MUX style (e.g. ALC880) */
460 return snd_hda_input_mux_put(codec, imux, ucontrol, nid,
461 &spec->cur_mux[adc_idx]);
466 * channel mode setting
468 static int alc_ch_mode_info(struct snd_kcontrol *kcontrol,
469 struct snd_ctl_elem_info *uinfo)
471 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
472 struct alc_spec *spec = codec->spec;
473 return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
474 spec->num_channel_mode);
477 static int alc_ch_mode_get(struct snd_kcontrol *kcontrol,
478 struct snd_ctl_elem_value *ucontrol)
480 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
481 struct alc_spec *spec = codec->spec;
482 return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
483 spec->num_channel_mode,
484 spec->ext_channel_count);
487 static int alc_ch_mode_put(struct snd_kcontrol *kcontrol,
488 struct snd_ctl_elem_value *ucontrol)
490 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
491 struct alc_spec *spec = codec->spec;
492 int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
493 spec->num_channel_mode,
494 &spec->ext_channel_count);
495 if (err >= 0 && !spec->const_channel_count) {
496 spec->multiout.max_channels = spec->ext_channel_count;
497 if (spec->need_dac_fix)
498 spec->multiout.num_dacs = spec->multiout.max_channels / 2;
504 * Control the mode of pin widget settings via the mixer. "pc" is used
505 * instead of "%" to avoid consequences of accidently treating the % as
506 * being part of a format specifier. Maximum allowed length of a value is
507 * 63 characters plus NULL terminator.
509 * Note: some retasking pin complexes seem to ignore requests for input
510 * states other than HiZ (eg: PIN_VREFxx) and revert to HiZ if any of these
511 * are requested. Therefore order this list so that this behaviour will not
512 * cause problems when mixer clients move through the enum sequentially.
513 * NIDs 0x0f and 0x10 have been observed to have this behaviour as of
516 static char *alc_pin_mode_names[] = {
517 "Mic 50pc bias", "Mic 80pc bias",
518 "Line in", "Line out", "Headphone out",
520 static unsigned char alc_pin_mode_values[] = {
521 PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP,
523 /* The control can present all 5 options, or it can limit the options based
524 * in the pin being assumed to be exclusively an input or an output pin. In
525 * addition, "input" pins may or may not process the mic bias option
526 * depending on actual widget capability (NIDs 0x0f and 0x10 don't seem to
527 * accept requests for bias as of chip versions up to March 2006) and/or
528 * wiring in the computer.
530 #define ALC_PIN_DIR_IN 0x00
531 #define ALC_PIN_DIR_OUT 0x01
532 #define ALC_PIN_DIR_INOUT 0x02
533 #define ALC_PIN_DIR_IN_NOMICBIAS 0x03
534 #define ALC_PIN_DIR_INOUT_NOMICBIAS 0x04
536 /* Info about the pin modes supported by the different pin direction modes.
537 * For each direction the minimum and maximum values are given.
539 static signed char alc_pin_mode_dir_info[5][2] = {
540 { 0, 2 }, /* ALC_PIN_DIR_IN */
541 { 3, 4 }, /* ALC_PIN_DIR_OUT */
542 { 0, 4 }, /* ALC_PIN_DIR_INOUT */
543 { 2, 2 }, /* ALC_PIN_DIR_IN_NOMICBIAS */
544 { 2, 4 }, /* ALC_PIN_DIR_INOUT_NOMICBIAS */
546 #define alc_pin_mode_min(_dir) (alc_pin_mode_dir_info[_dir][0])
547 #define alc_pin_mode_max(_dir) (alc_pin_mode_dir_info[_dir][1])
548 #define alc_pin_mode_n_items(_dir) \
549 (alc_pin_mode_max(_dir)-alc_pin_mode_min(_dir)+1)
551 static int alc_pin_mode_info(struct snd_kcontrol *kcontrol,
552 struct snd_ctl_elem_info *uinfo)
554 unsigned int item_num = uinfo->value.enumerated.item;
555 unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
557 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
559 uinfo->value.enumerated.items = alc_pin_mode_n_items(dir);
561 if (item_num<alc_pin_mode_min(dir) || item_num>alc_pin_mode_max(dir))
562 item_num = alc_pin_mode_min(dir);
563 strcpy(uinfo->value.enumerated.name, alc_pin_mode_names[item_num]);
567 static int alc_pin_mode_get(struct snd_kcontrol *kcontrol,
568 struct snd_ctl_elem_value *ucontrol)
571 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
572 hda_nid_t nid = kcontrol->private_value & 0xffff;
573 unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
574 long *valp = ucontrol->value.integer.value;
575 unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
576 AC_VERB_GET_PIN_WIDGET_CONTROL,
579 /* Find enumerated value for current pinctl setting */
580 i = alc_pin_mode_min(dir);
581 while (i <= alc_pin_mode_max(dir) && alc_pin_mode_values[i] != pinctl)
583 *valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir);
587 static int alc_pin_mode_put(struct snd_kcontrol *kcontrol,
588 struct snd_ctl_elem_value *ucontrol)
591 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
592 hda_nid_t nid = kcontrol->private_value & 0xffff;
593 unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
594 long val = *ucontrol->value.integer.value;
595 unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
596 AC_VERB_GET_PIN_WIDGET_CONTROL,
599 if (val < alc_pin_mode_min(dir) || val > alc_pin_mode_max(dir))
600 val = alc_pin_mode_min(dir);
602 change = pinctl != alc_pin_mode_values[val];
604 /* Set pin mode to that requested */
605 snd_hda_codec_write_cache(codec, nid, 0,
606 AC_VERB_SET_PIN_WIDGET_CONTROL,
607 alc_pin_mode_values[val]);
609 /* Also enable the retasking pin's input/output as required
610 * for the requested pin mode. Enum values of 2 or less are
613 * Dynamically switching the input/output buffers probably
614 * reduces noise slightly (particularly on input) so we'll
615 * do it. However, having both input and output buffers
616 * enabled simultaneously doesn't seem to be problematic if
617 * this turns out to be necessary in the future.
620 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
621 HDA_AMP_MUTE, HDA_AMP_MUTE);
622 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
625 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
626 HDA_AMP_MUTE, HDA_AMP_MUTE);
627 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
634 #define ALC_PIN_MODE(xname, nid, dir) \
635 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
636 .info = alc_pin_mode_info, \
637 .get = alc_pin_mode_get, \
638 .put = alc_pin_mode_put, \
639 .private_value = nid | (dir<<16) }
641 /* A switch control for ALC260 GPIO pins. Multiple GPIOs can be ganged
642 * together using a mask with more than one bit set. This control is
643 * currently used only by the ALC260 test model. At this stage they are not
644 * needed for any "production" models.
646 #ifdef CONFIG_SND_DEBUG
647 #define alc_gpio_data_info snd_ctl_boolean_mono_info
649 static int alc_gpio_data_get(struct snd_kcontrol *kcontrol,
650 struct snd_ctl_elem_value *ucontrol)
652 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
653 hda_nid_t nid = kcontrol->private_value & 0xffff;
654 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
655 long *valp = ucontrol->value.integer.value;
656 unsigned int val = snd_hda_codec_read(codec, nid, 0,
657 AC_VERB_GET_GPIO_DATA, 0x00);
659 *valp = (val & mask) != 0;
662 static int alc_gpio_data_put(struct snd_kcontrol *kcontrol,
663 struct snd_ctl_elem_value *ucontrol)
666 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
667 hda_nid_t nid = kcontrol->private_value & 0xffff;
668 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
669 long val = *ucontrol->value.integer.value;
670 unsigned int gpio_data = snd_hda_codec_read(codec, nid, 0,
671 AC_VERB_GET_GPIO_DATA,
674 /* Set/unset the masked GPIO bit(s) as needed */
675 change = (val == 0 ? 0 : mask) != (gpio_data & mask);
680 snd_hda_codec_write_cache(codec, nid, 0,
681 AC_VERB_SET_GPIO_DATA, gpio_data);
685 #define ALC_GPIO_DATA_SWITCH(xname, nid, mask) \
686 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
687 .info = alc_gpio_data_info, \
688 .get = alc_gpio_data_get, \
689 .put = alc_gpio_data_put, \
690 .private_value = nid | (mask<<16) }
691 #endif /* CONFIG_SND_DEBUG */
693 /* A switch control to allow the enabling of the digital IO pins on the
694 * ALC260. This is incredibly simplistic; the intention of this control is
695 * to provide something in the test model allowing digital outputs to be
696 * identified if present. If models are found which can utilise these
697 * outputs a more complete mixer control can be devised for those models if
700 #ifdef CONFIG_SND_DEBUG
701 #define alc_spdif_ctrl_info snd_ctl_boolean_mono_info
703 static int alc_spdif_ctrl_get(struct snd_kcontrol *kcontrol,
704 struct snd_ctl_elem_value *ucontrol)
706 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
707 hda_nid_t nid = kcontrol->private_value & 0xffff;
708 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
709 long *valp = ucontrol->value.integer.value;
710 unsigned int val = snd_hda_codec_read(codec, nid, 0,
711 AC_VERB_GET_DIGI_CONVERT_1, 0x00);
713 *valp = (val & mask) != 0;
716 static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol,
717 struct snd_ctl_elem_value *ucontrol)
720 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
721 hda_nid_t nid = kcontrol->private_value & 0xffff;
722 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
723 long val = *ucontrol->value.integer.value;
724 unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
725 AC_VERB_GET_DIGI_CONVERT_1,
728 /* Set/unset the masked control bit(s) as needed */
729 change = (val == 0 ? 0 : mask) != (ctrl_data & mask);
734 snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,
739 #define ALC_SPDIF_CTRL_SWITCH(xname, nid, mask) \
740 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
741 .info = alc_spdif_ctrl_info, \
742 .get = alc_spdif_ctrl_get, \
743 .put = alc_spdif_ctrl_put, \
744 .private_value = nid | (mask<<16) }
745 #endif /* CONFIG_SND_DEBUG */
747 /* A switch control to allow the enabling EAPD digital outputs on the ALC26x.
748 * Again, this is only used in the ALC26x test models to help identify when
749 * the EAPD line must be asserted for features to work.
751 #ifdef CONFIG_SND_DEBUG
752 #define alc_eapd_ctrl_info snd_ctl_boolean_mono_info
754 static int alc_eapd_ctrl_get(struct snd_kcontrol *kcontrol,
755 struct snd_ctl_elem_value *ucontrol)
757 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
758 hda_nid_t nid = kcontrol->private_value & 0xffff;
759 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
760 long *valp = ucontrol->value.integer.value;
761 unsigned int val = snd_hda_codec_read(codec, nid, 0,
762 AC_VERB_GET_EAPD_BTLENABLE, 0x00);
764 *valp = (val & mask) != 0;
768 static int alc_eapd_ctrl_put(struct snd_kcontrol *kcontrol,
769 struct snd_ctl_elem_value *ucontrol)
772 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
773 hda_nid_t nid = kcontrol->private_value & 0xffff;
774 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
775 long val = *ucontrol->value.integer.value;
776 unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
777 AC_VERB_GET_EAPD_BTLENABLE,
780 /* Set/unset the masked control bit(s) as needed */
781 change = (!val ? 0 : mask) != (ctrl_data & mask);
786 snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
792 #define ALC_EAPD_CTRL_SWITCH(xname, nid, mask) \
793 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
794 .info = alc_eapd_ctrl_info, \
795 .get = alc_eapd_ctrl_get, \
796 .put = alc_eapd_ctrl_put, \
797 .private_value = nid | (mask<<16) }
798 #endif /* CONFIG_SND_DEBUG */
801 * set up the input pin config (depending on the given auto-pin type)
803 static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid,
806 unsigned int val = PIN_IN;
808 if (auto_pin_type <= AUTO_PIN_FRONT_MIC) {
810 pincap = snd_hda_query_pin_caps(codec, nid);
811 pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
812 if (pincap & AC_PINCAP_VREF_80)
814 else if (pincap & AC_PINCAP_VREF_50)
816 else if (pincap & AC_PINCAP_VREF_100)
818 else if (pincap & AC_PINCAP_VREF_GRD)
821 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val);
826 static void add_mixer(struct alc_spec *spec, struct snd_kcontrol_new *mix)
828 if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers)))
830 spec->mixers[spec->num_mixers++] = mix;
833 static void add_verb(struct alc_spec *spec, const struct hda_verb *verb)
835 if (snd_BUG_ON(spec->num_init_verbs >= ARRAY_SIZE(spec->init_verbs)))
837 spec->init_verbs[spec->num_init_verbs++] = verb;
840 #ifdef CONFIG_PROC_FS
844 static void print_realtek_coef(struct snd_info_buffer *buffer,
845 struct hda_codec *codec, hda_nid_t nid)
851 coeff = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0);
852 snd_iprintf(buffer, " Processing Coefficient: 0x%02x\n", coeff);
853 coeff = snd_hda_codec_read(codec, nid, 0,
854 AC_VERB_GET_COEF_INDEX, 0);
855 snd_iprintf(buffer, " Coefficient Index: 0x%02x\n", coeff);
858 #define print_realtek_coef NULL
862 * set up from the preset table
864 static void setup_preset(struct hda_codec *codec,
865 const struct alc_config_preset *preset)
867 struct alc_spec *spec = codec->spec;
870 for (i = 0; i < ARRAY_SIZE(preset->mixers) && preset->mixers[i]; i++)
871 add_mixer(spec, preset->mixers[i]);
872 spec->cap_mixer = preset->cap_mixer;
873 for (i = 0; i < ARRAY_SIZE(preset->init_verbs) && preset->init_verbs[i];
875 add_verb(spec, preset->init_verbs[i]);
877 spec->channel_mode = preset->channel_mode;
878 spec->num_channel_mode = preset->num_channel_mode;
879 spec->need_dac_fix = preset->need_dac_fix;
880 spec->const_channel_count = preset->const_channel_count;
882 if (preset->const_channel_count)
883 spec->multiout.max_channels = preset->const_channel_count;
885 spec->multiout.max_channels = spec->channel_mode[0].channels;
886 spec->ext_channel_count = spec->channel_mode[0].channels;
888 spec->multiout.num_dacs = preset->num_dacs;
889 spec->multiout.dac_nids = preset->dac_nids;
890 spec->multiout.dig_out_nid = preset->dig_out_nid;
891 spec->multiout.slave_dig_outs = preset->slave_dig_outs;
892 spec->multiout.hp_nid = preset->hp_nid;
894 spec->num_mux_defs = preset->num_mux_defs;
895 if (!spec->num_mux_defs)
896 spec->num_mux_defs = 1;
897 spec->input_mux = preset->input_mux;
899 spec->num_adc_nids = preset->num_adc_nids;
900 spec->adc_nids = preset->adc_nids;
901 spec->capsrc_nids = preset->capsrc_nids;
902 spec->dig_in_nid = preset->dig_in_nid;
904 spec->unsol_event = preset->unsol_event;
905 spec->init_hook = preset->init_hook;
906 #ifdef CONFIG_SND_HDA_POWER_SAVE
907 spec->power_hook = preset->power_hook;
908 spec->loopback.amplist = preset->loopbacks;
912 preset->setup(codec);
915 /* Enable GPIO mask and set output */
916 static struct hda_verb alc_gpio1_init_verbs[] = {
917 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
918 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
919 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
923 static struct hda_verb alc_gpio2_init_verbs[] = {
924 {0x01, AC_VERB_SET_GPIO_MASK, 0x02},
925 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
926 {0x01, AC_VERB_SET_GPIO_DATA, 0x02},
930 static struct hda_verb alc_gpio3_init_verbs[] = {
931 {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
932 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
933 {0x01, AC_VERB_SET_GPIO_DATA, 0x03},
938 * Fix hardware PLL issue
939 * On some codecs, the analog PLL gating control must be off while
940 * the default value is 1.
942 static void alc_fix_pll(struct hda_codec *codec)
944 struct alc_spec *spec = codec->spec;
949 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
951 val = snd_hda_codec_read(codec, spec->pll_nid, 0,
952 AC_VERB_GET_PROC_COEF, 0);
953 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
955 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF,
956 val & ~(1 << spec->pll_coef_bit));
959 static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
960 unsigned int coef_idx, unsigned int coef_bit)
962 struct alc_spec *spec = codec->spec;
964 spec->pll_coef_idx = coef_idx;
965 spec->pll_coef_bit = coef_bit;
969 static void alc_automute_pin(struct hda_codec *codec)
971 struct alc_spec *spec = codec->spec;
972 unsigned int nid = spec->autocfg.hp_pins[0];
977 spec->jack_present = snd_hda_jack_detect(codec, nid);
978 for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
979 nid = spec->autocfg.speaker_pins[i];
982 snd_hda_codec_write(codec, nid, 0,
983 AC_VERB_SET_PIN_WIDGET_CONTROL,
984 spec->jack_present ? 0 : PIN_OUT);
988 static int get_connection_index(struct hda_codec *codec, hda_nid_t mux,
991 hda_nid_t conn[HDA_MAX_NUM_INPUTS];
994 nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn));
995 for (i = 0; i < nums; i++)
1001 static void alc_mic_automute(struct hda_codec *codec)
1003 struct alc_spec *spec = codec->spec;
1004 struct alc_mic_route *dead, *alive;
1005 unsigned int present, type;
1008 if (!spec->auto_mic)
1010 if (!spec->int_mic.pin || !spec->ext_mic.pin)
1012 if (snd_BUG_ON(!spec->adc_nids))
1015 cap_nid = spec->capsrc_nids ? spec->capsrc_nids[0] : spec->adc_nids[0];
1017 present = snd_hda_jack_detect(codec, spec->ext_mic.pin);
1019 alive = &spec->ext_mic;
1020 dead = &spec->int_mic;
1022 alive = &spec->int_mic;
1023 dead = &spec->ext_mic;
1026 type = get_wcaps_type(get_wcaps(codec, cap_nid));
1027 if (type == AC_WID_AUD_MIX) {
1028 /* Matrix-mixer style (e.g. ALC882) */
1029 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1032 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1034 HDA_AMP_MUTE, HDA_AMP_MUTE);
1036 /* MUX style (e.g. ALC880) */
1037 snd_hda_codec_write_cache(codec, cap_nid, 0,
1038 AC_VERB_SET_CONNECT_SEL,
1042 /* FIXME: analog mixer */
1045 /* unsolicited event for HP jack sensing */
1046 static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
1048 if (codec->vendor_id == 0x10ec0880)
1053 case ALC880_HP_EVENT:
1054 alc_automute_pin(codec);
1056 case ALC880_MIC_EVENT:
1057 alc_mic_automute(codec);
1062 static void alc_inithook(struct hda_codec *codec)
1064 alc_automute_pin(codec);
1065 alc_mic_automute(codec);
1068 /* additional initialization for ALC888 variants */
1069 static void alc888_coef_init(struct hda_codec *codec)
1073 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0);
1074 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1075 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1076 if ((tmp & 0xf0) == 0x20)
1078 snd_hda_codec_read(codec, 0x20, 0,
1079 AC_VERB_SET_PROC_COEF, 0x830);
1082 snd_hda_codec_read(codec, 0x20, 0,
1083 AC_VERB_SET_PROC_COEF, 0x3030);
1086 static void alc889_coef_init(struct hda_codec *codec)
1090 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1091 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1092 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1093 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, tmp|0x2010);
1096 static void alc_auto_init_amp(struct hda_codec *codec, int type)
1101 case ALC_INIT_GPIO1:
1102 snd_hda_sequence_write(codec, alc_gpio1_init_verbs);
1104 case ALC_INIT_GPIO2:
1105 snd_hda_sequence_write(codec, alc_gpio2_init_verbs);
1107 case ALC_INIT_GPIO3:
1108 snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
1110 case ALC_INIT_DEFAULT:
1111 switch (codec->vendor_id) {
1113 snd_hda_codec_write(codec, 0x0f, 0,
1114 AC_VERB_SET_EAPD_BTLENABLE, 2);
1115 snd_hda_codec_write(codec, 0x10, 0,
1116 AC_VERB_SET_EAPD_BTLENABLE, 2);
1128 snd_hda_codec_write(codec, 0x14, 0,
1129 AC_VERB_SET_EAPD_BTLENABLE, 2);
1130 snd_hda_codec_write(codec, 0x15, 0,
1131 AC_VERB_SET_EAPD_BTLENABLE, 2);
1134 switch (codec->vendor_id) {
1136 snd_hda_codec_write(codec, 0x1a, 0,
1137 AC_VERB_SET_COEF_INDEX, 7);
1138 tmp = snd_hda_codec_read(codec, 0x1a, 0,
1139 AC_VERB_GET_PROC_COEF, 0);
1140 snd_hda_codec_write(codec, 0x1a, 0,
1141 AC_VERB_SET_COEF_INDEX, 7);
1142 snd_hda_codec_write(codec, 0x1a, 0,
1143 AC_VERB_SET_PROC_COEF,
1153 alc889_coef_init(codec);
1156 alc888_coef_init(codec);
1160 snd_hda_codec_write(codec, 0x20, 0,
1161 AC_VERB_SET_COEF_INDEX, 7);
1162 tmp = snd_hda_codec_read(codec, 0x20, 0,
1163 AC_VERB_GET_PROC_COEF, 0);
1164 snd_hda_codec_write(codec, 0x20, 0,
1165 AC_VERB_SET_COEF_INDEX, 7);
1166 snd_hda_codec_write(codec, 0x20, 0,
1167 AC_VERB_SET_PROC_COEF,
1175 static void alc_init_auto_hp(struct hda_codec *codec)
1177 struct alc_spec *spec = codec->spec;
1179 if (!spec->autocfg.hp_pins[0])
1182 if (!spec->autocfg.speaker_pins[0]) {
1183 if (spec->autocfg.line_out_pins[0] &&
1184 spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
1185 spec->autocfg.speaker_pins[0] =
1186 spec->autocfg.line_out_pins[0];
1191 snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n",
1192 spec->autocfg.hp_pins[0]);
1193 snd_hda_codec_write_cache(codec, spec->autocfg.hp_pins[0], 0,
1194 AC_VERB_SET_UNSOLICITED_ENABLE,
1195 AC_USRSP_EN | ALC880_HP_EVENT);
1196 spec->unsol_event = alc_sku_unsol_event;
1199 static void alc_init_auto_mic(struct hda_codec *codec)
1201 struct alc_spec *spec = codec->spec;
1202 struct auto_pin_cfg *cfg = &spec->autocfg;
1203 hda_nid_t fixed, ext;
1206 /* there must be only two mic inputs exclusively */
1207 for (i = AUTO_PIN_LINE; i < AUTO_PIN_LAST; i++)
1208 if (cfg->input_pins[i])
1212 for (i = AUTO_PIN_MIC; i <= AUTO_PIN_FRONT_MIC; i++) {
1213 hda_nid_t nid = cfg->input_pins[i];
1214 unsigned int defcfg;
1217 defcfg = snd_hda_codec_get_pincfg(codec, nid);
1218 switch (get_defcfg_connect(defcfg)) {
1219 case AC_JACK_PORT_FIXED:
1221 return; /* already occupied */
1224 case AC_JACK_PORT_COMPLEX:
1226 return; /* already occupied */
1230 return; /* invalid entry */
1235 if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP))
1236 return; /* no unsol support */
1237 snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x\n",
1239 spec->ext_mic.pin = ext;
1240 spec->int_mic.pin = fixed;
1241 spec->ext_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1242 spec->int_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1244 snd_hda_codec_write_cache(codec, spec->ext_mic.pin, 0,
1245 AC_VERB_SET_UNSOLICITED_ENABLE,
1246 AC_USRSP_EN | ALC880_MIC_EVENT);
1247 spec->unsol_event = alc_sku_unsol_event;
1250 /* check subsystem ID and set up device-specific initialization;
1251 * return 1 if initialized, 0 if invalid SSID
1253 /* 32-bit subsystem ID for BIOS loading in HD Audio codec.
1254 * 31 ~ 16 : Manufacture ID
1256 * 7 ~ 0 : Assembly ID
1257 * port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
1259 static int alc_subsystem_id(struct hda_codec *codec,
1260 hda_nid_t porta, hda_nid_t porte,
1263 unsigned int ass, tmp, i;
1265 struct alc_spec *spec = codec->spec;
1267 ass = codec->subsystem_id & 0xffff;
1268 if ((ass != codec->bus->pci->subsystem_device) && (ass & 1))
1271 /* invalid SSID, check the special NID pin defcfg instead */
1273 * 31~30 : port connectivity
1276 * 19~16 : Check sum (15:1)
1281 if (codec->vendor_id == 0x10ec0260)
1283 ass = snd_hda_codec_get_pincfg(codec, nid);
1284 snd_printd("realtek: No valid SSID, "
1285 "checking pincfg 0x%08x for NID 0x%x\n",
1287 if (!(ass & 1) && !(ass & 0x100000))
1289 if ((ass >> 30) != 1) /* no physical connection */
1294 for (i = 1; i < 16; i++) {
1298 if (((ass >> 16) & 0xf) != tmp)
1301 snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
1302 ass & 0xffff, codec->vendor_id);
1306 * 2 : 0 --> Desktop, 1 --> Laptop
1307 * 3~5 : External Amplifier control
1310 tmp = (ass & 0x38) >> 3; /* external Amp control */
1313 spec->init_amp = ALC_INIT_GPIO1;
1316 spec->init_amp = ALC_INIT_GPIO2;
1319 spec->init_amp = ALC_INIT_GPIO3;
1322 spec->init_amp = ALC_INIT_DEFAULT;
1326 /* is laptop or Desktop and enable the function "Mute internal speaker
1327 * when the external headphone out jack is plugged"
1329 if (!(ass & 0x8000))
1332 * 10~8 : Jack location
1333 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
1335 * 15 : 1 --> enable the function "Mute internal speaker
1336 * when the external headphone out jack is plugged"
1338 if (!spec->autocfg.hp_pins[0]) {
1340 tmp = (ass >> 11) & 0x3; /* HP to chassis */
1349 for (i = 0; i < spec->autocfg.line_outs; i++)
1350 if (spec->autocfg.line_out_pins[i] == nid)
1352 spec->autocfg.hp_pins[0] = nid;
1355 alc_init_auto_hp(codec);
1356 alc_init_auto_mic(codec);
1360 static void alc_ssid_check(struct hda_codec *codec,
1361 hda_nid_t porta, hda_nid_t porte, hda_nid_t portd)
1363 if (!alc_subsystem_id(codec, porta, porte, portd)) {
1364 struct alc_spec *spec = codec->spec;
1365 snd_printd("realtek: "
1366 "Enable default setup for auto mode as fallback\n");
1367 spec->init_amp = ALC_INIT_DEFAULT;
1368 alc_init_auto_hp(codec);
1369 alc_init_auto_mic(codec);
1374 * Fix-up pin default configurations and add default verbs
1383 const struct alc_pincfg *pins;
1384 const struct hda_verb *verbs;
1387 static void alc_pick_fixup(struct hda_codec *codec,
1388 const struct snd_pci_quirk *quirk,
1389 const struct alc_fixup *fix)
1391 const struct alc_pincfg *cfg;
1393 quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
1397 fix += quirk->value;
1400 for (; cfg->nid; cfg++)
1401 snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);
1404 add_verb(codec->spec, fix->verbs);
1407 static int alc_read_coef_idx(struct hda_codec *codec,
1408 unsigned int coef_idx)
1411 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX,
1413 val = snd_hda_codec_read(codec, 0x20, 0,
1414 AC_VERB_GET_PROC_COEF, 0);
1425 static struct hda_verb alc888_4ST_ch2_intel_init[] = {
1426 /* Mic-in jack as mic in */
1427 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1428 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1429 /* Line-in jack as Line in */
1430 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1431 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1432 /* Line-Out as Front */
1433 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1440 static struct hda_verb alc888_4ST_ch4_intel_init[] = {
1441 /* Mic-in jack as mic in */
1442 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1443 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1444 /* Line-in jack as Surround */
1445 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1446 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1447 /* Line-Out as Front */
1448 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1455 static struct hda_verb alc888_4ST_ch6_intel_init[] = {
1456 /* Mic-in jack as CLFE */
1457 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1458 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1459 /* Line-in jack as Surround */
1460 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1461 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1462 /* Line-Out as CLFE (workaround because Mic-in is not loud enough) */
1463 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1470 static struct hda_verb alc888_4ST_ch8_intel_init[] = {
1471 /* Mic-in jack as CLFE */
1472 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1473 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1474 /* Line-in jack as Surround */
1475 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1476 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1477 /* Line-Out as Side */
1478 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1482 static struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = {
1483 { 2, alc888_4ST_ch2_intel_init },
1484 { 4, alc888_4ST_ch4_intel_init },
1485 { 6, alc888_4ST_ch6_intel_init },
1486 { 8, alc888_4ST_ch8_intel_init },
1490 * ALC888 Fujitsu Siemens Amillo xa3530
1493 static struct hda_verb alc888_fujitsu_xa3530_verbs[] = {
1494 /* Front Mic: set to PIN_IN (empty by default) */
1495 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1496 /* Connect Internal HP to Front */
1497 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1498 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1499 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1500 /* Connect Bass HP to Front */
1501 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1502 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1503 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1504 /* Connect Line-Out side jack (SPDIF) to Side */
1505 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1506 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1507 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1508 /* Connect Mic jack to CLFE */
1509 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1510 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1511 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
1512 /* Connect Line-in jack to Surround */
1513 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1514 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1515 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
1516 /* Connect HP out jack to Front */
1517 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1518 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1519 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
1520 /* Enable unsolicited event for HP jack and Line-out jack */
1521 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1522 {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1526 static void alc_automute_amp(struct hda_codec *codec)
1528 struct alc_spec *spec = codec->spec;
1533 spec->jack_present = 0;
1534 for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) {
1535 nid = spec->autocfg.hp_pins[i];
1538 if (snd_hda_jack_detect(codec, nid)) {
1539 spec->jack_present = 1;
1544 mute = spec->jack_present ? HDA_AMP_MUTE : 0;
1545 /* Toggle internal speakers muting */
1546 for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
1547 nid = spec->autocfg.speaker_pins[i];
1550 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
1551 HDA_AMP_MUTE, mute);
1555 static void alc_automute_amp_unsol_event(struct hda_codec *codec,
1558 if (codec->vendor_id == 0x10ec0880)
1562 if (res == ALC880_HP_EVENT)
1563 alc_automute_amp(codec);
1566 static void alc889_automute_setup(struct hda_codec *codec)
1568 struct alc_spec *spec = codec->spec;
1570 spec->autocfg.hp_pins[0] = 0x15;
1571 spec->autocfg.speaker_pins[0] = 0x14;
1572 spec->autocfg.speaker_pins[1] = 0x16;
1573 spec->autocfg.speaker_pins[2] = 0x17;
1574 spec->autocfg.speaker_pins[3] = 0x19;
1575 spec->autocfg.speaker_pins[4] = 0x1a;
1578 static void alc889_intel_init_hook(struct hda_codec *codec)
1580 alc889_coef_init(codec);
1581 alc_automute_amp(codec);
1584 static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec)
1586 struct alc_spec *spec = codec->spec;
1588 spec->autocfg.hp_pins[0] = 0x17; /* line-out */
1589 spec->autocfg.hp_pins[1] = 0x1b; /* hp */
1590 spec->autocfg.speaker_pins[0] = 0x14; /* speaker */
1591 spec->autocfg.speaker_pins[1] = 0x15; /* bass */
1595 * ALC888 Acer Aspire 4930G model
1598 static struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
1599 /* Front Mic: set to PIN_IN (empty by default) */
1600 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1601 /* Unselect Front Mic by default in input mixer 3 */
1602 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1603 /* Enable unsolicited event for HP jack */
1604 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1605 /* Connect Internal HP to front */
1606 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1607 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1608 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1609 /* Connect HP out to front */
1610 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1611 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1612 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1617 * ALC888 Acer Aspire 6530G model
1620 static struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
1621 /* Bias voltage on for external mic port */
1622 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
1623 /* Front Mic: set to PIN_IN (empty by default) */
1624 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1625 /* Unselect Front Mic by default in input mixer 3 */
1626 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1627 /* Enable unsolicited event for HP jack */
1628 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1629 /* Enable speaker output */
1630 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1631 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1632 /* Enable headphone output */
1633 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1634 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1635 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1640 * ALC889 Acer Aspire 8930G model
1643 static struct hda_verb alc889_acer_aspire_8930g_verbs[] = {
1644 /* Front Mic: set to PIN_IN (empty by default) */
1645 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1646 /* Unselect Front Mic by default in input mixer 3 */
1647 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1648 /* Enable unsolicited event for HP jack */
1649 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1650 /* Connect Internal Front to Front */
1651 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1652 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1653 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1654 /* Connect Internal Rear to Rear */
1655 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1656 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1657 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
1658 /* Connect Internal CLFE to CLFE */
1659 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1660 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1661 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
1662 /* Connect HP out to Front */
1663 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1664 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1665 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1666 /* Enable all DACs */
1667 /* DAC DISABLE/MUTE 1? */
1668 /* setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */
1669 {0x20, AC_VERB_SET_COEF_INDEX, 0x03},
1670 {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1671 /* DAC DISABLE/MUTE 2? */
1672 /* some bit here disables the other DACs. Init=0x4900 */
1673 {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
1674 {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1676 * This laptop has a stereo digital microphone. The mics are only 1cm apart
1677 * which makes the stereo useless. However, either the mic or the ALC889
1678 * makes the signal become a difference/sum signal instead of standard
1679 * stereo, which is annoying. So instead we flip this bit which makes the
1680 * codec replicate the sum signal to both channels, turning it into a
1683 /* DMIC_CONTROL? Init value = 0x0001 */
1684 {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
1685 {0x20, AC_VERB_SET_PROC_COEF, 0x0003},
1689 static struct hda_input_mux alc888_2_capture_sources[2] = {
1690 /* Front mic only available on one ADC */
1697 { "Front Mic", 0xb },
1710 static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = {
1711 /* Interal mic only available on one ADC */
1718 { "Input Mix", 0xa },
1728 { "Input Mix", 0xa },
1733 static struct hda_input_mux alc889_capture_sources[3] = {
1734 /* Digital mic only available on first "ADC" */
1741 { "Front Mic", 0xb },
1742 { "Input Mix", 0xa },
1751 { "Input Mix", 0xa },
1760 { "Input Mix", 0xa },
1765 static struct snd_kcontrol_new alc888_base_mixer[] = {
1766 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1767 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1768 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1769 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1770 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1772 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1773 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1774 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1775 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1776 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
1777 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1778 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1779 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1780 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1781 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1782 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1783 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1787 static struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = {
1788 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1789 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1790 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1791 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1792 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1794 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1795 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1796 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1797 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1798 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1799 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1800 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1801 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1806 static void alc888_acer_aspire_4930g_setup(struct hda_codec *codec)
1808 struct alc_spec *spec = codec->spec;
1810 spec->autocfg.hp_pins[0] = 0x15;
1811 spec->autocfg.speaker_pins[0] = 0x14;
1812 spec->autocfg.speaker_pins[1] = 0x16;
1813 spec->autocfg.speaker_pins[2] = 0x17;
1816 static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec)
1818 struct alc_spec *spec = codec->spec;
1820 spec->autocfg.hp_pins[0] = 0x15;
1821 spec->autocfg.speaker_pins[0] = 0x14;
1822 spec->autocfg.speaker_pins[1] = 0x16;
1823 spec->autocfg.speaker_pins[2] = 0x17;
1826 static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
1828 struct alc_spec *spec = codec->spec;
1830 spec->autocfg.hp_pins[0] = 0x15;
1831 spec->autocfg.speaker_pins[0] = 0x14;
1832 spec->autocfg.speaker_pins[1] = 0x16;
1833 spec->autocfg.speaker_pins[2] = 0x1b;
1836 #ifdef CONFIG_SND_HDA_POWER_SAVE
1837 static void alc889_power_eapd(struct hda_codec *codec, int power)
1839 snd_hda_codec_write(codec, 0x14, 0,
1840 AC_VERB_SET_EAPD_BTLENABLE, power ? 2 : 0);
1841 snd_hda_codec_write(codec, 0x15, 0,
1842 AC_VERB_SET_EAPD_BTLENABLE, power ? 2 : 0);
1847 * ALC880 3-stack model
1849 * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0e)
1850 * Pin assignment: Front = 0x14, Line-In/Surr = 0x1a, Mic/CLFE = 0x18,
1851 * F-Mic = 0x1b, HP = 0x19
1854 static hda_nid_t alc880_dac_nids[4] = {
1855 /* front, rear, clfe, rear_surr */
1856 0x02, 0x05, 0x04, 0x03
1859 static hda_nid_t alc880_adc_nids[3] = {
1864 /* The datasheet says the node 0x07 is connected from inputs,
1865 * but it shows zero connection in the real implementation on some devices.
1866 * Note: this is a 915GAV bug, fixed on 915GLV
1868 static hda_nid_t alc880_adc_nids_alt[2] = {
1873 #define ALC880_DIGOUT_NID 0x06
1874 #define ALC880_DIGIN_NID 0x0a
1876 static struct hda_input_mux alc880_capture_source = {
1880 { "Front Mic", 0x3 },
1886 /* channel source setting (2/6 channel selection for 3-stack) */
1888 static struct hda_verb alc880_threestack_ch2_init[] = {
1889 /* set line-in to input, mute it */
1890 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1891 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1892 /* set mic-in to input vref 80%, mute it */
1893 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1894 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1899 static struct hda_verb alc880_threestack_ch6_init[] = {
1900 /* set line-in to output, unmute it */
1901 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1902 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1903 /* set mic-in to output, unmute it */
1904 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1905 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1909 static struct hda_channel_mode alc880_threestack_modes[2] = {
1910 { 2, alc880_threestack_ch2_init },
1911 { 6, alc880_threestack_ch6_init },
1914 static struct snd_kcontrol_new alc880_three_stack_mixer[] = {
1915 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1916 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1917 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1918 HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
1919 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
1920 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1921 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1922 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1923 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1924 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1925 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1926 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1927 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1928 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1929 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
1930 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
1931 HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT),
1933 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
1934 .name = "Channel Mode",
1935 .info = alc_ch_mode_info,
1936 .get = alc_ch_mode_get,
1937 .put = alc_ch_mode_put,
1942 /* capture mixer elements */
1943 static int alc_cap_vol_info(struct snd_kcontrol *kcontrol,
1944 struct snd_ctl_elem_info *uinfo)
1946 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1947 struct alc_spec *spec = codec->spec;
1950 mutex_lock(&codec->control_mutex);
1951 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
1953 err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
1954 mutex_unlock(&codec->control_mutex);
1958 static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
1959 unsigned int size, unsigned int __user *tlv)
1961 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1962 struct alc_spec *spec = codec->spec;
1965 mutex_lock(&codec->control_mutex);
1966 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
1968 err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
1969 mutex_unlock(&codec->control_mutex);
1973 typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol,
1974 struct snd_ctl_elem_value *ucontrol);
1976 static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol,
1977 struct snd_ctl_elem_value *ucontrol,
1980 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
1981 struct alc_spec *spec = codec->spec;
1982 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
1985 mutex_lock(&codec->control_mutex);
1986 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[adc_idx],
1988 err = func(kcontrol, ucontrol);
1989 mutex_unlock(&codec->control_mutex);
1993 static int alc_cap_vol_get(struct snd_kcontrol *kcontrol,
1994 struct snd_ctl_elem_value *ucontrol)
1996 return alc_cap_getput_caller(kcontrol, ucontrol,
1997 snd_hda_mixer_amp_volume_get);
2000 static int alc_cap_vol_put(struct snd_kcontrol *kcontrol,
2001 struct snd_ctl_elem_value *ucontrol)
2003 return alc_cap_getput_caller(kcontrol, ucontrol,
2004 snd_hda_mixer_amp_volume_put);
2007 /* capture mixer elements */
2008 #define alc_cap_sw_info snd_ctl_boolean_stereo_info
2010 static int alc_cap_sw_get(struct snd_kcontrol *kcontrol,
2011 struct snd_ctl_elem_value *ucontrol)
2013 return alc_cap_getput_caller(kcontrol, ucontrol,
2014 snd_hda_mixer_amp_switch_get);
2017 static int alc_cap_sw_put(struct snd_kcontrol *kcontrol,
2018 struct snd_ctl_elem_value *ucontrol)
2020 return alc_cap_getput_caller(kcontrol, ucontrol,
2021 snd_hda_mixer_amp_switch_put);
2024 #define _DEFINE_CAPMIX(num) \
2026 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2027 .name = "Capture Switch", \
2028 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
2030 .info = alc_cap_sw_info, \
2031 .get = alc_cap_sw_get, \
2032 .put = alc_cap_sw_put, \
2035 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2036 .name = "Capture Volume", \
2037 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | \
2038 SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
2039 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK), \
2041 .info = alc_cap_vol_info, \
2042 .get = alc_cap_vol_get, \
2043 .put = alc_cap_vol_put, \
2044 .tlv = { .c = alc_cap_vol_tlv }, \
2047 #define _DEFINE_CAPSRC(num) \
2049 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2050 /* .name = "Capture Source", */ \
2051 .name = "Input Source", \
2053 .info = alc_mux_enum_info, \
2054 .get = alc_mux_enum_get, \
2055 .put = alc_mux_enum_put, \
2058 #define DEFINE_CAPMIX(num) \
2059 static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \
2060 _DEFINE_CAPMIX(num), \
2061 _DEFINE_CAPSRC(num), \
2065 #define DEFINE_CAPMIX_NOSRC(num) \
2066 static struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \
2067 _DEFINE_CAPMIX(num), \
2071 /* up to three ADCs */
2075 DEFINE_CAPMIX_NOSRC(1);
2076 DEFINE_CAPMIX_NOSRC(2);
2077 DEFINE_CAPMIX_NOSRC(3);
2080 * ALC880 5-stack model
2082 * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0d),
2084 * Pin assignment: Front = 0x14, Surr = 0x17, CLFE = 0x16
2085 * Line-In/Side = 0x1a, Mic = 0x18, F-Mic = 0x1b, HP = 0x19
2088 /* additional mixers to alc880_three_stack_mixer */
2089 static struct snd_kcontrol_new alc880_five_stack_mixer[] = {
2090 HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2091 HDA_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT),
2095 /* channel source setting (6/8 channel selection for 5-stack) */
2097 static struct hda_verb alc880_fivestack_ch6_init[] = {
2098 /* set line-in to input, mute it */
2099 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2100 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2105 static struct hda_verb alc880_fivestack_ch8_init[] = {
2106 /* set line-in to output, unmute it */
2107 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2108 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2112 static struct hda_channel_mode alc880_fivestack_modes[2] = {
2113 { 6, alc880_fivestack_ch6_init },
2114 { 8, alc880_fivestack_ch8_init },
2119 * ALC880 6-stack model
2121 * DAC: Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e),
2122 * Side = 0x05 (0x0f)
2123 * Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, Side = 0x17,
2124 * Mic = 0x18, F-Mic = 0x19, Line = 0x1a, HP = 0x1b
2127 static hda_nid_t alc880_6st_dac_nids[4] = {
2128 /* front, rear, clfe, rear_surr */
2129 0x02, 0x03, 0x04, 0x05
2132 static struct hda_input_mux alc880_6stack_capture_source = {
2136 { "Front Mic", 0x1 },
2142 /* fixed 8-channels */
2143 static struct hda_channel_mode alc880_sixstack_modes[1] = {
2147 static struct snd_kcontrol_new alc880_six_stack_mixer[] = {
2148 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2149 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2150 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2151 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2152 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2153 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2154 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2155 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2156 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
2157 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
2158 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2159 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2160 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2161 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2162 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2163 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2164 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2165 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2167 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2168 .name = "Channel Mode",
2169 .info = alc_ch_mode_info,
2170 .get = alc_ch_mode_get,
2171 .put = alc_ch_mode_put,
2180 * W810 has rear IO for:
2183 * Center/LFE (DAC 04)
2186 * The system also has a pair of internal speakers, and a headphone jack.
2187 * These are both connected to Line2 on the codec, hence to DAC 02.
2189 * There is a variable resistor to control the speaker or headphone
2190 * volume. This is a hardware-only device without a software API.
2192 * Plugging headphones in will disable the internal speakers. This is
2193 * implemented in hardware, not via the driver using jack sense. In
2194 * a similar fashion, plugging into the rear socket marked "front" will
2195 * disable both the speakers and headphones.
2197 * For input, there's a microphone jack, and an "audio in" jack.
2198 * These may not do anything useful with this driver yet, because I
2199 * haven't setup any initialization verbs for these yet...
2202 static hda_nid_t alc880_w810_dac_nids[3] = {
2203 /* front, rear/surround, clfe */
2207 /* fixed 6 channels */
2208 static struct hda_channel_mode alc880_w810_modes[1] = {
2212 /* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */
2213 static struct snd_kcontrol_new alc880_w810_base_mixer[] = {
2214 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2215 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2216 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2217 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2218 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2219 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2220 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2221 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2222 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2230 * DAC: Front = 0x02 (0x0c), HP = 0x03 (0x0d)
2231 * Pin assignment: Front = 0x14, HP = 0x15, Mic = 0x18, Mic2 = 0x19(?),
2235 static hda_nid_t alc880_z71v_dac_nids[1] = {
2238 #define ALC880_Z71V_HP_DAC 0x03
2240 /* fixed 2 channels */
2241 static struct hda_channel_mode alc880_2_jack_modes[1] = {
2245 static struct snd_kcontrol_new alc880_z71v_mixer[] = {
2246 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2247 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2248 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2249 HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
2250 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2251 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2252 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2253 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2259 * ALC880 F1734 model
2261 * DAC: HP = 0x02 (0x0c), Front = 0x03 (0x0d)
2262 * Pin assignment: HP = 0x14, Front = 0x15, Mic = 0x18
2265 static hda_nid_t alc880_f1734_dac_nids[1] = {
2268 #define ALC880_F1734_HP_DAC 0x02
2270 static struct snd_kcontrol_new alc880_f1734_mixer[] = {
2271 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2272 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2273 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2274 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2275 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2276 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2277 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2278 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2282 static struct hda_input_mux alc880_f1734_capture_source = {
2294 * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2295 * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2296 * Mic = 0x18, Line = 0x1a
2299 #define alc880_asus_dac_nids alc880_w810_dac_nids /* identical with w810 */
2300 #define alc880_asus_modes alc880_threestack_modes /* 2/6 channel mode */
2302 static struct snd_kcontrol_new alc880_asus_mixer[] = {
2303 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2304 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2305 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2306 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2307 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2308 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2309 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2310 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2311 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2312 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2313 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2314 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2315 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2316 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2318 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2319 .name = "Channel Mode",
2320 .info = alc_ch_mode_info,
2321 .get = alc_ch_mode_get,
2322 .put = alc_ch_mode_put,
2328 * ALC880 ASUS W1V model
2330 * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2331 * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2332 * Mic = 0x18, Line = 0x1a, Line2 = 0x1b
2335 /* additional mixers to alc880_asus_mixer */
2336 static struct snd_kcontrol_new alc880_asus_w1v_mixer[] = {
2337 HDA_CODEC_VOLUME("Line2 Playback Volume", 0x0b, 0x03, HDA_INPUT),
2338 HDA_CODEC_MUTE("Line2 Playback Switch", 0x0b, 0x03, HDA_INPUT),
2343 static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = {
2344 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2345 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2346 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
2347 HDA_CODEC_VOLUME("CD Playback Volume", 0x0B, 0x04, HDA_INPUT),
2348 HDA_CODEC_MUTE("CD Playback Switch", 0x0B, 0x04, HDA_INPUT),
2349 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0B, 0x0, HDA_INPUT),
2350 HDA_CODEC_MUTE("Mic Playback Switch", 0x0B, 0x0, HDA_INPUT),
2351 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
2352 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
2357 static struct snd_kcontrol_new alc880_uniwill_mixer[] = {
2358 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2359 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2360 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2361 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2362 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2363 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2364 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2365 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2366 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2367 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2368 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2369 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2370 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2371 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2372 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2373 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2375 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2376 .name = "Channel Mode",
2377 .info = alc_ch_mode_info,
2378 .get = alc_ch_mode_get,
2379 .put = alc_ch_mode_put,
2384 static struct snd_kcontrol_new alc880_fujitsu_mixer[] = {
2385 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2386 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2387 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2388 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2389 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2390 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2391 HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2392 HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2393 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2394 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2398 static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = {
2399 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2400 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2401 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2402 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2403 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2404 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2409 * virtual master controls
2413 * slave controls for virtual master
2415 static const char *alc_slave_vols[] = {
2416 "Front Playback Volume",
2417 "Surround Playback Volume",
2418 "Center Playback Volume",
2419 "LFE Playback Volume",
2420 "Side Playback Volume",
2421 "Headphone Playback Volume",
2422 "Speaker Playback Volume",
2423 "Mono Playback Volume",
2424 "Line-Out Playback Volume",
2425 "PCM Playback Volume",
2429 static const char *alc_slave_sws[] = {
2430 "Front Playback Switch",
2431 "Surround Playback Switch",
2432 "Center Playback Switch",
2433 "LFE Playback Switch",
2434 "Side Playback Switch",
2435 "Headphone Playback Switch",
2436 "Speaker Playback Switch",
2437 "Mono Playback Switch",
2438 "IEC958 Playback Switch",
2439 "Line-Out Playback Switch",
2440 "PCM Playback Switch",
2445 * build control elements
2448 static void alc_free_kctls(struct hda_codec *codec);
2450 #ifdef CONFIG_SND_HDA_INPUT_BEEP
2451 /* additional beep mixers; the actual parameters are overwritten at build */
2452 static struct snd_kcontrol_new alc_beep_mixer[] = {
2453 HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
2454 HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
2459 static int alc_build_controls(struct hda_codec *codec)
2461 struct alc_spec *spec = codec->spec;
2465 for (i = 0; i < spec->num_mixers; i++) {
2466 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
2470 if (spec->cap_mixer) {
2471 err = snd_hda_add_new_ctls(codec, spec->cap_mixer);
2475 if (spec->multiout.dig_out_nid) {
2476 err = snd_hda_create_spdif_out_ctls(codec,
2477 spec->multiout.dig_out_nid);
2480 if (!spec->no_analog) {
2481 err = snd_hda_create_spdif_share_sw(codec,
2485 spec->multiout.share_spdif = 1;
2488 if (spec->dig_in_nid) {
2489 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
2494 #ifdef CONFIG_SND_HDA_INPUT_BEEP
2495 /* create beep controls if needed */
2496 if (spec->beep_amp) {
2497 struct snd_kcontrol_new *knew;
2498 for (knew = alc_beep_mixer; knew->name; knew++) {
2499 struct snd_kcontrol *kctl;
2500 kctl = snd_ctl_new1(knew, codec);
2503 kctl->private_value = spec->beep_amp;
2504 err = snd_hda_ctl_add(codec,
2505 get_amp_nid_(spec->beep_amp), kctl);
2512 /* if we have no master control, let's create it */
2513 if (!spec->no_analog &&
2514 !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
2515 unsigned int vmaster_tlv[4];
2516 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
2517 HDA_OUTPUT, vmaster_tlv);
2518 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
2519 vmaster_tlv, alc_slave_vols);
2523 if (!spec->no_analog &&
2524 !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
2525 err = snd_hda_add_vmaster(codec, "Master Playback Switch",
2526 NULL, alc_slave_sws);
2531 alc_free_kctls(codec); /* no longer needed */
2537 * initialize the codec volumes, etc
2541 * generic initialization of ADC, input mixers and output mixers
2543 static struct hda_verb alc880_volume_init_verbs[] = {
2545 * Unmute ADC0-2 and set the default input to mic-in
2547 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
2548 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2549 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
2550 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2551 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
2552 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2554 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
2556 * Note: PASD motherboards uses the Line In 2 as the input for front
2559 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
2560 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2561 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2562 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2563 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2564 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2565 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2566 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
2569 * Set up output mixers (0x0c - 0x0f)
2571 /* set vol=0 to output mixers */
2572 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2573 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2574 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2575 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2576 /* set up input amps for analog loopback */
2577 /* Amp Indices: DAC = 0, mixer = 1 */
2578 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2579 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2580 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2581 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2582 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2583 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2584 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2585 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2591 * 3-stack pin configuration:
2592 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
2594 static struct hda_verb alc880_pin_3stack_init_verbs[] = {
2596 * preset connection lists of input pins
2597 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2599 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
2600 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2601 {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
2604 * Set pin mode and muting
2606 /* set front pin widgets 0x14 for output */
2607 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2608 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2609 /* Mic1 (rear panel) pin widget for input and vref at 80% */
2610 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2611 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2612 /* Mic2 (as headphone out) for HP output */
2613 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2614 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2615 /* Line In pin widget for input */
2616 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2617 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2618 /* Line2 (as front mic) pin widget for input and vref at 80% */
2619 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2620 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2621 /* CD pin widget for input */
2622 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2628 * 5-stack pin configuration:
2629 * front = 0x14, surround = 0x17, clfe = 0x16, mic = 0x18, HP = 0x19,
2630 * line-in/side = 0x1a, f-mic = 0x1b
2632 static struct hda_verb alc880_pin_5stack_init_verbs[] = {
2634 * preset connection lists of input pins
2635 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2637 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2638 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/side */
2641 * Set pin mode and muting
2643 /* set pin widgets 0x14-0x17 for output */
2644 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2645 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2646 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2647 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2648 /* unmute pins for output (no gain on this amp) */
2649 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2650 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2651 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2652 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2654 /* Mic1 (rear panel) pin widget for input and vref at 80% */
2655 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2656 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2657 /* Mic2 (as headphone out) for HP output */
2658 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2659 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2660 /* Line In pin widget for input */
2661 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2662 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2663 /* Line2 (as front mic) pin widget for input and vref at 80% */
2664 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2665 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2666 /* CD pin widget for input */
2667 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2673 * W810 pin configuration:
2674 * front = 0x14, surround = 0x15, clfe = 0x16, HP = 0x1b
2676 static struct hda_verb alc880_pin_w810_init_verbs[] = {
2677 /* hphone/speaker input selector: front DAC */
2678 {0x13, AC_VERB_SET_CONNECT_SEL, 0x0},
2680 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2681 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2682 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2683 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2684 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2685 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2687 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2688 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2694 * Z71V pin configuration:
2695 * Speaker-out = 0x14, HP = 0x15, Mic = 0x18, Line-in = 0x1a, Mic2 = 0x1b (?)
2697 static struct hda_verb alc880_pin_z71v_init_verbs[] = {
2698 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2699 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2700 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2701 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2703 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2704 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2705 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2706 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2712 * 6-stack pin configuration:
2713 * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18,
2714 * f-mic = 0x19, line = 0x1a, HP = 0x1b
2716 static struct hda_verb alc880_pin_6stack_init_verbs[] = {
2717 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2719 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2720 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2721 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2722 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2723 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2724 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2725 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2726 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2728 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2729 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2730 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2731 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2732 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2733 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2734 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2735 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2736 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2742 * Uniwill pin configuration:
2743 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x18, internal mic = 0x19,
2746 static struct hda_verb alc880_uniwill_init_verbs[] = {
2747 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2749 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2750 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2751 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2752 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2753 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2754 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2755 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2756 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2757 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2758 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2759 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2760 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2761 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2762 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2764 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2765 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2766 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2767 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2768 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2769 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2770 /* {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, */
2771 /* {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
2772 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2774 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2775 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
2782 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x19,
2784 static struct hda_verb alc880_uniwill_p53_init_verbs[] = {
2785 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2787 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2788 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2789 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2790 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2791 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2792 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2793 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2794 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2795 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2796 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2797 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
2798 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
2800 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2801 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2802 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2803 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2804 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2805 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2807 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
2808 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_DCVOL_EVENT},
2813 static struct hda_verb alc880_beep_init_verbs[] = {
2814 { 0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5) },
2818 /* auto-toggle front mic */
2819 static void alc880_uniwill_mic_automute(struct hda_codec *codec)
2821 unsigned int present;
2824 present = snd_hda_jack_detect(codec, 0x18);
2825 bits = present ? HDA_AMP_MUTE : 0;
2826 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
2829 static void alc880_uniwill_setup(struct hda_codec *codec)
2831 struct alc_spec *spec = codec->spec;
2833 spec->autocfg.hp_pins[0] = 0x14;
2834 spec->autocfg.speaker_pins[0] = 0x15;
2835 spec->autocfg.speaker_pins[0] = 0x16;
2838 static void alc880_uniwill_init_hook(struct hda_codec *codec)
2840 alc_automute_amp(codec);
2841 alc880_uniwill_mic_automute(codec);
2844 static void alc880_uniwill_unsol_event(struct hda_codec *codec,
2847 /* Looks like the unsol event is incompatible with the standard
2848 * definition. 4bit tag is placed at 28 bit!
2850 switch (res >> 28) {
2851 case ALC880_MIC_EVENT:
2852 alc880_uniwill_mic_automute(codec);
2855 alc_automute_amp_unsol_event(codec, res);
2860 static void alc880_uniwill_p53_setup(struct hda_codec *codec)
2862 struct alc_spec *spec = codec->spec;
2864 spec->autocfg.hp_pins[0] = 0x14;
2865 spec->autocfg.speaker_pins[0] = 0x15;
2868 static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec)
2870 unsigned int present;
2872 present = snd_hda_codec_read(codec, 0x21, 0,
2873 AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
2874 present &= HDA_AMP_VOLMASK;
2875 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_OUTPUT, 0,
2876 HDA_AMP_VOLMASK, present);
2877 snd_hda_codec_amp_stereo(codec, 0x0d, HDA_OUTPUT, 0,
2878 HDA_AMP_VOLMASK, present);
2881 static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec,
2884 /* Looks like the unsol event is incompatible with the standard
2885 * definition. 4bit tag is placed at 28 bit!
2887 if ((res >> 28) == ALC880_DCVOL_EVENT)
2888 alc880_uniwill_p53_dcvol_automute(codec);
2890 alc_automute_amp_unsol_event(codec, res);
2894 * F1734 pin configuration:
2895 * HP = 0x14, speaker-out = 0x15, mic = 0x18
2897 static struct hda_verb alc880_pin_f1734_init_verbs[] = {
2898 {0x07, AC_VERB_SET_CONNECT_SEL, 0x01},
2899 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
2900 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
2901 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
2902 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
2904 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2905 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2906 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2907 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2909 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2910 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2911 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
2912 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2913 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2914 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2915 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2916 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2917 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2919 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
2920 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_DCVOL_EVENT},
2926 * ASUS pin configuration:
2927 * HP/front = 0x14, surr = 0x15, clfe = 0x16, mic = 0x18, line = 0x1a
2929 static struct hda_verb alc880_pin_asus_init_verbs[] = {
2930 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
2931 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
2932 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
2933 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
2935 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2936 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2937 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2938 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2939 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2940 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2941 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2942 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2944 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2945 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2946 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2947 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2948 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2949 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2950 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2951 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2952 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2957 /* Enable GPIO mask and set output */
2958 #define alc880_gpio1_init_verbs alc_gpio1_init_verbs
2959 #define alc880_gpio2_init_verbs alc_gpio2_init_verbs
2960 #define alc880_gpio3_init_verbs alc_gpio3_init_verbs
2962 /* Clevo m520g init */
2963 static struct hda_verb alc880_pin_clevo_init_verbs[] = {
2964 /* headphone output */
2965 {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
2967 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2968 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2970 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2971 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2973 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2974 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2975 /* Mic1 (rear panel) */
2976 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2977 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2978 /* Mic2 (front panel) */
2979 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2980 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2982 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2983 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2984 /* change to EAPD mode */
2985 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
2986 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
2991 static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = {
2992 /* change to EAPD mode */
2993 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
2994 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
2996 /* Headphone output */
2997 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2999 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3000 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
3002 /* Line In pin widget for input */
3003 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3004 /* CD pin widget for input */
3005 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3006 /* Mic1 (rear panel) pin widget for input and vref at 80% */
3007 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3009 /* change to EAPD mode */
3010 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3011 {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
3017 * LG m1 express dual
3020 * Rear Line-In/Out (blue): 0x14
3021 * Build-in Mic-In: 0x15
3023 * HP-Out (green): 0x1b
3024 * Mic-In/Out (red): 0x19
3028 /* To make 5.1 output working (green=Front, blue=Surr, red=CLFE) */
3029 static hda_nid_t alc880_lg_dac_nids[3] = {
3033 /* seems analog CD is not working */
3034 static struct hda_input_mux alc880_lg_capture_source = {
3039 { "Internal Mic", 0x6 },
3043 /* 2,4,6 channel modes */
3044 static struct hda_verb alc880_lg_ch2_init[] = {
3045 /* set line-in and mic-in to input */
3046 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
3047 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3051 static struct hda_verb alc880_lg_ch4_init[] = {
3052 /* set line-in to out and mic-in to input */
3053 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3054 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3058 static struct hda_verb alc880_lg_ch6_init[] = {
3059 /* set line-in and mic-in to output */
3060 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3061 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3065 static struct hda_channel_mode alc880_lg_ch_modes[3] = {
3066 { 2, alc880_lg_ch2_init },
3067 { 4, alc880_lg_ch4_init },
3068 { 6, alc880_lg_ch6_init },
3071 static struct snd_kcontrol_new alc880_lg_mixer[] = {
3072 HDA_CODEC_VOLUME("Front Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3073 HDA_BIND_MUTE("Front Playback Switch", 0x0f, 2, HDA_INPUT),
3074 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3075 HDA_BIND_MUTE("Surround Playback Switch", 0x0c, 2, HDA_INPUT),
3076 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT),
3077 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
3078 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
3079 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
3080 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3081 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
3082 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x06, HDA_INPUT),
3083 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x06, HDA_INPUT),
3084 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x07, HDA_INPUT),
3085 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x07, HDA_INPUT),
3087 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3088 .name = "Channel Mode",
3089 .info = alc_ch_mode_info,
3090 .get = alc_ch_mode_get,
3091 .put = alc_ch_mode_put,
3096 static struct hda_verb alc880_lg_init_verbs[] = {
3097 /* set capture source to mic-in */
3098 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3099 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3100 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3101 /* mute all amp mixer inputs */
3102 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)},
3103 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
3104 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3105 /* line-in to input */
3106 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3107 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3109 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3110 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3112 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3113 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3114 /* mic-in to input */
3115 {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3116 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3117 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3119 {0x13, AC_VERB_SET_CONNECT_SEL, 0x03},
3120 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3121 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3123 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3127 /* toggle speaker-output according to the hp-jack state */
3128 static void alc880_lg_setup(struct hda_codec *codec)
3130 struct alc_spec *spec = codec->spec;
3132 spec->autocfg.hp_pins[0] = 0x1b;
3133 spec->autocfg.speaker_pins[0] = 0x17;
3142 * Built-in Mic-In: 0x19
3148 static struct hda_input_mux alc880_lg_lw_capture_source = {
3152 { "Internal Mic", 0x1 },
3157 #define alc880_lg_lw_modes alc880_threestack_modes
3159 static struct snd_kcontrol_new alc880_lg_lw_mixer[] = {
3160 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3161 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3162 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3163 HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
3164 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
3165 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
3166 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
3167 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
3168 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
3169 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
3170 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3171 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3172 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
3173 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
3175 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3176 .name = "Channel Mode",
3177 .info = alc_ch_mode_info,
3178 .get = alc_ch_mode_get,
3179 .put = alc_ch_mode_put,
3184 static struct hda_verb alc880_lg_lw_init_verbs[] = {
3185 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3186 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
3187 {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
3189 /* set capture source to mic-in */
3190 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3191 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3192 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3193 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3195 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3196 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3198 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3199 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3200 /* mic-in to input */
3201 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3202 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3204 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3205 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3207 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3211 /* toggle speaker-output according to the hp-jack state */
3212 static void alc880_lg_lw_setup(struct hda_codec *codec)
3214 struct alc_spec *spec = codec->spec;
3216 spec->autocfg.hp_pins[0] = 0x1b;
3217 spec->autocfg.speaker_pins[0] = 0x14;
3220 static struct snd_kcontrol_new alc880_medion_rim_mixer[] = {
3221 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3222 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
3223 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3224 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3225 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3226 HDA_CODEC_MUTE("Internal Playback Switch", 0x0b, 0x1, HDA_INPUT),
3230 static struct hda_input_mux alc880_medion_rim_capture_source = {
3234 { "Internal Mic", 0x1 },
3238 static struct hda_verb alc880_medion_rim_init_verbs[] = {
3239 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3241 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3242 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3244 /* Mic1 (rear panel) pin widget for input and vref at 80% */
3245 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3246 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3247 /* Mic2 (as headphone out) for HP output */
3248 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3249 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3250 /* Internal Speaker */
3251 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3252 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3254 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3255 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
3257 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3261 /* toggle speaker-output according to the hp-jack state */
3262 static void alc880_medion_rim_automute(struct hda_codec *codec)
3264 struct alc_spec *spec = codec->spec;
3265 alc_automute_amp(codec);
3267 if (spec->jack_present)
3268 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0);
3270 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 2);
3273 static void alc880_medion_rim_unsol_event(struct hda_codec *codec,
3276 /* Looks like the unsol event is incompatible with the standard
3277 * definition. 4bit tag is placed at 28 bit!
3279 if ((res >> 28) == ALC880_HP_EVENT)
3280 alc880_medion_rim_automute(codec);
3283 static void alc880_medion_rim_setup(struct hda_codec *codec)
3285 struct alc_spec *spec = codec->spec;
3287 spec->autocfg.hp_pins[0] = 0x14;
3288 spec->autocfg.speaker_pins[0] = 0x1b;
3291 #ifdef CONFIG_SND_HDA_POWER_SAVE
3292 static struct hda_amp_list alc880_loopbacks[] = {
3293 { 0x0b, HDA_INPUT, 0 },
3294 { 0x0b, HDA_INPUT, 1 },
3295 { 0x0b, HDA_INPUT, 2 },
3296 { 0x0b, HDA_INPUT, 3 },
3297 { 0x0b, HDA_INPUT, 4 },
3301 static struct hda_amp_list alc880_lg_loopbacks[] = {
3302 { 0x0b, HDA_INPUT, 1 },
3303 { 0x0b, HDA_INPUT, 6 },
3304 { 0x0b, HDA_INPUT, 7 },
3313 static int alc_init(struct hda_codec *codec)
3315 struct alc_spec *spec = codec->spec;
3319 alc_auto_init_amp(codec, spec->init_amp);
3321 for (i = 0; i < spec->num_init_verbs; i++)
3322 snd_hda_sequence_write(codec, spec->init_verbs[i]);
3324 if (spec->init_hook)
3325 spec->init_hook(codec);
3330 static void alc_unsol_event(struct hda_codec *codec, unsigned int res)
3332 struct alc_spec *spec = codec->spec;
3334 if (spec->unsol_event)
3335 spec->unsol_event(codec, res);
3338 #ifdef CONFIG_SND_HDA_POWER_SAVE
3339 static int alc_check_power_status(struct hda_codec *codec, hda_nid_t nid)
3341 struct alc_spec *spec = codec->spec;
3342 return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
3347 * Analog playback callbacks
3349 static int alc880_playback_pcm_open(struct hda_pcm_stream *hinfo,
3350 struct hda_codec *codec,
3351 struct snd_pcm_substream *substream)
3353 struct alc_spec *spec = codec->spec;
3354 return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
3358 static int alc880_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3359 struct hda_codec *codec,
3360 unsigned int stream_tag,
3361 unsigned int format,
3362 struct snd_pcm_substream *substream)
3364 struct alc_spec *spec = codec->spec;
3365 return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
3366 stream_tag, format, substream);
3369 static int alc880_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3370 struct hda_codec *codec,
3371 struct snd_pcm_substream *substream)
3373 struct alc_spec *spec = codec->spec;
3374 return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
3380 static int alc880_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
3381 struct hda_codec *codec,
3382 struct snd_pcm_substream *substream)
3384 struct alc_spec *spec = codec->spec;
3385 return snd_hda_multi_out_dig_open(codec, &spec->multiout);
3388 static int alc880_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3389 struct hda_codec *codec,
3390 unsigned int stream_tag,
3391 unsigned int format,
3392 struct snd_pcm_substream *substream)
3394 struct alc_spec *spec = codec->spec;
3395 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
3396 stream_tag, format, substream);
3399 static int alc880_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3400 struct hda_codec *codec,
3401 struct snd_pcm_substream *substream)
3403 struct alc_spec *spec = codec->spec;
3404 return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
3407 static int alc880_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
3408 struct hda_codec *codec,
3409 struct snd_pcm_substream *substream)
3411 struct alc_spec *spec = codec->spec;
3412 return snd_hda_multi_out_dig_close(codec, &spec->multiout);
3418 static int alc880_alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3419 struct hda_codec *codec,
3420 unsigned int stream_tag,
3421 unsigned int format,
3422 struct snd_pcm_substream *substream)
3424 struct alc_spec *spec = codec->spec;
3426 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
3427 stream_tag, 0, format);
3431 static int alc880_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3432 struct hda_codec *codec,
3433 struct snd_pcm_substream *substream)
3435 struct alc_spec *spec = codec->spec;
3437 snd_hda_codec_cleanup_stream(codec,
3438 spec->adc_nids[substream->number + 1]);
3445 static struct hda_pcm_stream alc880_pcm_analog_playback = {
3449 /* NID is set in alc_build_pcms */
3451 .open = alc880_playback_pcm_open,
3452 .prepare = alc880_playback_pcm_prepare,
3453 .cleanup = alc880_playback_pcm_cleanup
3457 static struct hda_pcm_stream alc880_pcm_analog_capture = {
3461 /* NID is set in alc_build_pcms */
3464 static struct hda_pcm_stream alc880_pcm_analog_alt_playback = {
3468 /* NID is set in alc_build_pcms */
3471 static struct hda_pcm_stream alc880_pcm_analog_alt_capture = {
3472 .substreams = 2, /* can be overridden */
3475 /* NID is set in alc_build_pcms */
3477 .prepare = alc880_alt_capture_pcm_prepare,
3478 .cleanup = alc880_alt_capture_pcm_cleanup
3482 static struct hda_pcm_stream alc880_pcm_digital_playback = {
3486 /* NID is set in alc_build_pcms */
3488 .open = alc880_dig_playback_pcm_open,
3489 .close = alc880_dig_playback_pcm_close,
3490 .prepare = alc880_dig_playback_pcm_prepare,
3491 .cleanup = alc880_dig_playback_pcm_cleanup
3495 static struct hda_pcm_stream alc880_pcm_digital_capture = {
3499 /* NID is set in alc_build_pcms */
3502 /* Used by alc_build_pcms to flag that a PCM has no playback stream */
3503 static struct hda_pcm_stream alc_pcm_null_stream = {
3509 static int alc_build_pcms(struct hda_codec *codec)
3511 struct alc_spec *spec = codec->spec;
3512 struct hda_pcm *info = spec->pcm_rec;
3515 codec->num_pcms = 1;
3516 codec->pcm_info = info;
3518 if (spec->no_analog)
3521 snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog),
3522 "%s Analog", codec->chip_name);
3523 info->name = spec->stream_name_analog;
3525 if (spec->stream_analog_playback) {
3526 if (snd_BUG_ON(!spec->multiout.dac_nids))
3528 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_analog_playback);
3529 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
3531 if (spec->stream_analog_capture) {
3532 if (snd_BUG_ON(!spec->adc_nids))
3534 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture);
3535 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
3538 if (spec->channel_mode) {
3539 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0;
3540 for (i = 0; i < spec->num_channel_mode; i++) {
3541 if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) {
3542 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels;
3548 /* SPDIF for stream index #1 */
3549 if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
3550 snprintf(spec->stream_name_digital,
3551 sizeof(spec->stream_name_digital),
3552 "%s Digital", codec->chip_name);
3553 codec->num_pcms = 2;
3554 codec->slave_dig_outs = spec->multiout.slave_dig_outs;
3555 info = spec->pcm_rec + 1;
3556 info->name = spec->stream_name_digital;
3557 if (spec->dig_out_type)
3558 info->pcm_type = spec->dig_out_type;
3560 info->pcm_type = HDA_PCM_TYPE_SPDIF;
3561 if (spec->multiout.dig_out_nid &&
3562 spec->stream_digital_playback) {
3563 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_digital_playback);
3564 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
3566 if (spec->dig_in_nid &&
3567 spec->stream_digital_capture) {
3568 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_digital_capture);
3569 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
3571 /* FIXME: do we need this for all Realtek codec models? */
3572 codec->spdif_status_reset = 1;
3575 if (spec->no_analog)
3578 /* If the use of more than one ADC is requested for the current
3579 * model, configure a second analog capture-only PCM.
3581 /* Additional Analaog capture for index #2 */
3582 if ((spec->alt_dac_nid && spec->stream_analog_alt_playback) ||
3583 (spec->num_adc_nids > 1 && spec->stream_analog_alt_capture)) {
3584 codec->num_pcms = 3;
3585 info = spec->pcm_rec + 2;
3586 info->name = spec->stream_name_analog;
3587 if (spec->alt_dac_nid) {
3588 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3589 *spec->stream_analog_alt_playback;
3590 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
3593 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3594 alc_pcm_null_stream;
3595 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
3597 if (spec->num_adc_nids > 1) {
3598 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3599 *spec->stream_analog_alt_capture;
3600 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
3602 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
3603 spec->num_adc_nids - 1;
3605 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3606 alc_pcm_null_stream;
3607 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
3614 static void alc_free_kctls(struct hda_codec *codec)
3616 struct alc_spec *spec = codec->spec;
3618 if (spec->kctls.list) {
3619 struct snd_kcontrol_new *kctl = spec->kctls.list;
3621 for (i = 0; i < spec->kctls.used; i++)
3622 kfree(kctl[i].name);
3624 snd_array_free(&spec->kctls);
3627 static void alc_free(struct hda_codec *codec)
3629 struct alc_spec *spec = codec->spec;
3634 alc_free_kctls(codec);
3636 snd_hda_detach_beep_device(codec);
3639 #ifdef CONFIG_SND_HDA_POWER_SAVE
3640 static int alc_suspend(struct hda_codec *codec, pm_message_t state)
3642 struct alc_spec *spec = codec->spec;
3643 if (spec && spec->power_hook)
3644 spec->power_hook(codec, 0);
3649 #ifdef SND_HDA_NEEDS_RESUME
3650 static int alc_resume(struct hda_codec *codec)
3652 #ifdef CONFIG_SND_HDA_POWER_SAVE
3653 struct alc_spec *spec = codec->spec;
3655 codec->patch_ops.init(codec);
3656 snd_hda_codec_resume_amp(codec);
3657 snd_hda_codec_resume_cache(codec);
3658 #ifdef CONFIG_SND_HDA_POWER_SAVE
3659 if (spec && spec->power_hook)
3660 spec->power_hook(codec, 1);
3668 static struct hda_codec_ops alc_patch_ops = {
3669 .build_controls = alc_build_controls,
3670 .build_pcms = alc_build_pcms,
3673 .unsol_event = alc_unsol_event,
3674 #ifdef SND_HDA_NEEDS_RESUME
3675 .resume = alc_resume,
3677 #ifdef CONFIG_SND_HDA_POWER_SAVE
3678 .suspend = alc_suspend,
3679 .check_power_status = alc_check_power_status,
3685 * Test configuration for debugging
3687 * Almost all inputs/outputs are enabled. I/O pins can be configured via
3690 #ifdef CONFIG_SND_DEBUG
3691 static hda_nid_t alc880_test_dac_nids[4] = {
3692 0x02, 0x03, 0x04, 0x05
3695 static struct hda_input_mux alc880_test_capture_source = {
3704 { "Surround", 0x6 },
3708 static struct hda_channel_mode alc880_test_modes[4] = {
3715 static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol,
3716 struct snd_ctl_elem_info *uinfo)
3718 static char *texts[] = {
3719 "N/A", "Line Out", "HP Out",
3720 "In Hi-Z", "In 50%", "In Grd", "In 80%", "In 100%"
3722 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3724 uinfo->value.enumerated.items = 8;
3725 if (uinfo->value.enumerated.item >= 8)
3726 uinfo->value.enumerated.item = 7;
3727 strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
3731 static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol,
3732 struct snd_ctl_elem_value *ucontrol)
3734 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3735 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3736 unsigned int pin_ctl, item = 0;
3738 pin_ctl = snd_hda_codec_read(codec, nid, 0,
3739 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3740 if (pin_ctl & AC_PINCTL_OUT_EN) {
3741 if (pin_ctl & AC_PINCTL_HP_EN)
3745 } else if (pin_ctl & AC_PINCTL_IN_EN) {
3746 switch (pin_ctl & AC_PINCTL_VREFEN) {
3747 case AC_PINCTL_VREF_HIZ: item = 3; break;
3748 case AC_PINCTL_VREF_50: item = 4; break;
3749 case AC_PINCTL_VREF_GRD: item = 5; break;
3750 case AC_PINCTL_VREF_80: item = 6; break;
3751 case AC_PINCTL_VREF_100: item = 7; break;
3754 ucontrol->value.enumerated.item[0] = item;
3758 static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol,
3759 struct snd_ctl_elem_value *ucontrol)
3761 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3762 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3763 static unsigned int ctls[] = {
3764 0, AC_PINCTL_OUT_EN, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN,
3765 AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ,
3766 AC_PINCTL_IN_EN | AC_PINCTL_VREF_50,
3767 AC_PINCTL_IN_EN | AC_PINCTL_VREF_GRD,
3768 AC_PINCTL_IN_EN | AC_PINCTL_VREF_80,
3769 AC_PINCTL_IN_EN | AC_PINCTL_VREF_100,
3771 unsigned int old_ctl, new_ctl;
3773 old_ctl = snd_hda_codec_read(codec, nid, 0,
3774 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
3775 new_ctl = ctls[ucontrol->value.enumerated.item[0]];
3776 if (old_ctl != new_ctl) {
3778 snd_hda_codec_write_cache(codec, nid, 0,
3779 AC_VERB_SET_PIN_WIDGET_CONTROL,
3781 val = ucontrol->value.enumerated.item[0] >= 3 ?
3783 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
3790 static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol,
3791 struct snd_ctl_elem_info *uinfo)
3793 static char *texts[] = {
3794 "Front", "Surround", "CLFE", "Side"
3796 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
3798 uinfo->value.enumerated.items = 4;
3799 if (uinfo->value.enumerated.item >= 4)
3800 uinfo->value.enumerated.item = 3;
3801 strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
3805 static int alc_test_pin_src_get(struct snd_kcontrol *kcontrol,
3806 struct snd_ctl_elem_value *ucontrol)
3808 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3809 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3812 sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0);
3813 ucontrol->value.enumerated.item[0] = sel & 3;
3817 static int alc_test_pin_src_put(struct snd_kcontrol *kcontrol,
3818 struct snd_ctl_elem_value *ucontrol)
3820 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
3821 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
3824 sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0) & 3;
3825 if (ucontrol->value.enumerated.item[0] != sel) {
3826 sel = ucontrol->value.enumerated.item[0] & 3;
3827 snd_hda_codec_write_cache(codec, nid, 0,
3828 AC_VERB_SET_CONNECT_SEL, sel);
3834 #define PIN_CTL_TEST(xname,nid) { \
3835 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3837 .info = alc_test_pin_ctl_info, \
3838 .get = alc_test_pin_ctl_get, \
3839 .put = alc_test_pin_ctl_put, \
3840 .private_value = nid \
3843 #define PIN_SRC_TEST(xname,nid) { \
3844 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
3846 .info = alc_test_pin_src_info, \
3847 .get = alc_test_pin_src_get, \
3848 .put = alc_test_pin_src_put, \
3849 .private_value = nid \
3852 static struct snd_kcontrol_new alc880_test_mixer[] = {
3853 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3854 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
3855 HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
3856 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3857 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3858 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
3859 HDA_BIND_MUTE("CLFE Playback Switch", 0x0e, 2, HDA_INPUT),
3860 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
3861 PIN_CTL_TEST("Front Pin Mode", 0x14),
3862 PIN_CTL_TEST("Surround Pin Mode", 0x15),
3863 PIN_CTL_TEST("CLFE Pin Mode", 0x16),
3864 PIN_CTL_TEST("Side Pin Mode", 0x17),
3865 PIN_CTL_TEST("In-1 Pin Mode", 0x18),
3866 PIN_CTL_TEST("In-2 Pin Mode", 0x19),
3867 PIN_CTL_TEST("In-3 Pin Mode", 0x1a),
3868 PIN_CTL_TEST("In-4 Pin Mode", 0x1b),
3869 PIN_SRC_TEST("In-1 Pin Source", 0x18),
3870 PIN_SRC_TEST("In-2 Pin Source", 0x19),
3871 PIN_SRC_TEST("In-3 Pin Source", 0x1a),
3872 PIN_SRC_TEST("In-4 Pin Source", 0x1b),
3873 HDA_CODEC_VOLUME("In-1 Playback Volume", 0x0b, 0x0, HDA_INPUT),
3874 HDA_CODEC_MUTE("In-1 Playback Switch", 0x0b, 0x0, HDA_INPUT),
3875 HDA_CODEC_VOLUME("In-2 Playback Volume", 0x0b, 0x1, HDA_INPUT),
3876 HDA_CODEC_MUTE("In-2 Playback Switch", 0x0b, 0x1, HDA_INPUT),
3877 HDA_CODEC_VOLUME("In-3 Playback Volume", 0x0b, 0x2, HDA_INPUT),
3878 HDA_CODEC_MUTE("In-3 Playback Switch", 0x0b, 0x2, HDA_INPUT),
3879 HDA_CODEC_VOLUME("In-4 Playback Volume", 0x0b, 0x3, HDA_INPUT),
3880 HDA_CODEC_MUTE("In-4 Playback Switch", 0x0b, 0x3, HDA_INPUT),
3881 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x4, HDA_INPUT),
3882 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x4, HDA_INPUT),
3884 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3885 .name = "Channel Mode",
3886 .info = alc_ch_mode_info,
3887 .get = alc_ch_mode_get,
3888 .put = alc_ch_mode_put,
3893 static struct hda_verb alc880_test_init_verbs[] = {
3894 /* Unmute inputs of 0x0c - 0x0f */
3895 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3896 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3897 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3898 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3899 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3900 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3901 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3902 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3903 /* Vol output for 0x0c-0x0f */
3904 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3905 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3906 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3907 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
3908 /* Set output pins 0x14-0x17 */
3909 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3910 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3911 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3912 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3913 /* Unmute output pins 0x14-0x17 */
3914 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3915 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3916 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3917 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3918 /* Set input pins 0x18-0x1c */
3919 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3920 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3921 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3922 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3923 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3924 /* Mute input pins 0x18-0x1b */
3925 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3926 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3927 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3928 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3930 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3931 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
3932 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3933 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
3934 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3935 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
3936 /* Analog input/passthru */
3937 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
3938 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3939 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
3940 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
3941 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
3949 static const char *alc880_models[ALC880_MODEL_LAST] = {
3950 [ALC880_3ST] = "3stack",
3951 [ALC880_TCL_S700] = "tcl",
3952 [ALC880_3ST_DIG] = "3stack-digout",
3953 [ALC880_CLEVO] = "clevo",
3954 [ALC880_5ST] = "5stack",
3955 [ALC880_5ST_DIG] = "5stack-digout",
3956 [ALC880_W810] = "w810",
3957 [ALC880_Z71V] = "z71v",
3958 [ALC880_6ST] = "6stack",
3959 [ALC880_6ST_DIG] = "6stack-digout",
3960 [ALC880_ASUS] = "asus",
3961 [ALC880_ASUS_W1V] = "asus-w1v",
3962 [ALC880_ASUS_DIG] = "asus-dig",
3963 [ALC880_ASUS_DIG2] = "asus-dig2",
3964 [ALC880_UNIWILL_DIG] = "uniwill",
3965 [ALC880_UNIWILL_P53] = "uniwill-p53",
3966 [ALC880_FUJITSU] = "fujitsu",
3967 [ALC880_F1734] = "F1734",
3969 [ALC880_LG_LW] = "lg-lw",
3970 [ALC880_MEDION_RIM] = "medion",
3971 #ifdef CONFIG_SND_DEBUG
3972 [ALC880_TEST] = "test",
3974 [ALC880_AUTO] = "auto",
3977 static struct snd_pci_quirk alc880_cfg_tbl[] = {
3978 SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_W810),
3979 SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_5ST_DIG),
3980 SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_6ST),
3981 SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_3ST_DIG),
3982 SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_6ST_DIG),
3983 SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_6ST_DIG),
3984 SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_6ST_DIG),
3985 SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG),
3986 SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST),
3987 SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG),
3988 SND_PCI_QUIRK(0x103c, 0x2a09, "HP", ALC880_5ST),
3989 SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V),
3990 SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG),
3991 SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG),
3992 SND_PCI_QUIRK(0x1043, 0x1113, "ASUS", ALC880_ASUS_DIG),
3993 SND_PCI_QUIRK(0x1043, 0x1123, "ASUS", ALC880_ASUS_DIG),
3994 SND_PCI_QUIRK(0x1043, 0x1173, "ASUS", ALC880_ASUS_DIG),
3995 SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_Z71V),
3996 /* SND_PCI_QUIRK(0x1043, 0x1964, "ASUS", ALC880_ASUS_DIG), */
3997 SND_PCI_QUIRK(0x1043, 0x1973, "ASUS", ALC880_ASUS_DIG),
3998 SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS", ALC880_ASUS_DIG),
3999 SND_PCI_QUIRK(0x1043, 0x814e, "ASUS P5GD1 w/SPDIF", ALC880_6ST_DIG),
4000 SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG),
4001 SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST),
4002 SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST),
4003 SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_ASUS), /* default ASUS */
4004 SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_3ST),
4005 SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_3ST),
4006 SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_5ST),
4007 SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_5ST),
4008 SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_5ST),
4009 SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_6ST_DIG),
4010 SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_6ST_DIG),
4011 SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_6ST_DIG),
4012 SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_6ST_DIG),
4013 SND_PCI_QUIRK(0x1558, 0x0520, "Clevo m520G", ALC880_CLEVO),
4014 SND_PCI_QUIRK(0x1558, 0x0660, "Clevo m655n", ALC880_CLEVO),
4015 SND_PCI_QUIRK(0x1558, 0x5401, "ASUS", ALC880_ASUS_DIG2),
4016 SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_5ST_DIG),
4017 SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_UNIWILL_DIG),
4018 SND_PCI_QUIRK(0x1584, 0x9054, "Uniwlll", ALC880_F1734),
4019 SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_UNIWILL),
4020 SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_UNIWILL_P53),
4021 SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_W810),
4022 SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_MEDION_RIM),
4023 SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_5ST_DIG),
4024 SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG),
4025 SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734),
4026 SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU),
4027 SND_PCI_QUIRK(0x1734, 0x10ac, "FSC", ALC880_UNIWILL),
4028 SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU),
4029 SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW),
4030 SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG),
4031 SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG),
4032 SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW),
4033 SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700),
4034 SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_6ST_DIG), /* broken BIOS */
4035 SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_6ST_DIG),
4036 SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_5ST_DIG),
4037 SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_5ST_DIG),
4038 SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_5ST_DIG),
4039 SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_3ST_DIG),
4040 SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_5ST_DIG),
4041 SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_3ST_DIG),
4042 SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_3ST_DIG),
4043 SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_5ST_DIG),
4044 SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_5ST_DIG),
4045 SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_5ST_DIG),
4047 SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_3ST),
4048 SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_5ST_DIG),
4049 SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_6ST_DIG),
4054 * ALC880 codec presets
4056 static struct alc_config_preset alc880_presets[] = {
4058 .mixers = { alc880_three_stack_mixer },
4059 .init_verbs = { alc880_volume_init_verbs,
4060 alc880_pin_3stack_init_verbs },
4061 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4062 .dac_nids = alc880_dac_nids,
4063 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4064 .channel_mode = alc880_threestack_modes,
4066 .input_mux = &alc880_capture_source,
4068 [ALC880_3ST_DIG] = {
4069 .mixers = { alc880_three_stack_mixer },
4070 .init_verbs = { alc880_volume_init_verbs,
4071 alc880_pin_3stack_init_verbs },
4072 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4073 .dac_nids = alc880_dac_nids,
4074 .dig_out_nid = ALC880_DIGOUT_NID,
4075 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4076 .channel_mode = alc880_threestack_modes,
4078 .input_mux = &alc880_capture_source,
4080 [ALC880_TCL_S700] = {
4081 .mixers = { alc880_tcl_s700_mixer },
4082 .init_verbs = { alc880_volume_init_verbs,
4083 alc880_pin_tcl_S700_init_verbs,
4084 alc880_gpio2_init_verbs },
4085 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4086 .dac_nids = alc880_dac_nids,
4087 .adc_nids = alc880_adc_nids_alt, /* FIXME: correct? */
4088 .num_adc_nids = 1, /* single ADC */
4090 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4091 .channel_mode = alc880_2_jack_modes,
4092 .input_mux = &alc880_capture_source,
4095 .mixers = { alc880_three_stack_mixer,
4096 alc880_five_stack_mixer},
4097 .init_verbs = { alc880_volume_init_verbs,
4098 alc880_pin_5stack_init_verbs },
4099 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4100 .dac_nids = alc880_dac_nids,
4101 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4102 .channel_mode = alc880_fivestack_modes,
4103 .input_mux = &alc880_capture_source,
4105 [ALC880_5ST_DIG] = {
4106 .mixers = { alc880_three_stack_mixer,
4107 alc880_five_stack_mixer },
4108 .init_verbs = { alc880_volume_init_verbs,
4109 alc880_pin_5stack_init_verbs },
4110 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4111 .dac_nids = alc880_dac_nids,
4112 .dig_out_nid = ALC880_DIGOUT_NID,
4113 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4114 .channel_mode = alc880_fivestack_modes,
4115 .input_mux = &alc880_capture_source,
4118 .mixers = { alc880_six_stack_mixer },
4119 .init_verbs = { alc880_volume_init_verbs,
4120 alc880_pin_6stack_init_verbs },
4121 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4122 .dac_nids = alc880_6st_dac_nids,
4123 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4124 .channel_mode = alc880_sixstack_modes,
4125 .input_mux = &alc880_6stack_capture_source,
4127 [ALC880_6ST_DIG] = {
4128 .mixers = { alc880_six_stack_mixer },
4129 .init_verbs = { alc880_volume_init_verbs,
4130 alc880_pin_6stack_init_verbs },
4131 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4132 .dac_nids = alc880_6st_dac_nids,
4133 .dig_out_nid = ALC880_DIGOUT_NID,
4134 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4135 .channel_mode = alc880_sixstack_modes,
4136 .input_mux = &alc880_6stack_capture_source,
4139 .mixers = { alc880_w810_base_mixer },
4140 .init_verbs = { alc880_volume_init_verbs,
4141 alc880_pin_w810_init_verbs,
4142 alc880_gpio2_init_verbs },
4143 .num_dacs = ARRAY_SIZE(alc880_w810_dac_nids),
4144 .dac_nids = alc880_w810_dac_nids,
4145 .dig_out_nid = ALC880_DIGOUT_NID,
4146 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4147 .channel_mode = alc880_w810_modes,
4148 .input_mux = &alc880_capture_source,
4151 .mixers = { alc880_z71v_mixer },
4152 .init_verbs = { alc880_volume_init_verbs,
4153 alc880_pin_z71v_init_verbs },
4154 .num_dacs = ARRAY_SIZE(alc880_z71v_dac_nids),
4155 .dac_nids = alc880_z71v_dac_nids,
4156 .dig_out_nid = ALC880_DIGOUT_NID,
4158 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4159 .channel_mode = alc880_2_jack_modes,
4160 .input_mux = &alc880_capture_source,
4163 .mixers = { alc880_f1734_mixer },
4164 .init_verbs = { alc880_volume_init_verbs,
4165 alc880_pin_f1734_init_verbs },
4166 .num_dacs = ARRAY_SIZE(alc880_f1734_dac_nids),
4167 .dac_nids = alc880_f1734_dac_nids,
4169 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4170 .channel_mode = alc880_2_jack_modes,
4171 .input_mux = &alc880_f1734_capture_source,
4172 .unsol_event = alc880_uniwill_p53_unsol_event,
4173 .setup = alc880_uniwill_p53_setup,
4174 .init_hook = alc_automute_amp,
4177 .mixers = { alc880_asus_mixer },
4178 .init_verbs = { alc880_volume_init_verbs,
4179 alc880_pin_asus_init_verbs,
4180 alc880_gpio1_init_verbs },
4181 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4182 .dac_nids = alc880_asus_dac_nids,
4183 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4184 .channel_mode = alc880_asus_modes,
4186 .input_mux = &alc880_capture_source,
4188 [ALC880_ASUS_DIG] = {
4189 .mixers = { alc880_asus_mixer },
4190 .init_verbs = { alc880_volume_init_verbs,
4191 alc880_pin_asus_init_verbs,
4192 alc880_gpio1_init_verbs },
4193 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4194 .dac_nids = alc880_asus_dac_nids,
4195 .dig_out_nid = ALC880_DIGOUT_NID,
4196 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4197 .channel_mode = alc880_asus_modes,
4199 .input_mux = &alc880_capture_source,
4201 [ALC880_ASUS_DIG2] = {
4202 .mixers = { alc880_asus_mixer },
4203 .init_verbs = { alc880_volume_init_verbs,
4204 alc880_pin_asus_init_verbs,
4205 alc880_gpio2_init_verbs }, /* use GPIO2 */
4206 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4207 .dac_nids = alc880_asus_dac_nids,
4208 .dig_out_nid = ALC880_DIGOUT_NID,
4209 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4210 .channel_mode = alc880_asus_modes,
4212 .input_mux = &alc880_capture_source,
4214 [ALC880_ASUS_W1V] = {
4215 .mixers = { alc880_asus_mixer, alc880_asus_w1v_mixer },
4216 .init_verbs = { alc880_volume_init_verbs,
4217 alc880_pin_asus_init_verbs,
4218 alc880_gpio1_init_verbs },
4219 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4220 .dac_nids = alc880_asus_dac_nids,
4221 .dig_out_nid = ALC880_DIGOUT_NID,
4222 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4223 .channel_mode = alc880_asus_modes,
4225 .input_mux = &alc880_capture_source,
4227 [ALC880_UNIWILL_DIG] = {
4228 .mixers = { alc880_asus_mixer },
4229 .init_verbs = { alc880_volume_init_verbs,
4230 alc880_pin_asus_init_verbs },
4231 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4232 .dac_nids = alc880_asus_dac_nids,
4233 .dig_out_nid = ALC880_DIGOUT_NID,
4234 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4235 .channel_mode = alc880_asus_modes,
4237 .input_mux = &alc880_capture_source,
4239 [ALC880_UNIWILL] = {
4240 .mixers = { alc880_uniwill_mixer },
4241 .init_verbs = { alc880_volume_init_verbs,
4242 alc880_uniwill_init_verbs },
4243 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4244 .dac_nids = alc880_asus_dac_nids,
4245 .dig_out_nid = ALC880_DIGOUT_NID,
4246 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4247 .channel_mode = alc880_threestack_modes,
4249 .input_mux = &alc880_capture_source,
4250 .unsol_event = alc880_uniwill_unsol_event,
4251 .setup = alc880_uniwill_setup,
4252 .init_hook = alc880_uniwill_init_hook,
4254 [ALC880_UNIWILL_P53] = {
4255 .mixers = { alc880_uniwill_p53_mixer },
4256 .init_verbs = { alc880_volume_init_verbs,
4257 alc880_uniwill_p53_init_verbs },
4258 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4259 .dac_nids = alc880_asus_dac_nids,
4260 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4261 .channel_mode = alc880_threestack_modes,
4262 .input_mux = &alc880_capture_source,
4263 .unsol_event = alc880_uniwill_p53_unsol_event,
4264 .setup = alc880_uniwill_p53_setup,
4265 .init_hook = alc_automute_amp,
4267 [ALC880_FUJITSU] = {
4268 .mixers = { alc880_fujitsu_mixer },
4269 .init_verbs = { alc880_volume_init_verbs,
4270 alc880_uniwill_p53_init_verbs,
4271 alc880_beep_init_verbs },
4272 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4273 .dac_nids = alc880_dac_nids,
4274 .dig_out_nid = ALC880_DIGOUT_NID,
4275 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4276 .channel_mode = alc880_2_jack_modes,
4277 .input_mux = &alc880_capture_source,
4278 .unsol_event = alc880_uniwill_p53_unsol_event,
4279 .setup = alc880_uniwill_p53_setup,
4280 .init_hook = alc_automute_amp,
4283 .mixers = { alc880_three_stack_mixer },
4284 .init_verbs = { alc880_volume_init_verbs,
4285 alc880_pin_clevo_init_verbs },
4286 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4287 .dac_nids = alc880_dac_nids,
4289 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4290 .channel_mode = alc880_threestack_modes,
4292 .input_mux = &alc880_capture_source,
4295 .mixers = { alc880_lg_mixer },
4296 .init_verbs = { alc880_volume_init_verbs,
4297 alc880_lg_init_verbs },
4298 .num_dacs = ARRAY_SIZE(alc880_lg_dac_nids),
4299 .dac_nids = alc880_lg_dac_nids,
4300 .dig_out_nid = ALC880_DIGOUT_NID,
4301 .num_channel_mode = ARRAY_SIZE(alc880_lg_ch_modes),
4302 .channel_mode = alc880_lg_ch_modes,
4304 .input_mux = &alc880_lg_capture_source,
4305 .unsol_event = alc_automute_amp_unsol_event,
4306 .setup = alc880_lg_setup,
4307 .init_hook = alc_automute_amp,
4308 #ifdef CONFIG_SND_HDA_POWER_SAVE
4309 .loopbacks = alc880_lg_loopbacks,
4313 .mixers = { alc880_lg_lw_mixer },
4314 .init_verbs = { alc880_volume_init_verbs,
4315 alc880_lg_lw_init_verbs },
4316 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4317 .dac_nids = alc880_dac_nids,
4318 .dig_out_nid = ALC880_DIGOUT_NID,
4319 .num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes),
4320 .channel_mode = alc880_lg_lw_modes,
4321 .input_mux = &alc880_lg_lw_capture_source,
4322 .unsol_event = alc_automute_amp_unsol_event,
4323 .setup = alc880_lg_lw_setup,
4324 .init_hook = alc_automute_amp,
4326 [ALC880_MEDION_RIM] = {
4327 .mixers = { alc880_medion_rim_mixer },
4328 .init_verbs = { alc880_volume_init_verbs,
4329 alc880_medion_rim_init_verbs,
4330 alc_gpio2_init_verbs },
4331 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4332 .dac_nids = alc880_dac_nids,
4333 .dig_out_nid = ALC880_DIGOUT_NID,
4334 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4335 .channel_mode = alc880_2_jack_modes,
4336 .input_mux = &alc880_medion_rim_capture_source,
4337 .unsol_event = alc880_medion_rim_unsol_event,
4338 .setup = alc880_medion_rim_setup,
4339 .init_hook = alc880_medion_rim_automute,
4341 #ifdef CONFIG_SND_DEBUG
4343 .mixers = { alc880_test_mixer },
4344 .init_verbs = { alc880_test_init_verbs },
4345 .num_dacs = ARRAY_SIZE(alc880_test_dac_nids),
4346 .dac_nids = alc880_test_dac_nids,
4347 .dig_out_nid = ALC880_DIGOUT_NID,
4348 .num_channel_mode = ARRAY_SIZE(alc880_test_modes),
4349 .channel_mode = alc880_test_modes,
4350 .input_mux = &alc880_test_capture_source,
4356 * Automatic parse of I/O pins from the BIOS configuration
4361 ALC_CTL_WIDGET_MUTE,
4364 static struct snd_kcontrol_new alc880_control_templates[] = {
4365 HDA_CODEC_VOLUME(NULL, 0, 0, 0),
4366 HDA_CODEC_MUTE(NULL, 0, 0, 0),
4367 HDA_BIND_MUTE(NULL, 0, 0, 0),
4370 /* add dynamic controls */
4371 static int add_control(struct alc_spec *spec, int type, const char *name,
4374 struct snd_kcontrol_new *knew;
4376 snd_array_init(&spec->kctls, sizeof(*knew), 32);
4377 knew = snd_array_new(&spec->kctls);
4380 *knew = alc880_control_templates[type];
4381 knew->name = kstrdup(name, GFP_KERNEL);
4384 if (get_amp_nid_(val))
4385 knew->subdevice = HDA_SUBDEV_NID_FLAG | get_amp_nid_(val);
4386 knew->private_value = val;
4390 static int add_control_with_pfx(struct alc_spec *spec, int type,
4391 const char *pfx, const char *dir,
4392 const char *sfx, unsigned long val)
4395 snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
4396 return add_control(spec, type, name, val);
4399 #define add_pb_vol_ctrl(spec, type, pfx, val) \
4400 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", val)
4401 #define add_pb_sw_ctrl(spec, type, pfx, val) \
4402 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", val)
4404 #define alc880_is_fixed_pin(nid) ((nid) >= 0x14 && (nid) <= 0x17)
4405 #define alc880_fixed_pin_idx(nid) ((nid) - 0x14)
4406 #define alc880_is_multi_pin(nid) ((nid) >= 0x18)
4407 #define alc880_multi_pin_idx(nid) ((nid) - 0x18)
4408 #define alc880_idx_to_dac(nid) ((nid) + 0x02)
4409 #define alc880_dac_to_idx(nid) ((nid) - 0x02)
4410 #define alc880_idx_to_mixer(nid) ((nid) + 0x0c)
4411 #define alc880_idx_to_selector(nid) ((nid) + 0x10)
4412 #define ALC880_PIN_CD_NID 0x1c
4414 /* fill in the dac_nids table from the parsed pin configuration */
4415 static int alc880_auto_fill_dac_nids(struct alc_spec *spec,
4416 const struct auto_pin_cfg *cfg)
4422 memset(assigned, 0, sizeof(assigned));
4423 spec->multiout.dac_nids = spec->private_dac_nids;
4425 /* check the pins hardwired to audio widget */
4426 for (i = 0; i < cfg->line_outs; i++) {
4427 nid = cfg->line_out_pins[i];
4428 if (alc880_is_fixed_pin(nid)) {
4429 int idx = alc880_fixed_pin_idx(nid);
4430 spec->multiout.dac_nids[i] = alc880_idx_to_dac(idx);
4434 /* left pins can be connect to any audio widget */
4435 for (i = 0; i < cfg->line_outs; i++) {
4436 nid = cfg->line_out_pins[i];
4437 if (alc880_is_fixed_pin(nid))
4439 /* search for an empty channel */
4440 for (j = 0; j < cfg->line_outs; j++) {
4442 spec->multiout.dac_nids[i] =
4443 alc880_idx_to_dac(j);
4449 spec->multiout.num_dacs = cfg->line_outs;
4453 /* add playback controls from the parsed DAC table */
4454 static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
4455 const struct auto_pin_cfg *cfg)
4457 static const char *chname[4] = {
4458 "Front", "Surround", NULL /*CLFE*/, "Side"
4463 for (i = 0; i < cfg->line_outs; i++) {
4464 if (!spec->multiout.dac_nids[i])
4466 nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i]));
4469 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4471 HDA_COMPOSE_AMP_VAL(nid, 1, 0,
4475 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4477 HDA_COMPOSE_AMP_VAL(nid, 2, 0,
4481 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4483 HDA_COMPOSE_AMP_VAL(nid, 1, 2,
4487 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4489 HDA_COMPOSE_AMP_VAL(nid, 2, 2,
4495 if (cfg->line_outs == 1 &&
4496 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
4500 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
4501 HDA_COMPOSE_AMP_VAL(nid, 3, 0,
4505 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
4506 HDA_COMPOSE_AMP_VAL(nid, 3, 2,
4515 /* add playback controls for speaker and HP outputs */
4516 static int alc880_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin,
4525 if (alc880_is_fixed_pin(pin)) {
4526 nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
4527 /* specify the DAC as the extra output */
4528 if (!spec->multiout.hp_nid)
4529 spec->multiout.hp_nid = nid;
4531 spec->multiout.extra_out_nid[0] = nid;
4532 /* control HP volume/switch on the output mixer amp */
4533 nid = alc880_idx_to_mixer(alc880_fixed_pin_idx(pin));
4534 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
4535 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
4538 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
4539 HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT));
4542 } else if (alc880_is_multi_pin(pin)) {
4543 /* set manual connection */
4544 /* we have only a switch on HP-out PIN */
4545 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
4546 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
4553 /* create input playback/capture controls for the given pin */
4554 static int new_analog_input(struct alc_spec *spec, hda_nid_t pin,
4555 const char *ctlname,
4556 int idx, hda_nid_t mix_nid)
4560 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
4561 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4564 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
4565 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4571 static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid)
4573 unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
4574 return (pincap & AC_PINCAP_IN) != 0;
4577 /* create playback/capture controls for input pins */
4578 static int alc_auto_create_input_ctls(struct hda_codec *codec,
4579 const struct auto_pin_cfg *cfg,
4581 hda_nid_t cap1, hda_nid_t cap2)
4583 struct alc_spec *spec = codec->spec;
4584 struct hda_input_mux *imux = &spec->private_imux[0];
4587 for (i = 0; i < AUTO_PIN_LAST; i++) {
4590 pin = cfg->input_pins[i];
4591 if (!alc_is_input_pin(codec, pin))
4595 idx = get_connection_index(codec, mixer, pin);
4597 err = new_analog_input(spec, pin,
4598 auto_pin_cfg_labels[i],
4607 idx = get_connection_index(codec, cap1, pin);
4608 if (idx < 0 && cap2)
4609 idx = get_connection_index(codec, cap2, pin);
4611 imux->items[imux->num_items].label =
4612 auto_pin_cfg_labels[i];
4613 imux->items[imux->num_items].index = idx;
4620 static int alc880_auto_create_input_ctls(struct hda_codec *codec,
4621 const struct auto_pin_cfg *cfg)
4623 return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x08, 0x09);
4626 static void alc_set_pin_output(struct hda_codec *codec, hda_nid_t nid,
4627 unsigned int pin_type)
4629 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4632 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
4636 static void alc880_auto_set_output_and_unmute(struct hda_codec *codec,
4637 hda_nid_t nid, int pin_type,
4640 alc_set_pin_output(codec, nid, pin_type);
4641 /* need the manual connection? */
4642 if (alc880_is_multi_pin(nid)) {
4643 struct alc_spec *spec = codec->spec;
4644 int idx = alc880_multi_pin_idx(nid);
4645 snd_hda_codec_write(codec, alc880_idx_to_selector(idx), 0,
4646 AC_VERB_SET_CONNECT_SEL,
4647 alc880_dac_to_idx(spec->multiout.dac_nids[dac_idx]));
4651 static int get_pin_type(int line_out_type)
4653 if (line_out_type == AUTO_PIN_HP_OUT)
4659 static void alc880_auto_init_multi_out(struct hda_codec *codec)
4661 struct alc_spec *spec = codec->spec;
4664 for (i = 0; i < spec->autocfg.line_outs; i++) {
4665 hda_nid_t nid = spec->autocfg.line_out_pins[i];
4666 int pin_type = get_pin_type(spec->autocfg.line_out_type);
4667 alc880_auto_set_output_and_unmute(codec, nid, pin_type, i);
4671 static void alc880_auto_init_extra_out(struct hda_codec *codec)
4673 struct alc_spec *spec = codec->spec;
4676 pin = spec->autocfg.speaker_pins[0];
4677 if (pin) /* connect to front */
4678 alc880_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
4679 pin = spec->autocfg.hp_pins[0];
4680 if (pin) /* connect to front */
4681 alc880_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
4684 static void alc880_auto_init_analog_input(struct hda_codec *codec)
4686 struct alc_spec *spec = codec->spec;
4689 for (i = 0; i < AUTO_PIN_LAST; i++) {
4690 hda_nid_t nid = spec->autocfg.input_pins[i];
4691 if (alc_is_input_pin(codec, nid)) {
4692 alc_set_input_pin(codec, nid, i);
4693 if (nid != ALC880_PIN_CD_NID &&
4694 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
4695 snd_hda_codec_write(codec, nid, 0,
4696 AC_VERB_SET_AMP_GAIN_MUTE,
4702 /* parse the BIOS configuration and set up the alc_spec */
4703 /* return 1 if successful, 0 if the proper config is not found,
4704 * or a negative error code
4706 static int alc880_parse_auto_config(struct hda_codec *codec)
4708 struct alc_spec *spec = codec->spec;
4710 static hda_nid_t alc880_ignore[] = { 0x1d, 0 };
4712 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
4716 if (!spec->autocfg.line_outs)
4717 return 0; /* can't find valid BIOS pin config */
4719 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
4722 err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
4725 err = alc880_auto_create_extra_out(spec,
4726 spec->autocfg.speaker_pins[0],
4730 err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
4734 err = alc880_auto_create_input_ctls(codec, &spec->autocfg);
4738 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
4740 /* check multiple SPDIF-out (for recent codecs) */
4741 for (i = 0; i < spec->autocfg.dig_outs; i++) {
4743 err = snd_hda_get_connections(codec,
4744 spec->autocfg.dig_out_pins[i],
4749 spec->multiout.dig_out_nid = dig_nid;
4751 spec->multiout.slave_dig_outs = spec->slave_dig_outs;
4752 if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
4754 spec->slave_dig_outs[i - 1] = dig_nid;
4757 if (spec->autocfg.dig_in_pin)
4758 spec->dig_in_nid = ALC880_DIGIN_NID;
4760 if (spec->kctls.list)
4761 add_mixer(spec, spec->kctls.list);
4763 add_verb(spec, alc880_volume_init_verbs);
4765 spec->num_mux_defs = 1;
4766 spec->input_mux = &spec->private_imux[0];
4768 alc_ssid_check(codec, 0x15, 0x1b, 0x14);
4773 /* additional initialization for auto-configuration model */
4774 static void alc880_auto_init(struct hda_codec *codec)
4776 struct alc_spec *spec = codec->spec;
4777 alc880_auto_init_multi_out(codec);
4778 alc880_auto_init_extra_out(codec);
4779 alc880_auto_init_analog_input(codec);
4780 if (spec->unsol_event)
4781 alc_inithook(codec);
4784 /* check the ADC/MUX contains all input pins; some ADC/MUX contains only
4785 * one of two digital mic pins, e.g. on ALC272
4787 static void fixup_automic_adc(struct hda_codec *codec)
4789 struct alc_spec *spec = codec->spec;
4792 for (i = 0; i < spec->num_adc_nids; i++) {
4793 hda_nid_t cap = spec->capsrc_nids ?
4794 spec->capsrc_nids[i] : spec->adc_nids[i];
4797 iidx = get_connection_index(codec, cap, spec->int_mic.pin);
4800 eidx = get_connection_index(codec, cap, spec->ext_mic.pin);
4803 spec->int_mic.mux_idx = iidx;
4804 spec->ext_mic.mux_idx = eidx;
4805 if (spec->capsrc_nids)
4806 spec->capsrc_nids += i;
4807 spec->adc_nids += i;
4808 spec->num_adc_nids = 1;
4811 snd_printd(KERN_INFO "hda_codec: %s: "
4812 "No ADC/MUX containing both 0x%x and 0x%x pins\n",
4813 codec->chip_name, spec->int_mic.pin, spec->ext_mic.pin);
4814 spec->auto_mic = 0; /* disable auto-mic to be sure */
4817 /* choose the ADC/MUX containing the input pin and initialize the setup */
4818 static void fixup_single_adc(struct hda_codec *codec)
4820 struct alc_spec *spec = codec->spec;
4824 /* search for the input pin; there must be only one */
4825 for (i = 0; i < AUTO_PIN_LAST; i++) {
4826 if (spec->autocfg.input_pins[i]) {
4827 pin = spec->autocfg.input_pins[i];
4834 /* set the default connection to that pin */
4835 for (i = 0; i < spec->num_adc_nids; i++) {
4836 hda_nid_t cap = spec->capsrc_nids ?
4837 spec->capsrc_nids[i] : spec->adc_nids[i];
4840 idx = get_connection_index(codec, cap, pin);
4843 /* use only this ADC */
4844 if (spec->capsrc_nids)
4845 spec->capsrc_nids += i;
4846 spec->adc_nids += i;
4847 spec->num_adc_nids = 1;
4848 /* select or unmute this route */
4849 if (get_wcaps_type(get_wcaps(codec, cap)) == AC_WID_AUD_MIX) {
4850 snd_hda_codec_amp_stereo(codec, cap, HDA_INPUT, idx,
4853 snd_hda_codec_write_cache(codec, cap, 0,
4854 AC_VERB_SET_CONNECT_SEL, idx);
4860 static void set_capture_mixer(struct hda_codec *codec)
4862 struct alc_spec *spec = codec->spec;
4863 static struct snd_kcontrol_new *caps[2][3] = {
4864 { alc_capture_mixer_nosrc1,
4865 alc_capture_mixer_nosrc2,
4866 alc_capture_mixer_nosrc3 },
4867 { alc_capture_mixer1,
4869 alc_capture_mixer3 },
4871 if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) {
4874 fixup_automic_adc(codec);
4875 else if (spec->input_mux) {
4876 if (spec->input_mux->num_items > 1)
4878 else if (spec->input_mux->num_items == 1)
4879 fixup_single_adc(codec);
4881 spec->cap_mixer = caps[mux][spec->num_adc_nids - 1];
4885 #ifdef CONFIG_SND_HDA_INPUT_BEEP
4886 #define set_beep_amp(spec, nid, idx, dir) \
4887 ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir))
4889 #define set_beep_amp(spec, nid, idx, dir) /* NOP */
4893 * OK, here we have finally the patch for ALC880
4896 static int patch_alc880(struct hda_codec *codec)
4898 struct alc_spec *spec;
4902 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
4908 board_config = snd_hda_check_board_config(codec, ALC880_MODEL_LAST,
4911 if (board_config < 0) {
4912 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
4914 board_config = ALC880_AUTO;
4917 if (board_config == ALC880_AUTO) {
4918 /* automatic parse from the BIOS config */
4919 err = alc880_parse_auto_config(codec);
4925 "hda_codec: Cannot set up configuration "
4926 "from BIOS. Using 3-stack mode...\n");
4927 board_config = ALC880_3ST;
4931 err = snd_hda_attach_beep_device(codec, 0x1);
4937 if (board_config != ALC880_AUTO)
4938 setup_preset(codec, &alc880_presets[board_config]);
4940 spec->stream_analog_playback = &alc880_pcm_analog_playback;
4941 spec->stream_analog_capture = &alc880_pcm_analog_capture;
4942 spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
4944 spec->stream_digital_playback = &alc880_pcm_digital_playback;
4945 spec->stream_digital_capture = &alc880_pcm_digital_capture;
4947 if (!spec->adc_nids && spec->input_mux) {
4948 /* check whether NID 0x07 is valid */
4949 unsigned int wcap = get_wcaps(codec, alc880_adc_nids[0]);
4951 wcap = get_wcaps_type(wcap);
4952 if (wcap != AC_WID_AUD_IN) {
4953 spec->adc_nids = alc880_adc_nids_alt;
4954 spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids_alt);
4956 spec->adc_nids = alc880_adc_nids;
4957 spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids);
4960 set_capture_mixer(codec);
4961 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
4963 spec->vmaster_nid = 0x0c;
4965 codec->patch_ops = alc_patch_ops;
4966 if (board_config == ALC880_AUTO)
4967 spec->init_hook = alc880_auto_init;
4968 #ifdef CONFIG_SND_HDA_POWER_SAVE
4969 if (!spec->loopback.amplist)
4970 spec->loopback.amplist = alc880_loopbacks;
4972 codec->proc_widget_hook = print_realtek_coef;
4982 static hda_nid_t alc260_dac_nids[1] = {
4987 static hda_nid_t alc260_adc_nids[1] = {
4992 static hda_nid_t alc260_adc_nids_alt[1] = {
4997 /* NIDs used when simultaneous access to both ADCs makes sense. Note that
4998 * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC.
5000 static hda_nid_t alc260_dual_adc_nids[2] = {
5005 #define ALC260_DIGOUT_NID 0x03
5006 #define ALC260_DIGIN_NID 0x06
5008 static struct hda_input_mux alc260_capture_source = {
5012 { "Front Mic", 0x1 },
5018 /* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack,
5019 * headphone jack and the internal CD lines since these are the only pins at
5020 * which audio can appear. For flexibility, also allow the option of
5021 * recording the mixer output on the second ADC (ADC0 doesn't have a
5022 * connection to the mixer output).
5024 static struct hda_input_mux alc260_fujitsu_capture_sources[2] = {
5028 { "Mic/Line", 0x0 },
5030 { "Headphone", 0x2 },
5036 { "Mic/Line", 0x0 },
5038 { "Headphone", 0x2 },
5045 /* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to
5046 * the Fujitsu S702x, but jacks are marked differently.
5048 static struct hda_input_mux alc260_acer_capture_sources[2] = {
5055 { "Headphone", 0x5 },
5064 { "Headphone", 0x6 },
5070 /* Maxdata Favorit 100XS */
5071 static struct hda_input_mux alc260_favorit100_capture_sources[2] = {
5075 { "Line/Mic", 0x0 },
5082 { "Line/Mic", 0x0 },
5090 * This is just place-holder, so there's something for alc_build_pcms to look
5091 * at when it calculates the maximum number of channels. ALC260 has no mixer
5092 * element which allows changing the channel mode, so the verb list is
5095 static struct hda_channel_mode alc260_modes[1] = {
5100 /* Mixer combinations
5102 * basic: base_output + input + pc_beep + capture
5103 * HP: base_output + input + capture_alt
5104 * HP_3013: hp_3013 + input + capture
5105 * fujitsu: fujitsu + capture
5106 * acer: acer + capture
5109 static struct snd_kcontrol_new alc260_base_output_mixer[] = {
5110 HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5111 HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5112 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5113 HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5114 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5115 HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5119 static struct snd_kcontrol_new alc260_input_mixer[] = {
5120 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5121 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5122 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5123 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5124 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5125 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5126 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x07, 0x01, HDA_INPUT),
5127 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x07, 0x01, HDA_INPUT),
5131 /* update HP, line and mono out pins according to the master switch */
5132 static void alc260_hp_master_update(struct hda_codec *codec,
5133 hda_nid_t hp, hda_nid_t line,
5136 struct alc_spec *spec = codec->spec;
5137 unsigned int val = spec->master_sw ? PIN_HP : 0;
5138 /* change HP and line-out pins */
5139 snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5141 snd_hda_codec_write(codec, line, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5143 /* mono (speaker) depending on the HP jack sense */
5144 val = (val && !spec->jack_present) ? PIN_OUT : 0;
5145 snd_hda_codec_write(codec, mono, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5149 static int alc260_hp_master_sw_get(struct snd_kcontrol *kcontrol,
5150 struct snd_ctl_elem_value *ucontrol)
5152 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5153 struct alc_spec *spec = codec->spec;
5154 *ucontrol->value.integer.value = spec->master_sw;
5158 static int alc260_hp_master_sw_put(struct snd_kcontrol *kcontrol,
5159 struct snd_ctl_elem_value *ucontrol)
5161 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5162 struct alc_spec *spec = codec->spec;
5163 int val = !!*ucontrol->value.integer.value;
5164 hda_nid_t hp, line, mono;
5166 if (val == spec->master_sw)
5168 spec->master_sw = val;
5169 hp = (kcontrol->private_value >> 16) & 0xff;
5170 line = (kcontrol->private_value >> 8) & 0xff;
5171 mono = kcontrol->private_value & 0xff;
5172 alc260_hp_master_update(codec, hp, line, mono);
5176 static struct snd_kcontrol_new alc260_hp_output_mixer[] = {
5178 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5179 .name = "Master Playback Switch",
5180 .info = snd_ctl_boolean_mono_info,
5181 .get = alc260_hp_master_sw_get,
5182 .put = alc260_hp_master_sw_put,
5183 .private_value = (0x0f << 16) | (0x10 << 8) | 0x11
5185 HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5186 HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5187 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5188 HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5189 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5191 HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5195 static struct hda_verb alc260_hp_unsol_verbs[] = {
5196 {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5200 static void alc260_hp_automute(struct hda_codec *codec)
5202 struct alc_spec *spec = codec->spec;
5204 spec->jack_present = snd_hda_jack_detect(codec, 0x10);
5205 alc260_hp_master_update(codec, 0x0f, 0x10, 0x11);
5208 static void alc260_hp_unsol_event(struct hda_codec *codec, unsigned int res)
5210 if ((res >> 26) == ALC880_HP_EVENT)
5211 alc260_hp_automute(codec);
5214 static struct snd_kcontrol_new alc260_hp_3013_mixer[] = {
5216 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5217 .name = "Master Playback Switch",
5218 .info = snd_ctl_boolean_mono_info,
5219 .get = alc260_hp_master_sw_get,
5220 .put = alc260_hp_master_sw_put,
5221 .private_value = (0x15 << 16) | (0x10 << 8) | 0x11
5223 HDA_CODEC_VOLUME("Front Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5224 HDA_CODEC_MUTE("Front Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5225 HDA_CODEC_VOLUME("Aux-In Playback Volume", 0x07, 0x06, HDA_INPUT),
5226 HDA_CODEC_MUTE("Aux-In Playback Switch", 0x07, 0x06, HDA_INPUT),
5227 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5228 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
5229 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5230 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x11, 1, 0x0, HDA_OUTPUT),
5234 static struct hda_bind_ctls alc260_dc7600_bind_master_vol = {
5235 .ops = &snd_hda_bind_vol,
5237 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_OUTPUT),
5238 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT),
5239 HDA_COMPOSE_AMP_VAL(0x0a, 3, 0, HDA_OUTPUT),
5244 static struct hda_bind_ctls alc260_dc7600_bind_switch = {
5245 .ops = &snd_hda_bind_sw,
5247 HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT),
5248 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
5253 static struct snd_kcontrol_new alc260_hp_dc7600_mixer[] = {
5254 HDA_BIND_VOL("Master Playback Volume", &alc260_dc7600_bind_master_vol),
5255 HDA_BIND_SW("LineOut Playback Switch", &alc260_dc7600_bind_switch),
5256 HDA_CODEC_MUTE("Speaker Playback Switch", 0x0f, 0x0, HDA_OUTPUT),
5257 HDA_CODEC_MUTE("Headphone Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5261 static struct hda_verb alc260_hp_3013_unsol_verbs[] = {
5262 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5266 static void alc260_hp_3013_automute(struct hda_codec *codec)
5268 struct alc_spec *spec = codec->spec;
5270 spec->jack_present = snd_hda_jack_detect(codec, 0x15);
5271 alc260_hp_master_update(codec, 0x15, 0x10, 0x11);
5274 static void alc260_hp_3013_unsol_event(struct hda_codec *codec,
5277 if ((res >> 26) == ALC880_HP_EVENT)
5278 alc260_hp_3013_automute(codec);
5281 static void alc260_hp_3012_automute(struct hda_codec *codec)
5283 unsigned int bits = snd_hda_jack_detect(codec, 0x10) ? 0 : PIN_OUT;
5285 snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5287 snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5289 snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5293 static void alc260_hp_3012_unsol_event(struct hda_codec *codec,
5296 if ((res >> 26) == ALC880_HP_EVENT)
5297 alc260_hp_3012_automute(codec);
5300 /* Fujitsu S702x series laptops. ALC260 pin usage: Mic/Line jack = 0x12,
5301 * HP jack = 0x14, CD audio = 0x16, internal speaker = 0x10.
5303 static struct snd_kcontrol_new alc260_fujitsu_mixer[] = {
5304 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5305 HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT),
5306 ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5307 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5308 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5309 HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT),
5310 HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT),
5311 ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN),
5312 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5313 HDA_BIND_MUTE("Speaker Playback Switch", 0x09, 2, HDA_INPUT),
5317 /* Mixer for Acer TravelMate(/Extensa/Aspire) notebooks. Note that current
5318 * versions of the ALC260 don't act on requests to enable mic bias from NID
5319 * 0x0f (used to drive the headphone jack in these laptops). The ALC260
5320 * datasheet doesn't mention this restriction. At this stage it's not clear
5321 * whether this behaviour is intentional or is a hardware bug in chip
5322 * revisions available in early 2006. Therefore for now allow the
5323 * "Headphone Jack Mode" control to span all choices, but if it turns out
5324 * that the lack of mic bias for this NID is intentional we could change the
5325 * mode from ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
5327 * In addition, Acer TravelMate(/Extensa/Aspire) notebooks in early 2006
5328 * don't appear to make the mic bias available from the "line" jack, even
5329 * though the NID used for this jack (0x14) can supply it. The theory is
5330 * that perhaps Acer have included blocking capacitors between the ALC260
5331 * and the output jack. If this turns out to be the case for all such
5332 * models the "Line Jack Mode" mode could be changed from ALC_PIN_DIR_INOUT
5333 * to ALC_PIN_DIR_INOUT_NOMICBIAS.
5335 * The C20x Tablet series have a mono internal speaker which is controlled
5336 * via the chip's Mono sum widget and pin complex, so include the necessary
5337 * controls for such models. On models without a "mono speaker" the control
5338 * won't do anything.
5340 static struct snd_kcontrol_new alc260_acer_mixer[] = {
5341 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5342 HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5343 ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5344 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5346 HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2,
5348 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5349 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5350 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5351 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5352 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5353 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5354 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5355 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5359 /* Maxdata Favorit 100XS: one output and one input (0x12) jack
5361 static struct snd_kcontrol_new alc260_favorit100_mixer[] = {
5362 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5363 HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5364 ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5365 HDA_CODEC_VOLUME("Line/Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5366 HDA_CODEC_MUTE("Line/Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5367 ALC_PIN_MODE("Line/Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5371 /* Packard bell V7900 ALC260 pin usage: HP = 0x0f, Mic jack = 0x12,
5372 * Line In jack = 0x14, CD audio = 0x16, pc beep = 0x17.
5374 static struct snd_kcontrol_new alc260_will_mixer[] = {
5375 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5376 HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5377 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5378 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5379 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5380 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5381 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5382 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5383 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5384 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5388 /* Replacer 672V ALC260 pin usage: Mic jack = 0x12,
5389 * Line In jack = 0x14, ATAPI Mic = 0x13, speaker = 0x0f.
5391 static struct snd_kcontrol_new alc260_replacer_672v_mixer[] = {
5392 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5393 HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5394 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5395 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5396 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5397 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x07, 0x1, HDA_INPUT),
5398 HDA_CODEC_MUTE("ATATI Mic Playback Switch", 0x07, 0x1, HDA_INPUT),
5399 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5400 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5401 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5406 * initialization verbs
5408 static struct hda_verb alc260_init_verbs[] = {
5409 /* Line In pin widget for input */
5410 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5411 /* CD pin widget for input */
5412 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5413 /* Mic1 (rear panel) pin widget for input and vref at 80% */
5414 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5415 /* Mic2 (front panel) pin widget for input and vref at 80% */
5416 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5417 /* LINE-2 is used for line-out in rear */
5418 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5419 /* select line-out */
5420 {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
5422 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5424 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5426 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5427 /* mute capture amp left and right */
5428 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5429 /* set connection select to line in (default select for this ADC) */
5430 {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5431 /* mute capture amp left and right */
5432 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5433 /* set connection select to line in (default select for this ADC) */
5434 {0x05, AC_VERB_SET_CONNECT_SEL, 0x02},
5435 /* set vol=0 Line-Out mixer amp left and right */
5436 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5437 /* unmute pin widget amp left and right (no gain on this amp) */
5438 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5439 /* set vol=0 HP mixer amp left and right */
5440 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5441 /* unmute pin widget amp left and right (no gain on this amp) */
5442 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5443 /* set vol=0 Mono mixer amp left and right */
5444 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5445 /* unmute pin widget amp left and right (no gain on this amp) */
5446 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5447 /* unmute LINE-2 out pin */
5448 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5449 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5452 /* mute analog inputs */
5453 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5454 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5455 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5456 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5457 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5458 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5459 /* mute Front out path */
5460 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5461 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5462 /* mute Headphone out path */
5463 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5464 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5465 /* mute Mono out path */
5466 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5467 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5471 #if 0 /* should be identical with alc260_init_verbs? */
5472 static struct hda_verb alc260_hp_init_verbs[] = {
5473 /* Headphone and output */
5474 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5476 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5477 /* Mic1 (rear panel) pin widget for input and vref at 80% */
5478 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5479 /* Mic2 (front panel) pin widget for input and vref at 80% */
5480 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5481 /* Line In pin widget for input */
5482 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5483 /* Line-2 pin widget for output */
5484 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5485 /* CD pin widget for input */
5486 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5487 /* unmute amp left and right */
5488 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5489 /* set connection select to line in (default select for this ADC) */
5490 {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5491 /* unmute Line-Out mixer amp left and right (volume = 0) */
5492 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5493 /* mute pin widget amp left and right (no gain on this amp) */
5494 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5495 /* unmute HP mixer amp left and right (volume = 0) */
5496 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5497 /* mute pin widget amp left and right (no gain on this amp) */
5498 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5499 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5502 /* mute analog inputs */
5503 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5504 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5505 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5506 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5507 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5508 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5509 /* Unmute Front out path */
5510 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5511 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5512 /* Unmute Headphone out path */
5513 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5514 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5515 /* Unmute Mono out path */
5516 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5517 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5522 static struct hda_verb alc260_hp_3013_init_verbs[] = {
5523 /* Line out and output */
5524 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5526 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5527 /* Mic1 (rear panel) pin widget for input and vref at 80% */
5528 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5529 /* Mic2 (front panel) pin widget for input and vref at 80% */
5530 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5531 /* Line In pin widget for input */
5532 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5533 /* Headphone pin widget for output */
5534 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5535 /* CD pin widget for input */
5536 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5537 /* unmute amp left and right */
5538 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5539 /* set connection select to line in (default select for this ADC) */
5540 {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5541 /* unmute Line-Out mixer amp left and right (volume = 0) */
5542 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5543 /* mute pin widget amp left and right (no gain on this amp) */
5544 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5545 /* unmute HP mixer amp left and right (volume = 0) */
5546 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5547 /* mute pin widget amp left and right (no gain on this amp) */
5548 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5549 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5552 /* mute analog inputs */
5553 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5554 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5555 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5556 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5557 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5558 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5559 /* Unmute Front out path */
5560 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5561 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5562 /* Unmute Headphone out path */
5563 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5564 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5565 /* Unmute Mono out path */
5566 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5567 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5571 /* Initialisation sequence for ALC260 as configured in Fujitsu S702x
5572 * laptops. ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD
5573 * audio = 0x16, internal speaker = 0x10.
5575 static struct hda_verb alc260_fujitsu_init_verbs[] = {
5576 /* Disable all GPIOs */
5577 {0x01, AC_VERB_SET_GPIO_MASK, 0},
5578 /* Internal speaker is connected to headphone pin */
5579 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5580 /* Headphone/Line-out jack connects to Line1 pin; make it an output */
5581 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5582 /* Mic/Line-in jack is connected to mic1 pin, so make it an input */
5583 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5584 /* Ensure all other unused pins are disabled and muted. */
5585 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5586 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5587 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5588 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5589 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5590 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5591 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5592 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5594 /* Disable digital (SPDIF) pins */
5595 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5596 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5598 /* Ensure Line1 pin widget takes its input from the OUT1 sum bus
5599 * when acting as an output.
5601 {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5603 /* Start with output sum widgets muted and their output gains at min */
5604 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5605 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5606 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5607 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5608 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5609 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5610 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5611 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5612 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5614 /* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */
5615 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5616 /* Unmute Line1 pin widget output buffer since it starts as an output.
5617 * If the pin mode is changed by the user the pin mode control will
5618 * take care of enabling the pin's input/output buffers as needed.
5619 * Therefore there's no need to enable the input buffer at this
5622 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5623 /* Unmute input buffer of pin widget used for Line-in (no equiv
5626 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5628 /* Mute capture amp left and right */
5629 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5630 /* Set ADC connection select to match default mixer setting - line
5633 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5635 /* Do the same for the second ADC: mute capture input amp and
5636 * set ADC connection to line in (on mic1 pin)
5638 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5639 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5641 /* Mute all inputs to mixer widget (even unconnected ones) */
5642 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5643 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5644 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5645 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5646 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5647 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5648 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5649 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5654 /* Initialisation sequence for ALC260 as configured in Acer TravelMate and
5655 * similar laptops (adapted from Fujitsu init verbs).
5657 static struct hda_verb alc260_acer_init_verbs[] = {
5658 /* On TravelMate laptops, GPIO 0 enables the internal speaker and
5659 * the headphone jack. Turn this on and rely on the standard mute
5660 * methods whenever the user wants to turn these outputs off.
5662 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5663 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5664 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5665 /* Internal speaker/Headphone jack is connected to Line-out pin */
5666 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5667 /* Internal microphone/Mic jack is connected to Mic1 pin */
5668 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
5669 /* Line In jack is connected to Line1 pin */
5670 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5671 /* Some Acers (eg: C20x Tablets) use Mono pin for internal speaker */
5672 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5673 /* Ensure all other unused pins are disabled and muted. */
5674 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5675 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5676 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5677 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5678 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5679 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5680 /* Disable digital (SPDIF) pins */
5681 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5682 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5684 /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
5685 * bus when acting as outputs.
5687 {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5688 {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5690 /* Start with output sum widgets muted and their output gains at min */
5691 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5692 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5693 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5694 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5695 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5696 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5697 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5698 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5699 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5701 /* Unmute Line-out pin widget amp left and right
5702 * (no equiv mixer ctrl)
5704 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5705 /* Unmute mono pin widget amp output (no equiv mixer ctrl) */
5706 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5707 /* Unmute Mic1 and Line1 pin widget input buffers since they start as
5708 * inputs. If the pin mode is changed by the user the pin mode control
5709 * will take care of enabling the pin's input/output buffers as needed.
5710 * Therefore there's no need to enable the input buffer at this
5713 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5714 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5716 /* Mute capture amp left and right */
5717 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5718 /* Set ADC connection select to match default mixer setting - mic
5721 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5723 /* Do similar with the second ADC: mute capture input amp and
5724 * set ADC connection to mic to match ALSA's default state.
5726 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5727 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5729 /* Mute all inputs to mixer widget (even unconnected ones) */
5730 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5731 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5732 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5733 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5734 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5735 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5736 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5737 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5742 /* Initialisation sequence for Maxdata Favorit 100XS
5743 * (adapted from Acer init verbs).
5745 static struct hda_verb alc260_favorit100_init_verbs[] = {
5746 /* GPIO 0 enables the output jack.
5747 * Turn this on and rely on the standard mute
5748 * methods whenever the user wants to turn these outputs off.
5750 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5751 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5752 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
5753 /* Line/Mic input jack is connected to Mic1 pin */
5754 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
5755 /* Ensure all other unused pins are disabled and muted. */
5756 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5757 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5758 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5759 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5760 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5761 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5762 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5763 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5764 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5765 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5766 /* Disable digital (SPDIF) pins */
5767 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
5768 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
5770 /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
5771 * bus when acting as outputs.
5773 {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
5774 {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
5776 /* Start with output sum widgets muted and their output gains at min */
5777 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5778 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5779 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5780 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5781 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5782 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5783 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5784 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5785 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5787 /* Unmute Line-out pin widget amp left and right
5788 * (no equiv mixer ctrl)
5790 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5791 /* Unmute Mic1 and Line1 pin widget input buffers since they start as
5792 * inputs. If the pin mode is changed by the user the pin mode control
5793 * will take care of enabling the pin's input/output buffers as needed.
5794 * Therefore there's no need to enable the input buffer at this
5797 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5799 /* Mute capture amp left and right */
5800 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5801 /* Set ADC connection select to match default mixer setting - mic
5804 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
5806 /* Do similar with the second ADC: mute capture input amp and
5807 * set ADC connection to mic to match ALSA's default state.
5809 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5810 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
5812 /* Mute all inputs to mixer widget (even unconnected ones) */
5813 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
5814 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
5815 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
5816 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
5817 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
5818 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
5819 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
5820 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
5825 static struct hda_verb alc260_will_verbs[] = {
5826 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5827 {0x0b, AC_VERB_SET_CONNECT_SEL, 0x00},
5828 {0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
5829 {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
5830 {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
5831 {0x1a, AC_VERB_SET_PROC_COEF, 0x3040},
5835 static struct hda_verb alc260_replacer_672v_verbs[] = {
5836 {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
5837 {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
5838 {0x1a, AC_VERB_SET_PROC_COEF, 0x3050},
5840 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
5841 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
5842 {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
5844 {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5848 /* toggle speaker-output according to the hp-jack state */
5849 static void alc260_replacer_672v_automute(struct hda_codec *codec)
5851 unsigned int present;
5853 /* speaker --> GPIO Data 0, hp or spdif --> GPIO data 1 */
5854 present = snd_hda_jack_detect(codec, 0x0f);
5856 snd_hda_codec_write_cache(codec, 0x01, 0,
5857 AC_VERB_SET_GPIO_DATA, 1);
5858 snd_hda_codec_write_cache(codec, 0x0f, 0,
5859 AC_VERB_SET_PIN_WIDGET_CONTROL,
5862 snd_hda_codec_write_cache(codec, 0x01, 0,
5863 AC_VERB_SET_GPIO_DATA, 0);
5864 snd_hda_codec_write_cache(codec, 0x0f, 0,
5865 AC_VERB_SET_PIN_WIDGET_CONTROL,
5870 static void alc260_replacer_672v_unsol_event(struct hda_codec *codec,
5873 if ((res >> 26) == ALC880_HP_EVENT)
5874 alc260_replacer_672v_automute(codec);
5877 static struct hda_verb alc260_hp_dc7600_verbs[] = {
5878 {0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
5879 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
5880 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5881 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5882 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5883 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5884 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5885 {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5886 {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5887 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5891 /* Test configuration for debugging, modelled after the ALC880 test
5894 #ifdef CONFIG_SND_DEBUG
5895 static hda_nid_t alc260_test_dac_nids[1] = {
5898 static hda_nid_t alc260_test_adc_nids[2] = {
5901 /* For testing the ALC260, each input MUX needs its own definition since
5902 * the signal assignments are different. This assumes that the first ADC
5905 static struct hda_input_mux alc260_test_capture_sources[2] = {
5909 { "MIC1 pin", 0x0 },
5910 { "MIC2 pin", 0x1 },
5911 { "LINE1 pin", 0x2 },
5912 { "LINE2 pin", 0x3 },
5914 { "LINE-OUT pin", 0x5 },
5915 { "HP-OUT pin", 0x6 },
5921 { "MIC1 pin", 0x0 },
5922 { "MIC2 pin", 0x1 },
5923 { "LINE1 pin", 0x2 },
5924 { "LINE2 pin", 0x3 },
5927 { "LINE-OUT pin", 0x6 },
5928 { "HP-OUT pin", 0x7 },
5932 static struct snd_kcontrol_new alc260_test_mixer[] = {
5933 /* Output driver widgets */
5934 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5935 HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5936 HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5937 HDA_BIND_MUTE("LOUT2 Playback Switch", 0x09, 2, HDA_INPUT),
5938 HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5939 HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT),
5941 /* Modes for retasking pin widgets
5942 * Note: the ALC260 doesn't seem to act on requests to enable mic
5943 * bias from NIDs 0x0f and 0x10. The ALC260 datasheet doesn't
5944 * mention this restriction. At this stage it's not clear whether
5945 * this behaviour is intentional or is a hardware bug in chip
5946 * revisions available at least up until early 2006. Therefore for
5947 * now allow the "HP-OUT" and "LINE-OUT" Mode controls to span all
5948 * choices, but if it turns out that the lack of mic bias for these
5949 * NIDs is intentional we could change their modes from
5950 * ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
5952 ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT),
5953 ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT),
5954 ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT),
5955 ALC_PIN_MODE("LINE1 pin mode", 0x14, ALC_PIN_DIR_INOUT),
5956 ALC_PIN_MODE("MIC2 pin mode", 0x13, ALC_PIN_DIR_INOUT),
5957 ALC_PIN_MODE("MIC1 pin mode", 0x12, ALC_PIN_DIR_INOUT),
5959 /* Loopback mixer controls */
5960 HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x07, 0x00, HDA_INPUT),
5961 HDA_CODEC_MUTE("MIC1 Playback Switch", 0x07, 0x00, HDA_INPUT),
5962 HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x07, 0x01, HDA_INPUT),
5963 HDA_CODEC_MUTE("MIC2 Playback Switch", 0x07, 0x01, HDA_INPUT),
5964 HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x07, 0x02, HDA_INPUT),
5965 HDA_CODEC_MUTE("LINE1 Playback Switch", 0x07, 0x02, HDA_INPUT),
5966 HDA_CODEC_VOLUME("LINE2 Playback Volume", 0x07, 0x03, HDA_INPUT),
5967 HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT),
5968 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5969 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5970 HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT),
5971 HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT),
5972 HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT),
5973 HDA_CODEC_MUTE("HP-OUT loopback Playback Switch", 0x07, 0x7, HDA_INPUT),
5975 /* Controls for GPIO pins, assuming they are configured as outputs */
5976 ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
5977 ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
5978 ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
5979 ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
5981 /* Switches to allow the digital IO pins to be enabled. The datasheet
5982 * is ambigious as to which NID is which; testing on laptops which
5983 * make this output available should provide clarification.
5985 ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x03, 0x01),
5986 ALC_SPDIF_CTRL_SWITCH("SPDIF Capture Switch", 0x06, 0x01),
5988 /* A switch allowing EAPD to be enabled. Some laptops seem to use
5989 * this output to turn on an external amplifier.
5991 ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
5992 ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
5996 static struct hda_verb alc260_test_init_verbs[] = {
5997 /* Enable all GPIOs as outputs with an initial value of 0 */
5998 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f},
5999 {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
6000 {0x01, AC_VERB_SET_GPIO_MASK, 0x0f},
6002 /* Enable retasking pins as output, initially without power amp */
6003 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6004 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6005 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6006 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6007 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6008 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6010 /* Disable digital (SPDIF) pins initially, but users can enable
6011 * them via a mixer switch. In the case of SPDIF-out, this initverb
6012 * payload also sets the generation to 0, output to be in "consumer"
6013 * PCM format, copyright asserted, no pre-emphasis and no validity
6016 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6017 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6019 /* Ensure mic1, mic2, line1 and line2 pin widgets take input from the
6020 * OUT1 sum bus when acting as an output.
6022 {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6023 {0x0c, AC_VERB_SET_CONNECT_SEL, 0},
6024 {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6025 {0x0e, AC_VERB_SET_CONNECT_SEL, 0},
6027 /* Start with output sum widgets muted and their output gains at min */
6028 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6029 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6030 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6031 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6032 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6033 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6034 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6035 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6036 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6038 /* Unmute retasking pin widget output buffers since the default
6039 * state appears to be output. As the pin mode is changed by the
6040 * user the pin mode control will take care of enabling the pin's
6041 * input/output buffers as needed.
6043 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6044 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6045 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6046 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6047 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6048 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6049 /* Also unmute the mono-out pin widget */
6050 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6052 /* Mute capture amp left and right */
6053 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6054 /* Set ADC connection select to match default mixer setting (mic1
6057 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6059 /* Do the same for the second ADC: mute capture input amp and
6060 * set ADC connection to mic1 pin
6062 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6063 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6065 /* Mute all inputs to mixer widget (even unconnected ones) */
6066 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6067 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6068 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6069 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6070 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6071 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6072 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6073 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6079 #define alc260_pcm_analog_playback alc880_pcm_analog_alt_playback
6080 #define alc260_pcm_analog_capture alc880_pcm_analog_capture
6082 #define alc260_pcm_digital_playback alc880_pcm_digital_playback
6083 #define alc260_pcm_digital_capture alc880_pcm_digital_capture
6086 * for BIOS auto-configuration
6089 static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid,
6090 const char *pfx, int *vol_bits)
6093 unsigned long vol_val, sw_val;
6096 if (nid >= 0x0f && nid < 0x11) {
6097 nid_vol = nid - 0x7;
6098 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6099 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6100 } else if (nid == 0x11) {
6101 nid_vol = nid - 0x7;
6102 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, HDA_OUTPUT);
6103 sw_val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
6104 } else if (nid >= 0x12 && nid <= 0x15) {
6106 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6107 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6111 if (!(*vol_bits & (1 << nid_vol))) {
6112 /* first control for the volume widget */
6113 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, vol_val);
6116 *vol_bits |= (1 << nid_vol);
6118 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, sw_val);
6124 /* add playback controls from the parsed DAC table */
6125 static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec,
6126 const struct auto_pin_cfg *cfg)
6132 spec->multiout.num_dacs = 1;
6133 spec->multiout.dac_nids = spec->private_dac_nids;
6134 spec->multiout.dac_nids[0] = 0x02;
6136 nid = cfg->line_out_pins[0];
6139 if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
6141 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
6145 err = alc260_add_playback_controls(spec, nid, pfx, &vols);
6150 nid = cfg->speaker_pins[0];
6152 err = alc260_add_playback_controls(spec, nid, "Speaker", &vols);
6157 nid = cfg->hp_pins[0];
6159 err = alc260_add_playback_controls(spec, nid, "Headphone",
6167 /* create playback/capture controls for input pins */
6168 static int alc260_auto_create_input_ctls(struct hda_codec *codec,
6169 const struct auto_pin_cfg *cfg)
6171 return alc_auto_create_input_ctls(codec, cfg, 0x07, 0x04, 0x05);
6174 static void alc260_auto_set_output_and_unmute(struct hda_codec *codec,
6175 hda_nid_t nid, int pin_type,
6178 alc_set_pin_output(codec, nid, pin_type);
6179 /* need the manual connection? */
6181 int idx = nid - 0x12;
6182 snd_hda_codec_write(codec, idx + 0x0b, 0,
6183 AC_VERB_SET_CONNECT_SEL, sel_idx);
6187 static void alc260_auto_init_multi_out(struct hda_codec *codec)
6189 struct alc_spec *spec = codec->spec;
6192 nid = spec->autocfg.line_out_pins[0];
6194 int pin_type = get_pin_type(spec->autocfg.line_out_type);
6195 alc260_auto_set_output_and_unmute(codec, nid, pin_type, 0);
6198 nid = spec->autocfg.speaker_pins[0];
6200 alc260_auto_set_output_and_unmute(codec, nid, PIN_OUT, 0);
6202 nid = spec->autocfg.hp_pins[0];
6204 alc260_auto_set_output_and_unmute(codec, nid, PIN_HP, 0);
6207 #define ALC260_PIN_CD_NID 0x16
6208 static void alc260_auto_init_analog_input(struct hda_codec *codec)
6210 struct alc_spec *spec = codec->spec;
6213 for (i = 0; i < AUTO_PIN_LAST; i++) {
6214 hda_nid_t nid = spec->autocfg.input_pins[i];
6216 alc_set_input_pin(codec, nid, i);
6217 if (nid != ALC260_PIN_CD_NID &&
6218 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
6219 snd_hda_codec_write(codec, nid, 0,
6220 AC_VERB_SET_AMP_GAIN_MUTE,
6227 * generic initialization of ADC, input mixers and output mixers
6229 static struct hda_verb alc260_volume_init_verbs[] = {
6231 * Unmute ADC0-1 and set the default input to mic-in
6233 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6234 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6235 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6236 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6238 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
6240 * Note: PASD motherboards uses the Line In 2 as the input for
6241 * front panel mic (mic 2)
6243 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
6244 /* mute analog inputs */
6245 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6246 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6247 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
6248 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
6249 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
6252 * Set up output mixers (0x08 - 0x0a)
6254 /* set vol=0 to output mixers */
6255 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6256 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6257 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6258 /* set up input amps for analog loopback */
6259 /* Amp Indices: DAC = 0, mixer = 1 */
6260 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6261 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6262 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6263 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6264 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6265 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6270 static int alc260_parse_auto_config(struct hda_codec *codec)
6272 struct alc_spec *spec = codec->spec;
6274 static hda_nid_t alc260_ignore[] = { 0x17, 0 };
6276 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
6280 err = alc260_auto_create_multi_out_ctls(spec, &spec->autocfg);
6283 if (!spec->kctls.list)
6284 return 0; /* can't find valid BIOS pin config */
6285 err = alc260_auto_create_input_ctls(codec, &spec->autocfg);
6289 spec->multiout.max_channels = 2;
6291 if (spec->autocfg.dig_outs)
6292 spec->multiout.dig_out_nid = ALC260_DIGOUT_NID;
6293 if (spec->kctls.list)
6294 add_mixer(spec, spec->kctls.list);
6296 add_verb(spec, alc260_volume_init_verbs);
6298 spec->num_mux_defs = 1;
6299 spec->input_mux = &spec->private_imux[0];
6301 alc_ssid_check(codec, 0x10, 0x15, 0x0f);
6306 /* additional initialization for auto-configuration model */
6307 static void alc260_auto_init(struct hda_codec *codec)
6309 struct alc_spec *spec = codec->spec;
6310 alc260_auto_init_multi_out(codec);
6311 alc260_auto_init_analog_input(codec);
6312 if (spec->unsol_event)
6313 alc_inithook(codec);
6316 #ifdef CONFIG_SND_HDA_POWER_SAVE
6317 static struct hda_amp_list alc260_loopbacks[] = {
6318 { 0x07, HDA_INPUT, 0 },
6319 { 0x07, HDA_INPUT, 1 },
6320 { 0x07, HDA_INPUT, 2 },
6321 { 0x07, HDA_INPUT, 3 },
6322 { 0x07, HDA_INPUT, 4 },
6328 * ALC260 configurations
6330 static const char *alc260_models[ALC260_MODEL_LAST] = {
6331 [ALC260_BASIC] = "basic",
6333 [ALC260_HP_3013] = "hp-3013",
6334 [ALC260_HP_DC7600] = "hp-dc7600",
6335 [ALC260_FUJITSU_S702X] = "fujitsu",
6336 [ALC260_ACER] = "acer",
6337 [ALC260_WILL] = "will",
6338 [ALC260_REPLACER_672V] = "replacer",
6339 [ALC260_FAVORIT100] = "favorit100",
6340 #ifdef CONFIG_SND_DEBUG
6341 [ALC260_TEST] = "test",
6343 [ALC260_AUTO] = "auto",
6346 static struct snd_pci_quirk alc260_cfg_tbl[] = {
6347 SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER),
6348 SND_PCI_QUIRK(0x1025, 0x007f, "Acer", ALC260_WILL),
6349 SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER),
6350 SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FAVORIT100),
6351 SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013),
6352 SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_AUTO), /* no quirk */
6353 SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013),
6354 SND_PCI_QUIRK(0x103c, 0x3011, "HP", ALC260_HP_3013),
6355 SND_PCI_QUIRK(0x103c, 0x3012, "HP", ALC260_HP_DC7600),
6356 SND_PCI_QUIRK(0x103c, 0x3013, "HP", ALC260_HP_3013),
6357 SND_PCI_QUIRK(0x103c, 0x3014, "HP", ALC260_HP),
6358 SND_PCI_QUIRK(0x103c, 0x3015, "HP", ALC260_HP),
6359 SND_PCI_QUIRK(0x103c, 0x3016, "HP", ALC260_HP),
6360 SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_BASIC),
6361 SND_PCI_QUIRK(0x104d, 0x81cc, "Sony VAIO", ALC260_BASIC),
6362 SND_PCI_QUIRK(0x104d, 0x81cd, "Sony VAIO", ALC260_BASIC),
6363 SND_PCI_QUIRK(0x10cf, 0x1326, "Fujitsu S702X", ALC260_FUJITSU_S702X),
6364 SND_PCI_QUIRK(0x152d, 0x0729, "CTL U553W", ALC260_BASIC),
6365 SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_REPLACER_672V),
6366 SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_WILL),
6370 static struct alc_config_preset alc260_presets[] = {
6372 .mixers = { alc260_base_output_mixer,
6373 alc260_input_mixer },
6374 .init_verbs = { alc260_init_verbs },
6375 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6376 .dac_nids = alc260_dac_nids,
6377 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6378 .adc_nids = alc260_adc_nids,
6379 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6380 .channel_mode = alc260_modes,
6381 .input_mux = &alc260_capture_source,
6384 .mixers = { alc260_hp_output_mixer,
6385 alc260_input_mixer },
6386 .init_verbs = { alc260_init_verbs,
6387 alc260_hp_unsol_verbs },
6388 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6389 .dac_nids = alc260_dac_nids,
6390 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6391 .adc_nids = alc260_adc_nids_alt,
6392 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6393 .channel_mode = alc260_modes,
6394 .input_mux = &alc260_capture_source,
6395 .unsol_event = alc260_hp_unsol_event,
6396 .init_hook = alc260_hp_automute,
6398 [ALC260_HP_DC7600] = {
6399 .mixers = { alc260_hp_dc7600_mixer,
6400 alc260_input_mixer },
6401 .init_verbs = { alc260_init_verbs,
6402 alc260_hp_dc7600_verbs },
6403 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6404 .dac_nids = alc260_dac_nids,
6405 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6406 .adc_nids = alc260_adc_nids_alt,
6407 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6408 .channel_mode = alc260_modes,
6409 .input_mux = &alc260_capture_source,
6410 .unsol_event = alc260_hp_3012_unsol_event,
6411 .init_hook = alc260_hp_3012_automute,
6413 [ALC260_HP_3013] = {
6414 .mixers = { alc260_hp_3013_mixer,
6415 alc260_input_mixer },
6416 .init_verbs = { alc260_hp_3013_init_verbs,
6417 alc260_hp_3013_unsol_verbs },
6418 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6419 .dac_nids = alc260_dac_nids,
6420 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6421 .adc_nids = alc260_adc_nids_alt,
6422 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6423 .channel_mode = alc260_modes,
6424 .input_mux = &alc260_capture_source,
6425 .unsol_event = alc260_hp_3013_unsol_event,
6426 .init_hook = alc260_hp_3013_automute,
6428 [ALC260_FUJITSU_S702X] = {
6429 .mixers = { alc260_fujitsu_mixer },
6430 .init_verbs = { alc260_fujitsu_init_verbs },
6431 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6432 .dac_nids = alc260_dac_nids,
6433 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6434 .adc_nids = alc260_dual_adc_nids,
6435 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6436 .channel_mode = alc260_modes,
6437 .num_mux_defs = ARRAY_SIZE(alc260_fujitsu_capture_sources),
6438 .input_mux = alc260_fujitsu_capture_sources,
6441 .mixers = { alc260_acer_mixer },
6442 .init_verbs = { alc260_acer_init_verbs },
6443 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6444 .dac_nids = alc260_dac_nids,
6445 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6446 .adc_nids = alc260_dual_adc_nids,
6447 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6448 .channel_mode = alc260_modes,
6449 .num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources),
6450 .input_mux = alc260_acer_capture_sources,
6452 [ALC260_FAVORIT100] = {
6453 .mixers = { alc260_favorit100_mixer },
6454 .init_verbs = { alc260_favorit100_init_verbs },
6455 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6456 .dac_nids = alc260_dac_nids,
6457 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6458 .adc_nids = alc260_dual_adc_nids,
6459 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6460 .channel_mode = alc260_modes,
6461 .num_mux_defs = ARRAY_SIZE(alc260_favorit100_capture_sources),
6462 .input_mux = alc260_favorit100_capture_sources,
6465 .mixers = { alc260_will_mixer },
6466 .init_verbs = { alc260_init_verbs, alc260_will_verbs },
6467 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6468 .dac_nids = alc260_dac_nids,
6469 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6470 .adc_nids = alc260_adc_nids,
6471 .dig_out_nid = ALC260_DIGOUT_NID,
6472 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6473 .channel_mode = alc260_modes,
6474 .input_mux = &alc260_capture_source,
6476 [ALC260_REPLACER_672V] = {
6477 .mixers = { alc260_replacer_672v_mixer },
6478 .init_verbs = { alc260_init_verbs, alc260_replacer_672v_verbs },
6479 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6480 .dac_nids = alc260_dac_nids,
6481 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6482 .adc_nids = alc260_adc_nids,
6483 .dig_out_nid = ALC260_DIGOUT_NID,
6484 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6485 .channel_mode = alc260_modes,
6486 .input_mux = &alc260_capture_source,
6487 .unsol_event = alc260_replacer_672v_unsol_event,
6488 .init_hook = alc260_replacer_672v_automute,
6490 #ifdef CONFIG_SND_DEBUG
6492 .mixers = { alc260_test_mixer },
6493 .init_verbs = { alc260_test_init_verbs },
6494 .num_dacs = ARRAY_SIZE(alc260_test_dac_nids),
6495 .dac_nids = alc260_test_dac_nids,
6496 .num_adc_nids = ARRAY_SIZE(alc260_test_adc_nids),
6497 .adc_nids = alc260_test_adc_nids,
6498 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6499 .channel_mode = alc260_modes,
6500 .num_mux_defs = ARRAY_SIZE(alc260_test_capture_sources),
6501 .input_mux = alc260_test_capture_sources,
6506 static int patch_alc260(struct hda_codec *codec)
6508 struct alc_spec *spec;
6509 int err, board_config;
6511 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
6517 board_config = snd_hda_check_board_config(codec, ALC260_MODEL_LAST,
6520 if (board_config < 0) {
6521 snd_printd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
6523 board_config = ALC260_AUTO;
6526 if (board_config == ALC260_AUTO) {
6527 /* automatic parse from the BIOS config */
6528 err = alc260_parse_auto_config(codec);
6534 "hda_codec: Cannot set up configuration "
6535 "from BIOS. Using base mode...\n");
6536 board_config = ALC260_BASIC;
6540 err = snd_hda_attach_beep_device(codec, 0x1);
6546 if (board_config != ALC260_AUTO)
6547 setup_preset(codec, &alc260_presets[board_config]);
6549 spec->stream_analog_playback = &alc260_pcm_analog_playback;
6550 spec->stream_analog_capture = &alc260_pcm_analog_capture;
6552 spec->stream_digital_playback = &alc260_pcm_digital_playback;
6553 spec->stream_digital_capture = &alc260_pcm_digital_capture;
6555 if (!spec->adc_nids && spec->input_mux) {
6556 /* check whether NID 0x04 is valid */
6557 unsigned int wcap = get_wcaps(codec, 0x04);
6558 wcap = get_wcaps_type(wcap);
6560 if (wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
6561 spec->adc_nids = alc260_adc_nids_alt;
6562 spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt);
6564 spec->adc_nids = alc260_adc_nids;
6565 spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids);
6568 set_capture_mixer(codec);
6569 set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
6571 spec->vmaster_nid = 0x08;
6573 codec->patch_ops = alc_patch_ops;
6574 if (board_config == ALC260_AUTO)
6575 spec->init_hook = alc260_auto_init;
6576 #ifdef CONFIG_SND_HDA_POWER_SAVE
6577 if (!spec->loopback.amplist)
6578 spec->loopback.amplist = alc260_loopbacks;
6580 codec->proc_widget_hook = print_realtek_coef;
6587 * ALC882/883/885/888/889 support
6589 * ALC882 is almost identical with ALC880 but has cleaner and more flexible
6590 * configuration. Each pin widget can choose any input DACs and a mixer.
6591 * Each ADC is connected from a mixer of all inputs. This makes possible
6592 * 6-channel independent captures.
6594 * In addition, an independent DAC for the multi-playback (not used in this
6597 #define ALC882_DIGOUT_NID 0x06
6598 #define ALC882_DIGIN_NID 0x0a
6599 #define ALC883_DIGOUT_NID ALC882_DIGOUT_NID
6600 #define ALC883_DIGIN_NID ALC882_DIGIN_NID
6601 #define ALC1200_DIGOUT_NID 0x10
6604 static struct hda_channel_mode alc882_ch_modes[1] = {
6609 static hda_nid_t alc882_dac_nids[4] = {
6610 /* front, rear, clfe, rear_surr */
6611 0x02, 0x03, 0x04, 0x05
6613 #define alc883_dac_nids alc882_dac_nids
6616 #define alc882_adc_nids alc880_adc_nids
6617 #define alc882_adc_nids_alt alc880_adc_nids_alt
6618 #define alc883_adc_nids alc882_adc_nids_alt
6619 static hda_nid_t alc883_adc_nids_alt[1] = { 0x08 };
6620 static hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 };
6621 #define alc889_adc_nids alc880_adc_nids
6623 static hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 };
6624 static hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 };
6625 #define alc883_capsrc_nids alc882_capsrc_nids_alt
6626 static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 };
6627 #define alc889_capsrc_nids alc882_capsrc_nids
6630 /* FIXME: should be a matrix-type input source selection */
6632 static struct hda_input_mux alc882_capture_source = {
6636 { "Front Mic", 0x1 },
6642 #define alc883_capture_source alc882_capture_source
6644 static struct hda_input_mux alc889_capture_source = {
6647 { "Front Mic", 0x0 },
6653 static struct hda_input_mux mb5_capture_source = {
6662 static struct hda_input_mux alc883_3stack_6ch_intel = {
6666 { "Front Mic", 0x0 },
6672 static struct hda_input_mux alc883_lenovo_101e_capture_source = {
6680 static struct hda_input_mux alc883_lenovo_nb0763_capture_source = {
6690 static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = {
6698 static struct hda_input_mux alc883_lenovo_sky_capture_source = {
6702 { "Front Mic", 0x1 },
6707 static struct hda_input_mux alc883_asus_eee1601_capture_source = {
6715 static struct hda_input_mux alc889A_mb31_capture_source = {
6719 /* Front Mic (0x01) unused */
6721 /* Line 2 (0x03) unused */
6722 /* CD (0x04) unused? */
6729 static struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
6736 static struct hda_verb alc882_3ST_ch2_init[] = {
6737 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6738 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6739 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6740 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6747 static struct hda_verb alc882_3ST_ch4_init[] = {
6748 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6749 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6750 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6751 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6752 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6759 static struct hda_verb alc882_3ST_ch6_init[] = {
6760 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6761 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6762 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6763 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6764 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6765 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6769 static struct hda_channel_mode alc882_3ST_6ch_modes[3] = {
6770 { 2, alc882_3ST_ch2_init },
6771 { 4, alc882_3ST_ch4_init },
6772 { 6, alc882_3ST_ch6_init },
6775 #define alc883_3ST_6ch_modes alc882_3ST_6ch_modes
6780 static struct hda_verb alc883_3ST_ch2_clevo_init[] = {
6781 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
6782 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6783 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6784 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6785 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6792 static struct hda_verb alc883_3ST_ch4_clevo_init[] = {
6793 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6794 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6795 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6796 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6797 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6798 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6805 static struct hda_verb alc883_3ST_ch6_clevo_init[] = {
6806 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6807 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6808 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6809 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6810 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6811 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6812 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6816 static struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = {
6817 { 2, alc883_3ST_ch2_clevo_init },
6818 { 4, alc883_3ST_ch4_clevo_init },
6819 { 6, alc883_3ST_ch6_clevo_init },
6826 static struct hda_verb alc882_sixstack_ch6_init[] = {
6827 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
6828 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6829 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6830 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6837 static struct hda_verb alc882_sixstack_ch8_init[] = {
6838 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6839 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6840 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6841 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6845 static struct hda_channel_mode alc882_sixstack_modes[2] = {
6846 { 6, alc882_sixstack_ch6_init },
6847 { 8, alc882_sixstack_ch8_init },
6851 * macbook pro ALC885 can switch LineIn to LineOut without losing Mic
6857 static struct hda_verb alc885_mbp_ch2_init[] = {
6858 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6859 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6860 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6867 static struct hda_verb alc885_mbp_ch4_init[] = {
6868 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6869 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6870 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6871 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6872 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6876 static struct hda_channel_mode alc885_mbp_4ch_modes[2] = {
6877 { 2, alc885_mbp_ch2_init },
6878 { 4, alc885_mbp_ch4_init },
6883 * Speakers/Woofer/HP = Front
6886 static struct hda_verb alc885_mb5_ch2_init[] = {
6887 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
6888 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
6894 * Speakers/HP = Front
6898 static struct hda_verb alc885_mb5_ch6_init[] = {
6899 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6900 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6901 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
6905 static struct hda_channel_mode alc885_mb5_6ch_modes[2] = {
6906 { 2, alc885_mb5_ch2_init },
6907 { 6, alc885_mb5_ch6_init },
6914 static struct hda_verb alc883_4ST_ch2_init[] = {
6915 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6916 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6917 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6918 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6919 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6920 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6927 static struct hda_verb alc883_4ST_ch4_init[] = {
6928 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6929 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6930 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6931 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6932 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6933 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6934 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6941 static struct hda_verb alc883_4ST_ch6_init[] = {
6942 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6943 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6944 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6945 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6946 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6947 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6948 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6949 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6956 static struct hda_verb alc883_4ST_ch8_init[] = {
6957 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6958 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6959 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
6960 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6961 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6962 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
6963 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6964 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6965 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
6969 static struct hda_channel_mode alc883_4ST_8ch_modes[4] = {
6970 { 2, alc883_4ST_ch2_init },
6971 { 4, alc883_4ST_ch4_init },
6972 { 6, alc883_4ST_ch6_init },
6973 { 8, alc883_4ST_ch8_init },
6980 static struct hda_verb alc883_3ST_ch2_intel_init[] = {
6981 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6982 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6983 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
6984 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6991 static struct hda_verb alc883_3ST_ch4_intel_init[] = {
6992 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
6993 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
6994 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
6995 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
6996 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7003 static struct hda_verb alc883_3ST_ch6_intel_init[] = {
7004 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7005 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7006 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 },
7007 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7008 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7009 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7013 static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = {
7014 { 2, alc883_3ST_ch2_intel_init },
7015 { 4, alc883_3ST_ch4_intel_init },
7016 { 6, alc883_3ST_ch6_intel_init },
7022 static struct hda_verb alc889_ch2_intel_init[] = {
7023 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7024 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x00 },
7025 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x00 },
7026 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00 },
7027 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7028 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7035 static struct hda_verb alc889_ch6_intel_init[] = {
7036 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7037 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7038 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7039 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7040 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7041 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7048 static struct hda_verb alc889_ch8_intel_init[] = {
7049 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7050 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7051 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7052 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7053 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x03 },
7054 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7055 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7059 static struct hda_channel_mode alc889_8ch_intel_modes[3] = {
7060 { 2, alc889_ch2_intel_init },
7061 { 6, alc889_ch6_intel_init },
7062 { 8, alc889_ch8_intel_init },
7068 static struct hda_verb alc883_sixstack_ch6_init[] = {
7069 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7070 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7071 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7072 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7079 static struct hda_verb alc883_sixstack_ch8_init[] = {
7080 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7081 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7082 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7083 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7087 static struct hda_channel_mode alc883_sixstack_modes[2] = {
7088 { 6, alc883_sixstack_ch6_init },
7089 { 8, alc883_sixstack_ch8_init },
7093 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
7094 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
7096 static struct snd_kcontrol_new alc882_base_mixer[] = {
7097 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7098 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7099 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7100 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7101 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7102 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7103 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7104 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7105 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
7106 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
7107 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7108 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7109 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7110 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7111 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7112 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7113 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7114 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7115 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7116 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7117 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7121 static struct snd_kcontrol_new alc885_mbp3_mixer[] = {
7122 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7123 HDA_BIND_MUTE ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
7124 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7125 HDA_BIND_MUTE ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT),
7126 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7127 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7128 HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7129 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
7130 HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
7131 HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
7132 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
7136 static struct snd_kcontrol_new alc885_mb5_mixer[] = {
7137 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7138 HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7139 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7140 HDA_BIND_MUTE ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7141 HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7142 HDA_BIND_MUTE ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
7143 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7144 HDA_BIND_MUTE ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
7145 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7146 HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7147 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
7148 HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
7149 HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7150 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0x00, HDA_INPUT),
7154 static struct snd_kcontrol_new alc885_imac91_mixer[] = {
7155 HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7156 HDA_BIND_MUTE ("Line-Out Playback Switch", 0x0c, 0x02, HDA_INPUT),
7157 HDA_CODEC_MUTE ("Speaker Playback Switch", 0x14, 0x00, HDA_OUTPUT),
7158 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7159 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7160 HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7161 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
7162 HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
7163 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
7168 static struct snd_kcontrol_new alc882_w2jc_mixer[] = {
7169 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7170 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7171 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7172 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7173 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7174 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7175 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7176 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7177 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7181 static struct snd_kcontrol_new alc882_targa_mixer[] = {
7182 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7183 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7184 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7185 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7186 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7187 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7188 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7189 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7190 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7191 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7192 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7193 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7194 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7198 /* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ???
7199 * Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c
7201 static struct snd_kcontrol_new alc882_asus_a7j_mixer[] = {
7202 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7203 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
7204 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7205 HDA_CODEC_MUTE("Mobile Front Playback Switch", 0x16, 0x0, HDA_OUTPUT),
7206 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7207 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7208 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7209 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7210 HDA_CODEC_VOLUME("Mobile Line Playback Volume", 0x0b, 0x03, HDA_INPUT),
7211 HDA_CODEC_MUTE("Mobile Line Playback Switch", 0x0b, 0x03, HDA_INPUT),
7212 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7213 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7214 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7218 static struct snd_kcontrol_new alc882_asus_a7m_mixer[] = {
7219 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7220 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7221 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7222 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7223 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7224 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7225 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7226 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7227 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7228 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7232 static struct snd_kcontrol_new alc882_chmode_mixer[] = {
7234 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
7235 .name = "Channel Mode",
7236 .info = alc_ch_mode_info,
7237 .get = alc_ch_mode_get,
7238 .put = alc_ch_mode_put,
7243 static struct hda_verb alc882_base_init_verbs[] = {
7244 /* Front mixer: unmute input/output amp left and right (volume = 0) */
7245 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7246 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7247 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7249 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7250 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7251 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7253 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7254 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7255 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7257 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7258 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7259 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7261 /* mute analog input loopbacks */
7262 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7263 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7264 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7265 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7266 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7268 /* Front Pin: output 0 (0x0c) */
7269 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7270 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7271 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7272 /* Rear Pin: output 1 (0x0d) */
7273 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7274 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7275 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7276 /* CLFE Pin: output 2 (0x0e) */
7277 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7278 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7279 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7280 /* Side Pin: output 3 (0x0f) */
7281 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7282 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7283 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7284 /* Mic (rear) pin: input vref at 80% */
7285 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7286 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7287 /* Front Mic pin: input vref at 80% */
7288 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7289 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7290 /* Line In pin: input */
7291 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7292 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7293 /* Line-2 In: Headphone output (output 0 - 0x0c) */
7294 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7295 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7296 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
7297 /* CD pin widget for input */
7298 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7300 /* FIXME: use matrix-type input source selection */
7301 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7303 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7304 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7305 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7306 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7308 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7309 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7310 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7311 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7312 /* ADC2: mute amp left and right */
7313 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7314 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7315 /* ADC3: mute amp left and right */
7316 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7317 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7322 static struct hda_verb alc882_adc1_init_verbs[] = {
7323 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7324 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7325 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7326 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7327 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7328 /* ADC1: mute amp left and right */
7329 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7330 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7334 static struct hda_verb alc882_eapd_verbs[] = {
7335 /* change to EAPD mode */
7336 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
7337 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
7341 static struct hda_verb alc889_eapd_verbs[] = {
7342 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
7343 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
7347 static struct hda_verb alc_hp15_unsol_verbs[] = {
7348 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
7349 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7353 static struct hda_verb alc885_init_verbs[] = {
7354 /* Front mixer: unmute input/output amp left and right (volume = 0) */
7355 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7356 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7357 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7359 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7360 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7361 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7363 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7364 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7365 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7367 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7368 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7369 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7371 /* mute analog input loopbacks */
7372 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7373 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7374 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7376 /* Front HP Pin: output 0 (0x0c) */
7377 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7378 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7379 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7380 /* Front Pin: output 0 (0x0c) */
7381 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7382 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7383 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7384 /* Rear Pin: output 1 (0x0d) */
7385 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7386 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7387 {0x19, AC_VERB_SET_CONNECT_SEL, 0x01},
7388 /* CLFE Pin: output 2 (0x0e) */
7389 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7390 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7391 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7392 /* Side Pin: output 3 (0x0f) */
7393 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7394 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7395 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7396 /* Mic (rear) pin: input vref at 80% */
7397 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7398 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7399 /* Front Mic pin: input vref at 80% */
7400 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7401 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7402 /* Line In pin: input */
7403 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7404 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7406 /* Mixer elements: 0x18, , 0x1a, 0x1b */
7408 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
7409 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7410 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7412 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7413 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7414 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7416 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
7417 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7418 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7419 /* ADC2: mute amp left and right */
7420 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7421 /* ADC3: mute amp left and right */
7422 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7427 static struct hda_verb alc885_init_input_verbs[] = {
7428 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7429 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
7430 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
7435 /* Unmute Selector 24h and set the default input to front mic */
7436 static struct hda_verb alc889_init_input_verbs[] = {
7437 {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
7438 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7443 #define alc883_init_verbs alc882_base_init_verbs
7446 static struct snd_kcontrol_new alc882_macpro_mixer[] = {
7447 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7448 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7449 HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT),
7450 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
7451 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
7452 /* FIXME: this looks suspicious...
7453 HDA_CODEC_VOLUME("Beep Playback Volume", 0x0b, 0x02, HDA_INPUT),
7454 HDA_CODEC_MUTE("Beep Playback Switch", 0x0b, 0x02, HDA_INPUT),
7459 static struct hda_verb alc882_macpro_init_verbs[] = {
7460 /* Front mixer: unmute input/output amp left and right (volume = 0) */
7461 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7462 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7463 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7464 /* Front Pin: output 0 (0x0c) */
7465 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7466 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7467 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7468 /* Front Mic pin: input vref at 80% */
7469 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7470 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7471 /* Speaker: output */
7472 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7473 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7474 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x04},
7475 /* Headphone output (output 0 - 0x0c) */
7476 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7477 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7478 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7480 /* FIXME: use matrix-type input source selection */
7481 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7482 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7483 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7484 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7485 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7486 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7488 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7489 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7490 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7491 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7493 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7494 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7495 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7496 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7497 /* ADC1: mute amp left and right */
7498 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7499 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7500 /* ADC2: mute amp left and right */
7501 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7502 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7503 /* ADC3: mute amp left and right */
7504 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7505 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7511 static struct hda_verb alc885_mb5_init_verbs[] = {
7513 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7514 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7515 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7516 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7518 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7519 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7520 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7521 /* Surround mixer */
7522 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7523 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7524 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7526 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7527 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7528 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7530 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7531 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7532 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7533 /* Front Pin (0x0c) */
7534 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7535 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7536 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7537 /* LFE Pin (0x0e) */
7538 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
7539 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7540 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
7542 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7543 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7544 {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
7545 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7546 /* Front Mic pin: input vref at 80% */
7547 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7548 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7550 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7551 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7553 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7554 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7555 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7556 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7560 /* Macbook Pro rev3 */
7561 static struct hda_verb alc885_mbp3_init_verbs[] = {
7562 /* Front mixer: unmute input/output amp left and right (volume = 0) */
7563 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7564 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7565 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7567 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7568 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7569 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7571 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7572 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7573 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7574 /* Front Pin: output 0 (0x0c) */
7575 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7576 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7577 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7578 /* HP Pin: output 0 (0x0e) */
7579 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
7580 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7581 {0x15, AC_VERB_SET_CONNECT_SEL, 0x02},
7582 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7583 /* Mic (rear) pin: input vref at 80% */
7584 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7585 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7586 /* Front Mic pin: input vref at 80% */
7587 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7588 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7589 /* Line In pin: use output 1 when in LineOut mode */
7590 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7591 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7592 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
7594 /* FIXME: use matrix-type input source selection */
7595 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7596 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7597 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7598 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7599 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7600 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7602 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7603 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7604 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7605 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7607 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7608 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7609 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7610 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7611 /* ADC1: mute amp left and right */
7612 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7613 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7614 /* ADC2: mute amp left and right */
7615 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7616 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7617 /* ADC3: mute amp left and right */
7618 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7619 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7625 static struct hda_verb alc885_imac91_init_verbs[] = {
7626 /* Line-Out mixer: unmute input/output amp left and right (volume = 0) */
7627 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7628 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7629 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7631 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7632 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7633 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7634 /* HP Pin: output 0 (0x0c) */
7635 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7636 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7637 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7638 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7639 /* Internal Speakers: output 0 (0x0d) */
7640 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7641 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7642 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7643 /* Mic (rear) pin: input vref at 80% */
7644 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7645 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7646 /* Front Mic pin: input vref at 80% */
7647 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7648 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7649 /* Line In pin: use output 1 when in LineOut mode */
7650 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7651 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7652 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
7654 /* FIXME: use matrix-type input source selection */
7655 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7656 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7657 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7658 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7659 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7660 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7662 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7663 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7664 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7665 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7667 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7668 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7669 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7670 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7671 /* ADC1: mute amp left and right */
7672 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7673 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7674 /* ADC2: mute amp left and right */
7675 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7676 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7677 /* ADC3: mute amp left and right */
7678 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7679 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7684 /* iMac 24 mixer. */
7685 static struct snd_kcontrol_new alc885_imac24_mixer[] = {
7686 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7687 HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT),
7691 /* iMac 24 init verbs. */
7692 static struct hda_verb alc885_imac24_init_verbs[] = {
7693 /* Internal speakers: output 0 (0x0c) */
7694 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7695 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7696 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7697 /* Internal speakers: output 0 (0x0c) */
7698 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7699 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7700 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
7701 /* Headphone: output 0 (0x0c) */
7702 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7703 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7704 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7705 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7706 /* Front Mic: input vref at 80% */
7707 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7708 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7712 /* Toggle speaker-output according to the hp-jack state */
7713 static void alc885_imac24_setup(struct hda_codec *codec)
7715 struct alc_spec *spec = codec->spec;
7717 spec->autocfg.hp_pins[0] = 0x14;
7718 spec->autocfg.speaker_pins[0] = 0x18;
7719 spec->autocfg.speaker_pins[1] = 0x1a;
7722 static void alc885_mbp3_setup(struct hda_codec *codec)
7724 struct alc_spec *spec = codec->spec;
7726 spec->autocfg.hp_pins[0] = 0x15;
7727 spec->autocfg.speaker_pins[0] = 0x14;
7730 static void alc885_mb5_automute(struct hda_codec *codec)
7732 unsigned int present;
7734 present = snd_hda_codec_read(codec, 0x14, 0,
7735 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
7736 snd_hda_codec_amp_stereo(codec, 0x18, HDA_OUTPUT, 0,
7737 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
7738 snd_hda_codec_amp_stereo(codec, 0x1a, HDA_OUTPUT, 0,
7739 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
7743 static void alc885_mb5_unsol_event(struct hda_codec *codec,
7746 /* Headphone insertion or removal. */
7747 if ((res >> 26) == ALC880_HP_EVENT)
7748 alc885_mb5_automute(codec);
7751 static void alc885_imac91_automute(struct hda_codec *codec)
7753 unsigned int present;
7755 present = snd_hda_codec_read(codec, 0x14, 0,
7756 AC_VERB_GET_PIN_SENSE, 0) & 0x80000000;
7757 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
7758 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
7759 snd_hda_codec_amp_stereo(codec, 0x1a, HDA_OUTPUT, 0,
7760 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
7764 static void alc885_imac91_unsol_event(struct hda_codec *codec,
7767 /* Headphone insertion or removal. */
7768 if ((res >> 26) == ALC880_HP_EVENT)
7769 alc885_imac91_automute(codec);
7772 static struct hda_verb alc882_targa_verbs[] = {
7773 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7774 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7776 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7777 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7779 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
7780 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
7781 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7783 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
7787 /* toggle speaker-output according to the hp-jack state */
7788 static void alc882_targa_automute(struct hda_codec *codec)
7790 struct alc_spec *spec = codec->spec;
7791 alc_automute_amp(codec);
7792 snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA,
7793 spec->jack_present ? 1 : 3);
7796 static void alc882_targa_setup(struct hda_codec *codec)
7798 struct alc_spec *spec = codec->spec;
7800 spec->autocfg.hp_pins[0] = 0x14;
7801 spec->autocfg.speaker_pins[0] = 0x1b;
7804 static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res)
7806 if ((res >> 26) == ALC880_HP_EVENT)
7807 alc882_targa_automute(codec);
7810 static struct hda_verb alc882_asus_a7j_verbs[] = {
7811 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7812 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7814 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7815 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7816 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7818 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7819 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7820 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7822 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
7823 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
7824 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7828 static struct hda_verb alc882_asus_a7m_verbs[] = {
7829 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7830 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7832 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7833 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7834 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7836 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7837 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7838 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
7840 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
7841 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
7842 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
7846 static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted)
7848 unsigned int gpiostate, gpiomask, gpiodir;
7850 gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
7851 AC_VERB_GET_GPIO_DATA, 0);
7854 gpiostate |= (1 << pin);
7856 gpiostate &= ~(1 << pin);
7858 gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
7859 AC_VERB_GET_GPIO_MASK, 0);
7860 gpiomask |= (1 << pin);
7862 gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
7863 AC_VERB_GET_GPIO_DIRECTION, 0);
7864 gpiodir |= (1 << pin);
7867 snd_hda_codec_write(codec, codec->afg, 0,
7868 AC_VERB_SET_GPIO_MASK, gpiomask);
7869 snd_hda_codec_write(codec, codec->afg, 0,
7870 AC_VERB_SET_GPIO_DIRECTION, gpiodir);
7874 snd_hda_codec_write(codec, codec->afg, 0,
7875 AC_VERB_SET_GPIO_DATA, gpiostate);
7878 /* set up GPIO at initialization */
7879 static void alc885_macpro_init_hook(struct hda_codec *codec)
7881 alc882_gpio_mute(codec, 0, 0);
7882 alc882_gpio_mute(codec, 1, 0);
7885 /* set up GPIO and update auto-muting at initialization */
7886 static void alc885_imac24_init_hook(struct hda_codec *codec)
7888 alc885_macpro_init_hook(codec);
7889 alc_automute_amp(codec);
7893 * generic initialization of ADC, input mixers and output mixers
7895 static struct hda_verb alc883_auto_init_verbs[] = {
7897 * Unmute ADC0-2 and set the default input to mic-in
7899 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7900 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7901 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7902 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7904 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
7906 * Note: PASD motherboards uses the Line In 2 as the input for
7907 * front panel mic (mic 2)
7909 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
7910 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7911 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7912 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7913 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7914 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7917 * Set up output mixers (0x0c - 0x0f)
7919 /* set vol=0 to output mixers */
7920 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7921 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7922 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7923 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7924 /* set up input amps for analog loopback */
7925 /* Amp Indices: DAC = 0, mixer = 1 */
7926 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7927 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7928 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7929 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7930 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7931 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7932 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7933 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7934 {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7935 {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7937 /* FIXME: use matrix-type input source selection */
7938 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7940 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
7941 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
7942 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
7943 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
7945 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
7946 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
7947 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
7948 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
7953 /* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */
7954 static struct hda_verb alc889A_mb31_ch2_init[] = {
7955 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */
7956 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
7957 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */
7958 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line off */
7962 /* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */
7963 static struct hda_verb alc889A_mb31_ch4_init[] = {
7964 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */
7965 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
7966 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */
7967 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
7971 /* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */
7972 static struct hda_verb alc889A_mb31_ch5_init[] = {
7973 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as rear */
7974 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
7975 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */
7976 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line off */
7980 /* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */
7981 static struct hda_verb alc889A_mb31_ch6_init[] = {
7982 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as front */
7983 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Subwoofer off */
7984 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */
7985 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
7989 static struct hda_channel_mode alc889A_mb31_6ch_modes[4] = {
7990 { 2, alc889A_mb31_ch2_init },
7991 { 4, alc889A_mb31_ch4_init },
7992 { 5, alc889A_mb31_ch5_init },
7993 { 6, alc889A_mb31_ch6_init },
7996 static struct hda_verb alc883_medion_eapd_verbs[] = {
7997 /* eanable EAPD on medion laptop */
7998 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
7999 {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
8003 #define alc883_base_mixer alc882_base_mixer
8005 static struct snd_kcontrol_new alc883_mitac_mixer[] = {
8006 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8007 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8008 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8009 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8010 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8011 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8012 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8013 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8014 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8015 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8016 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8017 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8018 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8022 static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = {
8023 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8024 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8025 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8026 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8027 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8028 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8029 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8030 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8031 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8032 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8036 static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = {
8037 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8038 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8039 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8040 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8041 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8042 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8043 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8044 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8045 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8046 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8050 static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = {
8051 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8052 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8053 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8054 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8055 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8056 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8057 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8058 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8059 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8060 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8061 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8062 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8063 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8067 static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
8068 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8069 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8070 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8071 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8072 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8073 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8074 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8075 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8076 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8077 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8078 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8079 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8080 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8081 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8082 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8083 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8084 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8085 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8086 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8090 static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = {
8091 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8092 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8093 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8094 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8095 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8097 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8098 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8099 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8100 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8101 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8102 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8103 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8104 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8105 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8106 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8107 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8108 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8109 HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8110 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8114 static struct snd_kcontrol_new alc885_8ch_intel_mixer[] = {
8115 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8116 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8117 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8118 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8119 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8121 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8122 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8123 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8124 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8125 HDA_BIND_MUTE("Speaker Playback Switch", 0x0f, 2, HDA_INPUT),
8126 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8127 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8128 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8129 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
8130 HDA_CODEC_VOLUME("Mic Boost", 0x1b, 0, HDA_INPUT),
8131 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
8132 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8133 HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8134 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8138 static struct snd_kcontrol_new alc883_fivestack_mixer[] = {
8139 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8140 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8141 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8142 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8143 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8144 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8145 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8146 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8147 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8148 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8149 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8150 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8151 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8152 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8153 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8154 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8155 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8156 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8157 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8161 static struct snd_kcontrol_new alc883_targa_mixer[] = {
8162 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8163 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8164 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8165 HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8166 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8167 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8168 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8169 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8170 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8171 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8172 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8173 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8174 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8175 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8176 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8177 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8178 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8182 static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = {
8183 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8184 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8185 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8186 HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8187 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8188 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8189 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8190 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8191 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8192 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8193 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8194 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8198 static struct snd_kcontrol_new alc883_targa_8ch_mixer[] = {
8199 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8200 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8201 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8202 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8203 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8207 static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = {
8208 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8209 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8210 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8211 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8212 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8213 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8214 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8215 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8219 static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = {
8220 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8221 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
8222 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8223 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8224 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8225 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8226 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8227 HDA_CODEC_VOLUME("iMic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8228 HDA_CODEC_MUTE("iMic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8232 static struct snd_kcontrol_new alc883_medion_md2_mixer[] = {
8233 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8234 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8235 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8236 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8237 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8238 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8239 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8240 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8241 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8245 static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = {
8246 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8247 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8248 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8249 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8250 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8251 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8252 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8253 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8257 static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
8258 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8259 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8260 HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8261 HDA_BIND_MUTE("LFE Playback Switch", 0x0f, 2, HDA_INPUT),
8262 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8263 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8264 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8265 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8266 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8267 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8268 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8272 static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = {
8273 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8274 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8275 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
8276 HDA_BIND_MUTE("Surround Playback Switch", 0x0e, 2, HDA_INPUT),
8277 HDA_CODEC_VOLUME_MONO("Center Playback Volume",
8278 0x0d, 1, 0x0, HDA_OUTPUT),
8279 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
8280 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
8281 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
8282 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8283 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8284 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8285 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8286 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8287 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8288 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8289 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8290 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8291 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8292 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8293 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8297 static struct snd_kcontrol_new alc889A_mb31_mixer[] = {
8299 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8300 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
8301 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
8302 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
8303 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00,
8305 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT),
8306 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT),
8307 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT),
8308 /* Output switches */
8309 HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT),
8310 HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT),
8311 HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT),
8313 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
8314 HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
8316 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
8317 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
8318 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8319 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8323 static struct snd_kcontrol_new alc883_vaiott_mixer[] = {
8324 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8325 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8326 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8327 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8328 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8329 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8333 static struct hda_bind_ctls alc883_bind_cap_vol = {
8334 .ops = &snd_hda_bind_vol,
8336 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8337 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8342 static struct hda_bind_ctls alc883_bind_cap_switch = {
8343 .ops = &snd_hda_bind_sw,
8345 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8346 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8351 static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = {
8352 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8353 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8354 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8355 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8356 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8357 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8358 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8359 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8363 static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = {
8364 HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol),
8365 HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch),
8367 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8368 /* .name = "Capture Source", */
8369 .name = "Input Source",
8371 .info = alc_mux_enum_info,
8372 .get = alc_mux_enum_get,
8373 .put = alc_mux_enum_put,
8378 static struct snd_kcontrol_new alc883_chmode_mixer[] = {
8380 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8381 .name = "Channel Mode",
8382 .info = alc_ch_mode_info,
8383 .get = alc_ch_mode_get,
8384 .put = alc_ch_mode_put,
8389 /* toggle speaker-output according to the hp-jack state */
8390 static void alc883_mitac_setup(struct hda_codec *codec)
8392 struct alc_spec *spec = codec->spec;
8394 spec->autocfg.hp_pins[0] = 0x15;
8395 spec->autocfg.speaker_pins[0] = 0x14;
8396 spec->autocfg.speaker_pins[1] = 0x17;
8399 /* auto-toggle front mic */
8401 static void alc883_mitac_mic_automute(struct hda_codec *codec)
8403 unsigned char bits = snd_hda_jack_detect(codec, 0x18) ? HDA_AMP_MUTE : 0;
8405 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
8409 static struct hda_verb alc883_mitac_verbs[] = {
8411 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8412 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8414 {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
8415 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8417 /* enable unsolicited event */
8418 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8419 /* {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, */
8424 static struct hda_verb alc883_clevo_m540r_verbs[] = {
8426 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8427 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8429 /*{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},*/
8431 /* enable unsolicited event */
8433 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8434 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8440 static struct hda_verb alc883_clevo_m720_verbs[] = {
8442 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8443 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8445 {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
8446 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8448 /* enable unsolicited event */
8449 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8450 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8455 static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = {
8457 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8458 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8460 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
8461 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8463 /* enable unsolicited event */
8464 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8469 static struct hda_verb alc883_targa_verbs[] = {
8470 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8471 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8473 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8474 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8476 /* Connect Line-Out side jack (SPDIF) to Side */
8477 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8478 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8479 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
8480 /* Connect Mic jack to CLFE */
8481 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8482 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8483 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
8484 /* Connect Line-in jack to Surround */
8485 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8486 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8487 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
8488 /* Connect HP out jack to Front */
8489 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8490 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8491 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8493 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8498 static struct hda_verb alc883_lenovo_101e_verbs[] = {
8499 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8500 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT|AC_USRSP_EN},
8501 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT|AC_USRSP_EN},
8505 static struct hda_verb alc883_lenovo_nb0763_verbs[] = {
8506 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8507 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8508 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8509 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8513 static struct hda_verb alc888_lenovo_ms7195_verbs[] = {
8514 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8515 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8516 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8517 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT | AC_USRSP_EN},
8518 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8522 static struct hda_verb alc883_haier_w66_verbs[] = {
8523 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8524 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8526 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8528 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
8529 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8530 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8531 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8535 static struct hda_verb alc888_lenovo_sky_verbs[] = {
8536 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8537 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8538 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8539 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8540 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8541 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8542 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8543 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8547 static struct hda_verb alc888_6st_dell_verbs[] = {
8548 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8552 static struct hda_verb alc883_vaiott_verbs[] = {
8554 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8555 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8557 /* enable unsolicited event */
8558 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8563 static void alc888_3st_hp_setup(struct hda_codec *codec)
8565 struct alc_spec *spec = codec->spec;
8567 spec->autocfg.hp_pins[0] = 0x1b;
8568 spec->autocfg.speaker_pins[0] = 0x14;
8569 spec->autocfg.speaker_pins[1] = 0x16;
8570 spec->autocfg.speaker_pins[2] = 0x18;
8573 static struct hda_verb alc888_3st_hp_verbs[] = {
8574 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front: output 0 (0x0c) */
8575 {0x16, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Rear : output 1 (0x0d) */
8576 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* CLFE : output 2 (0x0e) */
8577 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8584 static struct hda_verb alc888_3st_hp_2ch_init[] = {
8585 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8586 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8587 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
8588 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8595 static struct hda_verb alc888_3st_hp_4ch_init[] = {
8596 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
8597 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
8598 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8599 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8600 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8607 static struct hda_verb alc888_3st_hp_6ch_init[] = {
8608 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8609 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8610 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
8611 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
8612 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
8613 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
8617 static struct hda_channel_mode alc888_3st_hp_modes[3] = {
8618 { 2, alc888_3st_hp_2ch_init },
8619 { 4, alc888_3st_hp_4ch_init },
8620 { 6, alc888_3st_hp_6ch_init },
8623 /* toggle front-jack and RCA according to the hp-jack state */
8624 static void alc888_lenovo_ms7195_front_automute(struct hda_codec *codec)
8626 unsigned int present = snd_hda_jack_detect(codec, 0x1b);
8628 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
8629 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8630 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8631 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8634 /* toggle RCA according to the front-jack state */
8635 static void alc888_lenovo_ms7195_rca_automute(struct hda_codec *codec)
8637 unsigned int present = snd_hda_jack_detect(codec, 0x14);
8639 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8640 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8643 static void alc883_lenovo_ms7195_unsol_event(struct hda_codec *codec,
8646 if ((res >> 26) == ALC880_HP_EVENT)
8647 alc888_lenovo_ms7195_front_automute(codec);
8648 if ((res >> 26) == ALC880_FRONT_EVENT)
8649 alc888_lenovo_ms7195_rca_automute(codec);
8652 static struct hda_verb alc883_medion_md2_verbs[] = {
8653 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8654 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8656 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8658 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8662 /* toggle speaker-output according to the hp-jack state */
8663 static void alc883_medion_md2_setup(struct hda_codec *codec)
8665 struct alc_spec *spec = codec->spec;
8667 spec->autocfg.hp_pins[0] = 0x14;
8668 spec->autocfg.speaker_pins[0] = 0x15;
8671 /* toggle speaker-output according to the hp-jack state */
8672 #define alc883_targa_init_hook alc882_targa_init_hook
8673 #define alc883_targa_unsol_event alc882_targa_unsol_event
8675 static void alc883_clevo_m720_mic_automute(struct hda_codec *codec)
8677 unsigned int present;
8679 present = snd_hda_jack_detect(codec, 0x18);
8680 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
8681 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8684 static void alc883_clevo_m720_setup(struct hda_codec *codec)
8686 struct alc_spec *spec = codec->spec;
8688 spec->autocfg.hp_pins[0] = 0x15;
8689 spec->autocfg.speaker_pins[0] = 0x14;
8692 static void alc883_clevo_m720_init_hook(struct hda_codec *codec)
8694 alc_automute_amp(codec);
8695 alc883_clevo_m720_mic_automute(codec);
8698 static void alc883_clevo_m720_unsol_event(struct hda_codec *codec,
8701 switch (res >> 26) {
8702 case ALC880_MIC_EVENT:
8703 alc883_clevo_m720_mic_automute(codec);
8706 alc_automute_amp_unsol_event(codec, res);
8711 /* toggle speaker-output according to the hp-jack state */
8712 static void alc883_2ch_fujitsu_pi2515_setup(struct hda_codec *codec)
8714 struct alc_spec *spec = codec->spec;
8716 spec->autocfg.hp_pins[0] = 0x14;
8717 spec->autocfg.speaker_pins[0] = 0x15;
8720 static void alc883_haier_w66_setup(struct hda_codec *codec)
8722 struct alc_spec *spec = codec->spec;
8724 spec->autocfg.hp_pins[0] = 0x1b;
8725 spec->autocfg.speaker_pins[0] = 0x14;
8728 static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
8730 int bits = snd_hda_jack_detect(codec, 0x14) ? HDA_AMP_MUTE : 0;
8732 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8733 HDA_AMP_MUTE, bits);
8736 static void alc883_lenovo_101e_all_automute(struct hda_codec *codec)
8738 int bits = snd_hda_jack_detect(codec, 0x1b) ? HDA_AMP_MUTE : 0;
8740 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
8741 HDA_AMP_MUTE, bits);
8742 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
8743 HDA_AMP_MUTE, bits);
8746 static void alc883_lenovo_101e_unsol_event(struct hda_codec *codec,
8749 if ((res >> 26) == ALC880_HP_EVENT)
8750 alc883_lenovo_101e_all_automute(codec);
8751 if ((res >> 26) == ALC880_FRONT_EVENT)
8752 alc883_lenovo_101e_ispeaker_automute(codec);
8755 /* toggle speaker-output according to the hp-jack state */
8756 static void alc883_acer_aspire_setup(struct hda_codec *codec)
8758 struct alc_spec *spec = codec->spec;
8760 spec->autocfg.hp_pins[0] = 0x14;
8761 spec->autocfg.speaker_pins[0] = 0x15;
8762 spec->autocfg.speaker_pins[1] = 0x16;
8765 static struct hda_verb alc883_acer_eapd_verbs[] = {
8766 /* HP Pin: output 0 (0x0c) */
8767 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8768 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8769 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8770 /* Front Pin: output 0 (0x0c) */
8771 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8772 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8773 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8774 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00},
8775 /* eanable EAPD on medion laptop */
8776 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
8777 {0x20, AC_VERB_SET_PROC_COEF, 0x3050},
8778 /* enable unsolicited event */
8779 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8783 static struct hda_verb alc888_acer_aspire_7730G_verbs[] = {
8784 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8785 {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
8786 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8790 static void alc888_6st_dell_setup(struct hda_codec *codec)
8792 struct alc_spec *spec = codec->spec;
8794 spec->autocfg.hp_pins[0] = 0x1b;
8795 spec->autocfg.speaker_pins[0] = 0x14;
8796 spec->autocfg.speaker_pins[1] = 0x15;
8797 spec->autocfg.speaker_pins[2] = 0x16;
8798 spec->autocfg.speaker_pins[3] = 0x17;
8801 static void alc888_lenovo_sky_setup(struct hda_codec *codec)
8803 struct alc_spec *spec = codec->spec;
8805 spec->autocfg.hp_pins[0] = 0x1b;
8806 spec->autocfg.speaker_pins[0] = 0x14;
8807 spec->autocfg.speaker_pins[1] = 0x15;
8808 spec->autocfg.speaker_pins[2] = 0x16;
8809 spec->autocfg.speaker_pins[3] = 0x17;
8810 spec->autocfg.speaker_pins[4] = 0x1a;
8813 static void alc883_vaiott_setup(struct hda_codec *codec)
8815 struct alc_spec *spec = codec->spec;
8817 spec->autocfg.hp_pins[0] = 0x15;
8818 spec->autocfg.speaker_pins[0] = 0x14;
8819 spec->autocfg.speaker_pins[1] = 0x17;
8822 static struct hda_verb alc888_asus_m90v_verbs[] = {
8823 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8824 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8825 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8826 /* enable unsolicited event */
8827 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8828 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
8832 static void alc883_mode2_setup(struct hda_codec *codec)
8834 struct alc_spec *spec = codec->spec;
8836 spec->autocfg.hp_pins[0] = 0x1b;
8837 spec->autocfg.speaker_pins[0] = 0x14;
8838 spec->autocfg.speaker_pins[1] = 0x15;
8839 spec->autocfg.speaker_pins[2] = 0x16;
8840 spec->ext_mic.pin = 0x18;
8841 spec->int_mic.pin = 0x19;
8842 spec->ext_mic.mux_idx = 0;
8843 spec->int_mic.mux_idx = 1;
8847 static struct hda_verb alc888_asus_eee1601_verbs[] = {
8848 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8849 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8850 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8851 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8852 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8853 {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
8854 {0x20, AC_VERB_SET_PROC_COEF, 0x0838},
8855 /* enable unsolicited event */
8856 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8860 static void alc883_eee1601_inithook(struct hda_codec *codec)
8862 struct alc_spec *spec = codec->spec;
8864 spec->autocfg.hp_pins[0] = 0x14;
8865 spec->autocfg.speaker_pins[0] = 0x1b;
8866 alc_automute_pin(codec);
8869 static struct hda_verb alc889A_mb31_verbs[] = {
8870 /* Init rear pin (used as headphone output) */
8871 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, /* Apple Headphones */
8872 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Connect to front */
8873 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8874 /* Init line pin (used as output in 4ch and 6ch mode) */
8875 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02}, /* Connect to CLFE */
8876 /* Init line 2 pin (used as headphone out by default) */
8877 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Use as input */
8878 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */
8882 /* Mute speakers according to the headphone jack state */
8883 static void alc889A_mb31_automute(struct hda_codec *codec)
8885 unsigned int present;
8887 /* Mute only in 2ch or 4ch mode */
8888 if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0)
8890 present = snd_hda_jack_detect(codec, 0x15);
8891 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
8892 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8893 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
8894 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
8898 static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
8900 if ((res >> 26) == ALC880_HP_EVENT)
8901 alc889A_mb31_automute(codec);
8905 #ifdef CONFIG_SND_HDA_POWER_SAVE
8906 #define alc882_loopbacks alc880_loopbacks
8909 /* pcm configuration: identical with ALC880 */
8910 #define alc882_pcm_analog_playback alc880_pcm_analog_playback
8911 #define alc882_pcm_analog_capture alc880_pcm_analog_capture
8912 #define alc882_pcm_digital_playback alc880_pcm_digital_playback
8913 #define alc882_pcm_digital_capture alc880_pcm_digital_capture
8915 static hda_nid_t alc883_slave_dig_outs[] = {
8916 ALC1200_DIGOUT_NID, 0,
8919 static hda_nid_t alc1200_slave_dig_outs[] = {
8920 ALC883_DIGOUT_NID, 0,
8924 * configuration and preset
8926 static const char *alc882_models[ALC882_MODEL_LAST] = {
8927 [ALC882_3ST_DIG] = "3stack-dig",
8928 [ALC882_6ST_DIG] = "6stack-dig",
8929 [ALC882_ARIMA] = "arima",
8930 [ALC882_W2JC] = "w2jc",
8931 [ALC882_TARGA] = "targa",
8932 [ALC882_ASUS_A7J] = "asus-a7j",
8933 [ALC882_ASUS_A7M] = "asus-a7m",
8934 [ALC885_MACPRO] = "macpro",
8935 [ALC885_MB5] = "mb5",
8936 [ALC885_MBP3] = "mbp3",
8937 [ALC885_IMAC24] = "imac24",
8938 [ALC885_IMAC91] = "imac91",
8939 [ALC883_3ST_2ch_DIG] = "3stack-2ch-dig",
8940 [ALC883_3ST_6ch_DIG] = "3stack-6ch-dig",
8941 [ALC883_3ST_6ch] = "3stack-6ch",
8942 [ALC883_6ST_DIG] = "alc883-6stack-dig",
8943 [ALC883_TARGA_DIG] = "targa-dig",
8944 [ALC883_TARGA_2ch_DIG] = "targa-2ch-dig",
8945 [ALC883_TARGA_8ch_DIG] = "targa-8ch-dig",
8946 [ALC883_ACER] = "acer",
8947 [ALC883_ACER_ASPIRE] = "acer-aspire",
8948 [ALC888_ACER_ASPIRE_4930G] = "acer-aspire-4930g",
8949 [ALC888_ACER_ASPIRE_6530G] = "acer-aspire-6530g",
8950 [ALC888_ACER_ASPIRE_8930G] = "acer-aspire-8930g",
8951 [ALC888_ACER_ASPIRE_7730G] = "acer-aspire-7730g",
8952 [ALC883_MEDION] = "medion",
8953 [ALC883_MEDION_MD2] = "medion-md2",
8954 [ALC883_LAPTOP_EAPD] = "laptop-eapd",
8955 [ALC883_LENOVO_101E_2ch] = "lenovo-101e",
8956 [ALC883_LENOVO_NB0763] = "lenovo-nb0763",
8957 [ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig",
8958 [ALC888_LENOVO_SKY] = "lenovo-sky",
8959 [ALC883_HAIER_W66] = "haier-w66",
8960 [ALC888_3ST_HP] = "3stack-hp",
8961 [ALC888_6ST_DELL] = "6stack-dell",
8962 [ALC883_MITAC] = "mitac",
8963 [ALC883_CLEVO_M540R] = "clevo-m540r",
8964 [ALC883_CLEVO_M720] = "clevo-m720",
8965 [ALC883_FUJITSU_PI2515] = "fujitsu-pi2515",
8966 [ALC888_FUJITSU_XA3530] = "fujitsu-xa3530",
8967 [ALC883_3ST_6ch_INTEL] = "3stack-6ch-intel",
8968 [ALC889A_INTEL] = "intel-alc889a",
8969 [ALC889_INTEL] = "intel-x58",
8970 [ALC1200_ASUS_P5Q] = "asus-p5q",
8971 [ALC889A_MB31] = "mb31",
8972 [ALC883_SONY_VAIO_TT] = "sony-vaio-tt",
8973 [ALC882_AUTO] = "auto",
8976 static struct snd_pci_quirk alc882_cfg_tbl[] = {
8977 SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG),
8979 SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
8980 SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
8981 SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE),
8982 SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
8983 SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
8984 SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),
8985 SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
8986 ALC888_ACER_ASPIRE_4930G),
8987 SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
8988 ALC888_ACER_ASPIRE_4930G),
8989 SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
8990 ALC888_ACER_ASPIRE_8930G),
8991 SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
8992 ALC888_ACER_ASPIRE_8930G),
8993 SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC882_AUTO),
8994 SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC882_AUTO),
8995 SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
8996 ALC888_ACER_ASPIRE_6530G),
8997 SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
8998 ALC888_ACER_ASPIRE_6530G),
8999 SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
9000 ALC888_ACER_ASPIRE_7730G),
9001 /* default Acer -- disabled as it causes more problems.
9002 * model=auto should work fine now
9004 /* SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), */
9006 SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL),
9008 SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG),
9009 SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP),
9010 SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP),
9011 SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG),
9012 SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP),
9013 SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP),
9015 SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J),
9016 SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J),
9017 SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M),
9018 SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),
9019 SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC),
9020 SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),
9021 SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),
9022 SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG),
9023 SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),
9024 SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q),
9025 SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601),
9027 SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC883_SONY_VAIO_TT),
9028 SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG),
9029 SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG),
9030 SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC),
9031 SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC),
9032 SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD),
9033 SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL),
9034 SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch),
9035 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG),
9037 SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG),
9038 SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG),
9039 SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG),
9040 SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8 */
9041 SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC882_AUTO),
9042 SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG),
9043 SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG),
9044 SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG),
9045 SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG),
9046 SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG),
9047 SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG),
9048 SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG),
9049 SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG),
9050 SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG),
9051 SND_PCI_QUIRK(0x1462, 0x42cd, "MSI", ALC883_TARGA_DIG),
9052 SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG),
9053 SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG),
9054 SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG),
9055 SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG),
9056 SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG),
9057 SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG),
9058 SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG),
9059 SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG),
9060 SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG),
9061 SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG),
9062 SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG),
9063 SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG),
9064 SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG),
9065 SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG),
9067 SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG),
9068 SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720),
9069 SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720),
9070 SND_PCI_QUIRK(0x1558, 0x5409, "Clevo laptop M540R", ALC883_CLEVO_M540R),
9071 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD),
9072 SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
9073 /* SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), */
9074 SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
9075 SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx",
9076 ALC883_FUJITSU_PI2515),
9077 SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx",
9078 ALC888_FUJITSU_XA3530),
9079 SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch),
9080 SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9081 SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9082 SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9083 SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY),
9084 SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2),
9085 SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
9086 SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
9087 SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
9089 SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
9090 SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL),
9091 SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC),
9092 SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL),
9093 SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL),
9094 SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL),
9095 SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC883_3ST_6ch),
9100 /* codec SSID table for Intel Mac */
9101 static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
9102 SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3),
9103 SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3),
9104 SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3),
9105 SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_MACPRO),
9106 SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24),
9107 SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24),
9108 SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3),
9109 SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31),
9110 SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3),
9111 SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24),
9112 SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91),
9113 SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5),
9114 /* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2,
9115 * so apparently no perfect solution yet
9117 SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5),
9118 SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC885_MB5),
9122 static struct alc_config_preset alc882_presets[] = {
9123 [ALC882_3ST_DIG] = {
9124 .mixers = { alc882_base_mixer },
9125 .init_verbs = { alc882_base_init_verbs,
9126 alc882_adc1_init_verbs },
9127 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9128 .dac_nids = alc882_dac_nids,
9129 .dig_out_nid = ALC882_DIGOUT_NID,
9130 .dig_in_nid = ALC882_DIGIN_NID,
9131 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9132 .channel_mode = alc882_ch_modes,
9134 .input_mux = &alc882_capture_source,
9136 [ALC882_6ST_DIG] = {
9137 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
9138 .init_verbs = { alc882_base_init_verbs,
9139 alc882_adc1_init_verbs },
9140 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9141 .dac_nids = alc882_dac_nids,
9142 .dig_out_nid = ALC882_DIGOUT_NID,
9143 .dig_in_nid = ALC882_DIGIN_NID,
9144 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9145 .channel_mode = alc882_sixstack_modes,
9146 .input_mux = &alc882_capture_source,
9149 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
9150 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9151 alc882_eapd_verbs },
9152 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9153 .dac_nids = alc882_dac_nids,
9154 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9155 .channel_mode = alc882_sixstack_modes,
9156 .input_mux = &alc882_capture_source,
9159 .mixers = { alc882_w2jc_mixer, alc882_chmode_mixer },
9160 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9161 alc882_eapd_verbs, alc880_gpio1_init_verbs },
9162 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9163 .dac_nids = alc882_dac_nids,
9164 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9165 .channel_mode = alc880_threestack_modes,
9167 .input_mux = &alc882_capture_source,
9168 .dig_out_nid = ALC882_DIGOUT_NID,
9171 .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer },
9172 .init_verbs = { alc885_mbp3_init_verbs,
9173 alc880_gpio1_init_verbs },
9175 .dac_nids = alc882_dac_nids,
9177 .channel_mode = alc885_mbp_4ch_modes,
9178 .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
9179 .input_mux = &alc882_capture_source,
9180 .dig_out_nid = ALC882_DIGOUT_NID,
9181 .dig_in_nid = ALC882_DIGIN_NID,
9182 .unsol_event = alc_automute_amp_unsol_event,
9183 .setup = alc885_mbp3_setup,
9184 .init_hook = alc_automute_amp,
9187 .mixers = { alc885_mb5_mixer, alc882_chmode_mixer },
9188 .init_verbs = { alc885_mb5_init_verbs,
9189 alc880_gpio1_init_verbs },
9190 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9191 .dac_nids = alc882_dac_nids,
9192 .channel_mode = alc885_mb5_6ch_modes,
9193 .num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes),
9194 .input_mux = &mb5_capture_source,
9195 .dig_out_nid = ALC882_DIGOUT_NID,
9196 .dig_in_nid = ALC882_DIGIN_NID,
9197 .unsol_event = alc885_mb5_unsol_event,
9198 .init_hook = alc885_mb5_automute,
9201 .mixers = { alc882_macpro_mixer },
9202 .init_verbs = { alc882_macpro_init_verbs },
9203 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9204 .dac_nids = alc882_dac_nids,
9205 .dig_out_nid = ALC882_DIGOUT_NID,
9206 .dig_in_nid = ALC882_DIGIN_NID,
9207 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9208 .channel_mode = alc882_ch_modes,
9209 .input_mux = &alc882_capture_source,
9210 .init_hook = alc885_macpro_init_hook,
9213 .mixers = { alc885_imac24_mixer },
9214 .init_verbs = { alc885_imac24_init_verbs },
9215 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9216 .dac_nids = alc882_dac_nids,
9217 .dig_out_nid = ALC882_DIGOUT_NID,
9218 .dig_in_nid = ALC882_DIGIN_NID,
9219 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9220 .channel_mode = alc882_ch_modes,
9221 .input_mux = &alc882_capture_source,
9222 .unsol_event = alc_automute_amp_unsol_event,
9223 .setup = alc885_imac24_setup,
9224 .init_hook = alc885_imac24_init_hook,
9227 .mixers = { alc885_imac91_mixer, alc882_chmode_mixer },
9228 .init_verbs = { alc885_imac91_init_verbs,
9229 alc880_gpio1_init_verbs },
9230 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9231 .dac_nids = alc882_dac_nids,
9232 .channel_mode = alc885_mbp_4ch_modes,
9233 .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
9234 .input_mux = &alc882_capture_source,
9235 .dig_out_nid = ALC882_DIGOUT_NID,
9236 .dig_in_nid = ALC882_DIGIN_NID,
9237 .unsol_event = alc885_imac91_unsol_event,
9238 .init_hook = alc885_imac91_automute,
9241 .mixers = { alc882_targa_mixer, alc882_chmode_mixer },
9242 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9243 alc880_gpio3_init_verbs, alc882_targa_verbs},
9244 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9245 .dac_nids = alc882_dac_nids,
9246 .dig_out_nid = ALC882_DIGOUT_NID,
9247 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9248 .adc_nids = alc882_adc_nids,
9249 .capsrc_nids = alc882_capsrc_nids,
9250 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9251 .channel_mode = alc882_3ST_6ch_modes,
9253 .input_mux = &alc882_capture_source,
9254 .unsol_event = alc882_targa_unsol_event,
9255 .setup = alc882_targa_setup,
9256 .init_hook = alc882_targa_automute,
9258 [ALC882_ASUS_A7J] = {
9259 .mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer },
9260 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9261 alc882_asus_a7j_verbs},
9262 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9263 .dac_nids = alc882_dac_nids,
9264 .dig_out_nid = ALC882_DIGOUT_NID,
9265 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9266 .adc_nids = alc882_adc_nids,
9267 .capsrc_nids = alc882_capsrc_nids,
9268 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9269 .channel_mode = alc882_3ST_6ch_modes,
9271 .input_mux = &alc882_capture_source,
9273 [ALC882_ASUS_A7M] = {
9274 .mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer },
9275 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9276 alc882_eapd_verbs, alc880_gpio1_init_verbs,
9277 alc882_asus_a7m_verbs },
9278 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9279 .dac_nids = alc882_dac_nids,
9280 .dig_out_nid = ALC882_DIGOUT_NID,
9281 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9282 .channel_mode = alc880_threestack_modes,
9284 .input_mux = &alc882_capture_source,
9286 [ALC883_3ST_2ch_DIG] = {
9287 .mixers = { alc883_3ST_2ch_mixer },
9288 .init_verbs = { alc883_init_verbs },
9289 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9290 .dac_nids = alc883_dac_nids,
9291 .dig_out_nid = ALC883_DIGOUT_NID,
9292 .dig_in_nid = ALC883_DIGIN_NID,
9293 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9294 .channel_mode = alc883_3ST_2ch_modes,
9295 .input_mux = &alc883_capture_source,
9297 [ALC883_3ST_6ch_DIG] = {
9298 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9299 .init_verbs = { alc883_init_verbs },
9300 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9301 .dac_nids = alc883_dac_nids,
9302 .dig_out_nid = ALC883_DIGOUT_NID,
9303 .dig_in_nid = ALC883_DIGIN_NID,
9304 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9305 .channel_mode = alc883_3ST_6ch_modes,
9307 .input_mux = &alc883_capture_source,
9309 [ALC883_3ST_6ch] = {
9310 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9311 .init_verbs = { alc883_init_verbs },
9312 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9313 .dac_nids = alc883_dac_nids,
9314 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9315 .channel_mode = alc883_3ST_6ch_modes,
9317 .input_mux = &alc883_capture_source,
9319 [ALC883_3ST_6ch_INTEL] = {
9320 .mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer },
9321 .init_verbs = { alc883_init_verbs },
9322 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9323 .dac_nids = alc883_dac_nids,
9324 .dig_out_nid = ALC883_DIGOUT_NID,
9325 .dig_in_nid = ALC883_DIGIN_NID,
9326 .slave_dig_outs = alc883_slave_dig_outs,
9327 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes),
9328 .channel_mode = alc883_3ST_6ch_intel_modes,
9330 .input_mux = &alc883_3stack_6ch_intel,
9333 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9334 .init_verbs = { alc885_init_verbs, alc885_init_input_verbs,
9335 alc_hp15_unsol_verbs },
9336 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9337 .dac_nids = alc883_dac_nids,
9338 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9339 .adc_nids = alc889_adc_nids,
9340 .dig_out_nid = ALC883_DIGOUT_NID,
9341 .dig_in_nid = ALC883_DIGIN_NID,
9342 .slave_dig_outs = alc883_slave_dig_outs,
9343 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9344 .channel_mode = alc889_8ch_intel_modes,
9345 .capsrc_nids = alc889_capsrc_nids,
9346 .input_mux = &alc889_capture_source,
9347 .setup = alc889_automute_setup,
9348 .init_hook = alc_automute_amp,
9349 .unsol_event = alc_automute_amp_unsol_event,
9353 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9354 .init_verbs = { alc885_init_verbs, alc889_init_input_verbs,
9355 alc889_eapd_verbs, alc_hp15_unsol_verbs},
9356 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9357 .dac_nids = alc883_dac_nids,
9358 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9359 .adc_nids = alc889_adc_nids,
9360 .dig_out_nid = ALC883_DIGOUT_NID,
9361 .dig_in_nid = ALC883_DIGIN_NID,
9362 .slave_dig_outs = alc883_slave_dig_outs,
9363 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9364 .channel_mode = alc889_8ch_intel_modes,
9365 .capsrc_nids = alc889_capsrc_nids,
9366 .input_mux = &alc889_capture_source,
9367 .setup = alc889_automute_setup,
9368 .init_hook = alc889_intel_init_hook,
9369 .unsol_event = alc_automute_amp_unsol_event,
9372 [ALC883_6ST_DIG] = {
9373 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
9374 .init_verbs = { alc883_init_verbs },
9375 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9376 .dac_nids = alc883_dac_nids,
9377 .dig_out_nid = ALC883_DIGOUT_NID,
9378 .dig_in_nid = ALC883_DIGIN_NID,
9379 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9380 .channel_mode = alc883_sixstack_modes,
9381 .input_mux = &alc883_capture_source,
9383 [ALC883_TARGA_DIG] = {
9384 .mixers = { alc883_targa_mixer, alc883_chmode_mixer },
9385 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9386 alc883_targa_verbs},
9387 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9388 .dac_nids = alc883_dac_nids,
9389 .dig_out_nid = ALC883_DIGOUT_NID,
9390 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9391 .channel_mode = alc883_3ST_6ch_modes,
9393 .input_mux = &alc883_capture_source,
9394 .unsol_event = alc883_targa_unsol_event,
9395 .setup = alc882_targa_setup,
9396 .init_hook = alc882_targa_automute,
9398 [ALC883_TARGA_2ch_DIG] = {
9399 .mixers = { alc883_targa_2ch_mixer},
9400 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9401 alc883_targa_verbs},
9402 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9403 .dac_nids = alc883_dac_nids,
9404 .adc_nids = alc883_adc_nids_alt,
9405 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9406 .capsrc_nids = alc883_capsrc_nids,
9407 .dig_out_nid = ALC883_DIGOUT_NID,
9408 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9409 .channel_mode = alc883_3ST_2ch_modes,
9410 .input_mux = &alc883_capture_source,
9411 .unsol_event = alc883_targa_unsol_event,
9412 .setup = alc882_targa_setup,
9413 .init_hook = alc882_targa_automute,
9415 [ALC883_TARGA_8ch_DIG] = {
9416 .mixers = { alc883_targa_mixer, alc883_targa_8ch_mixer,
9417 alc883_chmode_mixer },
9418 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9419 alc883_targa_verbs },
9420 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9421 .dac_nids = alc883_dac_nids,
9422 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9423 .adc_nids = alc883_adc_nids_rev,
9424 .capsrc_nids = alc883_capsrc_nids_rev,
9425 .dig_out_nid = ALC883_DIGOUT_NID,
9426 .dig_in_nid = ALC883_DIGIN_NID,
9427 .num_channel_mode = ARRAY_SIZE(alc883_4ST_8ch_modes),
9428 .channel_mode = alc883_4ST_8ch_modes,
9430 .input_mux = &alc883_capture_source,
9431 .unsol_event = alc883_targa_unsol_event,
9432 .setup = alc882_targa_setup,
9433 .init_hook = alc882_targa_automute,
9436 .mixers = { alc883_base_mixer },
9437 /* On TravelMate laptops, GPIO 0 enables the internal speaker
9438 * and the headphone jack. Turn this on and rely on the
9439 * standard mute methods whenever the user wants to turn
9440 * these outputs off.
9442 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs },
9443 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9444 .dac_nids = alc883_dac_nids,
9445 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9446 .channel_mode = alc883_3ST_2ch_modes,
9447 .input_mux = &alc883_capture_source,
9449 [ALC883_ACER_ASPIRE] = {
9450 .mixers = { alc883_acer_aspire_mixer },
9451 .init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs },
9452 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9453 .dac_nids = alc883_dac_nids,
9454 .dig_out_nid = ALC883_DIGOUT_NID,
9455 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9456 .channel_mode = alc883_3ST_2ch_modes,
9457 .input_mux = &alc883_capture_source,
9458 .unsol_event = alc_automute_amp_unsol_event,
9459 .setup = alc883_acer_aspire_setup,
9460 .init_hook = alc_automute_amp,
9462 [ALC888_ACER_ASPIRE_4930G] = {
9463 .mixers = { alc888_base_mixer,
9464 alc883_chmode_mixer },
9465 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9466 alc888_acer_aspire_4930g_verbs },
9467 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9468 .dac_nids = alc883_dac_nids,
9469 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9470 .adc_nids = alc883_adc_nids_rev,
9471 .capsrc_nids = alc883_capsrc_nids_rev,
9472 .dig_out_nid = ALC883_DIGOUT_NID,
9473 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9474 .channel_mode = alc883_3ST_6ch_modes,
9477 ARRAY_SIZE(alc888_2_capture_sources),
9478 .input_mux = alc888_2_capture_sources,
9479 .unsol_event = alc_automute_amp_unsol_event,
9480 .setup = alc888_acer_aspire_4930g_setup,
9481 .init_hook = alc_automute_amp,
9483 [ALC888_ACER_ASPIRE_6530G] = {
9484 .mixers = { alc888_acer_aspire_6530_mixer },
9485 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9486 alc888_acer_aspire_6530g_verbs },
9487 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9488 .dac_nids = alc883_dac_nids,
9489 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9490 .adc_nids = alc883_adc_nids_rev,
9491 .capsrc_nids = alc883_capsrc_nids_rev,
9492 .dig_out_nid = ALC883_DIGOUT_NID,
9493 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9494 .channel_mode = alc883_3ST_2ch_modes,
9496 ARRAY_SIZE(alc888_2_capture_sources),
9497 .input_mux = alc888_acer_aspire_6530_sources,
9498 .unsol_event = alc_automute_amp_unsol_event,
9499 .setup = alc888_acer_aspire_6530g_setup,
9500 .init_hook = alc_automute_amp,
9502 [ALC888_ACER_ASPIRE_8930G] = {
9503 .mixers = { alc889_acer_aspire_8930g_mixer,
9504 alc883_chmode_mixer },
9505 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9506 alc889_acer_aspire_8930g_verbs,
9508 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9509 .dac_nids = alc883_dac_nids,
9510 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9511 .adc_nids = alc889_adc_nids,
9512 .capsrc_nids = alc889_capsrc_nids,
9513 .dig_out_nid = ALC883_DIGOUT_NID,
9514 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9515 .channel_mode = alc883_3ST_6ch_modes,
9517 .const_channel_count = 6,
9519 ARRAY_SIZE(alc889_capture_sources),
9520 .input_mux = alc889_capture_sources,
9521 .unsol_event = alc_automute_amp_unsol_event,
9522 .setup = alc889_acer_aspire_8930g_setup,
9523 .init_hook = alc_automute_amp,
9524 #ifdef CONFIG_SND_HDA_POWER_SAVE
9525 .power_hook = alc889_power_eapd,
9528 [ALC888_ACER_ASPIRE_7730G] = {
9529 .mixers = { alc883_3ST_6ch_mixer,
9530 alc883_chmode_mixer },
9531 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
9532 alc888_acer_aspire_7730G_verbs },
9533 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9534 .dac_nids = alc883_dac_nids,
9535 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9536 .adc_nids = alc883_adc_nids_rev,
9537 .capsrc_nids = alc883_capsrc_nids_rev,
9538 .dig_out_nid = ALC883_DIGOUT_NID,
9539 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9540 .channel_mode = alc883_3ST_6ch_modes,
9542 .const_channel_count = 6,
9543 .input_mux = &alc883_capture_source,
9544 .unsol_event = alc_automute_amp_unsol_event,
9545 .setup = alc888_acer_aspire_6530g_setup,
9546 .init_hook = alc_automute_amp,
9549 .mixers = { alc883_fivestack_mixer,
9550 alc883_chmode_mixer },
9551 .init_verbs = { alc883_init_verbs,
9552 alc883_medion_eapd_verbs },
9553 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9554 .dac_nids = alc883_dac_nids,
9555 .adc_nids = alc883_adc_nids_alt,
9556 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9557 .capsrc_nids = alc883_capsrc_nids,
9558 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9559 .channel_mode = alc883_sixstack_modes,
9560 .input_mux = &alc883_capture_source,
9562 [ALC883_MEDION_MD2] = {
9563 .mixers = { alc883_medion_md2_mixer},
9564 .init_verbs = { alc883_init_verbs, alc883_medion_md2_verbs},
9565 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9566 .dac_nids = alc883_dac_nids,
9567 .dig_out_nid = ALC883_DIGOUT_NID,
9568 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9569 .channel_mode = alc883_3ST_2ch_modes,
9570 .input_mux = &alc883_capture_source,
9571 .unsol_event = alc_automute_amp_unsol_event,
9572 .setup = alc883_medion_md2_setup,
9573 .init_hook = alc_automute_amp,
9575 [ALC883_LAPTOP_EAPD] = {
9576 .mixers = { alc883_base_mixer },
9577 .init_verbs = { alc883_init_verbs, alc882_eapd_verbs },
9578 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9579 .dac_nids = alc883_dac_nids,
9580 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9581 .channel_mode = alc883_3ST_2ch_modes,
9582 .input_mux = &alc883_capture_source,
9584 [ALC883_CLEVO_M540R] = {
9585 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9586 .init_verbs = { alc883_init_verbs, alc883_clevo_m540r_verbs },
9587 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9588 .dac_nids = alc883_dac_nids,
9589 .dig_out_nid = ALC883_DIGOUT_NID,
9590 .dig_in_nid = ALC883_DIGIN_NID,
9591 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_clevo_modes),
9592 .channel_mode = alc883_3ST_6ch_clevo_modes,
9594 .input_mux = &alc883_capture_source,
9595 /* This machine has the hardware HP auto-muting, thus
9596 * we need no software mute via unsol event
9599 [ALC883_CLEVO_M720] = {
9600 .mixers = { alc883_clevo_m720_mixer },
9601 .init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs },
9602 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9603 .dac_nids = alc883_dac_nids,
9604 .dig_out_nid = ALC883_DIGOUT_NID,
9605 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9606 .channel_mode = alc883_3ST_2ch_modes,
9607 .input_mux = &alc883_capture_source,
9608 .unsol_event = alc883_clevo_m720_unsol_event,
9609 .setup = alc883_clevo_m720_setup,
9610 .init_hook = alc883_clevo_m720_init_hook,
9612 [ALC883_LENOVO_101E_2ch] = {
9613 .mixers = { alc883_lenovo_101e_2ch_mixer},
9614 .init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs},
9615 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9616 .dac_nids = alc883_dac_nids,
9617 .adc_nids = alc883_adc_nids_alt,
9618 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
9619 .capsrc_nids = alc883_capsrc_nids,
9620 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9621 .channel_mode = alc883_3ST_2ch_modes,
9622 .input_mux = &alc883_lenovo_101e_capture_source,
9623 .unsol_event = alc883_lenovo_101e_unsol_event,
9624 .init_hook = alc883_lenovo_101e_all_automute,
9626 [ALC883_LENOVO_NB0763] = {
9627 .mixers = { alc883_lenovo_nb0763_mixer },
9628 .init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs},
9629 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9630 .dac_nids = alc883_dac_nids,
9631 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9632 .channel_mode = alc883_3ST_2ch_modes,
9634 .input_mux = &alc883_lenovo_nb0763_capture_source,
9635 .unsol_event = alc_automute_amp_unsol_event,
9636 .setup = alc883_medion_md2_setup,
9637 .init_hook = alc_automute_amp,
9639 [ALC888_LENOVO_MS7195_DIG] = {
9640 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9641 .init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs},
9642 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9643 .dac_nids = alc883_dac_nids,
9644 .dig_out_nid = ALC883_DIGOUT_NID,
9645 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9646 .channel_mode = alc883_3ST_6ch_modes,
9648 .input_mux = &alc883_capture_source,
9649 .unsol_event = alc883_lenovo_ms7195_unsol_event,
9650 .init_hook = alc888_lenovo_ms7195_front_automute,
9652 [ALC883_HAIER_W66] = {
9653 .mixers = { alc883_targa_2ch_mixer},
9654 .init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs},
9655 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9656 .dac_nids = alc883_dac_nids,
9657 .dig_out_nid = ALC883_DIGOUT_NID,
9658 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9659 .channel_mode = alc883_3ST_2ch_modes,
9660 .input_mux = &alc883_capture_source,
9661 .unsol_event = alc_automute_amp_unsol_event,
9662 .setup = alc883_haier_w66_setup,
9663 .init_hook = alc_automute_amp,
9666 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9667 .init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs },
9668 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9669 .dac_nids = alc883_dac_nids,
9670 .num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes),
9671 .channel_mode = alc888_3st_hp_modes,
9673 .input_mux = &alc883_capture_source,
9674 .unsol_event = alc_automute_amp_unsol_event,
9675 .setup = alc888_3st_hp_setup,
9676 .init_hook = alc_automute_amp,
9678 [ALC888_6ST_DELL] = {
9679 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
9680 .init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs },
9681 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9682 .dac_nids = alc883_dac_nids,
9683 .dig_out_nid = ALC883_DIGOUT_NID,
9684 .dig_in_nid = ALC883_DIGIN_NID,
9685 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9686 .channel_mode = alc883_sixstack_modes,
9687 .input_mux = &alc883_capture_source,
9688 .unsol_event = alc_automute_amp_unsol_event,
9689 .setup = alc888_6st_dell_setup,
9690 .init_hook = alc_automute_amp,
9693 .mixers = { alc883_mitac_mixer },
9694 .init_verbs = { alc883_init_verbs, alc883_mitac_verbs },
9695 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9696 .dac_nids = alc883_dac_nids,
9697 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9698 .channel_mode = alc883_3ST_2ch_modes,
9699 .input_mux = &alc883_capture_source,
9700 .unsol_event = alc_automute_amp_unsol_event,
9701 .setup = alc883_mitac_setup,
9702 .init_hook = alc_automute_amp,
9704 [ALC883_FUJITSU_PI2515] = {
9705 .mixers = { alc883_2ch_fujitsu_pi2515_mixer },
9706 .init_verbs = { alc883_init_verbs,
9707 alc883_2ch_fujitsu_pi2515_verbs},
9708 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9709 .dac_nids = alc883_dac_nids,
9710 .dig_out_nid = ALC883_DIGOUT_NID,
9711 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9712 .channel_mode = alc883_3ST_2ch_modes,
9713 .input_mux = &alc883_fujitsu_pi2515_capture_source,
9714 .unsol_event = alc_automute_amp_unsol_event,
9715 .setup = alc883_2ch_fujitsu_pi2515_setup,
9716 .init_hook = alc_automute_amp,
9718 [ALC888_FUJITSU_XA3530] = {
9719 .mixers = { alc888_base_mixer, alc883_chmode_mixer },
9720 .init_verbs = { alc883_init_verbs,
9721 alc888_fujitsu_xa3530_verbs },
9722 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9723 .dac_nids = alc883_dac_nids,
9724 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
9725 .adc_nids = alc883_adc_nids_rev,
9726 .capsrc_nids = alc883_capsrc_nids_rev,
9727 .dig_out_nid = ALC883_DIGOUT_NID,
9728 .num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes),
9729 .channel_mode = alc888_4ST_8ch_intel_modes,
9731 ARRAY_SIZE(alc888_2_capture_sources),
9732 .input_mux = alc888_2_capture_sources,
9733 .unsol_event = alc_automute_amp_unsol_event,
9734 .setup = alc888_fujitsu_xa3530_setup,
9735 .init_hook = alc_automute_amp,
9737 [ALC888_LENOVO_SKY] = {
9738 .mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer },
9739 .init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs},
9740 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9741 .dac_nids = alc883_dac_nids,
9742 .dig_out_nid = ALC883_DIGOUT_NID,
9743 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9744 .channel_mode = alc883_sixstack_modes,
9746 .input_mux = &alc883_lenovo_sky_capture_source,
9747 .unsol_event = alc_automute_amp_unsol_event,
9748 .setup = alc888_lenovo_sky_setup,
9749 .init_hook = alc_automute_amp,
9751 [ALC888_ASUS_M90V] = {
9752 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9753 .init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs },
9754 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9755 .dac_nids = alc883_dac_nids,
9756 .dig_out_nid = ALC883_DIGOUT_NID,
9757 .dig_in_nid = ALC883_DIGIN_NID,
9758 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9759 .channel_mode = alc883_3ST_6ch_modes,
9761 .input_mux = &alc883_fujitsu_pi2515_capture_source,
9762 .unsol_event = alc_sku_unsol_event,
9763 .setup = alc883_mode2_setup,
9764 .init_hook = alc_inithook,
9766 [ALC888_ASUS_EEE1601] = {
9767 .mixers = { alc883_asus_eee1601_mixer },
9768 .cap_mixer = alc883_asus_eee1601_cap_mixer,
9769 .init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs },
9770 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9771 .dac_nids = alc883_dac_nids,
9772 .dig_out_nid = ALC883_DIGOUT_NID,
9773 .dig_in_nid = ALC883_DIGIN_NID,
9774 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9775 .channel_mode = alc883_3ST_2ch_modes,
9777 .input_mux = &alc883_asus_eee1601_capture_source,
9778 .unsol_event = alc_sku_unsol_event,
9779 .init_hook = alc883_eee1601_inithook,
9781 [ALC1200_ASUS_P5Q] = {
9782 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
9783 .init_verbs = { alc883_init_verbs },
9784 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9785 .dac_nids = alc883_dac_nids,
9786 .dig_out_nid = ALC1200_DIGOUT_NID,
9787 .dig_in_nid = ALC883_DIGIN_NID,
9788 .slave_dig_outs = alc1200_slave_dig_outs,
9789 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9790 .channel_mode = alc883_sixstack_modes,
9791 .input_mux = &alc883_capture_source,
9794 .mixers = { alc889A_mb31_mixer, alc883_chmode_mixer},
9795 .init_verbs = { alc883_init_verbs, alc889A_mb31_verbs,
9796 alc880_gpio1_init_verbs },
9797 .adc_nids = alc883_adc_nids,
9798 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
9799 .capsrc_nids = alc883_capsrc_nids,
9800 .dac_nids = alc883_dac_nids,
9801 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9802 .channel_mode = alc889A_mb31_6ch_modes,
9803 .num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes),
9804 .input_mux = &alc889A_mb31_capture_source,
9805 .dig_out_nid = ALC883_DIGOUT_NID,
9806 .unsol_event = alc889A_mb31_unsol_event,
9807 .init_hook = alc889A_mb31_automute,
9809 [ALC883_SONY_VAIO_TT] = {
9810 .mixers = { alc883_vaiott_mixer },
9811 .init_verbs = { alc883_init_verbs, alc883_vaiott_verbs },
9812 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9813 .dac_nids = alc883_dac_nids,
9814 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9815 .channel_mode = alc883_3ST_2ch_modes,
9816 .input_mux = &alc883_capture_source,
9817 .unsol_event = alc_automute_amp_unsol_event,
9818 .setup = alc883_vaiott_setup,
9819 .init_hook = alc_automute_amp,
9828 PINFIX_ABIT_AW9D_MAX
9831 static struct alc_pincfg alc882_abit_aw9d_pinfix[] = {
9832 { 0x15, 0x01080104 }, /* side */
9833 { 0x16, 0x01011012 }, /* rear */
9834 { 0x17, 0x01016011 }, /* clfe */
9838 static const struct alc_fixup alc882_fixups[] = {
9839 [PINFIX_ABIT_AW9D_MAX] = {
9840 .pins = alc882_abit_aw9d_pinfix
9844 static struct snd_pci_quirk alc882_fixup_tbl[] = {
9845 SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
9850 * BIOS auto configuration
9852 static int alc882_auto_create_input_ctls(struct hda_codec *codec,
9853 const struct auto_pin_cfg *cfg)
9855 return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x23, 0x22);
9858 static void alc882_auto_set_output_and_unmute(struct hda_codec *codec,
9859 hda_nid_t nid, int pin_type,
9863 struct alc_spec *spec = codec->spec;
9866 alc_set_pin_output(codec, nid, pin_type);
9867 if (spec->multiout.dac_nids[dac_idx] == 0x25)
9870 idx = spec->multiout.dac_nids[dac_idx] - 2;
9871 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
9875 static void alc882_auto_init_multi_out(struct hda_codec *codec)
9877 struct alc_spec *spec = codec->spec;
9880 for (i = 0; i <= HDA_SIDE; i++) {
9881 hda_nid_t nid = spec->autocfg.line_out_pins[i];
9882 int pin_type = get_pin_type(spec->autocfg.line_out_type);
9884 alc882_auto_set_output_and_unmute(codec, nid, pin_type,
9889 static void alc882_auto_init_hp_out(struct hda_codec *codec)
9891 struct alc_spec *spec = codec->spec;
9894 pin = spec->autocfg.hp_pins[0];
9895 if (pin) /* connect to front */
9897 alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
9898 pin = spec->autocfg.speaker_pins[0];
9900 alc882_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
9903 static void alc882_auto_init_analog_input(struct hda_codec *codec)
9905 struct alc_spec *spec = codec->spec;
9908 for (i = 0; i < AUTO_PIN_LAST; i++) {
9909 hda_nid_t nid = spec->autocfg.input_pins[i];
9912 alc_set_input_pin(codec, nid, i);
9913 if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
9914 snd_hda_codec_write(codec, nid, 0,
9915 AC_VERB_SET_AMP_GAIN_MUTE,
9920 static void alc882_auto_init_input_src(struct hda_codec *codec)
9922 struct alc_spec *spec = codec->spec;
9925 for (c = 0; c < spec->num_adc_nids; c++) {
9926 hda_nid_t conn_list[HDA_MAX_NUM_INPUTS];
9927 hda_nid_t nid = spec->capsrc_nids[c];
9928 unsigned int mux_idx;
9929 const struct hda_input_mux *imux;
9930 int conns, mute, idx, item;
9932 conns = snd_hda_get_connections(codec, nid, conn_list,
9933 ARRAY_SIZE(conn_list));
9936 mux_idx = c >= spec->num_mux_defs ? 0 : c;
9937 imux = &spec->input_mux[mux_idx];
9938 for (idx = 0; idx < conns; idx++) {
9939 /* if the current connection is the selected one,
9940 * unmute it as default - otherwise mute it
9942 mute = AMP_IN_MUTE(idx);
9943 for (item = 0; item < imux->num_items; item++) {
9944 if (imux->items[item].index == idx) {
9945 if (spec->cur_mux[c] == item)
9946 mute = AMP_IN_UNMUTE(idx);
9950 /* check if we have a selector or mixer
9951 * we could check for the widget type instead, but
9952 * just check for Amp-In presence (in case of mixer
9953 * without amp-in there is something wrong, this
9954 * function shouldn't be used or capsrc nid is wrong)
9956 if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)
9957 snd_hda_codec_write(codec, nid, 0,
9958 AC_VERB_SET_AMP_GAIN_MUTE,
9960 else if (mute != AMP_IN_MUTE(idx))
9961 snd_hda_codec_write(codec, nid, 0,
9962 AC_VERB_SET_CONNECT_SEL,
9968 /* add mic boosts if needed */
9969 static int alc_auto_add_mic_boost(struct hda_codec *codec)
9971 struct alc_spec *spec = codec->spec;
9975 nid = spec->autocfg.input_pins[AUTO_PIN_MIC];
9976 if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
9977 err = add_control(spec, ALC_CTL_WIDGET_VOL,
9979 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
9983 nid = spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC];
9984 if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
9985 err = add_control(spec, ALC_CTL_WIDGET_VOL,
9987 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
9994 /* almost identical with ALC880 parser... */
9995 static int alc882_parse_auto_config(struct hda_codec *codec)
9997 struct alc_spec *spec = codec->spec;
9998 static hda_nid_t alc882_ignore[] = { 0x1d, 0 };
10001 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
10005 if (!spec->autocfg.line_outs)
10006 return 0; /* can't find valid BIOS pin config */
10008 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
10011 err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
10014 err = alc880_auto_create_extra_out(spec,
10015 spec->autocfg.speaker_pins[0],
10019 err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
10023 err = alc882_auto_create_input_ctls(codec, &spec->autocfg);
10027 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
10029 /* check multiple SPDIF-out (for recent codecs) */
10030 for (i = 0; i < spec->autocfg.dig_outs; i++) {
10032 err = snd_hda_get_connections(codec,
10033 spec->autocfg.dig_out_pins[i],
10038 spec->multiout.dig_out_nid = dig_nid;
10040 spec->multiout.slave_dig_outs = spec->slave_dig_outs;
10041 if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
10043 spec->slave_dig_outs[i - 1] = dig_nid;
10046 if (spec->autocfg.dig_in_pin)
10047 spec->dig_in_nid = ALC880_DIGIN_NID;
10049 if (spec->kctls.list)
10050 add_mixer(spec, spec->kctls.list);
10052 add_verb(spec, alc883_auto_init_verbs);
10053 /* if ADC 0x07 is available, initialize it, too */
10054 if (get_wcaps_type(get_wcaps(codec, 0x07)) == AC_WID_AUD_IN)
10055 add_verb(spec, alc882_adc1_init_verbs);
10057 spec->num_mux_defs = 1;
10058 spec->input_mux = &spec->private_imux[0];
10060 alc_ssid_check(codec, 0x15, 0x1b, 0x14);
10062 err = alc_auto_add_mic_boost(codec);
10066 return 1; /* config found */
10069 /* additional initialization for auto-configuration model */
10070 static void alc882_auto_init(struct hda_codec *codec)
10072 struct alc_spec *spec = codec->spec;
10073 alc882_auto_init_multi_out(codec);
10074 alc882_auto_init_hp_out(codec);
10075 alc882_auto_init_analog_input(codec);
10076 alc882_auto_init_input_src(codec);
10077 if (spec->unsol_event)
10078 alc_inithook(codec);
10081 static int patch_alc882(struct hda_codec *codec)
10083 struct alc_spec *spec;
10084 int err, board_config;
10086 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
10090 codec->spec = spec;
10092 switch (codec->vendor_id) {
10097 /* ALC883 and variants */
10098 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
10102 board_config = snd_hda_check_board_config(codec, ALC882_MODEL_LAST,
10106 if (board_config < 0 || board_config >= ALC882_MODEL_LAST)
10107 board_config = snd_hda_check_board_codec_sid_config(codec,
10108 ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl);
10110 if (board_config < 0 || board_config >= ALC882_MODEL_LAST) {
10111 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
10113 board_config = ALC882_AUTO;
10116 alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups);
10118 if (board_config == ALC882_AUTO) {
10119 /* automatic parse from the BIOS config */
10120 err = alc882_parse_auto_config(codec);
10126 "hda_codec: Cannot set up configuration "
10127 "from BIOS. Using base mode...\n");
10128 board_config = ALC882_3ST_DIG;
10132 err = snd_hda_attach_beep_device(codec, 0x1);
10138 if (board_config != ALC882_AUTO)
10139 setup_preset(codec, &alc882_presets[board_config]);
10141 spec->stream_analog_playback = &alc882_pcm_analog_playback;
10142 spec->stream_analog_capture = &alc882_pcm_analog_capture;
10143 /* FIXME: setup DAC5 */
10144 /*spec->stream_analog_alt_playback = &alc880_pcm_analog_alt_playback;*/
10145 spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
10147 spec->stream_digital_playback = &alc882_pcm_digital_playback;
10148 spec->stream_digital_capture = &alc882_pcm_digital_capture;
10150 if (codec->vendor_id == 0x10ec0888)
10151 spec->init_amp = ALC_INIT_DEFAULT; /* always initialize */
10153 if (!spec->adc_nids && spec->input_mux) {
10155 spec->num_adc_nids = 0;
10156 for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) {
10157 const struct hda_input_mux *imux = spec->input_mux;
10159 hda_nid_t items[16];
10160 hda_nid_t nid = alc882_adc_nids[i];
10161 unsigned int wcap = get_wcaps(codec, nid);
10163 wcap = get_wcaps_type(wcap);
10164 if (wcap != AC_WID_AUD_IN)
10166 spec->private_adc_nids[spec->num_adc_nids] = nid;
10167 err = snd_hda_get_connections(codec, nid, &cap, 1);
10170 err = snd_hda_get_connections(codec, cap, items,
10171 ARRAY_SIZE(items));
10174 for (j = 0; j < imux->num_items; j++)
10175 if (imux->items[j].index >= err)
10177 if (j < imux->num_items)
10179 spec->private_capsrc_nids[spec->num_adc_nids] = cap;
10180 spec->num_adc_nids++;
10182 spec->adc_nids = spec->private_adc_nids;
10183 spec->capsrc_nids = spec->private_capsrc_nids;
10186 set_capture_mixer(codec);
10187 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
10189 spec->vmaster_nid = 0x0c;
10191 codec->patch_ops = alc_patch_ops;
10192 if (board_config == ALC882_AUTO)
10193 spec->init_hook = alc882_auto_init;
10194 #ifdef CONFIG_SND_HDA_POWER_SAVE
10195 if (!spec->loopback.amplist)
10196 spec->loopback.amplist = alc882_loopbacks;
10198 codec->proc_widget_hook = print_realtek_coef;
10208 #define ALC262_DIGOUT_NID ALC880_DIGOUT_NID
10209 #define ALC262_DIGIN_NID ALC880_DIGIN_NID
10211 #define alc262_dac_nids alc260_dac_nids
10212 #define alc262_adc_nids alc882_adc_nids
10213 #define alc262_adc_nids_alt alc882_adc_nids_alt
10214 #define alc262_capsrc_nids alc882_capsrc_nids
10215 #define alc262_capsrc_nids_alt alc882_capsrc_nids_alt
10217 #define alc262_modes alc260_modes
10218 #define alc262_capture_source alc882_capture_source
10220 static hda_nid_t alc262_dmic_adc_nids[1] = {
10225 static hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 };
10227 static struct snd_kcontrol_new alc262_base_mixer[] = {
10228 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10229 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10230 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10231 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10232 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10233 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10234 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10235 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10236 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10237 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10238 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10239 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10240 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),
10241 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10242 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
10243 HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
10247 /* update HP, line and mono-out pins according to the master switch */
10248 static void alc262_hp_master_update(struct hda_codec *codec)
10250 struct alc_spec *spec = codec->spec;
10251 int val = spec->master_sw;
10253 /* HP & line-out */
10254 snd_hda_codec_write_cache(codec, 0x1b, 0,
10255 AC_VERB_SET_PIN_WIDGET_CONTROL,
10257 snd_hda_codec_write_cache(codec, 0x15, 0,
10258 AC_VERB_SET_PIN_WIDGET_CONTROL,
10260 /* mono (speaker) depending on the HP jack sense */
10261 val = val && !spec->jack_present;
10262 snd_hda_codec_write_cache(codec, 0x16, 0,
10263 AC_VERB_SET_PIN_WIDGET_CONTROL,
10264 val ? PIN_OUT : 0);
10267 static void alc262_hp_bpc_automute(struct hda_codec *codec)
10269 struct alc_spec *spec = codec->spec;
10271 spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
10272 alc262_hp_master_update(codec);
10275 static void alc262_hp_bpc_unsol_event(struct hda_codec *codec, unsigned int res)
10277 if ((res >> 26) != ALC880_HP_EVENT)
10279 alc262_hp_bpc_automute(codec);
10282 static void alc262_hp_wildwest_automute(struct hda_codec *codec)
10284 struct alc_spec *spec = codec->spec;
10286 spec->jack_present = snd_hda_jack_detect(codec, 0x15);
10287 alc262_hp_master_update(codec);
10290 static void alc262_hp_wildwest_unsol_event(struct hda_codec *codec,
10293 if ((res >> 26) != ALC880_HP_EVENT)
10295 alc262_hp_wildwest_automute(codec);
10298 #define alc262_hp_master_sw_get alc260_hp_master_sw_get
10300 static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol,
10301 struct snd_ctl_elem_value *ucontrol)
10303 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10304 struct alc_spec *spec = codec->spec;
10305 int val = !!*ucontrol->value.integer.value;
10307 if (val == spec->master_sw)
10309 spec->master_sw = val;
10310 alc262_hp_master_update(codec);
10314 #define ALC262_HP_MASTER_SWITCH \
10316 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
10317 .name = "Master Playback Switch", \
10318 .info = snd_ctl_boolean_mono_info, \
10319 .get = alc262_hp_master_sw_get, \
10320 .put = alc262_hp_master_sw_put, \
10323 static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = {
10324 ALC262_HP_MASTER_SWITCH,
10325 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10326 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10327 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10328 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10330 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10332 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10333 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10334 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10335 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10336 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10337 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10338 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10339 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10340 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10341 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10342 HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT),
10343 HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT),
10347 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = {
10348 ALC262_HP_MASTER_SWITCH,
10349 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10350 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10351 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10352 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10353 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10355 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10357 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x02, HDA_INPUT),
10358 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x02, HDA_INPUT),
10359 HDA_CODEC_VOLUME("Front Mic Boost", 0x1a, 0, HDA_INPUT),
10360 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10361 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10362 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10363 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10367 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = {
10368 HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10369 HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10370 HDA_CODEC_VOLUME("Rear Mic Boost", 0x18, 0, HDA_INPUT),
10374 /* mute/unmute internal speaker according to the hp jack and mute state */
10375 static void alc262_hp_t5735_setup(struct hda_codec *codec)
10377 struct alc_spec *spec = codec->spec;
10379 spec->autocfg.hp_pins[0] = 0x15;
10380 spec->autocfg.speaker_pins[0] = 0x0c; /* HACK: not actually a pin */
10383 static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = {
10384 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10385 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10386 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10387 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10388 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10389 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10390 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10394 static struct hda_verb alc262_hp_t5735_verbs[] = {
10395 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10396 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10398 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
10402 static struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = {
10403 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10404 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10405 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
10406 HDA_CODEC_MUTE("Speaker Playback Switch", 0x16, 0x0, HDA_OUTPUT),
10407 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10408 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10412 static struct hda_verb alc262_hp_rp5700_verbs[] = {
10413 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10414 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10415 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10416 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10417 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10418 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
10419 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10420 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
10421 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10422 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
10426 static struct hda_input_mux alc262_hp_rp5700_capture_source = {
10433 /* bind hp and internal speaker mute (with plug check) as master switch */
10434 static void alc262_hippo_master_update(struct hda_codec *codec)
10436 struct alc_spec *spec = codec->spec;
10437 hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10438 hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
10439 hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
10443 mute = spec->master_sw ? 0 : HDA_AMP_MUTE;
10444 snd_hda_codec_amp_stereo(codec, hp_nid, HDA_OUTPUT, 0,
10445 HDA_AMP_MUTE, mute);
10446 /* mute internal speaker per jack sense */
10447 if (spec->jack_present)
10448 mute = HDA_AMP_MUTE;
10450 snd_hda_codec_amp_stereo(codec, line_nid, HDA_OUTPUT, 0,
10451 HDA_AMP_MUTE, mute);
10452 if (speaker_nid && speaker_nid != line_nid)
10453 snd_hda_codec_amp_stereo(codec, speaker_nid, HDA_OUTPUT, 0,
10454 HDA_AMP_MUTE, mute);
10457 #define alc262_hippo_master_sw_get alc262_hp_master_sw_get
10459 static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol,
10460 struct snd_ctl_elem_value *ucontrol)
10462 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10463 struct alc_spec *spec = codec->spec;
10464 int val = !!*ucontrol->value.integer.value;
10466 if (val == spec->master_sw)
10468 spec->master_sw = val;
10469 alc262_hippo_master_update(codec);
10473 #define ALC262_HIPPO_MASTER_SWITCH \
10475 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
10476 .name = "Master Playback Switch", \
10477 .info = snd_ctl_boolean_mono_info, \
10478 .get = alc262_hippo_master_sw_get, \
10479 .put = alc262_hippo_master_sw_put, \
10482 static struct snd_kcontrol_new alc262_hippo_mixer[] = {
10483 ALC262_HIPPO_MASTER_SWITCH,
10484 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10485 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10486 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10487 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10488 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10489 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10490 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10491 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10492 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10493 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10494 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10495 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10499 static struct snd_kcontrol_new alc262_hippo1_mixer[] = {
10500 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10501 ALC262_HIPPO_MASTER_SWITCH,
10502 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10503 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10504 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10505 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10506 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10507 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10508 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10509 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10510 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10511 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10515 /* mute/unmute internal speaker according to the hp jack and mute state */
10516 static void alc262_hippo_automute(struct hda_codec *codec)
10518 struct alc_spec *spec = codec->spec;
10519 hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
10521 spec->jack_present = snd_hda_jack_detect(codec, hp_nid);
10522 alc262_hippo_master_update(codec);
10525 static void alc262_hippo_unsol_event(struct hda_codec *codec, unsigned int res)
10527 if ((res >> 26) != ALC880_HP_EVENT)
10529 alc262_hippo_automute(codec);
10532 static void alc262_hippo_setup(struct hda_codec *codec)
10534 struct alc_spec *spec = codec->spec;
10536 spec->autocfg.hp_pins[0] = 0x15;
10537 spec->autocfg.speaker_pins[0] = 0x14;
10540 static void alc262_hippo1_setup(struct hda_codec *codec)
10542 struct alc_spec *spec = codec->spec;
10544 spec->autocfg.hp_pins[0] = 0x1b;
10545 spec->autocfg.speaker_pins[0] = 0x14;
10549 static struct snd_kcontrol_new alc262_sony_mixer[] = {
10550 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10551 ALC262_HIPPO_MASTER_SWITCH,
10552 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10553 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10554 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10555 HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10559 static struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
10560 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10561 ALC262_HIPPO_MASTER_SWITCH,
10562 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10563 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10564 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10565 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10566 HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10570 static struct snd_kcontrol_new alc262_tyan_mixer[] = {
10571 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10572 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
10573 HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT),
10574 HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT),
10575 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10576 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10577 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10578 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10579 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10580 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10581 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10582 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10586 static struct hda_verb alc262_tyan_verbs[] = {
10587 /* Headphone automute */
10588 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10589 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10590 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10592 /* P11 AUX_IN, white 4-pin connector */
10593 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10594 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1},
10595 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93},
10596 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19},
10601 /* unsolicited event for HP jack sensing */
10602 static void alc262_tyan_setup(struct hda_codec *codec)
10604 struct alc_spec *spec = codec->spec;
10606 spec->autocfg.hp_pins[0] = 0x1b;
10607 spec->autocfg.speaker_pins[0] = 0x15;
10611 #define alc262_capture_mixer alc882_capture_mixer
10612 #define alc262_capture_alt_mixer alc882_capture_alt_mixer
10615 * generic initialization of ADC, input mixers and output mixers
10617 static struct hda_verb alc262_init_verbs[] = {
10619 * Unmute ADC0-2 and set the default input to mic-in
10621 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
10622 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10623 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
10624 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10625 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
10626 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10628 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
10630 * Note: PASD motherboards uses the Line In 2 as the input for
10631 * front panel mic (mic 2)
10633 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
10634 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
10635 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
10636 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
10637 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
10638 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
10641 * Set up output mixers (0x0c - 0x0e)
10643 /* set vol=0 to output mixers */
10644 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10645 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10646 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
10647 /* set up input amps for analog loopback */
10648 /* Amp Indices: DAC = 0, mixer = 1 */
10649 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10650 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10651 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10652 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10653 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
10654 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10656 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
10657 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10658 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
10659 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10660 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
10661 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
10663 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10664 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10665 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10666 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10667 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10669 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
10670 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
10672 /* FIXME: use matrix-type input source selection */
10673 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
10674 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
10675 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10676 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10677 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10678 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10680 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10681 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10682 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10683 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10685 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
10686 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
10687 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
10688 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
10693 static struct hda_verb alc262_eapd_verbs[] = {
10694 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
10695 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
10699 static struct hda_verb alc262_hippo1_unsol_verbs[] = {
10700 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10701 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
10702 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
10704 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10705 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10709 static struct hda_verb alc262_sony_unsol_verbs[] = {
10710 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
10711 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10712 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, // Front Mic
10714 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10715 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10719 static struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = {
10720 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10721 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10722 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10723 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10724 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10728 static struct hda_verb alc262_toshiba_s06_verbs[] = {
10729 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
10730 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10731 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10732 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
10733 {0x22, AC_VERB_SET_CONNECT_SEL, 0x09},
10734 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
10735 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
10736 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10740 static void alc262_toshiba_s06_setup(struct hda_codec *codec)
10742 struct alc_spec *spec = codec->spec;
10744 spec->autocfg.hp_pins[0] = 0x15;
10745 spec->autocfg.speaker_pins[0] = 0x14;
10746 spec->ext_mic.pin = 0x18;
10747 spec->ext_mic.mux_idx = 0;
10748 spec->int_mic.pin = 0x12;
10749 spec->int_mic.mux_idx = 9;
10750 spec->auto_mic = 1;
10756 * 0x16 = internal speaker
10757 * 0x18 = external mic
10760 static struct snd_kcontrol_new alc262_nec_mixer[] = {
10761 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
10762 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
10764 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10765 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10766 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10768 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10769 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10773 static struct hda_verb alc262_nec_verbs[] = {
10774 /* Unmute Speaker */
10775 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
10778 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
10779 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
10781 /* External mic to headphone */
10782 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10783 /* External mic to speaker */
10784 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
10790 * 0x14 = headphone/spdif-out, 0x15 = internal speaker,
10791 * 0x1b = port replicator headphone out
10794 #define ALC_HP_EVENT 0x37
10796 static struct hda_verb alc262_fujitsu_unsol_verbs[] = {
10797 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
10798 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10799 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
10800 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10804 static struct hda_verb alc262_lenovo_3000_unsol_verbs[] = {
10805 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
10806 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
10810 static struct hda_verb alc262_lenovo_3000_init_verbs[] = {
10811 /* Front Mic pin: input vref at 50% */
10812 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
10813 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
10817 static struct hda_input_mux alc262_fujitsu_capture_source = {
10821 { "Int Mic", 0x1 },
10826 static struct hda_input_mux alc262_HP_capture_source = {
10830 { "Front Mic", 0x1 },
10837 static struct hda_input_mux alc262_HP_D7000_capture_source = {
10841 { "Front Mic", 0x2 },
10847 /* mute/unmute internal speaker according to the hp jacks and mute state */
10848 static void alc262_fujitsu_automute(struct hda_codec *codec, int force)
10850 struct alc_spec *spec = codec->spec;
10853 if (force || !spec->sense_updated) {
10854 spec->jack_present = snd_hda_jack_detect(codec, 0x14) ||
10855 snd_hda_jack_detect(codec, 0x1b);
10856 spec->sense_updated = 1;
10858 /* unmute internal speaker only if both HPs are unplugged and
10859 * master switch is on
10861 if (spec->jack_present)
10862 mute = HDA_AMP_MUTE;
10864 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
10865 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
10866 HDA_AMP_MUTE, mute);
10869 /* unsolicited event for HP jack sensing */
10870 static void alc262_fujitsu_unsol_event(struct hda_codec *codec,
10873 if ((res >> 26) != ALC_HP_EVENT)
10875 alc262_fujitsu_automute(codec, 1);
10878 static void alc262_fujitsu_init_hook(struct hda_codec *codec)
10880 alc262_fujitsu_automute(codec, 1);
10883 /* bind volumes of both NID 0x0c and 0x0d */
10884 static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = {
10885 .ops = &snd_hda_bind_vol,
10887 HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT),
10888 HDA_COMPOSE_AMP_VAL(0x0d, 3, 0, HDA_OUTPUT),
10893 /* mute/unmute internal speaker according to the hp jack and mute state */
10894 static void alc262_lenovo_3000_automute(struct hda_codec *codec, int force)
10896 struct alc_spec *spec = codec->spec;
10899 if (force || !spec->sense_updated) {
10900 spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
10901 spec->sense_updated = 1;
10903 if (spec->jack_present) {
10904 /* mute internal speaker */
10905 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
10906 HDA_AMP_MUTE, HDA_AMP_MUTE);
10907 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
10908 HDA_AMP_MUTE, HDA_AMP_MUTE);
10910 /* unmute internal speaker if necessary */
10911 mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0);
10912 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
10913 HDA_AMP_MUTE, mute);
10914 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
10915 HDA_AMP_MUTE, mute);
10919 /* unsolicited event for HP jack sensing */
10920 static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec,
10923 if ((res >> 26) != ALC_HP_EVENT)
10925 alc262_lenovo_3000_automute(codec, 1);
10928 static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid,
10929 int dir, int idx, long *valp)
10933 for (i = 0; i < 2; i++, valp++)
10934 change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx,
10936 *valp ? 0 : HDA_AMP_MUTE);
10940 /* bind hp and internal speaker mute (with plug check) */
10941 static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
10942 struct snd_ctl_elem_value *ucontrol)
10944 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10945 long *valp = ucontrol->value.integer.value;
10948 change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
10949 change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
10951 alc262_fujitsu_automute(codec, 0);
10955 static struct snd_kcontrol_new alc262_fujitsu_mixer[] = {
10956 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
10958 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
10959 .name = "Master Playback Switch",
10960 .info = snd_hda_mixer_amp_switch_info,
10961 .get = snd_hda_mixer_amp_switch_get,
10962 .put = alc262_fujitsu_master_sw_put,
10963 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
10965 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10966 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10967 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10968 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10969 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10970 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
10971 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
10972 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
10976 /* bind hp and internal speaker mute (with plug check) */
10977 static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol,
10978 struct snd_ctl_elem_value *ucontrol)
10980 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10981 long *valp = ucontrol->value.integer.value;
10984 change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
10986 alc262_lenovo_3000_automute(codec, 0);
10990 static struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = {
10991 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
10993 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
10994 .name = "Master Playback Switch",
10995 .info = snd_hda_mixer_amp_switch_info,
10996 .get = snd_hda_mixer_amp_switch_get,
10997 .put = alc262_lenovo_3000_master_sw_put,
10998 .private_value = HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
11000 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11001 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11002 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11003 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11004 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11005 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
11006 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11007 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
11011 static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = {
11012 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11013 ALC262_HIPPO_MASTER_SWITCH,
11014 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11015 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11016 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11017 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11018 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11019 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11023 /* additional init verbs for Benq laptops */
11024 static struct hda_verb alc262_EAPD_verbs[] = {
11025 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11026 {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
11030 static struct hda_verb alc262_benq_t31_EAPD_verbs[] = {
11031 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11032 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11034 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11035 {0x20, AC_VERB_SET_PROC_COEF, 0x3050},
11039 /* Samsung Q1 Ultra Vista model setup */
11040 static struct snd_kcontrol_new alc262_ultra_mixer[] = {
11041 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11042 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
11043 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11044 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11045 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
11046 HDA_CODEC_VOLUME("Headphone Mic Boost", 0x15, 0, HDA_INPUT),
11050 static struct hda_verb alc262_ultra_verbs[] = {
11052 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11053 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11054 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11056 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11057 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11058 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11059 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
11061 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11062 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11063 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11064 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11065 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11067 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
11068 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11069 /* ADC, choose mic */
11070 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11071 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11072 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11073 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11074 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11075 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11076 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11077 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11078 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
11079 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)},
11083 /* mute/unmute internal speaker according to the hp jack and mute state */
11084 static void alc262_ultra_automute(struct hda_codec *codec)
11086 struct alc_spec *spec = codec->spec;
11090 /* auto-mute only when HP is used as HP */
11091 if (!spec->cur_mux[0]) {
11092 spec->jack_present = snd_hda_jack_detect(codec, 0x15);
11093 if (spec->jack_present)
11094 mute = HDA_AMP_MUTE;
11096 /* mute/unmute internal speaker */
11097 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11098 HDA_AMP_MUTE, mute);
11099 /* mute/unmute HP */
11100 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11101 HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE);
11104 /* unsolicited event for HP jack sensing */
11105 static void alc262_ultra_unsol_event(struct hda_codec *codec,
11108 if ((res >> 26) != ALC880_HP_EVENT)
11110 alc262_ultra_automute(codec);
11113 static struct hda_input_mux alc262_ultra_capture_source = {
11117 { "Headphone", 0x7 },
11121 static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol,
11122 struct snd_ctl_elem_value *ucontrol)
11124 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11125 struct alc_spec *spec = codec->spec;
11128 ret = alc_mux_enum_put(kcontrol, ucontrol);
11131 /* reprogram the HP pin as mic or HP according to the input source */
11132 snd_hda_codec_write_cache(codec, 0x15, 0,
11133 AC_VERB_SET_PIN_WIDGET_CONTROL,
11134 spec->cur_mux[0] ? PIN_VREF80 : PIN_HP);
11135 alc262_ultra_automute(codec); /* mute/unmute HP */
11139 static struct snd_kcontrol_new alc262_ultra_capture_mixer[] = {
11140 HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
11141 HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
11143 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11144 .name = "Capture Source",
11145 .info = alc_mux_enum_info,
11146 .get = alc_mux_enum_get,
11147 .put = alc262_ultra_mux_enum_put,
11152 /* We use two mixers depending on the output pin; 0x16 is a mono output
11153 * and thus it's bound with a different mixer.
11154 * This function returns which mixer amp should be used.
11156 static int alc262_check_volbit(hda_nid_t nid)
11160 else if (nid == 0x16)
11166 static int alc262_add_out_vol_ctl(struct alc_spec *spec, hda_nid_t nid,
11167 const char *pfx, int *vbits)
11172 vbit = alc262_check_volbit(nid);
11175 if (*vbits & vbit) /* a volume control for this mixer already there */
11179 val = HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, HDA_OUTPUT);
11181 val = HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT);
11182 return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, val);
11185 static int alc262_add_out_sw_ctl(struct alc_spec *spec, hda_nid_t nid,
11193 val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
11195 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
11196 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, val);
11199 /* add playback controls from the parsed DAC table */
11200 static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
11201 const struct auto_pin_cfg *cfg)
11207 spec->multiout.num_dacs = 1; /* only use one dac */
11208 spec->multiout.dac_nids = spec->private_dac_nids;
11209 spec->multiout.dac_nids[0] = 2;
11211 if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
11213 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11217 err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[0], pfx);
11220 err = alc262_add_out_sw_ctl(spec, cfg->speaker_pins[0], "Speaker");
11223 err = alc262_add_out_sw_ctl(spec, cfg->hp_pins[0], "Headphone");
11227 vbits = alc262_check_volbit(cfg->line_out_pins[0]) |
11228 alc262_check_volbit(cfg->speaker_pins[0]) |
11229 alc262_check_volbit(cfg->hp_pins[0]);
11230 if (vbits == 1 || vbits == 2)
11231 pfx = "Master"; /* only one mixer is used */
11232 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11237 err = alc262_add_out_vol_ctl(spec, cfg->line_out_pins[0], pfx, &vbits);
11240 err = alc262_add_out_vol_ctl(spec, cfg->speaker_pins[0], "Speaker",
11244 err = alc262_add_out_vol_ctl(spec, cfg->hp_pins[0], "Headphone",
11251 #define alc262_auto_create_input_ctls \
11252 alc882_auto_create_input_ctls
11255 * generic initialization of ADC, input mixers and output mixers
11257 static struct hda_verb alc262_volume_init_verbs[] = {
11259 * Unmute ADC0-2 and set the default input to mic-in
11261 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11262 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11263 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11264 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11265 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11266 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11268 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11270 * Note: PASD motherboards uses the Line In 2 as the input for
11271 * front panel mic (mic 2)
11273 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11274 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11275 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11276 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11277 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11278 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11281 * Set up output mixers (0x0c - 0x0f)
11283 /* set vol=0 to output mixers */
11284 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11285 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11286 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11288 /* set up input amps for analog loopback */
11289 /* Amp Indices: DAC = 0, mixer = 1 */
11290 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11291 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11292 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11293 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11294 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11295 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11297 /* FIXME: use matrix-type input source selection */
11298 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11299 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11300 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11301 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11302 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11303 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11305 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11306 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11307 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11308 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11310 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11311 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11312 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11313 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11318 static struct hda_verb alc262_HP_BPC_init_verbs[] = {
11320 * Unmute ADC0-2 and set the default input to mic-in
11322 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11323 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11324 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11325 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11326 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11327 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11329 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11331 * Note: PASD motherboards uses the Line In 2 as the input for
11332 * front panel mic (mic 2)
11334 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11335 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11336 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11337 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11338 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11339 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11340 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11341 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11344 * Set up output mixers (0x0c - 0x0e)
11346 /* set vol=0 to output mixers */
11347 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11348 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11349 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11351 /* set up input amps for analog loopback */
11352 /* Amp Indices: DAC = 0, mixer = 1 */
11353 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11354 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11355 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11356 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11357 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11358 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11360 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11361 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11362 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
11364 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11365 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11367 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11368 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11370 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11371 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11372 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11373 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11374 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11376 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11377 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11378 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11379 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11380 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11381 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11384 /* FIXME: use matrix-type input source selection */
11385 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 0b, 12 */
11386 /* Input mixer1: only unmute Mic */
11387 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11388 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11389 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11390 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11391 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11392 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11393 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11394 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11395 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11397 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11398 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11399 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11400 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11401 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11402 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11403 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11404 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11405 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11407 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11408 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
11409 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11410 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11411 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11412 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
11413 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
11414 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
11415 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
11417 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11422 static struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = {
11424 * Unmute ADC0-2 and set the default input to mic-in
11426 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11427 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11428 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11429 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11430 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11431 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11433 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11435 * Note: PASD motherboards uses the Line In 2 as the input for front
11436 * panel mic (mic 2)
11438 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11439 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11440 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11441 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11442 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11443 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11444 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11445 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11446 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
11448 * Set up output mixers (0x0c - 0x0e)
11450 /* set vol=0 to output mixers */
11451 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11452 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11453 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11455 /* set up input amps for analog loopback */
11456 /* Amp Indices: DAC = 0, mixer = 1 */
11457 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11458 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11459 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11460 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11461 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11462 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11465 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP */
11466 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Mono */
11467 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* rear MIC */
11468 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* Line in */
11469 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Front MIC */
11470 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Line out */
11471 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* CD in */
11473 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11474 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11476 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11477 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
11479 /* {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, */
11480 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11481 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11482 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 },
11483 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11484 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
11486 /* FIXME: use matrix-type input source selection */
11487 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11488 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11489 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, /*rear MIC*/
11490 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, /*Line in*/
11491 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, /*F MIC*/
11492 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, /*Front*/
11493 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, /*CD*/
11494 /* {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11495 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, /*HP*/
11497 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11498 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11499 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11500 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11501 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11502 /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11503 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11505 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11506 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11507 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
11508 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
11509 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
11510 /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
11511 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
11513 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11518 static struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = {
11520 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Front Speaker */
11521 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
11522 {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
11524 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* MIC jack */
11525 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Front MIC */
11526 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11527 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
11529 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP jack */
11530 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11531 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11536 #ifdef CONFIG_SND_HDA_POWER_SAVE
11537 #define alc262_loopbacks alc880_loopbacks
11540 /* pcm configuration: identical with ALC880 */
11541 #define alc262_pcm_analog_playback alc880_pcm_analog_playback
11542 #define alc262_pcm_analog_capture alc880_pcm_analog_capture
11543 #define alc262_pcm_digital_playback alc880_pcm_digital_playback
11544 #define alc262_pcm_digital_capture alc880_pcm_digital_capture
11547 * BIOS auto configuration
11549 static int alc262_parse_auto_config(struct hda_codec *codec)
11551 struct alc_spec *spec = codec->spec;
11553 static hda_nid_t alc262_ignore[] = { 0x1d, 0 };
11555 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
11559 if (!spec->autocfg.line_outs) {
11560 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
11561 spec->multiout.max_channels = 2;
11562 spec->no_analog = 1;
11565 return 0; /* can't find valid BIOS pin config */
11567 err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg);
11570 err = alc262_auto_create_input_ctls(codec, &spec->autocfg);
11574 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
11577 if (spec->autocfg.dig_outs) {
11578 spec->multiout.dig_out_nid = ALC262_DIGOUT_NID;
11579 spec->dig_out_type = spec->autocfg.dig_out_type[0];
11581 if (spec->autocfg.dig_in_pin)
11582 spec->dig_in_nid = ALC262_DIGIN_NID;
11584 if (spec->kctls.list)
11585 add_mixer(spec, spec->kctls.list);
11587 add_verb(spec, alc262_volume_init_verbs);
11588 spec->num_mux_defs = 1;
11589 spec->input_mux = &spec->private_imux[0];
11591 err = alc_auto_add_mic_boost(codec);
11595 alc_ssid_check(codec, 0x15, 0x14, 0x1b);
11600 #define alc262_auto_init_multi_out alc882_auto_init_multi_out
11601 #define alc262_auto_init_hp_out alc882_auto_init_hp_out
11602 #define alc262_auto_init_analog_input alc882_auto_init_analog_input
11603 #define alc262_auto_init_input_src alc882_auto_init_input_src
11606 /* init callback for auto-configuration model -- overriding the default init */
11607 static void alc262_auto_init(struct hda_codec *codec)
11609 struct alc_spec *spec = codec->spec;
11610 alc262_auto_init_multi_out(codec);
11611 alc262_auto_init_hp_out(codec);
11612 alc262_auto_init_analog_input(codec);
11613 alc262_auto_init_input_src(codec);
11614 if (spec->unsol_event)
11615 alc_inithook(codec);
11619 * configuration and preset
11621 static const char *alc262_models[ALC262_MODEL_LAST] = {
11622 [ALC262_BASIC] = "basic",
11623 [ALC262_HIPPO] = "hippo",
11624 [ALC262_HIPPO_1] = "hippo_1",
11625 [ALC262_FUJITSU] = "fujitsu",
11626 [ALC262_HP_BPC] = "hp-bpc",
11627 [ALC262_HP_BPC_D7000_WL]= "hp-bpc-d7000",
11628 [ALC262_HP_TC_T5735] = "hp-tc-t5735",
11629 [ALC262_HP_RP5700] = "hp-rp5700",
11630 [ALC262_BENQ_ED8] = "benq",
11631 [ALC262_BENQ_T31] = "benq-t31",
11632 [ALC262_SONY_ASSAMD] = "sony-assamd",
11633 [ALC262_TOSHIBA_S06] = "toshiba-s06",
11634 [ALC262_TOSHIBA_RX1] = "toshiba-rx1",
11635 [ALC262_ULTRA] = "ultra",
11636 [ALC262_LENOVO_3000] = "lenovo-3000",
11637 [ALC262_NEC] = "nec",
11638 [ALC262_TYAN] = "tyan",
11639 [ALC262_AUTO] = "auto",
11642 static struct snd_pci_quirk alc262_cfg_tbl[] = {
11643 SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
11644 SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
11645 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series",
11647 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series",
11649 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series",
11651 SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL),
11652 SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF),
11653 SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL),
11654 SND_PCI_QUIRK(0x103c, 0x2803, "HP D7000", ALC262_HP_BPC_D7000_WF),
11655 SND_PCI_QUIRK(0x103c, 0x2804, "HP D7000", ALC262_HP_BPC_D7000_WL),
11656 SND_PCI_QUIRK(0x103c, 0x2805, "HP D7000", ALC262_HP_BPC_D7000_WF),
11657 SND_PCI_QUIRK(0x103c, 0x2806, "HP D7000", ALC262_HP_BPC_D7000_WL),
11658 SND_PCI_QUIRK(0x103c, 0x2807, "HP D7000", ALC262_HP_BPC_D7000_WF),
11659 SND_PCI_QUIRK(0x103c, 0x280c, "HP xw4400", ALC262_HP_BPC),
11660 SND_PCI_QUIRK(0x103c, 0x3014, "HP xw6400", ALC262_HP_BPC),
11661 SND_PCI_QUIRK(0x103c, 0x3015, "HP xw8400", ALC262_HP_BPC),
11662 SND_PCI_QUIRK(0x103c, 0x302f, "HP Thin Client T5735",
11663 ALC262_HP_TC_T5735),
11664 SND_PCI_QUIRK(0x103c, 0x2817, "HP RP5700", ALC262_HP_RP5700),
11665 SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", ALC262_SONY_ASSAMD),
11666 SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO),
11667 SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
11668 SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
11669 SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06),
11670 SND_PCI_QUIRK(0x104d, 0x9035, "Sony VAIO VGN-FW170J", ALC262_AUTO),
11671 SND_PCI_QUIRK(0x104d, 0x9047, "Sony VAIO Type G", ALC262_AUTO),
11672 #if 0 /* disable the quirk since model=auto works better in recent versions */
11673 SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
11674 ALC262_SONY_ASSAMD),
11676 SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
11677 ALC262_TOSHIBA_RX1),
11678 SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06),
11679 SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU),
11680 SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
11681 SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN),
11682 SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1",
11684 SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
11685 SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000),
11686 SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8),
11687 SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
11688 SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1),
11692 static struct alc_config_preset alc262_presets[] = {
11694 .mixers = { alc262_base_mixer },
11695 .init_verbs = { alc262_init_verbs },
11696 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11697 .dac_nids = alc262_dac_nids,
11699 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11700 .channel_mode = alc262_modes,
11701 .input_mux = &alc262_capture_source,
11704 .mixers = { alc262_hippo_mixer },
11705 .init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs},
11706 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11707 .dac_nids = alc262_dac_nids,
11709 .dig_out_nid = ALC262_DIGOUT_NID,
11710 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11711 .channel_mode = alc262_modes,
11712 .input_mux = &alc262_capture_source,
11713 .unsol_event = alc262_hippo_unsol_event,
11714 .setup = alc262_hippo_setup,
11715 .init_hook = alc262_hippo_automute,
11717 [ALC262_HIPPO_1] = {
11718 .mixers = { alc262_hippo1_mixer },
11719 .init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs},
11720 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11721 .dac_nids = alc262_dac_nids,
11723 .dig_out_nid = ALC262_DIGOUT_NID,
11724 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11725 .channel_mode = alc262_modes,
11726 .input_mux = &alc262_capture_source,
11727 .unsol_event = alc262_hippo_unsol_event,
11728 .setup = alc262_hippo1_setup,
11729 .init_hook = alc262_hippo_automute,
11731 [ALC262_FUJITSU] = {
11732 .mixers = { alc262_fujitsu_mixer },
11733 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
11734 alc262_fujitsu_unsol_verbs },
11735 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11736 .dac_nids = alc262_dac_nids,
11738 .dig_out_nid = ALC262_DIGOUT_NID,
11739 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11740 .channel_mode = alc262_modes,
11741 .input_mux = &alc262_fujitsu_capture_source,
11742 .unsol_event = alc262_fujitsu_unsol_event,
11743 .init_hook = alc262_fujitsu_init_hook,
11745 [ALC262_HP_BPC] = {
11746 .mixers = { alc262_HP_BPC_mixer },
11747 .init_verbs = { alc262_HP_BPC_init_verbs },
11748 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11749 .dac_nids = alc262_dac_nids,
11751 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11752 .channel_mode = alc262_modes,
11753 .input_mux = &alc262_HP_capture_source,
11754 .unsol_event = alc262_hp_bpc_unsol_event,
11755 .init_hook = alc262_hp_bpc_automute,
11757 [ALC262_HP_BPC_D7000_WF] = {
11758 .mixers = { alc262_HP_BPC_WildWest_mixer },
11759 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
11760 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11761 .dac_nids = alc262_dac_nids,
11763 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11764 .channel_mode = alc262_modes,
11765 .input_mux = &alc262_HP_D7000_capture_source,
11766 .unsol_event = alc262_hp_wildwest_unsol_event,
11767 .init_hook = alc262_hp_wildwest_automute,
11769 [ALC262_HP_BPC_D7000_WL] = {
11770 .mixers = { alc262_HP_BPC_WildWest_mixer,
11771 alc262_HP_BPC_WildWest_option_mixer },
11772 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
11773 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11774 .dac_nids = alc262_dac_nids,
11776 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11777 .channel_mode = alc262_modes,
11778 .input_mux = &alc262_HP_D7000_capture_source,
11779 .unsol_event = alc262_hp_wildwest_unsol_event,
11780 .init_hook = alc262_hp_wildwest_automute,
11782 [ALC262_HP_TC_T5735] = {
11783 .mixers = { alc262_hp_t5735_mixer },
11784 .init_verbs = { alc262_init_verbs, alc262_hp_t5735_verbs },
11785 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11786 .dac_nids = alc262_dac_nids,
11788 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11789 .channel_mode = alc262_modes,
11790 .input_mux = &alc262_capture_source,
11791 .unsol_event = alc_automute_amp_unsol_event,
11792 .setup = alc262_hp_t5735_setup,
11793 .init_hook = alc_automute_amp,
11795 [ALC262_HP_RP5700] = {
11796 .mixers = { alc262_hp_rp5700_mixer },
11797 .init_verbs = { alc262_init_verbs, alc262_hp_rp5700_verbs },
11798 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11799 .dac_nids = alc262_dac_nids,
11800 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11801 .channel_mode = alc262_modes,
11802 .input_mux = &alc262_hp_rp5700_capture_source,
11804 [ALC262_BENQ_ED8] = {
11805 .mixers = { alc262_base_mixer },
11806 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs },
11807 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11808 .dac_nids = alc262_dac_nids,
11810 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11811 .channel_mode = alc262_modes,
11812 .input_mux = &alc262_capture_source,
11814 [ALC262_SONY_ASSAMD] = {
11815 .mixers = { alc262_sony_mixer },
11816 .init_verbs = { alc262_init_verbs, alc262_sony_unsol_verbs},
11817 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11818 .dac_nids = alc262_dac_nids,
11820 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11821 .channel_mode = alc262_modes,
11822 .input_mux = &alc262_capture_source,
11823 .unsol_event = alc262_hippo_unsol_event,
11824 .setup = alc262_hippo_setup,
11825 .init_hook = alc262_hippo_automute,
11827 [ALC262_BENQ_T31] = {
11828 .mixers = { alc262_benq_t31_mixer },
11829 .init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs,
11830 alc_hp15_unsol_verbs },
11831 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11832 .dac_nids = alc262_dac_nids,
11834 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11835 .channel_mode = alc262_modes,
11836 .input_mux = &alc262_capture_source,
11837 .unsol_event = alc262_hippo_unsol_event,
11838 .setup = alc262_hippo_setup,
11839 .init_hook = alc262_hippo_automute,
11842 .mixers = { alc262_ultra_mixer },
11843 .cap_mixer = alc262_ultra_capture_mixer,
11844 .init_verbs = { alc262_ultra_verbs },
11845 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11846 .dac_nids = alc262_dac_nids,
11847 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11848 .channel_mode = alc262_modes,
11849 .input_mux = &alc262_ultra_capture_source,
11850 .adc_nids = alc262_adc_nids, /* ADC0 */
11851 .capsrc_nids = alc262_capsrc_nids,
11852 .num_adc_nids = 1, /* single ADC */
11853 .unsol_event = alc262_ultra_unsol_event,
11854 .init_hook = alc262_ultra_automute,
11856 [ALC262_LENOVO_3000] = {
11857 .mixers = { alc262_lenovo_3000_mixer },
11858 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
11859 alc262_lenovo_3000_unsol_verbs,
11860 alc262_lenovo_3000_init_verbs },
11861 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11862 .dac_nids = alc262_dac_nids,
11864 .dig_out_nid = ALC262_DIGOUT_NID,
11865 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11866 .channel_mode = alc262_modes,
11867 .input_mux = &alc262_fujitsu_capture_source,
11868 .unsol_event = alc262_lenovo_3000_unsol_event,
11871 .mixers = { alc262_nec_mixer },
11872 .init_verbs = { alc262_nec_verbs },
11873 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11874 .dac_nids = alc262_dac_nids,
11876 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11877 .channel_mode = alc262_modes,
11878 .input_mux = &alc262_capture_source,
11880 [ALC262_TOSHIBA_S06] = {
11881 .mixers = { alc262_toshiba_s06_mixer },
11882 .init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs,
11883 alc262_eapd_verbs },
11884 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11885 .capsrc_nids = alc262_dmic_capsrc_nids,
11886 .dac_nids = alc262_dac_nids,
11887 .adc_nids = alc262_dmic_adc_nids, /* ADC0 */
11888 .num_adc_nids = 1, /* single ADC */
11889 .dig_out_nid = ALC262_DIGOUT_NID,
11890 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11891 .channel_mode = alc262_modes,
11892 .unsol_event = alc_sku_unsol_event,
11893 .setup = alc262_toshiba_s06_setup,
11894 .init_hook = alc_inithook,
11896 [ALC262_TOSHIBA_RX1] = {
11897 .mixers = { alc262_toshiba_rx1_mixer },
11898 .init_verbs = { alc262_init_verbs, alc262_toshiba_rx1_unsol_verbs },
11899 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11900 .dac_nids = alc262_dac_nids,
11902 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11903 .channel_mode = alc262_modes,
11904 .input_mux = &alc262_capture_source,
11905 .unsol_event = alc262_hippo_unsol_event,
11906 .setup = alc262_hippo_setup,
11907 .init_hook = alc262_hippo_automute,
11910 .mixers = { alc262_tyan_mixer },
11911 .init_verbs = { alc262_init_verbs, alc262_tyan_verbs},
11912 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
11913 .dac_nids = alc262_dac_nids,
11915 .dig_out_nid = ALC262_DIGOUT_NID,
11916 .num_channel_mode = ARRAY_SIZE(alc262_modes),
11917 .channel_mode = alc262_modes,
11918 .input_mux = &alc262_capture_source,
11919 .unsol_event = alc_automute_amp_unsol_event,
11920 .setup = alc262_tyan_setup,
11921 .init_hook = alc_automute_amp,
11925 static int patch_alc262(struct hda_codec *codec)
11927 struct alc_spec *spec;
11931 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
11935 codec->spec = spec;
11937 /* pshou 07/11/05 set a zero PCM sample to DAC when FIFO is
11942 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
11943 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
11944 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
11945 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80);
11949 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
11951 board_config = snd_hda_check_board_config(codec, ALC262_MODEL_LAST,
11955 if (board_config < 0) {
11956 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
11958 board_config = ALC262_AUTO;
11961 if (board_config == ALC262_AUTO) {
11962 /* automatic parse from the BIOS config */
11963 err = alc262_parse_auto_config(codec);
11969 "hda_codec: Cannot set up configuration "
11970 "from BIOS. Using base mode...\n");
11971 board_config = ALC262_BASIC;
11975 if (!spec->no_analog) {
11976 err = snd_hda_attach_beep_device(codec, 0x1);
11983 if (board_config != ALC262_AUTO)
11984 setup_preset(codec, &alc262_presets[board_config]);
11986 spec->stream_analog_playback = &alc262_pcm_analog_playback;
11987 spec->stream_analog_capture = &alc262_pcm_analog_capture;
11989 spec->stream_digital_playback = &alc262_pcm_digital_playback;
11990 spec->stream_digital_capture = &alc262_pcm_digital_capture;
11992 if (!spec->adc_nids && spec->input_mux) {
11994 /* check whether the digital-mic has to be supported */
11995 for (i = 0; i < spec->input_mux->num_items; i++) {
11996 if (spec->input_mux->items[i].index >= 9)
11999 if (i < spec->input_mux->num_items) {
12000 /* use only ADC0 */
12001 spec->adc_nids = alc262_dmic_adc_nids;
12002 spec->num_adc_nids = 1;
12003 spec->capsrc_nids = alc262_dmic_capsrc_nids;
12005 /* all analog inputs */
12006 /* check whether NID 0x07 is valid */
12007 unsigned int wcap = get_wcaps(codec, 0x07);
12010 wcap = get_wcaps_type(wcap);
12011 if (wcap != AC_WID_AUD_IN) {
12012 spec->adc_nids = alc262_adc_nids_alt;
12013 spec->num_adc_nids =
12014 ARRAY_SIZE(alc262_adc_nids_alt);
12015 spec->capsrc_nids = alc262_capsrc_nids_alt;
12017 spec->adc_nids = alc262_adc_nids;
12018 spec->num_adc_nids =
12019 ARRAY_SIZE(alc262_adc_nids);
12020 spec->capsrc_nids = alc262_capsrc_nids;
12024 if (!spec->cap_mixer && !spec->no_analog)
12025 set_capture_mixer(codec);
12026 if (!spec->no_analog)
12027 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
12029 spec->vmaster_nid = 0x0c;
12031 codec->patch_ops = alc_patch_ops;
12032 if (board_config == ALC262_AUTO)
12033 spec->init_hook = alc262_auto_init;
12034 #ifdef CONFIG_SND_HDA_POWER_SAVE
12035 if (!spec->loopback.amplist)
12036 spec->loopback.amplist = alc262_loopbacks;
12038 codec->proc_widget_hook = print_realtek_coef;
12044 * ALC268 channel source setting (2 channel)
12046 #define ALC268_DIGOUT_NID ALC880_DIGOUT_NID
12047 #define alc268_modes alc260_modes
12049 static hda_nid_t alc268_dac_nids[2] = {
12054 static hda_nid_t alc268_adc_nids[2] = {
12059 static hda_nid_t alc268_adc_nids_alt[1] = {
12064 static hda_nid_t alc268_capsrc_nids[2] = { 0x23, 0x24 };
12066 static struct snd_kcontrol_new alc268_base_mixer[] = {
12067 /* output mixer control */
12068 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12069 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12070 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12071 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12072 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12073 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12074 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12078 static struct snd_kcontrol_new alc268_toshiba_mixer[] = {
12079 /* output mixer control */
12080 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12081 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12082 ALC262_HIPPO_MASTER_SWITCH,
12083 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12084 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12085 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12089 /* bind Beep switches of both NID 0x0f and 0x10 */
12090 static struct hda_bind_ctls alc268_bind_beep_sw = {
12091 .ops = &snd_hda_bind_sw,
12093 HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT),
12094 HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT),
12099 static struct snd_kcontrol_new alc268_beep_mixer[] = {
12100 HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
12101 HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw),
12105 static struct hda_verb alc268_eapd_verbs[] = {
12106 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
12107 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
12111 /* Toshiba specific */
12112 static struct hda_verb alc268_toshiba_verbs[] = {
12113 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12117 /* Acer specific */
12118 /* bind volumes of both NID 0x02 and 0x03 */
12119 static struct hda_bind_ctls alc268_acer_bind_master_vol = {
12120 .ops = &snd_hda_bind_vol,
12122 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
12123 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
12128 /* mute/unmute internal speaker according to the hp jack and mute state */
12129 static void alc268_acer_automute(struct hda_codec *codec, int force)
12131 struct alc_spec *spec = codec->spec;
12134 if (force || !spec->sense_updated) {
12135 spec->jack_present = snd_hda_jack_detect(codec, 0x14);
12136 spec->sense_updated = 1;
12138 if (spec->jack_present)
12139 mute = HDA_AMP_MUTE; /* mute internal speaker */
12140 else /* unmute internal speaker if necessary */
12141 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
12142 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
12143 HDA_AMP_MUTE, mute);
12147 /* bind hp and internal speaker mute (with plug check) */
12148 static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol,
12149 struct snd_ctl_elem_value *ucontrol)
12151 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
12152 long *valp = ucontrol->value.integer.value;
12155 change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
12157 alc268_acer_automute(codec, 0);
12161 static struct snd_kcontrol_new alc268_acer_aspire_one_mixer[] = {
12162 /* output mixer control */
12163 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12165 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12166 .name = "Master Playback Switch",
12167 .info = snd_hda_mixer_amp_switch_info,
12168 .get = snd_hda_mixer_amp_switch_get,
12169 .put = alc268_acer_master_sw_put,
12170 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12172 HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x18, 0, HDA_INPUT),
12176 static struct snd_kcontrol_new alc268_acer_mixer[] = {
12177 /* output mixer control */
12178 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12180 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12181 .name = "Master Playback Switch",
12182 .info = snd_hda_mixer_amp_switch_info,
12183 .get = snd_hda_mixer_amp_switch_get,
12184 .put = alc268_acer_master_sw_put,
12185 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12187 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12188 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12189 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12193 static struct snd_kcontrol_new alc268_acer_dmic_mixer[] = {
12194 /* output mixer control */
12195 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12197 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12198 .name = "Master Playback Switch",
12199 .info = snd_hda_mixer_amp_switch_info,
12200 .get = snd_hda_mixer_amp_switch_get,
12201 .put = alc268_acer_master_sw_put,
12202 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12204 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12205 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12209 static struct hda_verb alc268_acer_aspire_one_verbs[] = {
12210 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12211 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12212 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12213 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
12214 {0x23, AC_VERB_SET_CONNECT_SEL, 0x06},
12215 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, 0xa017},
12219 static struct hda_verb alc268_acer_verbs[] = {
12220 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* internal dmic? */
12221 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12222 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12223 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
12224 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12225 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12226 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12230 /* unsolicited event for HP jack sensing */
12231 #define alc268_toshiba_unsol_event alc262_hippo_unsol_event
12232 #define alc268_toshiba_setup alc262_hippo_setup
12233 #define alc268_toshiba_automute alc262_hippo_automute
12235 static void alc268_acer_unsol_event(struct hda_codec *codec,
12238 if ((res >> 26) != ALC880_HP_EVENT)
12240 alc268_acer_automute(codec, 1);
12243 static void alc268_acer_init_hook(struct hda_codec *codec)
12245 alc268_acer_automute(codec, 1);
12248 /* toggle speaker-output according to the hp-jack state */
12249 static void alc268_aspire_one_speaker_automute(struct hda_codec *codec)
12251 unsigned int present;
12252 unsigned char bits;
12254 present = snd_hda_jack_detect(codec, 0x15);
12255 bits = present ? AMP_IN_MUTE(0) : 0;
12256 snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 0,
12257 AMP_IN_MUTE(0), bits);
12258 snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 1,
12259 AMP_IN_MUTE(0), bits);
12262 static void alc268_acer_lc_unsol_event(struct hda_codec *codec,
12265 switch (res >> 26) {
12266 case ALC880_HP_EVENT:
12267 alc268_aspire_one_speaker_automute(codec);
12269 case ALC880_MIC_EVENT:
12270 alc_mic_automute(codec);
12275 static void alc268_acer_lc_setup(struct hda_codec *codec)
12277 struct alc_spec *spec = codec->spec;
12278 spec->ext_mic.pin = 0x18;
12279 spec->ext_mic.mux_idx = 0;
12280 spec->int_mic.pin = 0x12;
12281 spec->int_mic.mux_idx = 6;
12282 spec->auto_mic = 1;
12285 static void alc268_acer_lc_init_hook(struct hda_codec *codec)
12287 alc268_aspire_one_speaker_automute(codec);
12288 alc_mic_automute(codec);
12291 static struct snd_kcontrol_new alc268_dell_mixer[] = {
12292 /* output mixer control */
12293 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12294 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12295 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12296 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12297 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12298 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12302 static struct hda_verb alc268_dell_verbs[] = {
12303 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12304 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12305 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12306 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12310 /* mute/unmute internal speaker according to the hp jack and mute state */
12311 static void alc268_dell_setup(struct hda_codec *codec)
12313 struct alc_spec *spec = codec->spec;
12315 spec->autocfg.hp_pins[0] = 0x15;
12316 spec->autocfg.speaker_pins[0] = 0x14;
12317 spec->ext_mic.pin = 0x18;
12318 spec->ext_mic.mux_idx = 0;
12319 spec->int_mic.pin = 0x19;
12320 spec->int_mic.mux_idx = 1;
12321 spec->auto_mic = 1;
12324 static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = {
12325 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12326 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12327 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12328 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12329 HDA_CODEC_VOLUME("Mic Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12330 HDA_BIND_MUTE("Mic Capture Switch", 0x23, 2, HDA_OUTPUT),
12331 HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
12332 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
12336 static struct hda_verb alc267_quanta_il1_verbs[] = {
12337 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12338 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12342 static void alc267_quanta_il1_setup(struct hda_codec *codec)
12344 struct alc_spec *spec = codec->spec;
12345 spec->autocfg.hp_pins[0] = 0x15;
12346 spec->autocfg.speaker_pins[0] = 0x14;
12347 spec->ext_mic.pin = 0x18;
12348 spec->ext_mic.mux_idx = 0;
12349 spec->int_mic.pin = 0x19;
12350 spec->int_mic.mux_idx = 1;
12351 spec->auto_mic = 1;
12355 * generic initialization of ADC, input mixers and output mixers
12357 static struct hda_verb alc268_base_init_verbs[] = {
12358 /* Unmute DAC0-1 and set vol = 0 */
12359 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12360 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12363 * Set up output mixers (0x0c - 0x0e)
12365 /* set vol=0 to output mixers */
12366 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12367 {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
12369 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12370 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12372 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12373 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
12374 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
12375 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12376 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12377 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12378 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12379 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12381 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12382 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12383 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12384 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12385 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12387 /* set PCBEEP vol = 0, mute connections */
12388 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12389 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12390 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12392 /* Unmute Selector 23h,24h and set the default input to mic-in */
12394 {0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
12395 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12396 {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
12397 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
12403 * generic initialization of ADC, input mixers and output mixers
12405 static struct hda_verb alc268_volume_init_verbs[] = {
12406 /* set output DAC */
12407 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12408 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12410 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12411 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12412 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12413 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12414 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12416 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12417 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12418 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12420 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12421 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
12423 /* set PCBEEP vol = 0, mute connections */
12424 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12425 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12426 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12431 static struct snd_kcontrol_new alc268_capture_nosrc_mixer[] = {
12432 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12433 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12437 static struct snd_kcontrol_new alc268_capture_alt_mixer[] = {
12438 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12439 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12444 static struct snd_kcontrol_new alc268_capture_mixer[] = {
12445 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12446 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
12447 HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x24, 0x0, HDA_OUTPUT),
12448 HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x24, 0x0, HDA_OUTPUT),
12453 static struct hda_input_mux alc268_capture_source = {
12457 { "Front Mic", 0x1 },
12463 static struct hda_input_mux alc268_acer_capture_source = {
12467 { "Internal Mic", 0x1 },
12472 static struct hda_input_mux alc268_acer_dmic_capture_source = {
12476 { "Internal Mic", 0x6 },
12481 #ifdef CONFIG_SND_DEBUG
12482 static struct snd_kcontrol_new alc268_test_mixer[] = {
12483 /* Volume widgets */
12484 HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12485 HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12486 HDA_BIND_MUTE_MONO("Mono sum Playback Switch", 0x0e, 1, 2, HDA_INPUT),
12487 HDA_BIND_MUTE("LINE-OUT sum Playback Switch", 0x0f, 2, HDA_INPUT),
12488 HDA_BIND_MUTE("HP-OUT sum Playback Switch", 0x10, 2, HDA_INPUT),
12489 HDA_BIND_MUTE("LINE-OUT Playback Switch", 0x14, 2, HDA_OUTPUT),
12490 HDA_BIND_MUTE("HP-OUT Playback Switch", 0x15, 2, HDA_OUTPUT),
12491 HDA_BIND_MUTE("Mono Playback Switch", 0x16, 2, HDA_OUTPUT),
12492 HDA_CODEC_VOLUME("MIC1 Capture Volume", 0x18, 0x0, HDA_INPUT),
12493 HDA_BIND_MUTE("MIC1 Capture Switch", 0x18, 2, HDA_OUTPUT),
12494 HDA_CODEC_VOLUME("MIC2 Capture Volume", 0x19, 0x0, HDA_INPUT),
12495 HDA_CODEC_VOLUME("LINE1 Capture Volume", 0x1a, 0x0, HDA_INPUT),
12496 HDA_BIND_MUTE("LINE1 Capture Switch", 0x1a, 2, HDA_OUTPUT),
12497 /* The below appears problematic on some hardwares */
12498 /*HDA_CODEC_VOLUME("PCBEEP Playback Volume", 0x1d, 0x0, HDA_INPUT),*/
12499 HDA_CODEC_VOLUME("PCM-IN1 Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12500 HDA_BIND_MUTE("PCM-IN1 Capture Switch", 0x23, 2, HDA_OUTPUT),
12501 HDA_CODEC_VOLUME("PCM-IN2 Capture Volume", 0x24, 0x0, HDA_OUTPUT),
12502 HDA_BIND_MUTE("PCM-IN2 Capture Switch", 0x24, 2, HDA_OUTPUT),
12504 /* Modes for retasking pin widgets */
12505 ALC_PIN_MODE("LINE-OUT pin mode", 0x14, ALC_PIN_DIR_INOUT),
12506 ALC_PIN_MODE("HP-OUT pin mode", 0x15, ALC_PIN_DIR_INOUT),
12507 ALC_PIN_MODE("MIC1 pin mode", 0x18, ALC_PIN_DIR_INOUT),
12508 ALC_PIN_MODE("LINE1 pin mode", 0x1a, ALC_PIN_DIR_INOUT),
12510 /* Controls for GPIO pins, assuming they are configured as outputs */
12511 ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
12512 ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
12513 ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
12514 ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
12516 /* Switches to allow the digital SPDIF output pin to be enabled.
12517 * The ALC268 does not have an SPDIF input.
12519 ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x06, 0x01),
12521 /* A switch allowing EAPD to be enabled. Some laptops seem to use
12522 * this output to turn on an external amplifier.
12524 ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
12525 ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
12531 /* create input playback/capture controls for the given pin */
12532 static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
12533 const char *ctlname, int idx)
12549 if (spec->multiout.dac_nids[0] != dac &&
12550 spec->multiout.dac_nids[1] != dac) {
12551 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
12552 HDA_COMPOSE_AMP_VAL(dac, 3, idx,
12556 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
12560 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
12561 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
12563 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
12564 HDA_COMPOSE_AMP_VAL(nid, 2, idx, HDA_OUTPUT));
12570 /* add playback controls from the parsed DAC table */
12571 static int alc268_auto_create_multi_out_ctls(struct alc_spec *spec,
12572 const struct auto_pin_cfg *cfg)
12577 spec->multiout.dac_nids = spec->private_dac_nids;
12579 nid = cfg->line_out_pins[0];
12582 if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
12586 err = alc268_new_analog_output(spec, nid, name, 0);
12591 nid = cfg->speaker_pins[0];
12593 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, "Speaker",
12594 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
12598 err = alc268_new_analog_output(spec, nid, "Speaker", 0);
12602 nid = cfg->hp_pins[0];
12604 err = alc268_new_analog_output(spec, nid, "Headphone", 0);
12609 nid = cfg->line_out_pins[1] | cfg->line_out_pins[2];
12611 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, "Mono",
12612 HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT));
12619 /* create playback/capture controls for input pins */
12620 static int alc268_auto_create_input_ctls(struct hda_codec *codec,
12621 const struct auto_pin_cfg *cfg)
12623 return alc_auto_create_input_ctls(codec, cfg, 0, 0x23, 0x24);
12626 static void alc268_auto_set_output_and_unmute(struct hda_codec *codec,
12627 hda_nid_t nid, int pin_type)
12631 alc_set_pin_output(codec, nid, pin_type);
12632 if (nid == 0x14 || nid == 0x16)
12636 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
12639 static void alc268_auto_init_multi_out(struct hda_codec *codec)
12641 struct alc_spec *spec = codec->spec;
12642 hda_nid_t nid = spec->autocfg.line_out_pins[0];
12644 int pin_type = get_pin_type(spec->autocfg.line_out_type);
12645 alc268_auto_set_output_and_unmute(codec, nid, pin_type);
12649 static void alc268_auto_init_hp_out(struct hda_codec *codec)
12651 struct alc_spec *spec = codec->spec;
12654 pin = spec->autocfg.hp_pins[0];
12656 alc268_auto_set_output_and_unmute(codec, pin, PIN_HP);
12657 pin = spec->autocfg.speaker_pins[0];
12659 alc268_auto_set_output_and_unmute(codec, pin, PIN_OUT);
12662 static void alc268_auto_init_mono_speaker_out(struct hda_codec *codec)
12664 struct alc_spec *spec = codec->spec;
12665 hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
12666 hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
12667 hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
12668 unsigned int dac_vol1, dac_vol2;
12670 if (line_nid == 0x1d || speaker_nid == 0x1d) {
12671 snd_hda_codec_write(codec, speaker_nid, 0,
12672 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
12673 /* mute mixer inputs from 0x1d */
12674 snd_hda_codec_write(codec, 0x0f, 0,
12675 AC_VERB_SET_AMP_GAIN_MUTE,
12677 snd_hda_codec_write(codec, 0x10, 0,
12678 AC_VERB_SET_AMP_GAIN_MUTE,
12681 /* unmute mixer inputs from 0x1d */
12682 snd_hda_codec_write(codec, 0x0f, 0,
12683 AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
12684 snd_hda_codec_write(codec, 0x10, 0,
12685 AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
12688 dac_vol1 = dac_vol2 = 0xb000 | 0x40; /* set max volume */
12689 if (line_nid == 0x14)
12690 dac_vol2 = AMP_OUT_ZERO;
12691 else if (line_nid == 0x15)
12692 dac_vol1 = AMP_OUT_ZERO;
12693 if (hp_nid == 0x14)
12694 dac_vol2 = AMP_OUT_ZERO;
12695 else if (hp_nid == 0x15)
12696 dac_vol1 = AMP_OUT_ZERO;
12697 if (line_nid != 0x16 || hp_nid != 0x16 ||
12698 spec->autocfg.line_out_pins[1] != 0x16 ||
12699 spec->autocfg.line_out_pins[2] != 0x16)
12700 dac_vol1 = dac_vol2 = AMP_OUT_ZERO;
12702 snd_hda_codec_write(codec, 0x02, 0,
12703 AC_VERB_SET_AMP_GAIN_MUTE, dac_vol1);
12704 snd_hda_codec_write(codec, 0x03, 0,
12705 AC_VERB_SET_AMP_GAIN_MUTE, dac_vol2);
12708 /* pcm configuration: identical with ALC880 */
12709 #define alc268_pcm_analog_playback alc880_pcm_analog_playback
12710 #define alc268_pcm_analog_capture alc880_pcm_analog_capture
12711 #define alc268_pcm_analog_alt_capture alc880_pcm_analog_alt_capture
12712 #define alc268_pcm_digital_playback alc880_pcm_digital_playback
12715 * BIOS auto configuration
12717 static int alc268_parse_auto_config(struct hda_codec *codec)
12719 struct alc_spec *spec = codec->spec;
12721 static hda_nid_t alc268_ignore[] = { 0 };
12723 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
12727 if (!spec->autocfg.line_outs) {
12728 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
12729 spec->multiout.max_channels = 2;
12730 spec->no_analog = 1;
12733 return 0; /* can't find valid BIOS pin config */
12735 err = alc268_auto_create_multi_out_ctls(spec, &spec->autocfg);
12738 err = alc268_auto_create_input_ctls(codec, &spec->autocfg);
12742 spec->multiout.max_channels = 2;
12745 /* digital only support output */
12746 if (spec->autocfg.dig_outs) {
12747 spec->multiout.dig_out_nid = ALC268_DIGOUT_NID;
12748 spec->dig_out_type = spec->autocfg.dig_out_type[0];
12750 if (spec->kctls.list)
12751 add_mixer(spec, spec->kctls.list);
12753 if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d)
12754 add_mixer(spec, alc268_beep_mixer);
12756 add_verb(spec, alc268_volume_init_verbs);
12757 spec->num_mux_defs = 2;
12758 spec->input_mux = &spec->private_imux[0];
12760 err = alc_auto_add_mic_boost(codec);
12764 alc_ssid_check(codec, 0x15, 0x1b, 0x14);
12769 #define alc268_auto_init_analog_input alc882_auto_init_analog_input
12771 /* init callback for auto-configuration model -- overriding the default init */
12772 static void alc268_auto_init(struct hda_codec *codec)
12774 struct alc_spec *spec = codec->spec;
12775 alc268_auto_init_multi_out(codec);
12776 alc268_auto_init_hp_out(codec);
12777 alc268_auto_init_mono_speaker_out(codec);
12778 alc268_auto_init_analog_input(codec);
12779 if (spec->unsol_event)
12780 alc_inithook(codec);
12784 * configuration and preset
12786 static const char *alc268_models[ALC268_MODEL_LAST] = {
12787 [ALC267_QUANTA_IL1] = "quanta-il1",
12788 [ALC268_3ST] = "3stack",
12789 [ALC268_TOSHIBA] = "toshiba",
12790 [ALC268_ACER] = "acer",
12791 [ALC268_ACER_DMIC] = "acer-dmic",
12792 [ALC268_ACER_ASPIRE_ONE] = "acer-aspire",
12793 [ALC268_DELL] = "dell",
12794 [ALC268_ZEPTO] = "zepto",
12795 #ifdef CONFIG_SND_DEBUG
12796 [ALC268_TEST] = "test",
12798 [ALC268_AUTO] = "auto",
12801 static struct snd_pci_quirk alc268_cfg_tbl[] = {
12802 SND_PCI_QUIRK(0x1025, 0x011e, "Acer Aspire 5720z", ALC268_ACER),
12803 SND_PCI_QUIRK(0x1025, 0x0126, "Acer", ALC268_ACER),
12804 SND_PCI_QUIRK(0x1025, 0x012e, "Acer Aspire 5310", ALC268_ACER),
12805 SND_PCI_QUIRK(0x1025, 0x0130, "Acer Extensa 5210", ALC268_ACER),
12806 SND_PCI_QUIRK(0x1025, 0x0136, "Acer Aspire 5315", ALC268_ACER),
12807 SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One",
12808 ALC268_ACER_ASPIRE_ONE),
12809 SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL),
12810 SND_PCI_QUIRK_MASK(0x1028, 0xfff0, 0x02b0,
12811 "Dell Inspiron Mini9/Vostro A90", ALC268_DELL),
12812 /* almost compatible with toshiba but with optional digital outs;
12813 * auto-probing seems working fine
12815 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP TX25xx series",
12817 SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
12818 SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),
12819 SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
12820 SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
12821 SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
12822 SND_PCI_QUIRK(0x1854, 0x1775, "LG R510", ALC268_DELL),
12826 /* Toshiba laptops have no unique PCI SSID but only codec SSID */
12827 static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = {
12828 SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO),
12829 SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO),
12830 SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05",
12835 static struct alc_config_preset alc268_presets[] = {
12836 [ALC267_QUANTA_IL1] = {
12837 .mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer,
12838 alc268_capture_nosrc_mixer },
12839 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12840 alc267_quanta_il1_verbs },
12841 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12842 .dac_nids = alc268_dac_nids,
12843 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12844 .adc_nids = alc268_adc_nids_alt,
12846 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12847 .channel_mode = alc268_modes,
12848 .unsol_event = alc_sku_unsol_event,
12849 .setup = alc267_quanta_il1_setup,
12850 .init_hook = alc_inithook,
12853 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
12854 alc268_beep_mixer },
12855 .init_verbs = { alc268_base_init_verbs },
12856 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12857 .dac_nids = alc268_dac_nids,
12858 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12859 .adc_nids = alc268_adc_nids_alt,
12860 .capsrc_nids = alc268_capsrc_nids,
12862 .dig_out_nid = ALC268_DIGOUT_NID,
12863 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12864 .channel_mode = alc268_modes,
12865 .input_mux = &alc268_capture_source,
12867 [ALC268_TOSHIBA] = {
12868 .mixers = { alc268_toshiba_mixer, alc268_capture_alt_mixer,
12869 alc268_beep_mixer },
12870 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12871 alc268_toshiba_verbs },
12872 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12873 .dac_nids = alc268_dac_nids,
12874 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12875 .adc_nids = alc268_adc_nids_alt,
12876 .capsrc_nids = alc268_capsrc_nids,
12878 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12879 .channel_mode = alc268_modes,
12880 .input_mux = &alc268_capture_source,
12881 .unsol_event = alc268_toshiba_unsol_event,
12882 .setup = alc268_toshiba_setup,
12883 .init_hook = alc268_toshiba_automute,
12886 .mixers = { alc268_acer_mixer, alc268_capture_alt_mixer,
12887 alc268_beep_mixer },
12888 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12889 alc268_acer_verbs },
12890 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12891 .dac_nids = alc268_dac_nids,
12892 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12893 .adc_nids = alc268_adc_nids_alt,
12894 .capsrc_nids = alc268_capsrc_nids,
12896 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12897 .channel_mode = alc268_modes,
12898 .input_mux = &alc268_acer_capture_source,
12899 .unsol_event = alc268_acer_unsol_event,
12900 .init_hook = alc268_acer_init_hook,
12902 [ALC268_ACER_DMIC] = {
12903 .mixers = { alc268_acer_dmic_mixer, alc268_capture_alt_mixer,
12904 alc268_beep_mixer },
12905 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12906 alc268_acer_verbs },
12907 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12908 .dac_nids = alc268_dac_nids,
12909 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12910 .adc_nids = alc268_adc_nids_alt,
12911 .capsrc_nids = alc268_capsrc_nids,
12913 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12914 .channel_mode = alc268_modes,
12915 .input_mux = &alc268_acer_dmic_capture_source,
12916 .unsol_event = alc268_acer_unsol_event,
12917 .init_hook = alc268_acer_init_hook,
12919 [ALC268_ACER_ASPIRE_ONE] = {
12920 .mixers = { alc268_acer_aspire_one_mixer,
12922 alc268_capture_nosrc_mixer },
12923 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12924 alc268_acer_aspire_one_verbs },
12925 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12926 .dac_nids = alc268_dac_nids,
12927 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12928 .adc_nids = alc268_adc_nids_alt,
12929 .capsrc_nids = alc268_capsrc_nids,
12931 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12932 .channel_mode = alc268_modes,
12933 .unsol_event = alc268_acer_lc_unsol_event,
12934 .setup = alc268_acer_lc_setup,
12935 .init_hook = alc268_acer_lc_init_hook,
12938 .mixers = { alc268_dell_mixer, alc268_beep_mixer,
12939 alc268_capture_nosrc_mixer },
12940 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12941 alc268_dell_verbs },
12942 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12943 .dac_nids = alc268_dac_nids,
12944 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12945 .adc_nids = alc268_adc_nids_alt,
12946 .capsrc_nids = alc268_capsrc_nids,
12948 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12949 .channel_mode = alc268_modes,
12950 .unsol_event = alc_sku_unsol_event,
12951 .setup = alc268_dell_setup,
12952 .init_hook = alc_inithook,
12955 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
12956 alc268_beep_mixer },
12957 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12958 alc268_toshiba_verbs },
12959 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12960 .dac_nids = alc268_dac_nids,
12961 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12962 .adc_nids = alc268_adc_nids_alt,
12963 .capsrc_nids = alc268_capsrc_nids,
12965 .dig_out_nid = ALC268_DIGOUT_NID,
12966 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12967 .channel_mode = alc268_modes,
12968 .input_mux = &alc268_capture_source,
12969 .setup = alc268_toshiba_setup,
12970 .init_hook = alc268_toshiba_automute,
12972 #ifdef CONFIG_SND_DEBUG
12974 .mixers = { alc268_test_mixer, alc268_capture_mixer },
12975 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
12976 alc268_volume_init_verbs },
12977 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
12978 .dac_nids = alc268_dac_nids,
12979 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
12980 .adc_nids = alc268_adc_nids_alt,
12981 .capsrc_nids = alc268_capsrc_nids,
12983 .dig_out_nid = ALC268_DIGOUT_NID,
12984 .num_channel_mode = ARRAY_SIZE(alc268_modes),
12985 .channel_mode = alc268_modes,
12986 .input_mux = &alc268_capture_source,
12991 static int patch_alc268(struct hda_codec *codec)
12993 struct alc_spec *spec;
12995 int i, has_beep, err;
12997 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
13001 codec->spec = spec;
13003 board_config = snd_hda_check_board_config(codec, ALC268_MODEL_LAST,
13007 if (board_config < 0 || board_config >= ALC268_MODEL_LAST)
13008 board_config = snd_hda_check_board_codec_sid_config(codec,
13009 ALC882_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl);
13011 if (board_config < 0 || board_config >= ALC268_MODEL_LAST) {
13012 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
13014 board_config = ALC268_AUTO;
13017 if (board_config == ALC268_AUTO) {
13018 /* automatic parse from the BIOS config */
13019 err = alc268_parse_auto_config(codec);
13025 "hda_codec: Cannot set up configuration "
13026 "from BIOS. Using base mode...\n");
13027 board_config = ALC268_3ST;
13031 if (board_config != ALC268_AUTO)
13032 setup_preset(codec, &alc268_presets[board_config]);
13034 spec->stream_analog_playback = &alc268_pcm_analog_playback;
13035 spec->stream_analog_capture = &alc268_pcm_analog_capture;
13036 spec->stream_analog_alt_capture = &alc268_pcm_analog_alt_capture;
13038 spec->stream_digital_playback = &alc268_pcm_digital_playback;
13041 for (i = 0; i < spec->num_mixers; i++) {
13042 if (spec->mixers[i] == alc268_beep_mixer) {
13049 err = snd_hda_attach_beep_device(codec, 0x1);
13054 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
13055 /* override the amp caps for beep generator */
13056 snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
13057 (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
13058 (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
13059 (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
13060 (0 << AC_AMPCAP_MUTE_SHIFT));
13063 if (!spec->no_analog && !spec->adc_nids && spec->input_mux) {
13064 /* check whether NID 0x07 is valid */
13065 unsigned int wcap = get_wcaps(codec, 0x07);
13068 spec->capsrc_nids = alc268_capsrc_nids;
13070 wcap = get_wcaps_type(wcap);
13071 if (spec->auto_mic ||
13072 wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
13073 spec->adc_nids = alc268_adc_nids_alt;
13074 spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt);
13075 if (spec->auto_mic)
13076 fixup_automic_adc(codec);
13077 if (spec->auto_mic || spec->input_mux->num_items == 1)
13078 add_mixer(spec, alc268_capture_nosrc_mixer);
13080 add_mixer(spec, alc268_capture_alt_mixer);
13082 spec->adc_nids = alc268_adc_nids;
13083 spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids);
13084 add_mixer(spec, alc268_capture_mixer);
13086 /* set default input source */
13087 for (i = 0; i < spec->num_adc_nids; i++)
13088 snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i],
13089 0, AC_VERB_SET_CONNECT_SEL,
13090 i < spec->num_mux_defs ?
13091 spec->input_mux[i].items[0].index :
13092 spec->input_mux->items[0].index);
13095 spec->vmaster_nid = 0x02;
13097 codec->patch_ops = alc_patch_ops;
13098 if (board_config == ALC268_AUTO)
13099 spec->init_hook = alc268_auto_init;
13101 codec->proc_widget_hook = print_realtek_coef;
13107 * ALC269 channel source setting (2 channel)
13109 #define ALC269_DIGOUT_NID ALC880_DIGOUT_NID
13111 #define alc269_dac_nids alc260_dac_nids
13113 static hda_nid_t alc269_adc_nids[1] = {
13118 static hda_nid_t alc269_capsrc_nids[1] = {
13122 /* NOTE: ADC2 (0x07) is connected from a recording *MIXER* (0x24),
13126 #define alc269_modes alc260_modes
13127 #define alc269_capture_source alc880_lg_lw_capture_source
13129 static struct snd_kcontrol_new alc269_base_mixer[] = {
13130 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13131 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13132 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
13133 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
13134 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13135 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13136 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13137 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13138 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13139 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
13140 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13141 HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
13145 static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = {
13146 /* output mixer control */
13147 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13149 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13150 .name = "Master Playback Switch",
13151 .info = snd_hda_mixer_amp_switch_info,
13152 .get = snd_hda_mixer_amp_switch_get,
13153 .put = alc268_acer_master_sw_put,
13154 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13156 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13157 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13158 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13159 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13160 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13161 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13165 static struct snd_kcontrol_new alc269_lifebook_mixer[] = {
13166 /* output mixer control */
13167 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13169 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13170 .name = "Master Playback Switch",
13171 .info = snd_hda_mixer_amp_switch_info,
13172 .get = snd_hda_mixer_amp_switch_get,
13173 .put = alc268_acer_master_sw_put,
13174 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13176 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13177 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13178 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13179 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13180 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13181 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13182 HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x0b, 0x03, HDA_INPUT),
13183 HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x0b, 0x03, HDA_INPUT),
13184 HDA_CODEC_VOLUME("Dock Mic Boost", 0x1b, 0, HDA_INPUT),
13188 static struct snd_kcontrol_new alc269_eeepc_mixer[] = {
13189 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13190 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13191 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13192 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13196 /* capture mixer elements */
13197 static struct snd_kcontrol_new alc269_epc_capture_mixer[] = {
13198 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
13199 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
13200 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13205 #define alc269_fujitsu_mixer alc269_eeepc_mixer
13207 static struct hda_verb alc269_quanta_fl1_verbs[] = {
13208 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13209 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13210 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13211 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13212 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13213 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13217 static struct hda_verb alc269_lifebook_verbs[] = {
13218 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13219 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
13220 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13221 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13222 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13223 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13224 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13225 {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13226 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13227 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13231 /* toggle speaker-output according to the hp-jack state */
13232 static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec)
13234 unsigned int present;
13235 unsigned char bits;
13237 present = snd_hda_jack_detect(codec, 0x15);
13238 bits = present ? AMP_IN_MUTE(0) : 0;
13239 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13240 AMP_IN_MUTE(0), bits);
13241 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13242 AMP_IN_MUTE(0), bits);
13244 snd_hda_codec_write(codec, 0x20, 0,
13245 AC_VERB_SET_COEF_INDEX, 0x0c);
13246 snd_hda_codec_write(codec, 0x20, 0,
13247 AC_VERB_SET_PROC_COEF, 0x680);
13249 snd_hda_codec_write(codec, 0x20, 0,
13250 AC_VERB_SET_COEF_INDEX, 0x0c);
13251 snd_hda_codec_write(codec, 0x20, 0,
13252 AC_VERB_SET_PROC_COEF, 0x480);
13255 /* toggle speaker-output according to the hp-jacks state */
13256 static void alc269_lifebook_speaker_automute(struct hda_codec *codec)
13258 unsigned int present;
13259 unsigned char bits;
13261 /* Check laptop headphone socket */
13262 present = snd_hda_jack_detect(codec, 0x15);
13264 /* Check port replicator headphone socket */
13265 present |= snd_hda_jack_detect(codec, 0x1a);
13267 bits = present ? AMP_IN_MUTE(0) : 0;
13268 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13269 AMP_IN_MUTE(0), bits);
13270 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13271 AMP_IN_MUTE(0), bits);
13273 snd_hda_codec_write(codec, 0x20, 0,
13274 AC_VERB_SET_COEF_INDEX, 0x0c);
13275 snd_hda_codec_write(codec, 0x20, 0,
13276 AC_VERB_SET_PROC_COEF, 0x680);
13278 snd_hda_codec_write(codec, 0x20, 0,
13279 AC_VERB_SET_COEF_INDEX, 0x0c);
13280 snd_hda_codec_write(codec, 0x20, 0,
13281 AC_VERB_SET_PROC_COEF, 0x480);
13284 static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec)
13286 unsigned int present_laptop;
13287 unsigned int present_dock;
13289 present_laptop = snd_hda_jack_detect(codec, 0x18);
13290 present_dock = snd_hda_jack_detect(codec, 0x1b);
13292 /* Laptop mic port overrides dock mic port, design decision */
13294 snd_hda_codec_write(codec, 0x23, 0,
13295 AC_VERB_SET_CONNECT_SEL, 0x3);
13296 if (present_laptop)
13297 snd_hda_codec_write(codec, 0x23, 0,
13298 AC_VERB_SET_CONNECT_SEL, 0x0);
13299 if (!present_dock && !present_laptop)
13300 snd_hda_codec_write(codec, 0x23, 0,
13301 AC_VERB_SET_CONNECT_SEL, 0x1);
13304 static void alc269_quanta_fl1_unsol_event(struct hda_codec *codec,
13307 switch (res >> 26) {
13308 case ALC880_HP_EVENT:
13309 alc269_quanta_fl1_speaker_automute(codec);
13311 case ALC880_MIC_EVENT:
13312 alc_mic_automute(codec);
13317 static void alc269_lifebook_unsol_event(struct hda_codec *codec,
13320 if ((res >> 26) == ALC880_HP_EVENT)
13321 alc269_lifebook_speaker_automute(codec);
13322 if ((res >> 26) == ALC880_MIC_EVENT)
13323 alc269_lifebook_mic_autoswitch(codec);
13326 static void alc269_quanta_fl1_setup(struct hda_codec *codec)
13328 struct alc_spec *spec = codec->spec;
13329 spec->ext_mic.pin = 0x18;
13330 spec->ext_mic.mux_idx = 0;
13331 spec->int_mic.pin = 0x19;
13332 spec->int_mic.mux_idx = 1;
13333 spec->auto_mic = 1;
13336 static void alc269_quanta_fl1_init_hook(struct hda_codec *codec)
13338 alc269_quanta_fl1_speaker_automute(codec);
13339 alc_mic_automute(codec);
13342 static void alc269_lifebook_init_hook(struct hda_codec *codec)
13344 alc269_lifebook_speaker_automute(codec);
13345 alc269_lifebook_mic_autoswitch(codec);
13348 static struct hda_verb alc269_eeepc_dmic_init_verbs[] = {
13349 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13350 {0x23, AC_VERB_SET_CONNECT_SEL, 0x05},
13351 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13352 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
13353 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13354 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13355 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13359 static struct hda_verb alc269_eeepc_amic_init_verbs[] = {
13360 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13361 {0x23, AC_VERB_SET_CONNECT_SEL, 0x01},
13362 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
13363 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x701b | (0x00 << 8))},
13364 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13365 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
13369 /* toggle speaker-output according to the hp-jack state */
13370 static void alc269_speaker_automute(struct hda_codec *codec)
13372 struct alc_spec *spec = codec->spec;
13373 unsigned int nid = spec->autocfg.hp_pins[0];
13374 unsigned int present;
13375 unsigned char bits;
13377 present = snd_hda_jack_detect(codec, nid);
13378 bits = present ? AMP_IN_MUTE(0) : 0;
13379 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13380 AMP_IN_MUTE(0), bits);
13381 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13382 AMP_IN_MUTE(0), bits);
13385 /* unsolicited event for HP jack sensing */
13386 static void alc269_eeepc_unsol_event(struct hda_codec *codec,
13389 switch (res >> 26) {
13390 case ALC880_HP_EVENT:
13391 alc269_speaker_automute(codec);
13393 case ALC880_MIC_EVENT:
13394 alc_mic_automute(codec);
13399 static void alc269_eeepc_dmic_setup(struct hda_codec *codec)
13401 struct alc_spec *spec = codec->spec;
13402 spec->ext_mic.pin = 0x18;
13403 spec->ext_mic.mux_idx = 0;
13404 spec->int_mic.pin = 0x12;
13405 spec->int_mic.mux_idx = 5;
13406 spec->auto_mic = 1;
13409 static void alc269_eeepc_amic_setup(struct hda_codec *codec)
13411 struct alc_spec *spec = codec->spec;
13412 spec->ext_mic.pin = 0x18;
13413 spec->ext_mic.mux_idx = 0;
13414 spec->int_mic.pin = 0x19;
13415 spec->int_mic.mux_idx = 1;
13416 spec->auto_mic = 1;
13419 static void alc269_eeepc_inithook(struct hda_codec *codec)
13421 alc269_speaker_automute(codec);
13422 alc_mic_automute(codec);
13426 * generic initialization of ADC, input mixers and output mixers
13428 static struct hda_verb alc269_init_verbs[] = {
13430 * Unmute ADC0 and set the default input to mic-in
13432 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13434 /* Mute input amps (PCBeep, Line In, Mic 1 & Mic 2) of the
13435 * analog-loopback mixer widget
13436 * Note: PASD motherboards uses the Line In 2 as the input for
13437 * front panel mic (mic 2)
13439 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
13440 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
13441 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
13442 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
13443 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
13444 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
13447 * Set up output mixers (0x0c - 0x0e)
13449 /* set vol=0 to output mixers */
13450 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13451 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13453 /* set up input amps for analog loopback */
13454 /* Amp Indices: DAC = 0, mixer = 1 */
13455 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13456 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13457 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13458 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13459 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13460 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13462 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13463 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13464 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
13465 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13466 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
13467 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13468 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13470 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13471 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13472 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13473 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13474 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13475 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13476 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13478 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
13479 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
13481 /* FIXME: use matrix-type input source selection */
13482 /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
13483 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
13484 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
13485 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
13486 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
13487 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
13490 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
13491 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
13495 #define alc269_auto_create_multi_out_ctls \
13496 alc268_auto_create_multi_out_ctls
13497 #define alc269_auto_create_input_ctls \
13498 alc268_auto_create_input_ctls
13500 #ifdef CONFIG_SND_HDA_POWER_SAVE
13501 #define alc269_loopbacks alc880_loopbacks
13504 /* pcm configuration: identical with ALC880 */
13505 #define alc269_pcm_analog_playback alc880_pcm_analog_playback
13506 #define alc269_pcm_analog_capture alc880_pcm_analog_capture
13507 #define alc269_pcm_digital_playback alc880_pcm_digital_playback
13508 #define alc269_pcm_digital_capture alc880_pcm_digital_capture
13510 static struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
13514 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
13515 /* NID is set in alc_build_pcms */
13517 .open = alc880_playback_pcm_open,
13518 .prepare = alc880_playback_pcm_prepare,
13519 .cleanup = alc880_playback_pcm_cleanup
13523 static struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
13527 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
13528 /* NID is set in alc_build_pcms */
13532 * BIOS auto configuration
13534 static int alc269_parse_auto_config(struct hda_codec *codec)
13536 struct alc_spec *spec = codec->spec;
13538 static hda_nid_t alc269_ignore[] = { 0x1d, 0 };
13540 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
13545 err = alc269_auto_create_multi_out_ctls(spec, &spec->autocfg);
13548 err = alc269_auto_create_input_ctls(codec, &spec->autocfg);
13552 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
13554 if (spec->autocfg.dig_outs)
13555 spec->multiout.dig_out_nid = ALC269_DIGOUT_NID;
13557 if (spec->kctls.list)
13558 add_mixer(spec, spec->kctls.list);
13560 add_verb(spec, alc269_init_verbs);
13561 spec->num_mux_defs = 1;
13562 spec->input_mux = &spec->private_imux[0];
13563 /* set default input source */
13564 snd_hda_codec_write_cache(codec, alc269_capsrc_nids[0],
13565 0, AC_VERB_SET_CONNECT_SEL,
13566 spec->input_mux->items[0].index);
13568 err = alc_auto_add_mic_boost(codec);
13572 if (!spec->cap_mixer && !spec->no_analog)
13573 set_capture_mixer(codec);
13575 alc_ssid_check(codec, 0x15, 0x1b, 0x14);
13580 #define alc269_auto_init_multi_out alc268_auto_init_multi_out
13581 #define alc269_auto_init_hp_out alc268_auto_init_hp_out
13582 #define alc269_auto_init_analog_input alc882_auto_init_analog_input
13585 /* init callback for auto-configuration model -- overriding the default init */
13586 static void alc269_auto_init(struct hda_codec *codec)
13588 struct alc_spec *spec = codec->spec;
13589 alc269_auto_init_multi_out(codec);
13590 alc269_auto_init_hp_out(codec);
13591 alc269_auto_init_analog_input(codec);
13592 if (spec->unsol_event)
13593 alc_inithook(codec);
13597 * configuration and preset
13599 static const char *alc269_models[ALC269_MODEL_LAST] = {
13600 [ALC269_BASIC] = "basic",
13601 [ALC269_QUANTA_FL1] = "quanta",
13602 [ALC269_ASUS_AMIC] = "asus-amic",
13603 [ALC269_ASUS_DMIC] = "asus-dmic",
13604 [ALC269_FUJITSU] = "fujitsu",
13605 [ALC269_LIFEBOOK] = "lifebook",
13606 [ALC269_AUTO] = "auto",
13609 static struct snd_pci_quirk alc269_cfg_tbl[] = {
13610 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1),
13611 SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
13613 SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_ASUS_AMIC),
13614 SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80JT", ALC269_ASUS_AMIC),
13615 SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_ASUS_AMIC),
13616 SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82Jv", ALC269_ASUS_AMIC),
13617 SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_ASUS_AMIC),
13618 SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_ASUS_AMIC),
13619 SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_ASUS_AMIC),
13620 SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_ASUS_AMIC),
13621 SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_ASUS_AMIC),
13622 SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_ASUS_AMIC),
13623 SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_ASUS_AMIC),
13624 SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_ASUS_AMIC),
13625 SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_ASUS_AMIC),
13626 SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_ASUS_AMIC),
13627 SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_ASUS_AMIC),
13628 SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_ASUS_AMIC),
13629 SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_ASUS_AMIC),
13630 SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_ASUS_AMIC),
13631 SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_ASUS_AMIC),
13632 SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_ASUS_AMIC),
13633 SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_ASUS_AMIC),
13634 SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_ASUS_AMIC),
13635 SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_ASUS_AMIC),
13636 SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_ASUS_DMIC),
13637 SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_ASUS_AMIC),
13638 SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_ASUS_AMIC),
13639 SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_ASUS_AMIC),
13640 SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_ASUS_AMIC),
13641 SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901",
13643 SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101",
13645 SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_ASUS_DMIC),
13646 SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_ASUS_DMIC),
13647 SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU),
13648 SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK),
13652 static struct alc_config_preset alc269_presets[] = {
13654 .mixers = { alc269_base_mixer },
13655 .init_verbs = { alc269_init_verbs },
13656 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13657 .dac_nids = alc269_dac_nids,
13659 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13660 .channel_mode = alc269_modes,
13661 .input_mux = &alc269_capture_source,
13663 [ALC269_QUANTA_FL1] = {
13664 .mixers = { alc269_quanta_fl1_mixer },
13665 .init_verbs = { alc269_init_verbs, alc269_quanta_fl1_verbs },
13666 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13667 .dac_nids = alc269_dac_nids,
13669 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13670 .channel_mode = alc269_modes,
13671 .input_mux = &alc269_capture_source,
13672 .unsol_event = alc269_quanta_fl1_unsol_event,
13673 .setup = alc269_quanta_fl1_setup,
13674 .init_hook = alc269_quanta_fl1_init_hook,
13676 [ALC269_ASUS_AMIC] = {
13677 .mixers = { alc269_eeepc_mixer },
13678 .cap_mixer = alc269_epc_capture_mixer,
13679 .init_verbs = { alc269_init_verbs,
13680 alc269_eeepc_amic_init_verbs },
13681 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13682 .dac_nids = alc269_dac_nids,
13684 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13685 .channel_mode = alc269_modes,
13686 .unsol_event = alc269_eeepc_unsol_event,
13687 .setup = alc269_eeepc_amic_setup,
13688 .init_hook = alc269_eeepc_inithook,
13690 [ALC269_ASUS_DMIC] = {
13691 .mixers = { alc269_eeepc_mixer },
13692 .cap_mixer = alc269_epc_capture_mixer,
13693 .init_verbs = { alc269_init_verbs,
13694 alc269_eeepc_dmic_init_verbs },
13695 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13696 .dac_nids = alc269_dac_nids,
13698 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13699 .channel_mode = alc269_modes,
13700 .unsol_event = alc269_eeepc_unsol_event,
13701 .setup = alc269_eeepc_dmic_setup,
13702 .init_hook = alc269_eeepc_inithook,
13704 [ALC269_FUJITSU] = {
13705 .mixers = { alc269_fujitsu_mixer },
13706 .cap_mixer = alc269_epc_capture_mixer,
13707 .init_verbs = { alc269_init_verbs,
13708 alc269_eeepc_dmic_init_verbs },
13709 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13710 .dac_nids = alc269_dac_nids,
13712 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13713 .channel_mode = alc269_modes,
13714 .unsol_event = alc269_eeepc_unsol_event,
13715 .setup = alc269_eeepc_dmic_setup,
13716 .init_hook = alc269_eeepc_inithook,
13718 [ALC269_LIFEBOOK] = {
13719 .mixers = { alc269_lifebook_mixer },
13720 .init_verbs = { alc269_init_verbs, alc269_lifebook_verbs },
13721 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
13722 .dac_nids = alc269_dac_nids,
13724 .num_channel_mode = ARRAY_SIZE(alc269_modes),
13725 .channel_mode = alc269_modes,
13726 .input_mux = &alc269_capture_source,
13727 .unsol_event = alc269_lifebook_unsol_event,
13728 .init_hook = alc269_lifebook_init_hook,
13732 static int patch_alc269(struct hda_codec *codec)
13734 struct alc_spec *spec;
13738 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
13742 codec->spec = spec;
13744 alc_fix_pll_init(codec, 0x20, 0x04, 15);
13746 if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010){
13747 kfree(codec->chip_name);
13748 codec->chip_name = kstrdup("ALC259", GFP_KERNEL);
13749 if (!codec->chip_name) {
13755 board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST,
13759 if (board_config < 0) {
13760 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
13762 board_config = ALC269_AUTO;
13765 if (board_config == ALC269_AUTO) {
13766 /* automatic parse from the BIOS config */
13767 err = alc269_parse_auto_config(codec);
13773 "hda_codec: Cannot set up configuration "
13774 "from BIOS. Using base mode...\n");
13775 board_config = ALC269_BASIC;
13779 err = snd_hda_attach_beep_device(codec, 0x1);
13785 if (board_config != ALC269_AUTO)
13786 setup_preset(codec, &alc269_presets[board_config]);
13788 if (codec->subsystem_id == 0x17aa3bf8) {
13789 /* Due to a hardware problem on Lenovo Ideadpad, we need to
13790 * fix the sample rate of analog I/O to 44.1kHz
13792 spec->stream_analog_playback = &alc269_44k_pcm_analog_playback;
13793 spec->stream_analog_capture = &alc269_44k_pcm_analog_capture;
13795 spec->stream_analog_playback = &alc269_pcm_analog_playback;
13796 spec->stream_analog_capture = &alc269_pcm_analog_capture;
13798 spec->stream_digital_playback = &alc269_pcm_digital_playback;
13799 spec->stream_digital_capture = &alc269_pcm_digital_capture;
13801 spec->adc_nids = alc269_adc_nids;
13802 spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids);
13803 spec->capsrc_nids = alc269_capsrc_nids;
13804 if (!spec->cap_mixer)
13805 set_capture_mixer(codec);
13806 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
13808 spec->vmaster_nid = 0x02;
13810 codec->patch_ops = alc_patch_ops;
13811 if (board_config == ALC269_AUTO)
13812 spec->init_hook = alc269_auto_init;
13813 #ifdef CONFIG_SND_HDA_POWER_SAVE
13814 if (!spec->loopback.amplist)
13815 spec->loopback.amplist = alc269_loopbacks;
13817 codec->proc_widget_hook = print_realtek_coef;
13823 * ALC861 channel source setting (2/6 channel selection for 3-stack)
13827 * set the path ways for 2 channel output
13828 * need to set the codec line out and mic 1 pin widgets to inputs
13830 static struct hda_verb alc861_threestack_ch2_init[] = {
13831 /* set pin widget 1Ah (line in) for input */
13832 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13833 /* set pin widget 18h (mic1/2) for input, for mic also enable
13836 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13838 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
13840 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
13841 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
13847 * need to set the codec line out and mic 1 pin widgets to outputs
13849 static struct hda_verb alc861_threestack_ch6_init[] = {
13850 /* set pin widget 1Ah (line in) for output (Back Surround)*/
13851 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13852 /* set pin widget 18h (mic1) for output (CLFE)*/
13853 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13855 { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
13856 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
13858 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
13860 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
13861 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
13866 static struct hda_channel_mode alc861_threestack_modes[2] = {
13867 { 2, alc861_threestack_ch2_init },
13868 { 6, alc861_threestack_ch6_init },
13870 /* Set mic1 as input and unmute the mixer */
13871 static struct hda_verb alc861_uniwill_m31_ch2_init[] = {
13872 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13873 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
13876 /* Set mic1 as output and mute mixer */
13877 static struct hda_verb alc861_uniwill_m31_ch4_init[] = {
13878 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13879 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
13883 static struct hda_channel_mode alc861_uniwill_m31_modes[2] = {
13884 { 2, alc861_uniwill_m31_ch2_init },
13885 { 4, alc861_uniwill_m31_ch4_init },
13888 /* Set mic1 and line-in as input and unmute the mixer */
13889 static struct hda_verb alc861_asus_ch2_init[] = {
13890 /* set pin widget 1Ah (line in) for input */
13891 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
13892 /* set pin widget 18h (mic1/2) for input, for mic also enable
13895 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
13897 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
13899 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
13900 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
13904 /* Set mic1 nad line-in as output and mute mixer */
13905 static struct hda_verb alc861_asus_ch6_init[] = {
13906 /* set pin widget 1Ah (line in) for output (Back Surround)*/
13907 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13908 /* { 0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
13909 /* set pin widget 18h (mic1) for output (CLFE)*/
13910 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
13911 /* { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
13912 { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
13913 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
13915 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
13917 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
13918 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
13923 static struct hda_channel_mode alc861_asus_modes[2] = {
13924 { 2, alc861_asus_ch2_init },
13925 { 6, alc861_asus_ch6_init },
13930 static struct snd_kcontrol_new alc861_base_mixer[] = {
13931 /* output mixer control */
13932 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
13933 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
13934 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
13935 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
13936 HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
13938 /*Input mixer control */
13939 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
13940 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
13941 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
13942 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
13943 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
13944 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
13945 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
13946 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
13947 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
13948 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
13953 static struct snd_kcontrol_new alc861_3ST_mixer[] = {
13954 /* output mixer control */
13955 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
13956 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
13957 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
13958 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
13959 /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
13961 /* Input mixer control */
13962 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
13963 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
13964 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
13965 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
13966 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
13967 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
13968 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
13969 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
13970 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
13971 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
13974 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13975 .name = "Channel Mode",
13976 .info = alc_ch_mode_info,
13977 .get = alc_ch_mode_get,
13978 .put = alc_ch_mode_put,
13979 .private_value = ARRAY_SIZE(alc861_threestack_modes),
13984 static struct snd_kcontrol_new alc861_toshiba_mixer[] = {
13985 /* output mixer control */
13986 HDA_CODEC_MUTE("Master Playback Switch", 0x03, 0x0, HDA_OUTPUT),
13987 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
13988 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
13993 static struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = {
13994 /* output mixer control */
13995 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
13996 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
13997 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
13998 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
13999 /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
14001 /* Input mixer control */
14002 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14003 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14004 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14005 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14006 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14007 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14008 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14009 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14010 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14011 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14014 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14015 .name = "Channel Mode",
14016 .info = alc_ch_mode_info,
14017 .get = alc_ch_mode_get,
14018 .put = alc_ch_mode_put,
14019 .private_value = ARRAY_SIZE(alc861_uniwill_m31_modes),
14024 static struct snd_kcontrol_new alc861_asus_mixer[] = {
14025 /* output mixer control */
14026 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14027 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14028 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14029 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14030 HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
14032 /* Input mixer control */
14033 HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14034 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT),
14035 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14036 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14037 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14038 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14039 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14040 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14041 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14042 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_OUTPUT),
14045 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14046 .name = "Channel Mode",
14047 .info = alc_ch_mode_info,
14048 .get = alc_ch_mode_get,
14049 .put = alc_ch_mode_put,
14050 .private_value = ARRAY_SIZE(alc861_asus_modes),
14055 /* additional mixer */
14056 static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = {
14057 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14058 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14063 * generic initialization of ADC, input mixers and output mixers
14065 static struct hda_verb alc861_base_init_verbs[] = {
14067 * Unmute ADC0 and set the default input to mic-in
14069 /* port-A for surround (rear panel) */
14070 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14071 { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x00 },
14072 /* port-B for mic-in (rear panel) with vref */
14073 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14074 /* port-C for line-in (rear panel) */
14075 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14076 /* port-D for Front */
14077 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14078 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14079 /* port-E for HP out (front panel) */
14080 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
14081 /* route front PCM to HP */
14082 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14083 /* port-F for mic-in (front panel) with vref */
14084 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14085 /* port-G for CLFE (rear panel) */
14086 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14087 { 0x1f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14088 /* port-H for side (rear panel) */
14089 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14090 { 0x20, AC_VERB_SET_CONNECT_SEL, 0x00 },
14092 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14093 /* route front mic to ADC1*/
14094 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14095 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14097 /* Unmute DAC0~3 & spdif out*/
14098 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14099 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14100 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14101 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14102 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14104 /* Unmute Mixer 14 (mic) 1c (Line in)*/
14105 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14106 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14107 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14108 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14110 /* Unmute Stereo Mixer 15 */
14111 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14112 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14113 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14114 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14116 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14117 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14118 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14119 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14120 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14121 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14122 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14123 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14124 /* hp used DAC 3 (Front) */
14125 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14126 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14131 static struct hda_verb alc861_threestack_init_verbs[] = {
14133 * Unmute ADC0 and set the default input to mic-in
14135 /* port-A for surround (rear panel) */
14136 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14137 /* port-B for mic-in (rear panel) with vref */
14138 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14139 /* port-C for line-in (rear panel) */
14140 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14141 /* port-D for Front */
14142 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14143 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14144 /* port-E for HP out (front panel) */
14145 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
14146 /* route front PCM to HP */
14147 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14148 /* port-F for mic-in (front panel) with vref */
14149 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14150 /* port-G for CLFE (rear panel) */
14151 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14152 /* port-H for side (rear panel) */
14153 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14155 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14156 /* route front mic to ADC1*/
14157 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14158 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14159 /* Unmute DAC0~3 & spdif out*/
14160 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14161 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14162 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14163 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14164 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14166 /* Unmute Mixer 14 (mic) 1c (Line in)*/
14167 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14168 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14169 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14170 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14172 /* Unmute Stereo Mixer 15 */
14173 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14174 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14175 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14176 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14178 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14179 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14180 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14181 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14182 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14183 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14184 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14185 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14186 /* hp used DAC 3 (Front) */
14187 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14188 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14192 static struct hda_verb alc861_uniwill_m31_init_verbs[] = {
14194 * Unmute ADC0 and set the default input to mic-in
14196 /* port-A for surround (rear panel) */
14197 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14198 /* port-B for mic-in (rear panel) with vref */
14199 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14200 /* port-C for line-in (rear panel) */
14201 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14202 /* port-D for Front */
14203 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14204 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14205 /* port-E for HP out (front panel) */
14206 /* this has to be set to VREF80 */
14207 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14208 /* route front PCM to HP */
14209 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14210 /* port-F for mic-in (front panel) with vref */
14211 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14212 /* port-G for CLFE (rear panel) */
14213 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14214 /* port-H for side (rear panel) */
14215 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
14217 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14218 /* route front mic to ADC1*/
14219 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14220 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14221 /* Unmute DAC0~3 & spdif out*/
14222 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14223 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14224 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14225 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14226 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14228 /* Unmute Mixer 14 (mic) 1c (Line in)*/
14229 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14230 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14231 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14232 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14234 /* Unmute Stereo Mixer 15 */
14235 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14236 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14237 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14238 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14240 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14241 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14242 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14243 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14244 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14245 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14246 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14247 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14248 /* hp used DAC 3 (Front) */
14249 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14250 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14254 static struct hda_verb alc861_asus_init_verbs[] = {
14256 * Unmute ADC0 and set the default input to mic-in
14258 /* port-A for surround (rear panel)
14259 * according to codec#0 this is the HP jack
14261 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, /* was 0x00 */
14262 /* route front PCM to HP */
14263 { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x01 },
14264 /* port-B for mic-in (rear panel) with vref */
14265 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14266 /* port-C for line-in (rear panel) */
14267 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14268 /* port-D for Front */
14269 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14270 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
14271 /* port-E for HP out (front panel) */
14272 /* this has to be set to VREF80 */
14273 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14274 /* route front PCM to HP */
14275 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
14276 /* port-F for mic-in (front panel) with vref */
14277 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14278 /* port-G for CLFE (rear panel) */
14279 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14280 /* port-H for side (rear panel) */
14281 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14283 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14284 /* route front mic to ADC1*/
14285 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
14286 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14287 /* Unmute DAC0~3 & spdif out*/
14288 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14289 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14290 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14291 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14292 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14293 /* Unmute Mixer 14 (mic) 1c (Line in)*/
14294 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14295 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14296 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14297 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14299 /* Unmute Stereo Mixer 15 */
14300 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14301 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14302 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14303 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
14305 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14306 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14307 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14308 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14309 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14310 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14311 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14312 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14313 /* hp used DAC 3 (Front) */
14314 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
14315 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14319 /* additional init verbs for ASUS laptops */
14320 static struct hda_verb alc861_asus_laptop_init_verbs[] = {
14321 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x45 }, /* HP-out */
14322 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2) }, /* mute line-in */
14327 * generic initialization of ADC, input mixers and output mixers
14329 static struct hda_verb alc861_auto_init_verbs[] = {
14331 * Unmute ADC0 and set the default input to mic-in
14333 /* {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, */
14334 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14336 /* Unmute DAC0~3 & spdif out*/
14337 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14338 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14339 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14340 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
14341 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14343 /* Unmute Mixer 14 (mic) 1c (Line in)*/
14344 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14345 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14346 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14347 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14349 /* Unmute Stereo Mixer 15 */
14350 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14351 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14352 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
14353 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c},
14355 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14356 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14357 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14358 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14359 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14360 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14361 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14362 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14364 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14365 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14366 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
14367 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
14368 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
14369 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
14370 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
14371 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
14373 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, /* set Mic 1 */
14378 static struct hda_verb alc861_toshiba_init_verbs[] = {
14379 {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
14384 /* toggle speaker-output according to the hp-jack state */
14385 static void alc861_toshiba_automute(struct hda_codec *codec)
14387 unsigned int present = snd_hda_jack_detect(codec, 0x0f);
14389 snd_hda_codec_amp_stereo(codec, 0x16, HDA_INPUT, 0,
14390 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
14391 snd_hda_codec_amp_stereo(codec, 0x1a, HDA_INPUT, 3,
14392 HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE);
14395 static void alc861_toshiba_unsol_event(struct hda_codec *codec,
14398 if ((res >> 26) == ALC880_HP_EVENT)
14399 alc861_toshiba_automute(codec);
14402 /* pcm configuration: identical with ALC880 */
14403 #define alc861_pcm_analog_playback alc880_pcm_analog_playback
14404 #define alc861_pcm_analog_capture alc880_pcm_analog_capture
14405 #define alc861_pcm_digital_playback alc880_pcm_digital_playback
14406 #define alc861_pcm_digital_capture alc880_pcm_digital_capture
14409 #define ALC861_DIGOUT_NID 0x07
14411 static struct hda_channel_mode alc861_8ch_modes[1] = {
14415 static hda_nid_t alc861_dac_nids[4] = {
14416 /* front, surround, clfe, side */
14417 0x03, 0x06, 0x05, 0x04
14420 static hda_nid_t alc660_dac_nids[3] = {
14421 /* front, clfe, surround */
14425 static hda_nid_t alc861_adc_nids[1] = {
14430 static struct hda_input_mux alc861_capture_source = {
14434 { "Front Mic", 0x3 },
14441 static hda_nid_t alc861_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
14443 struct alc_spec *spec = codec->spec;
14444 hda_nid_t mix, srcs[5];
14447 if (snd_hda_get_connections(codec, pin, &mix, 1) != 1)
14449 num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
14452 for (i = 0; i < num; i++) {
14454 type = get_wcaps_type(get_wcaps(codec, srcs[i]));
14455 if (type != AC_WID_AUD_OUT)
14457 for (j = 0; j < spec->multiout.num_dacs; j++)
14458 if (spec->multiout.dac_nids[j] == srcs[i])
14460 if (j >= spec->multiout.num_dacs)
14466 /* fill in the dac_nids table from the parsed pin configuration */
14467 static int alc861_auto_fill_dac_nids(struct hda_codec *codec,
14468 const struct auto_pin_cfg *cfg)
14470 struct alc_spec *spec = codec->spec;
14472 hda_nid_t nid, dac;
14474 spec->multiout.dac_nids = spec->private_dac_nids;
14475 for (i = 0; i < cfg->line_outs; i++) {
14476 nid = cfg->line_out_pins[i];
14477 dac = alc861_look_for_dac(codec, nid);
14480 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
14485 static int alc861_create_out_sw(struct hda_codec *codec, const char *pfx,
14486 hda_nid_t nid, unsigned int chs)
14488 return add_pb_sw_ctrl(codec->spec, ALC_CTL_WIDGET_MUTE, pfx,
14489 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
14492 /* add playback controls from the parsed DAC table */
14493 static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
14494 const struct auto_pin_cfg *cfg)
14496 struct alc_spec *spec = codec->spec;
14497 static const char *chname[4] = {
14498 "Front", "Surround", NULL /*CLFE*/, "Side"
14503 if (cfg->line_outs == 1) {
14504 const char *pfx = NULL;
14507 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
14510 nid = spec->multiout.dac_nids[0];
14511 return alc861_create_out_sw(codec, pfx, nid, 3);
14515 for (i = 0; i < cfg->line_outs; i++) {
14516 nid = spec->multiout.dac_nids[i];
14521 err = alc861_create_out_sw(codec, "Center", nid, 1);
14524 err = alc861_create_out_sw(codec, "LFE", nid, 2);
14528 err = alc861_create_out_sw(codec, chname[i], nid, 3);
14536 static int alc861_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin)
14538 struct alc_spec *spec = codec->spec;
14545 if ((pin >= 0x0b && pin <= 0x10) || pin == 0x1f || pin == 0x20) {
14546 nid = alc861_look_for_dac(codec, pin);
14548 err = alc861_create_out_sw(codec, "Headphone", nid, 3);
14551 spec->multiout.hp_nid = nid;
14557 /* create playback/capture controls for input pins */
14558 static int alc861_auto_create_input_ctls(struct hda_codec *codec,
14559 const struct auto_pin_cfg *cfg)
14561 return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x08, 0);
14564 static void alc861_auto_set_output_and_unmute(struct hda_codec *codec,
14566 int pin_type, hda_nid_t dac)
14568 hda_nid_t mix, srcs[5];
14571 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
14573 snd_hda_codec_write(codec, dac, 0, AC_VERB_SET_AMP_GAIN_MUTE,
14575 if (snd_hda_get_connections(codec, nid, &mix, 1) != 1)
14577 num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
14580 for (i = 0; i < num; i++) {
14582 if (srcs[i] == dac || srcs[i] == 0x15)
14583 mute = AMP_IN_UNMUTE(i);
14585 mute = AMP_IN_MUTE(i);
14586 snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
14591 static void alc861_auto_init_multi_out(struct hda_codec *codec)
14593 struct alc_spec *spec = codec->spec;
14596 for (i = 0; i < spec->autocfg.line_outs; i++) {
14597 hda_nid_t nid = spec->autocfg.line_out_pins[i];
14598 int pin_type = get_pin_type(spec->autocfg.line_out_type);
14600 alc861_auto_set_output_and_unmute(codec, nid, pin_type,
14601 spec->multiout.dac_nids[i]);
14605 static void alc861_auto_init_hp_out(struct hda_codec *codec)
14607 struct alc_spec *spec = codec->spec;
14609 if (spec->autocfg.hp_outs)
14610 alc861_auto_set_output_and_unmute(codec,
14611 spec->autocfg.hp_pins[0],
14613 spec->multiout.hp_nid);
14614 if (spec->autocfg.speaker_outs)
14615 alc861_auto_set_output_and_unmute(codec,
14616 spec->autocfg.speaker_pins[0],
14618 spec->multiout.dac_nids[0]);
14621 static void alc861_auto_init_analog_input(struct hda_codec *codec)
14623 struct alc_spec *spec = codec->spec;
14626 for (i = 0; i < AUTO_PIN_LAST; i++) {
14627 hda_nid_t nid = spec->autocfg.input_pins[i];
14628 if (nid >= 0x0c && nid <= 0x11)
14629 alc_set_input_pin(codec, nid, i);
14633 /* parse the BIOS configuration and set up the alc_spec */
14634 /* return 1 if successful, 0 if the proper config is not found,
14635 * or a negative error code
14637 static int alc861_parse_auto_config(struct hda_codec *codec)
14639 struct alc_spec *spec = codec->spec;
14641 static hda_nid_t alc861_ignore[] = { 0x1d, 0 };
14643 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
14647 if (!spec->autocfg.line_outs)
14648 return 0; /* can't find valid BIOS pin config */
14650 err = alc861_auto_fill_dac_nids(codec, &spec->autocfg);
14653 err = alc861_auto_create_multi_out_ctls(codec, &spec->autocfg);
14656 err = alc861_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]);
14659 err = alc861_auto_create_input_ctls(codec, &spec->autocfg);
14663 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
14665 if (spec->autocfg.dig_outs)
14666 spec->multiout.dig_out_nid = ALC861_DIGOUT_NID;
14668 if (spec->kctls.list)
14669 add_mixer(spec, spec->kctls.list);
14671 add_verb(spec, alc861_auto_init_verbs);
14673 spec->num_mux_defs = 1;
14674 spec->input_mux = &spec->private_imux[0];
14676 spec->adc_nids = alc861_adc_nids;
14677 spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids);
14678 set_capture_mixer(codec);
14680 alc_ssid_check(codec, 0x0e, 0x0f, 0x0b);
14685 /* additional initialization for auto-configuration model */
14686 static void alc861_auto_init(struct hda_codec *codec)
14688 struct alc_spec *spec = codec->spec;
14689 alc861_auto_init_multi_out(codec);
14690 alc861_auto_init_hp_out(codec);
14691 alc861_auto_init_analog_input(codec);
14692 if (spec->unsol_event)
14693 alc_inithook(codec);
14696 #ifdef CONFIG_SND_HDA_POWER_SAVE
14697 static struct hda_amp_list alc861_loopbacks[] = {
14698 { 0x15, HDA_INPUT, 0 },
14699 { 0x15, HDA_INPUT, 1 },
14700 { 0x15, HDA_INPUT, 2 },
14701 { 0x15, HDA_INPUT, 3 },
14708 * configuration and preset
14710 static const char *alc861_models[ALC861_MODEL_LAST] = {
14711 [ALC861_3ST] = "3stack",
14712 [ALC660_3ST] = "3stack-660",
14713 [ALC861_3ST_DIG] = "3stack-dig",
14714 [ALC861_6ST_DIG] = "6stack-dig",
14715 [ALC861_UNIWILL_M31] = "uniwill-m31",
14716 [ALC861_TOSHIBA] = "toshiba",
14717 [ALC861_ASUS] = "asus",
14718 [ALC861_ASUS_LAPTOP] = "asus-laptop",
14719 [ALC861_AUTO] = "auto",
14722 static struct snd_pci_quirk alc861_cfg_tbl[] = {
14723 SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC861_3ST),
14724 SND_PCI_QUIRK(0x1043, 0x1335, "ASUS F2/3", ALC861_ASUS_LAPTOP),
14725 SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP),
14726 SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS),
14727 SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP),
14728 SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS P1-AH2", ALC861_3ST_DIG),
14729 SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA),
14730 /* FIXME: the entry below breaks Toshiba A100 (model=auto works!)
14731 * Any other models that need this preset?
14733 /* SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA), */
14734 SND_PCI_QUIRK(0x1462, 0x7254, "HP dx2200 (MSI MS-7254)", ALC861_3ST),
14735 SND_PCI_QUIRK(0x1462, 0x7297, "HP dx2250 (MSI MS-7297)", ALC861_3ST),
14736 SND_PCI_QUIRK(0x1584, 0x2b01, "Uniwill X40AIx", ALC861_UNIWILL_M31),
14737 SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31),
14738 SND_PCI_QUIRK(0x1584, 0x9075, "Airis Praxis N1212", ALC861_ASUS_LAPTOP),
14739 /* FIXME: the below seems conflict */
14740 /* SND_PCI_QUIRK(0x1584, 0x9075, "Uniwill", ALC861_UNIWILL_M31), */
14741 SND_PCI_QUIRK(0x1849, 0x0660, "Asrock 939SLI32", ALC660_3ST),
14742 SND_PCI_QUIRK(0x8086, 0xd600, "Intel", ALC861_3ST),
14746 static struct alc_config_preset alc861_presets[] = {
14748 .mixers = { alc861_3ST_mixer },
14749 .init_verbs = { alc861_threestack_init_verbs },
14750 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
14751 .dac_nids = alc861_dac_nids,
14752 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
14753 .channel_mode = alc861_threestack_modes,
14755 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14756 .adc_nids = alc861_adc_nids,
14757 .input_mux = &alc861_capture_source,
14759 [ALC861_3ST_DIG] = {
14760 .mixers = { alc861_base_mixer },
14761 .init_verbs = { alc861_threestack_init_verbs },
14762 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
14763 .dac_nids = alc861_dac_nids,
14764 .dig_out_nid = ALC861_DIGOUT_NID,
14765 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
14766 .channel_mode = alc861_threestack_modes,
14768 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14769 .adc_nids = alc861_adc_nids,
14770 .input_mux = &alc861_capture_source,
14772 [ALC861_6ST_DIG] = {
14773 .mixers = { alc861_base_mixer },
14774 .init_verbs = { alc861_base_init_verbs },
14775 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
14776 .dac_nids = alc861_dac_nids,
14777 .dig_out_nid = ALC861_DIGOUT_NID,
14778 .num_channel_mode = ARRAY_SIZE(alc861_8ch_modes),
14779 .channel_mode = alc861_8ch_modes,
14780 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14781 .adc_nids = alc861_adc_nids,
14782 .input_mux = &alc861_capture_source,
14785 .mixers = { alc861_3ST_mixer },
14786 .init_verbs = { alc861_threestack_init_verbs },
14787 .num_dacs = ARRAY_SIZE(alc660_dac_nids),
14788 .dac_nids = alc660_dac_nids,
14789 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
14790 .channel_mode = alc861_threestack_modes,
14792 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14793 .adc_nids = alc861_adc_nids,
14794 .input_mux = &alc861_capture_source,
14796 [ALC861_UNIWILL_M31] = {
14797 .mixers = { alc861_uniwill_m31_mixer },
14798 .init_verbs = { alc861_uniwill_m31_init_verbs },
14799 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
14800 .dac_nids = alc861_dac_nids,
14801 .dig_out_nid = ALC861_DIGOUT_NID,
14802 .num_channel_mode = ARRAY_SIZE(alc861_uniwill_m31_modes),
14803 .channel_mode = alc861_uniwill_m31_modes,
14805 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14806 .adc_nids = alc861_adc_nids,
14807 .input_mux = &alc861_capture_source,
14809 [ALC861_TOSHIBA] = {
14810 .mixers = { alc861_toshiba_mixer },
14811 .init_verbs = { alc861_base_init_verbs,
14812 alc861_toshiba_init_verbs },
14813 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
14814 .dac_nids = alc861_dac_nids,
14815 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
14816 .channel_mode = alc883_3ST_2ch_modes,
14817 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14818 .adc_nids = alc861_adc_nids,
14819 .input_mux = &alc861_capture_source,
14820 .unsol_event = alc861_toshiba_unsol_event,
14821 .init_hook = alc861_toshiba_automute,
14824 .mixers = { alc861_asus_mixer },
14825 .init_verbs = { alc861_asus_init_verbs },
14826 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
14827 .dac_nids = alc861_dac_nids,
14828 .dig_out_nid = ALC861_DIGOUT_NID,
14829 .num_channel_mode = ARRAY_SIZE(alc861_asus_modes),
14830 .channel_mode = alc861_asus_modes,
14833 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14834 .adc_nids = alc861_adc_nids,
14835 .input_mux = &alc861_capture_source,
14837 [ALC861_ASUS_LAPTOP] = {
14838 .mixers = { alc861_toshiba_mixer, alc861_asus_laptop_mixer },
14839 .init_verbs = { alc861_asus_init_verbs,
14840 alc861_asus_laptop_init_verbs },
14841 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
14842 .dac_nids = alc861_dac_nids,
14843 .dig_out_nid = ALC861_DIGOUT_NID,
14844 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
14845 .channel_mode = alc883_3ST_2ch_modes,
14847 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
14848 .adc_nids = alc861_adc_nids,
14849 .input_mux = &alc861_capture_source,
14853 /* Pin config fixes */
14855 PINFIX_FSC_AMILO_PI1505,
14858 static struct alc_pincfg alc861_fsc_amilo_pi1505_pinfix[] = {
14859 { 0x0b, 0x0221101f }, /* HP */
14860 { 0x0f, 0x90170310 }, /* speaker */
14864 static const struct alc_fixup alc861_fixups[] = {
14865 [PINFIX_FSC_AMILO_PI1505] = {
14866 .pins = alc861_fsc_amilo_pi1505_pinfix
14870 static struct snd_pci_quirk alc861_fixup_tbl[] = {
14871 SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505),
14875 static int patch_alc861(struct hda_codec *codec)
14877 struct alc_spec *spec;
14881 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
14885 codec->spec = spec;
14887 board_config = snd_hda_check_board_config(codec, ALC861_MODEL_LAST,
14891 if (board_config < 0) {
14892 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
14894 board_config = ALC861_AUTO;
14897 alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups);
14899 if (board_config == ALC861_AUTO) {
14900 /* automatic parse from the BIOS config */
14901 err = alc861_parse_auto_config(codec);
14907 "hda_codec: Cannot set up configuration "
14908 "from BIOS. Using base mode...\n");
14909 board_config = ALC861_3ST_DIG;
14913 err = snd_hda_attach_beep_device(codec, 0x23);
14919 if (board_config != ALC861_AUTO)
14920 setup_preset(codec, &alc861_presets[board_config]);
14922 spec->stream_analog_playback = &alc861_pcm_analog_playback;
14923 spec->stream_analog_capture = &alc861_pcm_analog_capture;
14925 spec->stream_digital_playback = &alc861_pcm_digital_playback;
14926 spec->stream_digital_capture = &alc861_pcm_digital_capture;
14928 if (!spec->cap_mixer)
14929 set_capture_mixer(codec);
14930 set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
14932 spec->vmaster_nid = 0x03;
14934 codec->patch_ops = alc_patch_ops;
14935 if (board_config == ALC861_AUTO)
14936 spec->init_hook = alc861_auto_init;
14937 #ifdef CONFIG_SND_HDA_POWER_SAVE
14938 if (!spec->loopback.amplist)
14939 spec->loopback.amplist = alc861_loopbacks;
14941 codec->proc_widget_hook = print_realtek_coef;
14947 * ALC861-VD support
14951 * In addition, an independent DAC
14953 #define ALC861VD_DIGOUT_NID 0x06
14955 static hda_nid_t alc861vd_dac_nids[4] = {
14956 /* front, surr, clfe, side surr */
14957 0x02, 0x03, 0x04, 0x05
14960 /* dac_nids for ALC660vd are in a different order - according to
14961 * Realtek's driver.
14962 * This should probably result in a different mixer for 6stack models
14963 * of ALC660vd codecs, but for now there is only 3stack mixer
14964 * - and it is the same as in 861vd.
14965 * adc_nids in ALC660vd are (is) the same as in 861vd
14967 static hda_nid_t alc660vd_dac_nids[3] = {
14968 /* front, rear, clfe, rear_surr */
14972 static hda_nid_t alc861vd_adc_nids[1] = {
14977 static hda_nid_t alc861vd_capsrc_nids[1] = { 0x22 };
14980 /* FIXME: should be a matrix-type input source selection */
14981 static struct hda_input_mux alc861vd_capture_source = {
14985 { "Front Mic", 0x1 },
14991 static struct hda_input_mux alc861vd_dallas_capture_source = {
14994 { "Ext Mic", 0x0 },
14995 { "Int Mic", 0x1 },
14999 static struct hda_input_mux alc861vd_hp_capture_source = {
15002 { "Front Mic", 0x0 },
15003 { "ATAPI Mic", 0x1 },
15010 static struct hda_channel_mode alc861vd_3stack_2ch_modes[1] = {
15017 static struct hda_verb alc861vd_6stack_ch6_init[] = {
15018 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15019 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15020 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15021 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15028 static struct hda_verb alc861vd_6stack_ch8_init[] = {
15029 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15030 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15031 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15032 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15036 static struct hda_channel_mode alc861vd_6stack_modes[2] = {
15037 { 6, alc861vd_6stack_ch6_init },
15038 { 8, alc861vd_6stack_ch8_init },
15041 static struct snd_kcontrol_new alc861vd_chmode_mixer[] = {
15043 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
15044 .name = "Channel Mode",
15045 .info = alc_ch_mode_info,
15046 .get = alc_ch_mode_get,
15047 .put = alc_ch_mode_put,
15052 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
15053 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
15055 static struct snd_kcontrol_new alc861vd_6st_mixer[] = {
15056 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15057 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15059 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15060 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
15062 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0,
15064 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0,
15066 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
15067 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
15069 HDA_CODEC_VOLUME("Side Playback Volume", 0x05, 0x0, HDA_OUTPUT),
15070 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
15072 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15074 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15075 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15076 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15078 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15079 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15080 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15082 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15083 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15085 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15086 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15091 static struct snd_kcontrol_new alc861vd_3st_mixer[] = {
15092 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15093 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15095 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15097 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15098 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15099 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15101 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15102 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15103 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15105 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
15106 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
15108 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15109 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15114 static struct snd_kcontrol_new alc861vd_lenovo_mixer[] = {
15115 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15116 /*HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),*/
15117 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
15119 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
15121 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
15122 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15123 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15125 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
15126 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15127 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15129 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
15130 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
15135 /* Pin assignment: Speaker=0x14, HP = 0x15,
15136 * Ext Mic=0x18, Int Mic = 0x19, CD = 0x1c, PC Beep = 0x1d
15138 static struct snd_kcontrol_new alc861vd_dallas_mixer[] = {
15139 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15140 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
15141 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15142 HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
15143 HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
15144 HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15145 HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15146 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
15147 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15148 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15152 /* Pin assignment: Speaker=0x14, Line-out = 0x15,
15153 * Front Mic=0x18, ATAPI Mic = 0x19,
15155 static struct snd_kcontrol_new alc861vd_hp_mixer[] = {
15156 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15157 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15158 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15159 HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
15160 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
15161 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
15162 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
15163 HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
15169 * generic initialization of ADC, input mixers and output mixers
15171 static struct hda_verb alc861vd_volume_init_verbs[] = {
15173 * Unmute ADC0 and set the default input to mic-in
15175 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
15176 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15178 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of
15179 * the analog-loopback mixer widget
15181 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
15182 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15183 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15184 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15185 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15186 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
15188 /* Capture mixer: unmute Mic, F-Mic, Line, CD inputs */
15189 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15190 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15191 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15192 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},
15195 * Set up output mixers (0x02 - 0x05)
15197 /* set vol=0 to output mixers */
15198 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15199 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15200 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15201 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15203 /* set up input amps for analog loopback */
15204 /* Amp Indices: DAC = 0, mixer = 1 */
15205 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15206 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15207 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15208 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15209 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15210 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15211 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15212 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15218 * 3-stack pin configuration:
15219 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
15221 static struct hda_verb alc861vd_3stack_init_verbs[] = {
15223 * Set pin mode and muting
15225 /* set front pin widgets 0x14 for output */
15226 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15227 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15228 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
15230 /* Mic (rear) pin: input vref at 80% */
15231 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15232 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15233 /* Front Mic pin: input vref at 80% */
15234 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15235 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15236 /* Line In pin: input */
15237 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15238 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15239 /* Line-2 In: Headphone output (output 0 - 0x0c) */
15240 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
15241 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15242 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
15243 /* CD pin widget for input */
15244 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15250 * 6-stack pin configuration:
15252 static struct hda_verb alc861vd_6stack_init_verbs[] = {
15254 * Set pin mode and muting
15256 /* set front pin widgets 0x14 for output */
15257 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15258 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15259 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
15261 /* Rear Pin: output 1 (0x0d) */
15262 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15263 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15264 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
15265 /* CLFE Pin: output 2 (0x0e) */
15266 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15267 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15268 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
15269 /* Side Pin: output 3 (0x0f) */
15270 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15271 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15272 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
15274 /* Mic (rear) pin: input vref at 80% */
15275 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15276 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15277 /* Front Mic pin: input vref at 80% */
15278 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
15279 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15280 /* Line In pin: input */
15281 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15282 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15283 /* Line-2 In: Headphone output (output 0 - 0x0c) */
15284 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
15285 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15286 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
15287 /* CD pin widget for input */
15288 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15293 static struct hda_verb alc861vd_eapd_verbs[] = {
15294 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
15298 static struct hda_verb alc660vd_eapd_verbs[] = {
15299 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
15300 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
15304 static struct hda_verb alc861vd_lenovo_unsol_verbs[] = {
15305 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15306 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15307 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
15308 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
15309 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
15313 static void alc861vd_lenovo_mic_automute(struct hda_codec *codec)
15315 unsigned int present;
15316 unsigned char bits;
15318 present = snd_hda_jack_detect(codec, 0x18);
15319 bits = present ? HDA_AMP_MUTE : 0;
15321 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
15322 HDA_AMP_MUTE, bits);
15325 static void alc861vd_lenovo_setup(struct hda_codec *codec)
15327 struct alc_spec *spec = codec->spec;
15328 spec->autocfg.hp_pins[0] = 0x1b;
15329 spec->autocfg.speaker_pins[0] = 0x14;
15332 static void alc861vd_lenovo_init_hook(struct hda_codec *codec)
15334 alc_automute_amp(codec);
15335 alc861vd_lenovo_mic_automute(codec);
15338 static void alc861vd_lenovo_unsol_event(struct hda_codec *codec,
15341 switch (res >> 26) {
15342 case ALC880_MIC_EVENT:
15343 alc861vd_lenovo_mic_automute(codec);
15346 alc_automute_amp_unsol_event(codec, res);
15351 static struct hda_verb alc861vd_dallas_verbs[] = {
15352 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15353 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15354 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15355 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
15357 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15358 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15359 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15360 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15361 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15362 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15363 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15364 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15366 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15367 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15368 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15369 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15370 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15371 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15372 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
15373 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15375 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
15376 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15377 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
15378 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15379 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15380 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15381 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15382 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
15384 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15385 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15386 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15387 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
15389 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15390 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
15391 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
15396 /* toggle speaker-output according to the hp-jack state */
15397 static void alc861vd_dallas_setup(struct hda_codec *codec)
15399 struct alc_spec *spec = codec->spec;
15401 spec->autocfg.hp_pins[0] = 0x15;
15402 spec->autocfg.speaker_pins[0] = 0x14;
15405 #ifdef CONFIG_SND_HDA_POWER_SAVE
15406 #define alc861vd_loopbacks alc880_loopbacks
15409 /* pcm configuration: identical with ALC880 */
15410 #define alc861vd_pcm_analog_playback alc880_pcm_analog_playback
15411 #define alc861vd_pcm_analog_capture alc880_pcm_analog_capture
15412 #define alc861vd_pcm_digital_playback alc880_pcm_digital_playback
15413 #define alc861vd_pcm_digital_capture alc880_pcm_digital_capture
15416 * configuration and preset
15418 static const char *alc861vd_models[ALC861VD_MODEL_LAST] = {
15419 [ALC660VD_3ST] = "3stack-660",
15420 [ALC660VD_3ST_DIG] = "3stack-660-digout",
15421 [ALC660VD_ASUS_V1S] = "asus-v1s",
15422 [ALC861VD_3ST] = "3stack",
15423 [ALC861VD_3ST_DIG] = "3stack-digout",
15424 [ALC861VD_6ST_DIG] = "6stack-digout",
15425 [ALC861VD_LENOVO] = "lenovo",
15426 [ALC861VD_DALLAS] = "dallas",
15427 [ALC861VD_HP] = "hp",
15428 [ALC861VD_AUTO] = "auto",
15431 static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
15432 SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST),
15433 SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP),
15434 SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST),
15435 /*SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),*/ /* auto */
15436 SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S),
15437 SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG),
15438 SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
15439 SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO),
15440 /*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/
15441 SND_PCI_QUIRK(0x1179, 0xff01, "Toshiba A135", ALC861VD_LENOVO),
15442 SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO),
15443 SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS),
15444 SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG),
15445 SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", ALC861VD_LENOVO),
15446 SND_PCI_QUIRK(0x1849, 0x0862, "ASRock K8NF6G-VSTA", ALC861VD_6ST_DIG),
15450 static struct alc_config_preset alc861vd_presets[] = {
15452 .mixers = { alc861vd_3st_mixer },
15453 .init_verbs = { alc861vd_volume_init_verbs,
15454 alc861vd_3stack_init_verbs },
15455 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15456 .dac_nids = alc660vd_dac_nids,
15457 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15458 .channel_mode = alc861vd_3stack_2ch_modes,
15459 .input_mux = &alc861vd_capture_source,
15461 [ALC660VD_3ST_DIG] = {
15462 .mixers = { alc861vd_3st_mixer },
15463 .init_verbs = { alc861vd_volume_init_verbs,
15464 alc861vd_3stack_init_verbs },
15465 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15466 .dac_nids = alc660vd_dac_nids,
15467 .dig_out_nid = ALC861VD_DIGOUT_NID,
15468 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15469 .channel_mode = alc861vd_3stack_2ch_modes,
15470 .input_mux = &alc861vd_capture_source,
15473 .mixers = { alc861vd_3st_mixer },
15474 .init_verbs = { alc861vd_volume_init_verbs,
15475 alc861vd_3stack_init_verbs },
15476 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15477 .dac_nids = alc861vd_dac_nids,
15478 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15479 .channel_mode = alc861vd_3stack_2ch_modes,
15480 .input_mux = &alc861vd_capture_source,
15482 [ALC861VD_3ST_DIG] = {
15483 .mixers = { alc861vd_3st_mixer },
15484 .init_verbs = { alc861vd_volume_init_verbs,
15485 alc861vd_3stack_init_verbs },
15486 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15487 .dac_nids = alc861vd_dac_nids,
15488 .dig_out_nid = ALC861VD_DIGOUT_NID,
15489 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15490 .channel_mode = alc861vd_3stack_2ch_modes,
15491 .input_mux = &alc861vd_capture_source,
15493 [ALC861VD_6ST_DIG] = {
15494 .mixers = { alc861vd_6st_mixer, alc861vd_chmode_mixer },
15495 .init_verbs = { alc861vd_volume_init_verbs,
15496 alc861vd_6stack_init_verbs },
15497 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15498 .dac_nids = alc861vd_dac_nids,
15499 .dig_out_nid = ALC861VD_DIGOUT_NID,
15500 .num_channel_mode = ARRAY_SIZE(alc861vd_6stack_modes),
15501 .channel_mode = alc861vd_6stack_modes,
15502 .input_mux = &alc861vd_capture_source,
15504 [ALC861VD_LENOVO] = {
15505 .mixers = { alc861vd_lenovo_mixer },
15506 .init_verbs = { alc861vd_volume_init_verbs,
15507 alc861vd_3stack_init_verbs,
15508 alc861vd_eapd_verbs,
15509 alc861vd_lenovo_unsol_verbs },
15510 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15511 .dac_nids = alc660vd_dac_nids,
15512 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15513 .channel_mode = alc861vd_3stack_2ch_modes,
15514 .input_mux = &alc861vd_capture_source,
15515 .unsol_event = alc861vd_lenovo_unsol_event,
15516 .setup = alc861vd_lenovo_setup,
15517 .init_hook = alc861vd_lenovo_init_hook,
15519 [ALC861VD_DALLAS] = {
15520 .mixers = { alc861vd_dallas_mixer },
15521 .init_verbs = { alc861vd_dallas_verbs },
15522 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15523 .dac_nids = alc861vd_dac_nids,
15524 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15525 .channel_mode = alc861vd_3stack_2ch_modes,
15526 .input_mux = &alc861vd_dallas_capture_source,
15527 .unsol_event = alc_automute_amp_unsol_event,
15528 .setup = alc861vd_dallas_setup,
15529 .init_hook = alc_automute_amp,
15532 .mixers = { alc861vd_hp_mixer },
15533 .init_verbs = { alc861vd_dallas_verbs, alc861vd_eapd_verbs },
15534 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
15535 .dac_nids = alc861vd_dac_nids,
15536 .dig_out_nid = ALC861VD_DIGOUT_NID,
15537 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15538 .channel_mode = alc861vd_3stack_2ch_modes,
15539 .input_mux = &alc861vd_hp_capture_source,
15540 .unsol_event = alc_automute_amp_unsol_event,
15541 .setup = alc861vd_dallas_setup,
15542 .init_hook = alc_automute_amp,
15544 [ALC660VD_ASUS_V1S] = {
15545 .mixers = { alc861vd_lenovo_mixer },
15546 .init_verbs = { alc861vd_volume_init_verbs,
15547 alc861vd_3stack_init_verbs,
15548 alc861vd_eapd_verbs,
15549 alc861vd_lenovo_unsol_verbs },
15550 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
15551 .dac_nids = alc660vd_dac_nids,
15552 .dig_out_nid = ALC861VD_DIGOUT_NID,
15553 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
15554 .channel_mode = alc861vd_3stack_2ch_modes,
15555 .input_mux = &alc861vd_capture_source,
15556 .unsol_event = alc861vd_lenovo_unsol_event,
15557 .setup = alc861vd_lenovo_setup,
15558 .init_hook = alc861vd_lenovo_init_hook,
15563 * BIOS auto configuration
15565 static int alc861vd_auto_create_input_ctls(struct hda_codec *codec,
15566 const struct auto_pin_cfg *cfg)
15568 return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x22, 0);
15572 static void alc861vd_auto_set_output_and_unmute(struct hda_codec *codec,
15573 hda_nid_t nid, int pin_type, int dac_idx)
15575 alc_set_pin_output(codec, nid, pin_type);
15578 static void alc861vd_auto_init_multi_out(struct hda_codec *codec)
15580 struct alc_spec *spec = codec->spec;
15583 for (i = 0; i <= HDA_SIDE; i++) {
15584 hda_nid_t nid = spec->autocfg.line_out_pins[i];
15585 int pin_type = get_pin_type(spec->autocfg.line_out_type);
15587 alc861vd_auto_set_output_and_unmute(codec, nid,
15593 static void alc861vd_auto_init_hp_out(struct hda_codec *codec)
15595 struct alc_spec *spec = codec->spec;
15598 pin = spec->autocfg.hp_pins[0];
15599 if (pin) /* connect to front and use dac 0 */
15600 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
15601 pin = spec->autocfg.speaker_pins[0];
15603 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
15606 #define ALC861VD_PIN_CD_NID ALC880_PIN_CD_NID
15608 static void alc861vd_auto_init_analog_input(struct hda_codec *codec)
15610 struct alc_spec *spec = codec->spec;
15613 for (i = 0; i < AUTO_PIN_LAST; i++) {
15614 hda_nid_t nid = spec->autocfg.input_pins[i];
15615 if (alc_is_input_pin(codec, nid)) {
15616 alc_set_input_pin(codec, nid, i);
15617 if (nid != ALC861VD_PIN_CD_NID &&
15618 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
15619 snd_hda_codec_write(codec, nid, 0,
15620 AC_VERB_SET_AMP_GAIN_MUTE,
15626 #define alc861vd_auto_init_input_src alc882_auto_init_input_src
15628 #define alc861vd_idx_to_mixer_vol(nid) ((nid) + 0x02)
15629 #define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c)
15631 /* add playback controls from the parsed DAC table */
15632 /* Based on ALC880 version. But ALC861VD has separate,
15633 * different NIDs for mute/unmute switch and volume control */
15634 static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
15635 const struct auto_pin_cfg *cfg)
15637 static const char *chname[4] = {"Front", "Surround", "CLFE", "Side"};
15638 hda_nid_t nid_v, nid_s;
15641 for (i = 0; i < cfg->line_outs; i++) {
15642 if (!spec->multiout.dac_nids[i])
15644 nid_v = alc861vd_idx_to_mixer_vol(
15646 spec->multiout.dac_nids[i]));
15647 nid_s = alc861vd_idx_to_mixer_switch(
15649 spec->multiout.dac_nids[i]));
15653 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
15655 HDA_COMPOSE_AMP_VAL(nid_v, 1, 0,
15659 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
15661 HDA_COMPOSE_AMP_VAL(nid_v, 2, 0,
15665 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
15667 HDA_COMPOSE_AMP_VAL(nid_s, 1, 2,
15671 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
15673 HDA_COMPOSE_AMP_VAL(nid_s, 2, 2,
15679 if (cfg->line_outs == 1 &&
15680 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
15687 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
15688 HDA_COMPOSE_AMP_VAL(nid_v, 3, 0,
15692 if (cfg->line_outs == 1 &&
15693 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
15695 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
15696 HDA_COMPOSE_AMP_VAL(nid_s, 3, 2,
15705 /* add playback controls for speaker and HP outputs */
15706 /* Based on ALC880 version. But ALC861VD has separate,
15707 * different NIDs for mute/unmute switch and volume control */
15708 static int alc861vd_auto_create_extra_out(struct alc_spec *spec,
15709 hda_nid_t pin, const char *pfx)
15711 hda_nid_t nid_v, nid_s;
15717 if (alc880_is_fixed_pin(pin)) {
15718 nid_v = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
15719 /* specify the DAC as the extra output */
15720 if (!spec->multiout.hp_nid)
15721 spec->multiout.hp_nid = nid_v;
15723 spec->multiout.extra_out_nid[0] = nid_v;
15724 /* control HP volume/switch on the output mixer amp */
15725 nid_v = alc861vd_idx_to_mixer_vol(
15726 alc880_fixed_pin_idx(pin));
15727 nid_s = alc861vd_idx_to_mixer_switch(
15728 alc880_fixed_pin_idx(pin));
15730 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
15731 HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, HDA_OUTPUT));
15734 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
15735 HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, HDA_INPUT));
15738 } else if (alc880_is_multi_pin(pin)) {
15739 /* set manual connection */
15740 /* we have only a switch on HP-out PIN */
15741 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
15742 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
15749 /* parse the BIOS configuration and set up the alc_spec
15750 * return 1 if successful, 0 if the proper config is not found,
15751 * or a negative error code
15752 * Based on ALC880 version - had to change it to override
15753 * alc880_auto_create_extra_out and alc880_auto_create_multi_out_ctls */
15754 static int alc861vd_parse_auto_config(struct hda_codec *codec)
15756 struct alc_spec *spec = codec->spec;
15758 static hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
15760 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
15764 if (!spec->autocfg.line_outs)
15765 return 0; /* can't find valid BIOS pin config */
15767 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
15770 err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg);
15773 err = alc861vd_auto_create_extra_out(spec,
15774 spec->autocfg.speaker_pins[0],
15778 err = alc861vd_auto_create_extra_out(spec,
15779 spec->autocfg.hp_pins[0],
15783 err = alc861vd_auto_create_input_ctls(codec, &spec->autocfg);
15787 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
15789 if (spec->autocfg.dig_outs)
15790 spec->multiout.dig_out_nid = ALC861VD_DIGOUT_NID;
15792 if (spec->kctls.list)
15793 add_mixer(spec, spec->kctls.list);
15795 add_verb(spec, alc861vd_volume_init_verbs);
15797 spec->num_mux_defs = 1;
15798 spec->input_mux = &spec->private_imux[0];
15800 err = alc_auto_add_mic_boost(codec);
15804 alc_ssid_check(codec, 0x15, 0x1b, 0x14);
15809 /* additional initialization for auto-configuration model */
15810 static void alc861vd_auto_init(struct hda_codec *codec)
15812 struct alc_spec *spec = codec->spec;
15813 alc861vd_auto_init_multi_out(codec);
15814 alc861vd_auto_init_hp_out(codec);
15815 alc861vd_auto_init_analog_input(codec);
15816 alc861vd_auto_init_input_src(codec);
15817 if (spec->unsol_event)
15818 alc_inithook(codec);
15822 ALC660VD_FIX_ASUS_GPIO1
15826 static const struct hda_verb alc660vd_fix_asus_gpio1_verbs[] = {
15827 {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
15828 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
15829 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
15833 static const struct alc_fixup alc861vd_fixups[] = {
15834 [ALC660VD_FIX_ASUS_GPIO1] = {
15835 .verbs = alc660vd_fix_asus_gpio1_verbs,
15839 static struct snd_pci_quirk alc861vd_fixup_tbl[] = {
15840 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
15844 static int patch_alc861vd(struct hda_codec *codec)
15846 struct alc_spec *spec;
15847 int err, board_config;
15849 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
15853 codec->spec = spec;
15855 board_config = snd_hda_check_board_config(codec, ALC861VD_MODEL_LAST,
15859 if (board_config < 0 || board_config >= ALC861VD_MODEL_LAST) {
15860 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
15862 board_config = ALC861VD_AUTO;
15865 alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups);
15867 if (board_config == ALC861VD_AUTO) {
15868 /* automatic parse from the BIOS config */
15869 err = alc861vd_parse_auto_config(codec);
15875 "hda_codec: Cannot set up configuration "
15876 "from BIOS. Using base mode...\n");
15877 board_config = ALC861VD_3ST;
15881 err = snd_hda_attach_beep_device(codec, 0x23);
15887 if (board_config != ALC861VD_AUTO)
15888 setup_preset(codec, &alc861vd_presets[board_config]);
15890 if (codec->vendor_id == 0x10ec0660) {
15891 /* always turn on EAPD */
15892 add_verb(spec, alc660vd_eapd_verbs);
15895 spec->stream_analog_playback = &alc861vd_pcm_analog_playback;
15896 spec->stream_analog_capture = &alc861vd_pcm_analog_capture;
15898 spec->stream_digital_playback = &alc861vd_pcm_digital_playback;
15899 spec->stream_digital_capture = &alc861vd_pcm_digital_capture;
15901 if (!spec->adc_nids) {
15902 spec->adc_nids = alc861vd_adc_nids;
15903 spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids);
15905 if (!spec->capsrc_nids)
15906 spec->capsrc_nids = alc861vd_capsrc_nids;
15908 set_capture_mixer(codec);
15909 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
15911 spec->vmaster_nid = 0x02;
15913 codec->patch_ops = alc_patch_ops;
15915 if (board_config == ALC861VD_AUTO)
15916 spec->init_hook = alc861vd_auto_init;
15917 #ifdef CONFIG_SND_HDA_POWER_SAVE
15918 if (!spec->loopback.amplist)
15919 spec->loopback.amplist = alc861vd_loopbacks;
15921 codec->proc_widget_hook = print_realtek_coef;
15929 * ALC662 is almost identical with ALC880 but has cleaner and more flexible
15930 * configuration. Each pin widget can choose any input DACs and a mixer.
15931 * Each ADC is connected from a mixer of all inputs. This makes possible
15932 * 6-channel independent captures.
15934 * In addition, an independent DAC for the multi-playback (not used in this
15937 #define ALC662_DIGOUT_NID 0x06
15938 #define ALC662_DIGIN_NID 0x0a
15940 static hda_nid_t alc662_dac_nids[4] = {
15941 /* front, rear, clfe, rear_surr */
15945 static hda_nid_t alc272_dac_nids[2] = {
15949 static hda_nid_t alc662_adc_nids[2] = {
15954 static hda_nid_t alc272_adc_nids[1] = {
15959 static hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 };
15960 static hda_nid_t alc272_capsrc_nids[1] = { 0x23 };
15964 /* FIXME: should be a matrix-type input source selection */
15965 static struct hda_input_mux alc662_capture_source = {
15969 { "Front Mic", 0x1 },
15975 static struct hda_input_mux alc662_lenovo_101e_capture_source = {
15983 static struct hda_input_mux alc663_capture_source = {
15987 { "Front Mic", 0x1 },
15992 #if 0 /* set to 1 for testing other input sources below */
15993 static struct hda_input_mux alc272_nc10_capture_source = {
15996 { "Autoselect Mic", 0x0 },
15997 { "Internal Mic", 0x1 },
15998 { "In-0x02", 0x2 },
15999 { "In-0x03", 0x3 },
16000 { "In-0x04", 0x4 },
16001 { "In-0x05", 0x5 },
16002 { "In-0x06", 0x6 },
16003 { "In-0x07", 0x7 },
16004 { "In-0x08", 0x8 },
16005 { "In-0x09", 0x9 },
16006 { "In-0x0a", 0x0a },
16007 { "In-0x0b", 0x0b },
16008 { "In-0x0c", 0x0c },
16009 { "In-0x0d", 0x0d },
16010 { "In-0x0e", 0x0e },
16011 { "In-0x0f", 0x0f },
16019 static struct hda_channel_mode alc662_3ST_2ch_modes[1] = {
16026 static struct hda_verb alc662_3ST_ch2_init[] = {
16027 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
16028 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
16029 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
16030 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
16037 static struct hda_verb alc662_3ST_ch6_init[] = {
16038 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16039 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
16040 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
16041 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16042 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
16043 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
16047 static struct hda_channel_mode alc662_3ST_6ch_modes[2] = {
16048 { 2, alc662_3ST_ch2_init },
16049 { 6, alc662_3ST_ch6_init },
16055 static struct hda_verb alc662_sixstack_ch6_init[] = {
16056 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16057 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16058 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16065 static struct hda_verb alc662_sixstack_ch8_init[] = {
16066 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16067 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16068 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16072 static struct hda_channel_mode alc662_5stack_modes[2] = {
16073 { 2, alc662_sixstack_ch6_init },
16074 { 6, alc662_sixstack_ch8_init },
16077 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
16078 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
16081 static struct snd_kcontrol_new alc662_base_mixer[] = {
16082 /* output mixer control */
16083 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
16084 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16085 HDA_CODEC_VOLUME("Surround Playback Volume", 0x3, 0x0, HDA_OUTPUT),
16086 HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
16087 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16088 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16089 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
16090 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
16091 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16093 /*Input mixer control */
16094 HDA_CODEC_VOLUME("CD Playback Volume", 0xb, 0x4, HDA_INPUT),
16095 HDA_CODEC_MUTE("CD Playback Switch", 0xb, 0x4, HDA_INPUT),
16096 HDA_CODEC_VOLUME("Line Playback Volume", 0xb, 0x02, HDA_INPUT),
16097 HDA_CODEC_MUTE("Line Playback Switch", 0xb, 0x02, HDA_INPUT),
16098 HDA_CODEC_VOLUME("Mic Playback Volume", 0xb, 0x0, HDA_INPUT),
16099 HDA_CODEC_MUTE("Mic Playback Switch", 0xb, 0x0, HDA_INPUT),
16100 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0xb, 0x01, HDA_INPUT),
16101 HDA_CODEC_MUTE("Front Mic Playback Switch", 0xb, 0x01, HDA_INPUT),
16105 static struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = {
16106 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16107 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16108 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16109 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16110 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16111 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16112 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16113 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16114 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16115 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16116 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16120 static struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = {
16121 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16122 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
16123 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16124 HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
16125 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16126 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16127 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
16128 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
16129 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16130 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16131 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16132 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16133 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16134 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16135 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16136 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16137 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16141 static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = {
16142 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16143 HDA_BIND_MUTE("Front Playback Switch", 0x02, 2, HDA_INPUT),
16144 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16145 HDA_BIND_MUTE("Speaker Playback Switch", 0x03, 2, HDA_INPUT),
16146 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16147 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16148 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16149 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16150 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16154 static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = {
16155 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16156 ALC262_HIPPO_MASTER_SWITCH,
16158 HDA_CODEC_VOLUME("e-Mic Boost", 0x18, 0, HDA_INPUT),
16159 HDA_CODEC_VOLUME("e-Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16160 HDA_CODEC_MUTE("e-Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16162 HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
16163 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16164 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16168 static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = {
16169 ALC262_HIPPO_MASTER_SWITCH,
16170 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16171 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16172 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
16173 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
16174 HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT),
16175 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16176 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16177 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16178 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16182 static struct hda_bind_ctls alc663_asus_bind_master_vol = {
16183 .ops = &snd_hda_bind_vol,
16185 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
16186 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
16191 static struct hda_bind_ctls alc663_asus_one_bind_switch = {
16192 .ops = &snd_hda_bind_sw,
16194 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16195 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16200 static struct snd_kcontrol_new alc663_m51va_mixer[] = {
16201 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16202 HDA_BIND_SW("Master Playback Switch", &alc663_asus_one_bind_switch),
16203 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16204 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16208 static struct hda_bind_ctls alc663_asus_tree_bind_switch = {
16209 .ops = &snd_hda_bind_sw,
16211 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16212 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16213 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16218 static struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = {
16219 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16220 HDA_BIND_SW("Master Playback Switch", &alc663_asus_tree_bind_switch),
16221 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16222 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16223 HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16224 HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16229 static struct hda_bind_ctls alc663_asus_four_bind_switch = {
16230 .ops = &snd_hda_bind_sw,
16232 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16233 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16234 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
16239 static struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = {
16240 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16241 HDA_BIND_SW("Master Playback Switch", &alc663_asus_four_bind_switch),
16242 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16243 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16244 HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16245 HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16249 static struct snd_kcontrol_new alc662_1bjd_mixer[] = {
16250 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16251 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16252 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16253 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16254 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16255 HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16256 HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16260 static struct hda_bind_ctls alc663_asus_two_bind_master_vol = {
16261 .ops = &snd_hda_bind_vol,
16263 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
16264 HDA_COMPOSE_AMP_VAL(0x04, 3, 0, HDA_OUTPUT),
16269 static struct hda_bind_ctls alc663_asus_two_bind_switch = {
16270 .ops = &snd_hda_bind_sw,
16272 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16273 HDA_COMPOSE_AMP_VAL(0x16, 3, 0, HDA_OUTPUT),
16278 static struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = {
16279 HDA_BIND_VOL("Master Playback Volume",
16280 &alc663_asus_two_bind_master_vol),
16281 HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
16282 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16283 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16284 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16285 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16289 static struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = {
16290 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
16291 HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
16292 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16293 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
16294 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16295 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16299 static struct snd_kcontrol_new alc663_g71v_mixer[] = {
16300 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16301 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16302 HDA_CODEC_VOLUME("Front Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16303 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
16304 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16306 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16307 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16308 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16309 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16313 static struct snd_kcontrol_new alc663_g50v_mixer[] = {
16314 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16315 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16316 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16318 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16319 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16320 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16321 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16322 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16323 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16327 static struct hda_bind_ctls alc663_asus_mode7_8_all_bind_switch = {
16328 .ops = &snd_hda_bind_sw,
16330 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16331 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
16332 HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
16333 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
16334 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
16339 static struct hda_bind_ctls alc663_asus_mode7_8_sp_bind_switch = {
16340 .ops = &snd_hda_bind_sw,
16342 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
16343 HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
16348 static struct snd_kcontrol_new alc663_mode7_mixer[] = {
16349 HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
16350 HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
16351 HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
16352 HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16353 HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16354 HDA_CODEC_VOLUME("IntMic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16355 HDA_CODEC_MUTE("IntMic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16356 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16357 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16361 static struct snd_kcontrol_new alc663_mode8_mixer[] = {
16362 HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
16363 HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
16364 HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
16365 HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x15, 0x0, HDA_OUTPUT),
16366 HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
16367 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16368 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16373 static struct snd_kcontrol_new alc662_chmode_mixer[] = {
16375 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
16376 .name = "Channel Mode",
16377 .info = alc_ch_mode_info,
16378 .get = alc_ch_mode_get,
16379 .put = alc_ch_mode_put,
16384 static struct hda_verb alc662_init_verbs[] = {
16385 /* ADC: mute amp left and right */
16386 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16387 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
16388 /* Front mixer: unmute input/output amp left and right (volume = 0) */
16390 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16391 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16392 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
16393 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
16394 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
16396 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16397 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16398 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16399 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16400 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16401 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16403 /* Front Pin: output 0 (0x0c) */
16404 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16405 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16407 /* Rear Pin: output 1 (0x0d) */
16408 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16409 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16411 /* CLFE Pin: output 2 (0x0e) */
16412 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16413 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16415 /* Mic (rear) pin: input vref at 80% */
16416 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16417 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16418 /* Front Mic pin: input vref at 80% */
16419 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16420 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16421 /* Line In pin: input */
16422 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16423 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16424 /* Line-2 In: Headphone output (output 0 - 0x0c) */
16425 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16426 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16427 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
16428 /* CD pin widget for input */
16429 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16431 /* FIXME: use matrix-type input source selection */
16432 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
16434 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16435 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16437 /* always trun on EAPD */
16438 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
16439 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
16444 static struct hda_verb alc662_sue_init_verbs[] = {
16445 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
16446 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
16450 static struct hda_verb alc662_eeepc_sue_init_verbs[] = {
16451 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16452 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16456 /* Set Unsolicited Event*/
16457 static struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = {
16458 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16459 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16464 * generic initialization of ADC, input mixers and output mixers
16466 static struct hda_verb alc662_auto_init_verbs[] = {
16468 * Unmute ADC and set the default input to mic-in
16470 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
16471 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16473 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
16475 * Note: PASD motherboards uses the Line In 2 as the input for front
16476 * panel mic (mic 2)
16478 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
16479 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16480 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16481 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
16482 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
16483 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
16486 * Set up output mixers (0x0c - 0x0f)
16488 /* set vol=0 to output mixers */
16489 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16490 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16491 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16493 /* set up input amps for analog loopback */
16494 /* Amp Indices: DAC = 0, mixer = 1 */
16495 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16496 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16497 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16498 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16499 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16500 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16503 /* FIXME: use matrix-type input source selection */
16504 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
16506 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16507 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16511 /* additional verbs for ALC663 */
16512 static struct hda_verb alc663_auto_init_verbs[] = {
16513 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16514 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16518 static struct hda_verb alc663_m51va_init_verbs[] = {
16519 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16520 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16521 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16522 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16523 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
16524 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16525 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16526 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16527 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16531 static struct hda_verb alc663_21jd_amic_init_verbs[] = {
16532 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16533 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16534 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
16535 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16536 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16537 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16538 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16542 static struct hda_verb alc662_1bjd_amic_init_verbs[] = {
16543 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16544 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16545 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16546 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
16547 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16548 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16549 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16550 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16554 static struct hda_verb alc663_15jd_amic_init_verbs[] = {
16555 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16556 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16557 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
16558 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16559 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16560 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16561 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16565 static struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = {
16566 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16567 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16568 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16569 {0x21, AC_VERB_SET_CONNECT_SEL, 0x0}, /* Headphone */
16570 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16571 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16572 {0x15, AC_VERB_SET_CONNECT_SEL, 0x0}, /* Headphone */
16573 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16574 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16575 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16576 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16577 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16581 static struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = {
16582 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16583 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16584 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16585 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
16586 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16587 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16588 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
16589 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16590 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16591 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16592 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16593 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16597 static struct hda_verb alc663_g71v_init_verbs[] = {
16598 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16599 /* {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
16600 /* {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, */ /* Headphone */
16602 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16603 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16604 {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
16606 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
16607 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_MIC_EVENT},
16608 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
16612 static struct hda_verb alc663_g50v_init_verbs[] = {
16613 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16614 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16615 {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
16617 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16618 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16622 static struct hda_verb alc662_ecs_init_verbs[] = {
16623 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
16624 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16625 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16626 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16630 static struct hda_verb alc272_dell_zm1_init_verbs[] = {
16631 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16632 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16633 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16634 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16635 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16636 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16637 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
16638 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16639 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16640 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16641 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16645 static struct hda_verb alc272_dell_init_verbs[] = {
16646 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16647 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16648 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16649 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16650 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16651 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16652 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
16653 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16654 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16655 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16656 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16660 static struct hda_verb alc663_mode7_init_verbs[] = {
16661 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16662 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16663 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16664 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16665 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16666 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16667 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
16668 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16669 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16670 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
16671 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16672 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16673 {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16674 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16675 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16679 static struct hda_verb alc663_mode8_init_verbs[] = {
16680 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16681 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16682 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16683 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
16684 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16685 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16686 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16687 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16688 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16689 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16690 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
16691 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16692 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
16693 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16694 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16695 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16699 static struct snd_kcontrol_new alc662_auto_capture_mixer[] = {
16700 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
16701 HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
16705 static struct snd_kcontrol_new alc272_auto_capture_mixer[] = {
16706 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
16707 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
16711 static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
16713 unsigned int present;
16714 unsigned char bits;
16716 present = snd_hda_jack_detect(codec, 0x14);
16717 bits = present ? HDA_AMP_MUTE : 0;
16719 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
16720 HDA_AMP_MUTE, bits);
16723 static void alc662_lenovo_101e_all_automute(struct hda_codec *codec)
16725 unsigned int present;
16726 unsigned char bits;
16728 present = snd_hda_jack_detect(codec, 0x1b);
16729 bits = present ? HDA_AMP_MUTE : 0;
16731 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
16732 HDA_AMP_MUTE, bits);
16733 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
16734 HDA_AMP_MUTE, bits);
16737 static void alc662_lenovo_101e_unsol_event(struct hda_codec *codec,
16740 if ((res >> 26) == ALC880_HP_EVENT)
16741 alc662_lenovo_101e_all_automute(codec);
16742 if ((res >> 26) == ALC880_FRONT_EVENT)
16743 alc662_lenovo_101e_ispeaker_automute(codec);
16746 /* unsolicited event for HP jack sensing */
16747 static void alc662_eeepc_unsol_event(struct hda_codec *codec,
16750 if ((res >> 26) == ALC880_MIC_EVENT)
16751 alc_mic_automute(codec);
16753 alc262_hippo_unsol_event(codec, res);
16756 static void alc662_eeepc_setup(struct hda_codec *codec)
16758 struct alc_spec *spec = codec->spec;
16760 alc262_hippo1_setup(codec);
16761 spec->ext_mic.pin = 0x18;
16762 spec->ext_mic.mux_idx = 0;
16763 spec->int_mic.pin = 0x19;
16764 spec->int_mic.mux_idx = 1;
16765 spec->auto_mic = 1;
16768 static void alc662_eeepc_inithook(struct hda_codec *codec)
16770 alc262_hippo_automute(codec);
16771 alc_mic_automute(codec);
16774 static void alc662_eeepc_ep20_setup(struct hda_codec *codec)
16776 struct alc_spec *spec = codec->spec;
16778 spec->autocfg.hp_pins[0] = 0x14;
16779 spec->autocfg.speaker_pins[0] = 0x1b;
16782 #define alc662_eeepc_ep20_inithook alc262_hippo_master_update
16784 static void alc663_m51va_speaker_automute(struct hda_codec *codec)
16786 unsigned int present;
16787 unsigned char bits;
16789 present = snd_hda_jack_detect(codec, 0x21);
16790 bits = present ? HDA_AMP_MUTE : 0;
16791 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16792 AMP_IN_MUTE(0), bits);
16793 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16794 AMP_IN_MUTE(0), bits);
16797 static void alc663_21jd_two_speaker_automute(struct hda_codec *codec)
16799 unsigned int present;
16800 unsigned char bits;
16802 present = snd_hda_jack_detect(codec, 0x21);
16803 bits = present ? HDA_AMP_MUTE : 0;
16804 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16805 AMP_IN_MUTE(0), bits);
16806 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16807 AMP_IN_MUTE(0), bits);
16808 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
16809 AMP_IN_MUTE(0), bits);
16810 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
16811 AMP_IN_MUTE(0), bits);
16814 static void alc663_15jd_two_speaker_automute(struct hda_codec *codec)
16816 unsigned int present;
16817 unsigned char bits;
16819 present = snd_hda_jack_detect(codec, 0x15);
16820 bits = present ? HDA_AMP_MUTE : 0;
16821 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16822 AMP_IN_MUTE(0), bits);
16823 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16824 AMP_IN_MUTE(0), bits);
16825 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
16826 AMP_IN_MUTE(0), bits);
16827 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
16828 AMP_IN_MUTE(0), bits);
16831 static void alc662_f5z_speaker_automute(struct hda_codec *codec)
16833 unsigned int present;
16834 unsigned char bits;
16836 present = snd_hda_jack_detect(codec, 0x1b);
16837 bits = present ? 0 : PIN_OUT;
16838 snd_hda_codec_write(codec, 0x14, 0,
16839 AC_VERB_SET_PIN_WIDGET_CONTROL, bits);
16842 static void alc663_two_hp_m1_speaker_automute(struct hda_codec *codec)
16844 unsigned int present1, present2;
16846 present1 = snd_hda_jack_detect(codec, 0x21);
16847 present2 = snd_hda_jack_detect(codec, 0x15);
16849 if (present1 || present2) {
16850 snd_hda_codec_write_cache(codec, 0x14, 0,
16851 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
16853 snd_hda_codec_write_cache(codec, 0x14, 0,
16854 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
16858 static void alc663_two_hp_m2_speaker_automute(struct hda_codec *codec)
16860 unsigned int present1, present2;
16862 present1 = snd_hda_jack_detect(codec, 0x1b);
16863 present2 = snd_hda_jack_detect(codec, 0x15);
16865 if (present1 || present2) {
16866 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16867 AMP_IN_MUTE(0), AMP_IN_MUTE(0));
16868 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16869 AMP_IN_MUTE(0), AMP_IN_MUTE(0));
16871 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
16872 AMP_IN_MUTE(0), 0);
16873 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
16874 AMP_IN_MUTE(0), 0);
16878 static void alc663_two_hp_m7_speaker_automute(struct hda_codec *codec)
16880 unsigned int present1, present2;
16882 present1 = snd_hda_codec_read(codec, 0x1b, 0,
16883 AC_VERB_GET_PIN_SENSE, 0)
16884 & AC_PINSENSE_PRESENCE;
16885 present2 = snd_hda_codec_read(codec, 0x21, 0,
16886 AC_VERB_GET_PIN_SENSE, 0)
16887 & AC_PINSENSE_PRESENCE;
16889 if (present1 || present2) {
16890 snd_hda_codec_write_cache(codec, 0x14, 0,
16891 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
16892 snd_hda_codec_write_cache(codec, 0x17, 0,
16893 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
16895 snd_hda_codec_write_cache(codec, 0x14, 0,
16896 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
16897 snd_hda_codec_write_cache(codec, 0x17, 0,
16898 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
16902 static void alc663_two_hp_m8_speaker_automute(struct hda_codec *codec)
16904 unsigned int present1, present2;
16906 present1 = snd_hda_codec_read(codec, 0x21, 0,
16907 AC_VERB_GET_PIN_SENSE, 0)
16908 & AC_PINSENSE_PRESENCE;
16909 present2 = snd_hda_codec_read(codec, 0x15, 0,
16910 AC_VERB_GET_PIN_SENSE, 0)
16911 & AC_PINSENSE_PRESENCE;
16913 if (present1 || present2) {
16914 snd_hda_codec_write_cache(codec, 0x14, 0,
16915 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
16916 snd_hda_codec_write_cache(codec, 0x17, 0,
16917 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
16919 snd_hda_codec_write_cache(codec, 0x14, 0,
16920 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
16921 snd_hda_codec_write_cache(codec, 0x17, 0,
16922 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
16926 static void alc663_m51va_unsol_event(struct hda_codec *codec,
16929 switch (res >> 26) {
16930 case ALC880_HP_EVENT:
16931 alc663_m51va_speaker_automute(codec);
16933 case ALC880_MIC_EVENT:
16934 alc_mic_automute(codec);
16939 static void alc663_m51va_setup(struct hda_codec *codec)
16941 struct alc_spec *spec = codec->spec;
16942 spec->ext_mic.pin = 0x18;
16943 spec->ext_mic.mux_idx = 0;
16944 spec->int_mic.pin = 0x12;
16945 spec->int_mic.mux_idx = 9;
16946 spec->auto_mic = 1;
16949 static void alc663_m51va_inithook(struct hda_codec *codec)
16951 alc663_m51va_speaker_automute(codec);
16952 alc_mic_automute(codec);
16955 /* ***************** Mode1 ******************************/
16956 #define alc663_mode1_unsol_event alc663_m51va_unsol_event
16958 static void alc663_mode1_setup(struct hda_codec *codec)
16960 struct alc_spec *spec = codec->spec;
16961 spec->ext_mic.pin = 0x18;
16962 spec->ext_mic.mux_idx = 0;
16963 spec->int_mic.pin = 0x19;
16964 spec->int_mic.mux_idx = 1;
16965 spec->auto_mic = 1;
16968 #define alc663_mode1_inithook alc663_m51va_inithook
16970 /* ***************** Mode2 ******************************/
16971 static void alc662_mode2_unsol_event(struct hda_codec *codec,
16974 switch (res >> 26) {
16975 case ALC880_HP_EVENT:
16976 alc662_f5z_speaker_automute(codec);
16978 case ALC880_MIC_EVENT:
16979 alc_mic_automute(codec);
16984 #define alc662_mode2_setup alc663_mode1_setup
16986 static void alc662_mode2_inithook(struct hda_codec *codec)
16988 alc662_f5z_speaker_automute(codec);
16989 alc_mic_automute(codec);
16991 /* ***************** Mode3 ******************************/
16992 static void alc663_mode3_unsol_event(struct hda_codec *codec,
16995 switch (res >> 26) {
16996 case ALC880_HP_EVENT:
16997 alc663_two_hp_m1_speaker_automute(codec);
16999 case ALC880_MIC_EVENT:
17000 alc_mic_automute(codec);
17005 #define alc663_mode3_setup alc663_mode1_setup
17007 static void alc663_mode3_inithook(struct hda_codec *codec)
17009 alc663_two_hp_m1_speaker_automute(codec);
17010 alc_mic_automute(codec);
17012 /* ***************** Mode4 ******************************/
17013 static void alc663_mode4_unsol_event(struct hda_codec *codec,
17016 switch (res >> 26) {
17017 case ALC880_HP_EVENT:
17018 alc663_21jd_two_speaker_automute(codec);
17020 case ALC880_MIC_EVENT:
17021 alc_mic_automute(codec);
17026 #define alc663_mode4_setup alc663_mode1_setup
17028 static void alc663_mode4_inithook(struct hda_codec *codec)
17030 alc663_21jd_two_speaker_automute(codec);
17031 alc_mic_automute(codec);
17033 /* ***************** Mode5 ******************************/
17034 static void alc663_mode5_unsol_event(struct hda_codec *codec,
17037 switch (res >> 26) {
17038 case ALC880_HP_EVENT:
17039 alc663_15jd_two_speaker_automute(codec);
17041 case ALC880_MIC_EVENT:
17042 alc_mic_automute(codec);
17047 #define alc663_mode5_setup alc663_mode1_setup
17049 static void alc663_mode5_inithook(struct hda_codec *codec)
17051 alc663_15jd_two_speaker_automute(codec);
17052 alc_mic_automute(codec);
17054 /* ***************** Mode6 ******************************/
17055 static void alc663_mode6_unsol_event(struct hda_codec *codec,
17058 switch (res >> 26) {
17059 case ALC880_HP_EVENT:
17060 alc663_two_hp_m2_speaker_automute(codec);
17062 case ALC880_MIC_EVENT:
17063 alc_mic_automute(codec);
17068 #define alc663_mode6_setup alc663_mode1_setup
17070 static void alc663_mode6_inithook(struct hda_codec *codec)
17072 alc663_two_hp_m2_speaker_automute(codec);
17073 alc_mic_automute(codec);
17076 /* ***************** Mode7 ******************************/
17077 static void alc663_mode7_unsol_event(struct hda_codec *codec,
17080 switch (res >> 26) {
17081 case ALC880_HP_EVENT:
17082 alc663_two_hp_m7_speaker_automute(codec);
17084 case ALC880_MIC_EVENT:
17085 alc_mic_automute(codec);
17090 #define alc663_mode7_setup alc663_mode1_setup
17092 static void alc663_mode7_inithook(struct hda_codec *codec)
17094 alc663_two_hp_m7_speaker_automute(codec);
17095 alc_mic_automute(codec);
17098 /* ***************** Mode8 ******************************/
17099 static void alc663_mode8_unsol_event(struct hda_codec *codec,
17102 switch (res >> 26) {
17103 case ALC880_HP_EVENT:
17104 alc663_two_hp_m8_speaker_automute(codec);
17106 case ALC880_MIC_EVENT:
17107 alc_mic_automute(codec);
17112 #define alc663_mode8_setup alc663_m51va_setup
17114 static void alc663_mode8_inithook(struct hda_codec *codec)
17116 alc663_two_hp_m8_speaker_automute(codec);
17117 alc_mic_automute(codec);
17120 static void alc663_g71v_hp_automute(struct hda_codec *codec)
17122 unsigned int present;
17123 unsigned char bits;
17125 present = snd_hda_jack_detect(codec, 0x21);
17126 bits = present ? HDA_AMP_MUTE : 0;
17127 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17128 HDA_AMP_MUTE, bits);
17129 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17130 HDA_AMP_MUTE, bits);
17133 static void alc663_g71v_front_automute(struct hda_codec *codec)
17135 unsigned int present;
17136 unsigned char bits;
17138 present = snd_hda_jack_detect(codec, 0x15);
17139 bits = present ? HDA_AMP_MUTE : 0;
17140 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17141 HDA_AMP_MUTE, bits);
17144 static void alc663_g71v_unsol_event(struct hda_codec *codec,
17147 switch (res >> 26) {
17148 case ALC880_HP_EVENT:
17149 alc663_g71v_hp_automute(codec);
17151 case ALC880_FRONT_EVENT:
17152 alc663_g71v_front_automute(codec);
17154 case ALC880_MIC_EVENT:
17155 alc_mic_automute(codec);
17160 #define alc663_g71v_setup alc663_m51va_setup
17162 static void alc663_g71v_inithook(struct hda_codec *codec)
17164 alc663_g71v_front_automute(codec);
17165 alc663_g71v_hp_automute(codec);
17166 alc_mic_automute(codec);
17169 static void alc663_g50v_unsol_event(struct hda_codec *codec,
17172 switch (res >> 26) {
17173 case ALC880_HP_EVENT:
17174 alc663_m51va_speaker_automute(codec);
17176 case ALC880_MIC_EVENT:
17177 alc_mic_automute(codec);
17182 #define alc663_g50v_setup alc663_m51va_setup
17184 static void alc663_g50v_inithook(struct hda_codec *codec)
17186 alc663_m51va_speaker_automute(codec);
17187 alc_mic_automute(codec);
17190 static struct snd_kcontrol_new alc662_ecs_mixer[] = {
17191 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17192 ALC262_HIPPO_MASTER_SWITCH,
17194 HDA_CODEC_VOLUME("e-Mic/LineIn Boost", 0x18, 0, HDA_INPUT),
17195 HDA_CODEC_VOLUME("e-Mic/LineIn Playback Volume", 0x0b, 0x0, HDA_INPUT),
17196 HDA_CODEC_MUTE("e-Mic/LineIn Playback Switch", 0x0b, 0x0, HDA_INPUT),
17198 HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
17199 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17200 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17204 static struct snd_kcontrol_new alc272_nc10_mixer[] = {
17205 /* Master Playback automatically created from Speaker and Headphone */
17206 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17207 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17208 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17209 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17211 HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17212 HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17213 HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
17215 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17216 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17217 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
17221 #ifdef CONFIG_SND_HDA_POWER_SAVE
17222 #define alc662_loopbacks alc880_loopbacks
17226 /* pcm configuration: identical with ALC880 */
17227 #define alc662_pcm_analog_playback alc880_pcm_analog_playback
17228 #define alc662_pcm_analog_capture alc880_pcm_analog_capture
17229 #define alc662_pcm_digital_playback alc880_pcm_digital_playback
17230 #define alc662_pcm_digital_capture alc880_pcm_digital_capture
17233 * configuration and preset
17235 static const char *alc662_models[ALC662_MODEL_LAST] = {
17236 [ALC662_3ST_2ch_DIG] = "3stack-dig",
17237 [ALC662_3ST_6ch_DIG] = "3stack-6ch-dig",
17238 [ALC662_3ST_6ch] = "3stack-6ch",
17239 [ALC662_5ST_DIG] = "6stack-dig",
17240 [ALC662_LENOVO_101E] = "lenovo-101e",
17241 [ALC662_ASUS_EEEPC_P701] = "eeepc-p701",
17242 [ALC662_ASUS_EEEPC_EP20] = "eeepc-ep20",
17243 [ALC662_ECS] = "ecs",
17244 [ALC663_ASUS_M51VA] = "m51va",
17245 [ALC663_ASUS_G71V] = "g71v",
17246 [ALC663_ASUS_H13] = "h13",
17247 [ALC663_ASUS_G50V] = "g50v",
17248 [ALC663_ASUS_MODE1] = "asus-mode1",
17249 [ALC662_ASUS_MODE2] = "asus-mode2",
17250 [ALC663_ASUS_MODE3] = "asus-mode3",
17251 [ALC663_ASUS_MODE4] = "asus-mode4",
17252 [ALC663_ASUS_MODE5] = "asus-mode5",
17253 [ALC663_ASUS_MODE6] = "asus-mode6",
17254 [ALC663_ASUS_MODE7] = "asus-mode7",
17255 [ALC663_ASUS_MODE8] = "asus-mode8",
17256 [ALC272_DELL] = "dell",
17257 [ALC272_DELL_ZM1] = "dell-zm1",
17258 [ALC272_SAMSUNG_NC10] = "samsung-nc10",
17259 [ALC662_AUTO] = "auto",
17262 static struct snd_pci_quirk alc662_cfg_tbl[] = {
17263 SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS),
17264 SND_PCI_QUIRK(0x1028, 0x02d6, "DELL", ALC272_DELL),
17265 SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1),
17266 SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1),
17267 SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3),
17268 SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3),
17269 SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1),
17270 SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2),
17271 SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC663_ASUS_MODE1),
17272 SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC663_ASUS_MODE1),
17273 SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC663_ASUS_MODE1),
17274 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_ASUS_MODE2),
17275 SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC663_ASUS_MODE7),
17276 SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC663_ASUS_MODE7),
17277 SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC663_ASUS_MODE8),
17278 SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC663_ASUS_MODE3),
17279 SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC663_ASUS_MODE1),
17280 SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_ASUS_MODE2),
17281 SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_ASUS_MODE2),
17282 SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC663_ASUS_MODE1),
17283 SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_ASUS_MODE2),
17284 SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC663_ASUS_MODE6),
17285 SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6),
17286 SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_ASUS_MODE2),
17287 SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC663_ASUS_MODE1),
17288 SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC663_ASUS_MODE3),
17289 SND_PCI_QUIRK(0x1043, 0x17c3, "ASUS UX20", ALC663_ASUS_M51VA),
17290 SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_ASUS_MODE2),
17291 SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_ASUS_MODE2),
17292 SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC663_ASUS_MODE5),
17293 SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC663_ASUS_MODE6),
17294 SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_ASUS_MODE2),
17295 SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC663_ASUS_MODE1),
17296 SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_ASUS_MODE2),
17297 SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_ASUS_MODE2),
17298 SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA),
17299 /*SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M50Vr", ALC663_ASUS_MODE1),*/
17300 SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3),
17301 SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3),
17302 SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1),
17303 SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1),
17304 SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1),
17305 SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1),
17306 SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_ASUS_MODE2),
17307 SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_ASUS_MODE2),
17308 SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC663_ASUS_MODE1),
17309 SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC663_ASUS_MODE1),
17310 SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC663_ASUS_MODE3),
17311 SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC663_ASUS_MODE1),
17312 SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC663_ASUS_MODE1),
17313 SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS G50V", ALC663_ASUS_G50V),
17314 /*SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS NB", ALC663_ASUS_MODE1),*/
17315 SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC663_ASUS_MODE1),
17316 SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_ASUS_MODE2),
17317 SND_PCI_QUIRK(0x1043, 0x19d3, "ASUS NB", ALC663_ASUS_M51VA),
17318 SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC663_ASUS_MODE1),
17319 SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC663_ASUS_MODE4),
17320 SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG),
17321 SND_PCI_QUIRK(0x1043, 0x82a1, "ASUS Eeepc", ALC662_ASUS_EEEPC_P701),
17322 SND_PCI_QUIRK(0x1043, 0x82d1, "ASUS Eeepc EP20", ALC662_ASUS_EEEPC_EP20),
17323 SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS),
17324 SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K",
17325 ALC662_3ST_6ch_DIG),
17326 SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB20x", ALC662_AUTO),
17327 SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10),
17328 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L",
17329 ALC662_3ST_6ch_DIG),
17330 SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG),
17331 SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA),
17332 SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E),
17333 SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0",
17334 ALC662_3ST_6ch_DIG),
17335 SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x",
17337 SND_PCI_QUIRK(0x8086, 0xd604, "Intel mobo", ALC662_3ST_2ch_DIG),
17341 static struct alc_config_preset alc662_presets[] = {
17342 [ALC662_3ST_2ch_DIG] = {
17343 .mixers = { alc662_3ST_2ch_mixer },
17344 .init_verbs = { alc662_init_verbs },
17345 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17346 .dac_nids = alc662_dac_nids,
17347 .dig_out_nid = ALC662_DIGOUT_NID,
17348 .dig_in_nid = ALC662_DIGIN_NID,
17349 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17350 .channel_mode = alc662_3ST_2ch_modes,
17351 .input_mux = &alc662_capture_source,
17353 [ALC662_3ST_6ch_DIG] = {
17354 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
17355 .init_verbs = { alc662_init_verbs },
17356 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17357 .dac_nids = alc662_dac_nids,
17358 .dig_out_nid = ALC662_DIGOUT_NID,
17359 .dig_in_nid = ALC662_DIGIN_NID,
17360 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17361 .channel_mode = alc662_3ST_6ch_modes,
17363 .input_mux = &alc662_capture_source,
17365 [ALC662_3ST_6ch] = {
17366 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
17367 .init_verbs = { alc662_init_verbs },
17368 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17369 .dac_nids = alc662_dac_nids,
17370 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17371 .channel_mode = alc662_3ST_6ch_modes,
17373 .input_mux = &alc662_capture_source,
17375 [ALC662_5ST_DIG] = {
17376 .mixers = { alc662_base_mixer, alc662_chmode_mixer },
17377 .init_verbs = { alc662_init_verbs },
17378 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17379 .dac_nids = alc662_dac_nids,
17380 .dig_out_nid = ALC662_DIGOUT_NID,
17381 .dig_in_nid = ALC662_DIGIN_NID,
17382 .num_channel_mode = ARRAY_SIZE(alc662_5stack_modes),
17383 .channel_mode = alc662_5stack_modes,
17384 .input_mux = &alc662_capture_source,
17386 [ALC662_LENOVO_101E] = {
17387 .mixers = { alc662_lenovo_101e_mixer },
17388 .init_verbs = { alc662_init_verbs, alc662_sue_init_verbs },
17389 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17390 .dac_nids = alc662_dac_nids,
17391 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17392 .channel_mode = alc662_3ST_2ch_modes,
17393 .input_mux = &alc662_lenovo_101e_capture_source,
17394 .unsol_event = alc662_lenovo_101e_unsol_event,
17395 .init_hook = alc662_lenovo_101e_all_automute,
17397 [ALC662_ASUS_EEEPC_P701] = {
17398 .mixers = { alc662_eeepc_p701_mixer },
17399 .init_verbs = { alc662_init_verbs,
17400 alc662_eeepc_sue_init_verbs },
17401 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17402 .dac_nids = alc662_dac_nids,
17403 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17404 .channel_mode = alc662_3ST_2ch_modes,
17405 .unsol_event = alc662_eeepc_unsol_event,
17406 .setup = alc662_eeepc_setup,
17407 .init_hook = alc662_eeepc_inithook,
17409 [ALC662_ASUS_EEEPC_EP20] = {
17410 .mixers = { alc662_eeepc_ep20_mixer,
17411 alc662_chmode_mixer },
17412 .init_verbs = { alc662_init_verbs,
17413 alc662_eeepc_ep20_sue_init_verbs },
17414 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17415 .dac_nids = alc662_dac_nids,
17416 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17417 .channel_mode = alc662_3ST_6ch_modes,
17418 .input_mux = &alc662_lenovo_101e_capture_source,
17419 .unsol_event = alc662_eeepc_unsol_event,
17420 .setup = alc662_eeepc_ep20_setup,
17421 .init_hook = alc662_eeepc_ep20_inithook,
17424 .mixers = { alc662_ecs_mixer },
17425 .init_verbs = { alc662_init_verbs,
17426 alc662_ecs_init_verbs },
17427 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17428 .dac_nids = alc662_dac_nids,
17429 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17430 .channel_mode = alc662_3ST_2ch_modes,
17431 .unsol_event = alc662_eeepc_unsol_event,
17432 .setup = alc662_eeepc_setup,
17433 .init_hook = alc662_eeepc_inithook,
17435 [ALC663_ASUS_M51VA] = {
17436 .mixers = { alc663_m51va_mixer },
17437 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
17438 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17439 .dac_nids = alc662_dac_nids,
17440 .dig_out_nid = ALC662_DIGOUT_NID,
17441 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17442 .channel_mode = alc662_3ST_2ch_modes,
17443 .unsol_event = alc663_m51va_unsol_event,
17444 .setup = alc663_m51va_setup,
17445 .init_hook = alc663_m51va_inithook,
17447 [ALC663_ASUS_G71V] = {
17448 .mixers = { alc663_g71v_mixer },
17449 .init_verbs = { alc662_init_verbs, alc663_g71v_init_verbs },
17450 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17451 .dac_nids = alc662_dac_nids,
17452 .dig_out_nid = ALC662_DIGOUT_NID,
17453 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17454 .channel_mode = alc662_3ST_2ch_modes,
17455 .unsol_event = alc663_g71v_unsol_event,
17456 .setup = alc663_g71v_setup,
17457 .init_hook = alc663_g71v_inithook,
17459 [ALC663_ASUS_H13] = {
17460 .mixers = { alc663_m51va_mixer },
17461 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
17462 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17463 .dac_nids = alc662_dac_nids,
17464 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17465 .channel_mode = alc662_3ST_2ch_modes,
17466 .unsol_event = alc663_m51va_unsol_event,
17467 .init_hook = alc663_m51va_inithook,
17469 [ALC663_ASUS_G50V] = {
17470 .mixers = { alc663_g50v_mixer },
17471 .init_verbs = { alc662_init_verbs, alc663_g50v_init_verbs },
17472 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17473 .dac_nids = alc662_dac_nids,
17474 .dig_out_nid = ALC662_DIGOUT_NID,
17475 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
17476 .channel_mode = alc662_3ST_6ch_modes,
17477 .input_mux = &alc663_capture_source,
17478 .unsol_event = alc663_g50v_unsol_event,
17479 .setup = alc663_g50v_setup,
17480 .init_hook = alc663_g50v_inithook,
17482 [ALC663_ASUS_MODE1] = {
17483 .mixers = { alc663_m51va_mixer },
17484 .cap_mixer = alc662_auto_capture_mixer,
17485 .init_verbs = { alc662_init_verbs,
17486 alc663_21jd_amic_init_verbs },
17487 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17489 .dac_nids = alc662_dac_nids,
17490 .dig_out_nid = ALC662_DIGOUT_NID,
17491 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17492 .channel_mode = alc662_3ST_2ch_modes,
17493 .unsol_event = alc663_mode1_unsol_event,
17494 .setup = alc663_mode1_setup,
17495 .init_hook = alc663_mode1_inithook,
17497 [ALC662_ASUS_MODE2] = {
17498 .mixers = { alc662_1bjd_mixer },
17499 .cap_mixer = alc662_auto_capture_mixer,
17500 .init_verbs = { alc662_init_verbs,
17501 alc662_1bjd_amic_init_verbs },
17502 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17503 .dac_nids = alc662_dac_nids,
17504 .dig_out_nid = ALC662_DIGOUT_NID,
17505 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17506 .channel_mode = alc662_3ST_2ch_modes,
17507 .unsol_event = alc662_mode2_unsol_event,
17508 .setup = alc662_mode2_setup,
17509 .init_hook = alc662_mode2_inithook,
17511 [ALC663_ASUS_MODE3] = {
17512 .mixers = { alc663_two_hp_m1_mixer },
17513 .cap_mixer = alc662_auto_capture_mixer,
17514 .init_verbs = { alc662_init_verbs,
17515 alc663_two_hp_amic_m1_init_verbs },
17516 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17518 .dac_nids = alc662_dac_nids,
17519 .dig_out_nid = ALC662_DIGOUT_NID,
17520 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17521 .channel_mode = alc662_3ST_2ch_modes,
17522 .unsol_event = alc663_mode3_unsol_event,
17523 .setup = alc663_mode3_setup,
17524 .init_hook = alc663_mode3_inithook,
17526 [ALC663_ASUS_MODE4] = {
17527 .mixers = { alc663_asus_21jd_clfe_mixer },
17528 .cap_mixer = alc662_auto_capture_mixer,
17529 .init_verbs = { alc662_init_verbs,
17530 alc663_21jd_amic_init_verbs},
17531 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17533 .dac_nids = alc662_dac_nids,
17534 .dig_out_nid = ALC662_DIGOUT_NID,
17535 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17536 .channel_mode = alc662_3ST_2ch_modes,
17537 .unsol_event = alc663_mode4_unsol_event,
17538 .setup = alc663_mode4_setup,
17539 .init_hook = alc663_mode4_inithook,
17541 [ALC663_ASUS_MODE5] = {
17542 .mixers = { alc663_asus_15jd_clfe_mixer },
17543 .cap_mixer = alc662_auto_capture_mixer,
17544 .init_verbs = { alc662_init_verbs,
17545 alc663_15jd_amic_init_verbs },
17546 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17548 .dac_nids = alc662_dac_nids,
17549 .dig_out_nid = ALC662_DIGOUT_NID,
17550 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17551 .channel_mode = alc662_3ST_2ch_modes,
17552 .unsol_event = alc663_mode5_unsol_event,
17553 .setup = alc663_mode5_setup,
17554 .init_hook = alc663_mode5_inithook,
17556 [ALC663_ASUS_MODE6] = {
17557 .mixers = { alc663_two_hp_m2_mixer },
17558 .cap_mixer = alc662_auto_capture_mixer,
17559 .init_verbs = { alc662_init_verbs,
17560 alc663_two_hp_amic_m2_init_verbs },
17561 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17563 .dac_nids = alc662_dac_nids,
17564 .dig_out_nid = ALC662_DIGOUT_NID,
17565 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17566 .channel_mode = alc662_3ST_2ch_modes,
17567 .unsol_event = alc663_mode6_unsol_event,
17568 .setup = alc663_mode6_setup,
17569 .init_hook = alc663_mode6_inithook,
17571 [ALC663_ASUS_MODE7] = {
17572 .mixers = { alc663_mode7_mixer },
17573 .cap_mixer = alc662_auto_capture_mixer,
17574 .init_verbs = { alc662_init_verbs,
17575 alc663_mode7_init_verbs },
17576 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17578 .dac_nids = alc662_dac_nids,
17579 .dig_out_nid = ALC662_DIGOUT_NID,
17580 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17581 .channel_mode = alc662_3ST_2ch_modes,
17582 .unsol_event = alc663_mode7_unsol_event,
17583 .setup = alc663_mode7_setup,
17584 .init_hook = alc663_mode7_inithook,
17586 [ALC663_ASUS_MODE8] = {
17587 .mixers = { alc663_mode8_mixer },
17588 .cap_mixer = alc662_auto_capture_mixer,
17589 .init_verbs = { alc662_init_verbs,
17590 alc663_mode8_init_verbs },
17591 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
17593 .dac_nids = alc662_dac_nids,
17594 .dig_out_nid = ALC662_DIGOUT_NID,
17595 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17596 .channel_mode = alc662_3ST_2ch_modes,
17597 .unsol_event = alc663_mode8_unsol_event,
17598 .setup = alc663_mode8_setup,
17599 .init_hook = alc663_mode8_inithook,
17602 .mixers = { alc663_m51va_mixer },
17603 .cap_mixer = alc272_auto_capture_mixer,
17604 .init_verbs = { alc662_init_verbs, alc272_dell_init_verbs },
17605 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
17606 .dac_nids = alc662_dac_nids,
17607 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17608 .adc_nids = alc272_adc_nids,
17609 .num_adc_nids = ARRAY_SIZE(alc272_adc_nids),
17610 .capsrc_nids = alc272_capsrc_nids,
17611 .channel_mode = alc662_3ST_2ch_modes,
17612 .unsol_event = alc663_m51va_unsol_event,
17613 .setup = alc663_m51va_setup,
17614 .init_hook = alc663_m51va_inithook,
17616 [ALC272_DELL_ZM1] = {
17617 .mixers = { alc663_m51va_mixer },
17618 .cap_mixer = alc662_auto_capture_mixer,
17619 .init_verbs = { alc662_init_verbs, alc272_dell_zm1_init_verbs },
17620 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
17621 .dac_nids = alc662_dac_nids,
17622 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17623 .adc_nids = alc662_adc_nids,
17625 .capsrc_nids = alc662_capsrc_nids,
17626 .channel_mode = alc662_3ST_2ch_modes,
17627 .unsol_event = alc663_m51va_unsol_event,
17628 .setup = alc663_m51va_setup,
17629 .init_hook = alc663_m51va_inithook,
17631 [ALC272_SAMSUNG_NC10] = {
17632 .mixers = { alc272_nc10_mixer },
17633 .init_verbs = { alc662_init_verbs,
17634 alc663_21jd_amic_init_verbs },
17635 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
17636 .dac_nids = alc272_dac_nids,
17637 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
17638 .channel_mode = alc662_3ST_2ch_modes,
17639 /*.input_mux = &alc272_nc10_capture_source,*/
17640 .unsol_event = alc663_mode4_unsol_event,
17641 .setup = alc663_mode4_setup,
17642 .init_hook = alc663_mode4_inithook,
17648 * BIOS auto configuration
17651 /* convert from MIX nid to DAC */
17652 static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid)
17656 else if (nid >= 0x0c && nid <= 0x0e)
17657 return nid - 0x0c + 0x02;
17662 /* get MIX nid connected to the given pin targeted to DAC */
17663 static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
17669 num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
17670 for (i = 0; i < num; i++) {
17671 if (alc662_mix_to_dac(mix[i]) == dac)
17677 /* look for an empty DAC slot */
17678 static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
17680 struct alc_spec *spec = codec->spec;
17684 num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs));
17687 for (i = 0; i < num; i++) {
17688 hda_nid_t nid = alc662_mix_to_dac(srcs[i]);
17691 for (j = 0; j < spec->multiout.num_dacs; j++)
17692 if (spec->multiout.dac_nids[j] == nid)
17694 if (j >= spec->multiout.num_dacs)
17700 /* fill in the dac_nids table from the parsed pin configuration */
17701 static int alc662_auto_fill_dac_nids(struct hda_codec *codec,
17702 const struct auto_pin_cfg *cfg)
17704 struct alc_spec *spec = codec->spec;
17708 spec->multiout.dac_nids = spec->private_dac_nids;
17709 for (i = 0; i < cfg->line_outs; i++) {
17710 dac = alc662_look_for_dac(codec, cfg->line_out_pins[i]);
17713 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
17718 static inline int alc662_add_vol_ctl(struct alc_spec *spec, const char *pfx,
17719 hda_nid_t nid, unsigned int chs)
17721 return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
17722 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
17725 static inline int alc662_add_sw_ctl(struct alc_spec *spec, const char *pfx,
17726 hda_nid_t nid, unsigned int chs)
17728 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
17729 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_INPUT));
17732 #define alc662_add_stereo_vol(spec, pfx, nid) \
17733 alc662_add_vol_ctl(spec, pfx, nid, 3)
17734 #define alc662_add_stereo_sw(spec, pfx, nid) \
17735 alc662_add_sw_ctl(spec, pfx, nid, 3)
17737 /* add playback controls from the parsed DAC table */
17738 static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
17739 const struct auto_pin_cfg *cfg)
17741 struct alc_spec *spec = codec->spec;
17742 static const char *chname[4] = {
17743 "Front", "Surround", NULL /*CLFE*/, "Side"
17745 hda_nid_t nid, mix;
17748 for (i = 0; i < cfg->line_outs; i++) {
17749 nid = spec->multiout.dac_nids[i];
17752 mix = alc662_dac_to_mix(codec, cfg->line_out_pins[i], nid);
17757 err = alc662_add_vol_ctl(spec, "Center", nid, 1);
17760 err = alc662_add_vol_ctl(spec, "LFE", nid, 2);
17763 err = alc662_add_sw_ctl(spec, "Center", mix, 1);
17766 err = alc662_add_sw_ctl(spec, "LFE", mix, 2);
17771 if (cfg->line_outs == 1 &&
17772 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
17779 err = alc662_add_vol_ctl(spec, pfx, nid, 3);
17782 if (cfg->line_outs == 1 &&
17783 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
17785 err = alc662_add_sw_ctl(spec, pfx, mix, 3);
17793 /* add playback controls for speaker and HP outputs */
17794 /* return DAC nid if any new DAC is assigned */
17795 static int alc662_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
17798 struct alc_spec *spec = codec->spec;
17799 hda_nid_t nid, mix;
17804 nid = alc662_look_for_dac(codec, pin);
17806 /* the corresponding DAC is already occupied */
17807 if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP))
17808 return 0; /* no way */
17809 /* create a switch only */
17810 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
17811 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
17814 mix = alc662_dac_to_mix(codec, pin, nid);
17817 err = alc662_add_vol_ctl(spec, pfx, nid, 3);
17820 err = alc662_add_sw_ctl(spec, pfx, mix, 3);
17826 /* create playback/capture controls for input pins */
17827 #define alc662_auto_create_input_ctls \
17828 alc882_auto_create_input_ctls
17830 static void alc662_auto_set_output_and_unmute(struct hda_codec *codec,
17831 hda_nid_t nid, int pin_type,
17837 alc_set_pin_output(codec, nid, pin_type);
17838 /* need the manual connection? */
17839 num = snd_hda_get_connections(codec, nid, srcs, ARRAY_SIZE(srcs));
17842 for (i = 0; i < num; i++) {
17843 if (alc662_mix_to_dac(srcs[i]) != dac)
17845 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i);
17850 static void alc662_auto_init_multi_out(struct hda_codec *codec)
17852 struct alc_spec *spec = codec->spec;
17853 int pin_type = get_pin_type(spec->autocfg.line_out_type);
17856 for (i = 0; i <= HDA_SIDE; i++) {
17857 hda_nid_t nid = spec->autocfg.line_out_pins[i];
17859 alc662_auto_set_output_and_unmute(codec, nid, pin_type,
17860 spec->multiout.dac_nids[i]);
17864 static void alc662_auto_init_hp_out(struct hda_codec *codec)
17866 struct alc_spec *spec = codec->spec;
17869 pin = spec->autocfg.hp_pins[0];
17871 alc662_auto_set_output_and_unmute(codec, pin, PIN_HP,
17872 spec->multiout.hp_nid);
17873 pin = spec->autocfg.speaker_pins[0];
17875 alc662_auto_set_output_and_unmute(codec, pin, PIN_OUT,
17876 spec->multiout.extra_out_nid[0]);
17879 #define ALC662_PIN_CD_NID ALC880_PIN_CD_NID
17881 static void alc662_auto_init_analog_input(struct hda_codec *codec)
17883 struct alc_spec *spec = codec->spec;
17886 for (i = 0; i < AUTO_PIN_LAST; i++) {
17887 hda_nid_t nid = spec->autocfg.input_pins[i];
17888 if (alc_is_input_pin(codec, nid)) {
17889 alc_set_input_pin(codec, nid, i);
17890 if (nid != ALC662_PIN_CD_NID &&
17891 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
17892 snd_hda_codec_write(codec, nid, 0,
17893 AC_VERB_SET_AMP_GAIN_MUTE,
17899 #define alc662_auto_init_input_src alc882_auto_init_input_src
17901 static int alc662_parse_auto_config(struct hda_codec *codec)
17903 struct alc_spec *spec = codec->spec;
17905 static hda_nid_t alc662_ignore[] = { 0x1d, 0 };
17907 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
17911 if (!spec->autocfg.line_outs)
17912 return 0; /* can't find valid BIOS pin config */
17914 err = alc662_auto_fill_dac_nids(codec, &spec->autocfg);
17917 err = alc662_auto_create_multi_out_ctls(codec, &spec->autocfg);
17920 err = alc662_auto_create_extra_out(codec,
17921 spec->autocfg.speaker_pins[0],
17926 spec->multiout.extra_out_nid[0] = err;
17927 err = alc662_auto_create_extra_out(codec, spec->autocfg.hp_pins[0],
17932 spec->multiout.hp_nid = err;
17933 err = alc662_auto_create_input_ctls(codec, &spec->autocfg);
17937 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
17939 if (spec->autocfg.dig_outs)
17940 spec->multiout.dig_out_nid = ALC880_DIGOUT_NID;
17942 if (spec->kctls.list)
17943 add_mixer(spec, spec->kctls.list);
17945 spec->num_mux_defs = 1;
17946 spec->input_mux = &spec->private_imux[0];
17948 add_verb(spec, alc662_auto_init_verbs);
17949 if (codec->vendor_id == 0x10ec0663)
17950 add_verb(spec, alc663_auto_init_verbs);
17952 err = alc_auto_add_mic_boost(codec);
17956 alc_ssid_check(codec, 0x15, 0x1b, 0x14);
17961 /* additional initialization for auto-configuration model */
17962 static void alc662_auto_init(struct hda_codec *codec)
17964 struct alc_spec *spec = codec->spec;
17965 alc662_auto_init_multi_out(codec);
17966 alc662_auto_init_hp_out(codec);
17967 alc662_auto_init_analog_input(codec);
17968 alc662_auto_init_input_src(codec);
17969 if (spec->unsol_event)
17970 alc_inithook(codec);
17973 static int patch_alc662(struct hda_codec *codec)
17975 struct alc_spec *spec;
17976 int err, board_config;
17978 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
17982 codec->spec = spec;
17984 alc_fix_pll_init(codec, 0x20, 0x04, 15);
17986 if (alc_read_coef_idx(codec, 0)==0x8020){
17987 kfree(codec->chip_name);
17988 codec->chip_name = kstrdup("ALC661", GFP_KERNEL);
17989 if (!codec->chip_name) {
17995 board_config = snd_hda_check_board_config(codec, ALC662_MODEL_LAST,
17998 if (board_config < 0) {
17999 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
18001 board_config = ALC662_AUTO;
18004 if (board_config == ALC662_AUTO) {
18005 /* automatic parse from the BIOS config */
18006 err = alc662_parse_auto_config(codec);
18012 "hda_codec: Cannot set up configuration "
18013 "from BIOS. Using base mode...\n");
18014 board_config = ALC662_3ST_2ch_DIG;
18018 err = snd_hda_attach_beep_device(codec, 0x1);
18024 if (board_config != ALC662_AUTO)
18025 setup_preset(codec, &alc662_presets[board_config]);
18027 spec->stream_analog_playback = &alc662_pcm_analog_playback;
18028 spec->stream_analog_capture = &alc662_pcm_analog_capture;
18030 spec->stream_digital_playback = &alc662_pcm_digital_playback;
18031 spec->stream_digital_capture = &alc662_pcm_digital_capture;
18033 if (!spec->adc_nids) {
18034 spec->adc_nids = alc662_adc_nids;
18035 spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids);
18037 if (!spec->capsrc_nids)
18038 spec->capsrc_nids = alc662_capsrc_nids;
18040 if (!spec->cap_mixer)
18041 set_capture_mixer(codec);
18042 if (codec->vendor_id == 0x10ec0662)
18043 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
18045 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
18047 spec->vmaster_nid = 0x02;
18049 codec->patch_ops = alc_patch_ops;
18050 if (board_config == ALC662_AUTO)
18051 spec->init_hook = alc662_auto_init;
18052 #ifdef CONFIG_SND_HDA_POWER_SAVE
18053 if (!spec->loopback.amplist)
18054 spec->loopback.amplist = alc662_loopbacks;
18056 codec->proc_widget_hook = print_realtek_coef;
18061 static int patch_alc888(struct hda_codec *codec)
18063 if ((alc_read_coef_idx(codec, 0) & 0x00f0)==0x0030){
18064 kfree(codec->chip_name);
18065 codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL);
18066 if (!codec->chip_name) {
18070 return patch_alc662(codec);
18072 return patch_alc882(codec);
18078 static struct hda_codec_preset snd_hda_preset_realtek[] = {
18079 { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
18080 { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
18081 { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
18082 { .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
18083 { .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
18084 { .id = 0x10ec0270, .name = "ALC270", .patch = patch_alc269 },
18085 { .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
18086 { .id = 0x10ec0275, .name = "ALC275", .patch = patch_alc269 },
18087 { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
18088 .patch = patch_alc861 },
18089 { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
18090 { .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 },
18091 { .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd },
18092 { .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2",
18093 .patch = patch_alc882 },
18094 { .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1",
18095 .patch = patch_alc662 },
18096 { .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
18097 { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
18098 { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
18099 { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
18100 { .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
18101 .patch = patch_alc882 },
18102 { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
18103 .patch = patch_alc882 },
18104 { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
18105 { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 },
18106 { .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200",
18107 .patch = patch_alc882 },
18108 { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 },
18109 { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
18110 { .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 },
18111 {} /* terminator */
18114 MODULE_ALIAS("snd-hda-codec-id:10ec*");
18116 MODULE_LICENSE("GPL");
18117 MODULE_DESCRIPTION("Realtek HD-audio codec");
18119 static struct hda_codec_preset_list realtek_list = {
18120 .preset = snd_hda_preset_realtek,
18121 .owner = THIS_MODULE,
18124 static int __init patch_realtek_init(void)
18126 return snd_hda_add_codec_preset(&realtek_list);
18129 static void __exit patch_realtek_exit(void)
18131 snd_hda_delete_codec_preset(&realtek_list);
18134 module_init(patch_realtek_init)
18135 module_exit(patch_realtek_exit)