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 */
141 ALC269_MODEL_LAST /* last tag */
158 /* ALC861-VD models */
180 ALC662_ASUS_EEEPC_P701,
181 ALC662_ASUS_EEEPC_EP20,
223 ALC883_TARGA_2ch_DIG,
224 ALC883_TARGA_8ch_DIG,
227 ALC888_ACER_ASPIRE_4930G,
228 ALC888_ACER_ASPIRE_6530G,
229 ALC888_ACER_ASPIRE_8930G,
230 ALC888_ACER_ASPIRE_7730G,
233 ALC883_MEDION_WIM2160,
235 ALC883_LENOVO_101E_2ch,
236 ALC883_LENOVO_NB0763,
237 ALC888_LENOVO_MS7195_DIG,
245 ALC883_FUJITSU_PI2515,
246 ALC888_FUJITSU_XA3530,
247 ALC883_3ST_6ch_INTEL,
267 #define GPIO_MASK 0x03
269 /* extra amp-initialization sequence types */
278 struct alc_mic_route {
280 unsigned char mux_idx;
281 unsigned char amix_idx;
284 #define MUX_IDX_UNDEF ((unsigned char)-1)
286 struct alc_customize_define {
287 unsigned int sku_cfg;
288 unsigned char port_connectivity;
289 unsigned char check_sum;
290 unsigned char customization;
291 unsigned char external_amp;
292 unsigned int enable_pcbeep:1;
293 unsigned int platform_type:1;
295 unsigned int override:1;
299 /* codec parameterization */
300 struct snd_kcontrol_new *mixers[5]; /* mixer arrays */
301 unsigned int num_mixers;
302 struct snd_kcontrol_new *cap_mixer; /* capture mixer */
303 unsigned int beep_amp; /* beep amp value, set via set_beep_amp() */
305 const struct hda_verb *init_verbs[10]; /* initialization verbs
309 unsigned int num_init_verbs;
311 char stream_name_analog[32]; /* analog PCM stream */
312 struct hda_pcm_stream *stream_analog_playback;
313 struct hda_pcm_stream *stream_analog_capture;
314 struct hda_pcm_stream *stream_analog_alt_playback;
315 struct hda_pcm_stream *stream_analog_alt_capture;
317 char stream_name_digital[32]; /* digital PCM stream */
318 struct hda_pcm_stream *stream_digital_playback;
319 struct hda_pcm_stream *stream_digital_capture;
322 struct hda_multi_out multiout; /* playback set-up
323 * max_channels, dacs must be set
324 * dig_out_nid and hp_nid are optional
326 hda_nid_t alt_dac_nid;
327 hda_nid_t slave_dig_outs[3]; /* optional - for auto-parsing */
331 unsigned int num_adc_nids;
333 hda_nid_t *capsrc_nids;
334 hda_nid_t dig_in_nid; /* digital-in NID; optional */
336 /* capture setup for dynamic dual-adc switch */
337 unsigned int cur_adc_idx;
339 unsigned int cur_adc_stream_tag;
340 unsigned int cur_adc_format;
343 unsigned int num_mux_defs;
344 const struct hda_input_mux *input_mux;
345 unsigned int cur_mux[3];
346 struct alc_mic_route ext_mic;
347 struct alc_mic_route int_mic;
350 const struct hda_channel_mode *channel_mode;
351 int num_channel_mode;
353 int const_channel_count;
354 int ext_channel_count;
356 /* PCM information */
357 struct hda_pcm pcm_rec[3]; /* used in alc_build_pcms() */
359 /* dynamic controls, init_verbs and input_mux */
360 struct auto_pin_cfg autocfg;
361 struct alc_customize_define cdefine;
362 struct snd_array kctls;
363 struct hda_input_mux private_imux[3];
364 hda_nid_t private_dac_nids[AUTO_CFG_MAX_OUTS];
365 hda_nid_t private_adc_nids[AUTO_CFG_MAX_OUTS];
366 hda_nid_t private_capsrc_nids[AUTO_CFG_MAX_OUTS];
369 void (*init_hook)(struct hda_codec *codec);
370 void (*unsol_event)(struct hda_codec *codec, unsigned int res);
371 #ifdef CONFIG_SND_HDA_POWER_SAVE
372 void (*power_hook)(struct hda_codec *codec);
375 /* for pin sensing */
376 unsigned int sense_updated: 1;
377 unsigned int jack_present: 1;
378 unsigned int master_sw: 1;
379 unsigned int auto_mic:1;
382 unsigned int no_analog :1; /* digital I/O only */
383 unsigned int dual_adc_switch:1; /* switch ADCs (for ALC275) */
386 /* for virtual master */
387 hda_nid_t vmaster_nid;
388 #ifdef CONFIG_SND_HDA_POWER_SAVE
389 struct hda_loopback_check loopback;
394 unsigned int pll_coef_idx, pll_coef_bit;
398 * configuration template - to be copied to the spec instance
400 struct alc_config_preset {
401 struct snd_kcontrol_new *mixers[5]; /* should be identical size
404 struct snd_kcontrol_new *cap_mixer; /* capture mixer */
405 const struct hda_verb *init_verbs[5];
406 unsigned int num_dacs;
408 hda_nid_t dig_out_nid; /* optional */
409 hda_nid_t hp_nid; /* optional */
410 hda_nid_t *slave_dig_outs;
411 unsigned int num_adc_nids;
413 hda_nid_t *capsrc_nids;
414 hda_nid_t dig_in_nid;
415 unsigned int num_channel_mode;
416 const struct hda_channel_mode *channel_mode;
418 int const_channel_count;
419 unsigned int num_mux_defs;
420 const struct hda_input_mux *input_mux;
421 void (*unsol_event)(struct hda_codec *, unsigned int);
422 void (*setup)(struct hda_codec *);
423 void (*init_hook)(struct hda_codec *);
424 #ifdef CONFIG_SND_HDA_POWER_SAVE
425 struct hda_amp_list *loopbacks;
426 void (*power_hook)(struct hda_codec *codec);
434 static int alc_mux_enum_info(struct snd_kcontrol *kcontrol,
435 struct snd_ctl_elem_info *uinfo)
437 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
438 struct alc_spec *spec = codec->spec;
439 unsigned int mux_idx = snd_ctl_get_ioffidx(kcontrol, &uinfo->id);
440 if (mux_idx >= spec->num_mux_defs)
442 if (!spec->input_mux[mux_idx].num_items && mux_idx > 0)
444 return snd_hda_input_mux_info(&spec->input_mux[mux_idx], uinfo);
447 static int alc_mux_enum_get(struct snd_kcontrol *kcontrol,
448 struct snd_ctl_elem_value *ucontrol)
450 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
451 struct alc_spec *spec = codec->spec;
452 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
454 ucontrol->value.enumerated.item[0] = spec->cur_mux[adc_idx];
458 static int alc_mux_enum_put(struct snd_kcontrol *kcontrol,
459 struct snd_ctl_elem_value *ucontrol)
461 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
462 struct alc_spec *spec = codec->spec;
463 const struct hda_input_mux *imux;
464 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
465 unsigned int mux_idx;
466 hda_nid_t nid = spec->capsrc_nids ?
467 spec->capsrc_nids[adc_idx] : spec->adc_nids[adc_idx];
470 mux_idx = adc_idx >= spec->num_mux_defs ? 0 : adc_idx;
471 imux = &spec->input_mux[mux_idx];
472 if (!imux->num_items && mux_idx > 0)
473 imux = &spec->input_mux[0];
475 type = get_wcaps_type(get_wcaps(codec, nid));
476 if (type == AC_WID_AUD_MIX) {
477 /* Matrix-mixer style (e.g. ALC882) */
478 unsigned int *cur_val = &spec->cur_mux[adc_idx];
481 idx = ucontrol->value.enumerated.item[0];
482 if (idx >= imux->num_items)
483 idx = imux->num_items - 1;
486 for (i = 0; i < imux->num_items; i++) {
487 unsigned int v = (i == idx) ? 0 : HDA_AMP_MUTE;
488 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT,
489 imux->items[i].index,
495 /* MUX style (e.g. ALC880) */
496 return snd_hda_input_mux_put(codec, imux, ucontrol, nid,
497 &spec->cur_mux[adc_idx]);
502 * channel mode setting
504 static int alc_ch_mode_info(struct snd_kcontrol *kcontrol,
505 struct snd_ctl_elem_info *uinfo)
507 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
508 struct alc_spec *spec = codec->spec;
509 return snd_hda_ch_mode_info(codec, uinfo, spec->channel_mode,
510 spec->num_channel_mode);
513 static int alc_ch_mode_get(struct snd_kcontrol *kcontrol,
514 struct snd_ctl_elem_value *ucontrol)
516 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
517 struct alc_spec *spec = codec->spec;
518 return snd_hda_ch_mode_get(codec, ucontrol, spec->channel_mode,
519 spec->num_channel_mode,
520 spec->ext_channel_count);
523 static int alc_ch_mode_put(struct snd_kcontrol *kcontrol,
524 struct snd_ctl_elem_value *ucontrol)
526 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
527 struct alc_spec *spec = codec->spec;
528 int err = snd_hda_ch_mode_put(codec, ucontrol, spec->channel_mode,
529 spec->num_channel_mode,
530 &spec->ext_channel_count);
531 if (err >= 0 && !spec->const_channel_count) {
532 spec->multiout.max_channels = spec->ext_channel_count;
533 if (spec->need_dac_fix)
534 spec->multiout.num_dacs = spec->multiout.max_channels / 2;
540 * Control the mode of pin widget settings via the mixer. "pc" is used
541 * instead of "%" to avoid consequences of accidently treating the % as
542 * being part of a format specifier. Maximum allowed length of a value is
543 * 63 characters plus NULL terminator.
545 * Note: some retasking pin complexes seem to ignore requests for input
546 * states other than HiZ (eg: PIN_VREFxx) and revert to HiZ if any of these
547 * are requested. Therefore order this list so that this behaviour will not
548 * cause problems when mixer clients move through the enum sequentially.
549 * NIDs 0x0f and 0x10 have been observed to have this behaviour as of
552 static char *alc_pin_mode_names[] = {
553 "Mic 50pc bias", "Mic 80pc bias",
554 "Line in", "Line out", "Headphone out",
556 static unsigned char alc_pin_mode_values[] = {
557 PIN_VREF50, PIN_VREF80, PIN_IN, PIN_OUT, PIN_HP,
559 /* The control can present all 5 options, or it can limit the options based
560 * in the pin being assumed to be exclusively an input or an output pin. In
561 * addition, "input" pins may or may not process the mic bias option
562 * depending on actual widget capability (NIDs 0x0f and 0x10 don't seem to
563 * accept requests for bias as of chip versions up to March 2006) and/or
564 * wiring in the computer.
566 #define ALC_PIN_DIR_IN 0x00
567 #define ALC_PIN_DIR_OUT 0x01
568 #define ALC_PIN_DIR_INOUT 0x02
569 #define ALC_PIN_DIR_IN_NOMICBIAS 0x03
570 #define ALC_PIN_DIR_INOUT_NOMICBIAS 0x04
572 /* Info about the pin modes supported by the different pin direction modes.
573 * For each direction the minimum and maximum values are given.
575 static signed char alc_pin_mode_dir_info[5][2] = {
576 { 0, 2 }, /* ALC_PIN_DIR_IN */
577 { 3, 4 }, /* ALC_PIN_DIR_OUT */
578 { 0, 4 }, /* ALC_PIN_DIR_INOUT */
579 { 2, 2 }, /* ALC_PIN_DIR_IN_NOMICBIAS */
580 { 2, 4 }, /* ALC_PIN_DIR_INOUT_NOMICBIAS */
582 #define alc_pin_mode_min(_dir) (alc_pin_mode_dir_info[_dir][0])
583 #define alc_pin_mode_max(_dir) (alc_pin_mode_dir_info[_dir][1])
584 #define alc_pin_mode_n_items(_dir) \
585 (alc_pin_mode_max(_dir)-alc_pin_mode_min(_dir)+1)
587 static int alc_pin_mode_info(struct snd_kcontrol *kcontrol,
588 struct snd_ctl_elem_info *uinfo)
590 unsigned int item_num = uinfo->value.enumerated.item;
591 unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
593 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
595 uinfo->value.enumerated.items = alc_pin_mode_n_items(dir);
597 if (item_num<alc_pin_mode_min(dir) || item_num>alc_pin_mode_max(dir))
598 item_num = alc_pin_mode_min(dir);
599 strcpy(uinfo->value.enumerated.name, alc_pin_mode_names[item_num]);
603 static int alc_pin_mode_get(struct snd_kcontrol *kcontrol,
604 struct snd_ctl_elem_value *ucontrol)
607 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
608 hda_nid_t nid = kcontrol->private_value & 0xffff;
609 unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
610 long *valp = ucontrol->value.integer.value;
611 unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
612 AC_VERB_GET_PIN_WIDGET_CONTROL,
615 /* Find enumerated value for current pinctl setting */
616 i = alc_pin_mode_min(dir);
617 while (i <= alc_pin_mode_max(dir) && alc_pin_mode_values[i] != pinctl)
619 *valp = i <= alc_pin_mode_max(dir) ? i: alc_pin_mode_min(dir);
623 static int alc_pin_mode_put(struct snd_kcontrol *kcontrol,
624 struct snd_ctl_elem_value *ucontrol)
627 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
628 hda_nid_t nid = kcontrol->private_value & 0xffff;
629 unsigned char dir = (kcontrol->private_value >> 16) & 0xff;
630 long val = *ucontrol->value.integer.value;
631 unsigned int pinctl = snd_hda_codec_read(codec, nid, 0,
632 AC_VERB_GET_PIN_WIDGET_CONTROL,
635 if (val < alc_pin_mode_min(dir) || val > alc_pin_mode_max(dir))
636 val = alc_pin_mode_min(dir);
638 change = pinctl != alc_pin_mode_values[val];
640 /* Set pin mode to that requested */
641 snd_hda_codec_write_cache(codec, nid, 0,
642 AC_VERB_SET_PIN_WIDGET_CONTROL,
643 alc_pin_mode_values[val]);
645 /* Also enable the retasking pin's input/output as required
646 * for the requested pin mode. Enum values of 2 or less are
649 * Dynamically switching the input/output buffers probably
650 * reduces noise slightly (particularly on input) so we'll
651 * do it. However, having both input and output buffers
652 * enabled simultaneously doesn't seem to be problematic if
653 * this turns out to be necessary in the future.
656 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
657 HDA_AMP_MUTE, HDA_AMP_MUTE);
658 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
661 snd_hda_codec_amp_stereo(codec, nid, HDA_INPUT, 0,
662 HDA_AMP_MUTE, HDA_AMP_MUTE);
663 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
670 #define ALC_PIN_MODE(xname, nid, dir) \
671 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
672 .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
673 .info = alc_pin_mode_info, \
674 .get = alc_pin_mode_get, \
675 .put = alc_pin_mode_put, \
676 .private_value = nid | (dir<<16) }
678 /* A switch control for ALC260 GPIO pins. Multiple GPIOs can be ganged
679 * together using a mask with more than one bit set. This control is
680 * currently used only by the ALC260 test model. At this stage they are not
681 * needed for any "production" models.
683 #ifdef CONFIG_SND_DEBUG
684 #define alc_gpio_data_info snd_ctl_boolean_mono_info
686 static int alc_gpio_data_get(struct snd_kcontrol *kcontrol,
687 struct snd_ctl_elem_value *ucontrol)
689 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
690 hda_nid_t nid = kcontrol->private_value & 0xffff;
691 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
692 long *valp = ucontrol->value.integer.value;
693 unsigned int val = snd_hda_codec_read(codec, nid, 0,
694 AC_VERB_GET_GPIO_DATA, 0x00);
696 *valp = (val & mask) != 0;
699 static int alc_gpio_data_put(struct snd_kcontrol *kcontrol,
700 struct snd_ctl_elem_value *ucontrol)
703 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
704 hda_nid_t nid = kcontrol->private_value & 0xffff;
705 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
706 long val = *ucontrol->value.integer.value;
707 unsigned int gpio_data = snd_hda_codec_read(codec, nid, 0,
708 AC_VERB_GET_GPIO_DATA,
711 /* Set/unset the masked GPIO bit(s) as needed */
712 change = (val == 0 ? 0 : mask) != (gpio_data & mask);
717 snd_hda_codec_write_cache(codec, nid, 0,
718 AC_VERB_SET_GPIO_DATA, gpio_data);
722 #define ALC_GPIO_DATA_SWITCH(xname, nid, mask) \
723 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
724 .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
725 .info = alc_gpio_data_info, \
726 .get = alc_gpio_data_get, \
727 .put = alc_gpio_data_put, \
728 .private_value = nid | (mask<<16) }
729 #endif /* CONFIG_SND_DEBUG */
731 /* A switch control to allow the enabling of the digital IO pins on the
732 * ALC260. This is incredibly simplistic; the intention of this control is
733 * to provide something in the test model allowing digital outputs to be
734 * identified if present. If models are found which can utilise these
735 * outputs a more complete mixer control can be devised for those models if
738 #ifdef CONFIG_SND_DEBUG
739 #define alc_spdif_ctrl_info snd_ctl_boolean_mono_info
741 static int alc_spdif_ctrl_get(struct snd_kcontrol *kcontrol,
742 struct snd_ctl_elem_value *ucontrol)
744 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
745 hda_nid_t nid = kcontrol->private_value & 0xffff;
746 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
747 long *valp = ucontrol->value.integer.value;
748 unsigned int val = snd_hda_codec_read(codec, nid, 0,
749 AC_VERB_GET_DIGI_CONVERT_1, 0x00);
751 *valp = (val & mask) != 0;
754 static int alc_spdif_ctrl_put(struct snd_kcontrol *kcontrol,
755 struct snd_ctl_elem_value *ucontrol)
758 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
759 hda_nid_t nid = kcontrol->private_value & 0xffff;
760 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
761 long val = *ucontrol->value.integer.value;
762 unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
763 AC_VERB_GET_DIGI_CONVERT_1,
766 /* Set/unset the masked control bit(s) as needed */
767 change = (val == 0 ? 0 : mask) != (ctrl_data & mask);
772 snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_DIGI_CONVERT_1,
777 #define ALC_SPDIF_CTRL_SWITCH(xname, nid, mask) \
778 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
779 .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
780 .info = alc_spdif_ctrl_info, \
781 .get = alc_spdif_ctrl_get, \
782 .put = alc_spdif_ctrl_put, \
783 .private_value = nid | (mask<<16) }
784 #endif /* CONFIG_SND_DEBUG */
786 /* A switch control to allow the enabling EAPD digital outputs on the ALC26x.
787 * Again, this is only used in the ALC26x test models to help identify when
788 * the EAPD line must be asserted for features to work.
790 #ifdef CONFIG_SND_DEBUG
791 #define alc_eapd_ctrl_info snd_ctl_boolean_mono_info
793 static int alc_eapd_ctrl_get(struct snd_kcontrol *kcontrol,
794 struct snd_ctl_elem_value *ucontrol)
796 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
797 hda_nid_t nid = kcontrol->private_value & 0xffff;
798 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
799 long *valp = ucontrol->value.integer.value;
800 unsigned int val = snd_hda_codec_read(codec, nid, 0,
801 AC_VERB_GET_EAPD_BTLENABLE, 0x00);
803 *valp = (val & mask) != 0;
807 static int alc_eapd_ctrl_put(struct snd_kcontrol *kcontrol,
808 struct snd_ctl_elem_value *ucontrol)
811 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
812 hda_nid_t nid = kcontrol->private_value & 0xffff;
813 unsigned char mask = (kcontrol->private_value >> 16) & 0xff;
814 long val = *ucontrol->value.integer.value;
815 unsigned int ctrl_data = snd_hda_codec_read(codec, nid, 0,
816 AC_VERB_GET_EAPD_BTLENABLE,
819 /* Set/unset the masked control bit(s) as needed */
820 change = (!val ? 0 : mask) != (ctrl_data & mask);
825 snd_hda_codec_write_cache(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
831 #define ALC_EAPD_CTRL_SWITCH(xname, nid, mask) \
832 { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, .index = 0, \
833 .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
834 .info = alc_eapd_ctrl_info, \
835 .get = alc_eapd_ctrl_get, \
836 .put = alc_eapd_ctrl_put, \
837 .private_value = nid | (mask<<16) }
838 #endif /* CONFIG_SND_DEBUG */
841 * set up the input pin config (depending on the given auto-pin type)
843 static void alc_set_input_pin(struct hda_codec *codec, hda_nid_t nid,
846 unsigned int val = PIN_IN;
848 if (auto_pin_type <= AUTO_PIN_FRONT_MIC) {
851 oldval = snd_hda_codec_read(codec, nid, 0,
852 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
853 pincap = snd_hda_query_pin_caps(codec, nid);
854 pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
855 /* if the default pin setup is vref50, we give it priority */
856 if ((pincap & AC_PINCAP_VREF_80) && oldval != PIN_VREF50)
858 else if (pincap & AC_PINCAP_VREF_50)
860 else if (pincap & AC_PINCAP_VREF_100)
862 else if (pincap & AC_PINCAP_VREF_GRD)
865 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL, val);
870 static void add_mixer(struct alc_spec *spec, struct snd_kcontrol_new *mix)
872 if (snd_BUG_ON(spec->num_mixers >= ARRAY_SIZE(spec->mixers)))
874 spec->mixers[spec->num_mixers++] = mix;
877 static void add_verb(struct alc_spec *spec, const struct hda_verb *verb)
879 if (snd_BUG_ON(spec->num_init_verbs >= ARRAY_SIZE(spec->init_verbs)))
881 spec->init_verbs[spec->num_init_verbs++] = verb;
885 * set up from the preset table
887 static void setup_preset(struct hda_codec *codec,
888 const struct alc_config_preset *preset)
890 struct alc_spec *spec = codec->spec;
893 for (i = 0; i < ARRAY_SIZE(preset->mixers) && preset->mixers[i]; i++)
894 add_mixer(spec, preset->mixers[i]);
895 spec->cap_mixer = preset->cap_mixer;
896 for (i = 0; i < ARRAY_SIZE(preset->init_verbs) && preset->init_verbs[i];
898 add_verb(spec, preset->init_verbs[i]);
900 spec->channel_mode = preset->channel_mode;
901 spec->num_channel_mode = preset->num_channel_mode;
902 spec->need_dac_fix = preset->need_dac_fix;
903 spec->const_channel_count = preset->const_channel_count;
905 if (preset->const_channel_count)
906 spec->multiout.max_channels = preset->const_channel_count;
908 spec->multiout.max_channels = spec->channel_mode[0].channels;
909 spec->ext_channel_count = spec->channel_mode[0].channels;
911 spec->multiout.num_dacs = preset->num_dacs;
912 spec->multiout.dac_nids = preset->dac_nids;
913 spec->multiout.dig_out_nid = preset->dig_out_nid;
914 spec->multiout.slave_dig_outs = preset->slave_dig_outs;
915 spec->multiout.hp_nid = preset->hp_nid;
917 spec->num_mux_defs = preset->num_mux_defs;
918 if (!spec->num_mux_defs)
919 spec->num_mux_defs = 1;
920 spec->input_mux = preset->input_mux;
922 spec->num_adc_nids = preset->num_adc_nids;
923 spec->adc_nids = preset->adc_nids;
924 spec->capsrc_nids = preset->capsrc_nids;
925 spec->dig_in_nid = preset->dig_in_nid;
927 spec->unsol_event = preset->unsol_event;
928 spec->init_hook = preset->init_hook;
929 #ifdef CONFIG_SND_HDA_POWER_SAVE
930 spec->power_hook = preset->power_hook;
931 spec->loopback.amplist = preset->loopbacks;
935 preset->setup(codec);
938 /* Enable GPIO mask and set output */
939 static struct hda_verb alc_gpio1_init_verbs[] = {
940 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
941 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
942 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
946 static struct hda_verb alc_gpio2_init_verbs[] = {
947 {0x01, AC_VERB_SET_GPIO_MASK, 0x02},
948 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
949 {0x01, AC_VERB_SET_GPIO_DATA, 0x02},
953 static struct hda_verb alc_gpio3_init_verbs[] = {
954 {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
955 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x03},
956 {0x01, AC_VERB_SET_GPIO_DATA, 0x03},
961 * Fix hardware PLL issue
962 * On some codecs, the analog PLL gating control must be off while
963 * the default value is 1.
965 static void alc_fix_pll(struct hda_codec *codec)
967 struct alc_spec *spec = codec->spec;
972 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
974 val = snd_hda_codec_read(codec, spec->pll_nid, 0,
975 AC_VERB_GET_PROC_COEF, 0);
976 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
978 snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF,
979 val & ~(1 << spec->pll_coef_bit));
982 static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
983 unsigned int coef_idx, unsigned int coef_bit)
985 struct alc_spec *spec = codec->spec;
987 spec->pll_coef_idx = coef_idx;
988 spec->pll_coef_bit = coef_bit;
992 static void alc_automute_pin(struct hda_codec *codec)
994 struct alc_spec *spec = codec->spec;
995 unsigned int nid = spec->autocfg.hp_pins[0];
1000 spec->jack_present = snd_hda_jack_detect(codec, nid);
1001 for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
1002 nid = spec->autocfg.speaker_pins[i];
1005 snd_hda_codec_write(codec, nid, 0,
1006 AC_VERB_SET_PIN_WIDGET_CONTROL,
1007 spec->jack_present ? 0 : PIN_OUT);
1011 static int get_connection_index(struct hda_codec *codec, hda_nid_t mux,
1014 hda_nid_t conn[HDA_MAX_NUM_INPUTS];
1017 nums = snd_hda_get_connections(codec, mux, conn, ARRAY_SIZE(conn));
1018 for (i = 0; i < nums; i++)
1024 /* switch the current ADC according to the jack state */
1025 static void alc_dual_mic_adc_auto_switch(struct hda_codec *codec)
1027 struct alc_spec *spec = codec->spec;
1028 unsigned int present;
1031 present = snd_hda_jack_detect(codec, spec->ext_mic.pin);
1033 spec->cur_adc_idx = 1;
1035 spec->cur_adc_idx = 0;
1036 new_adc = spec->adc_nids[spec->cur_adc_idx];
1037 if (spec->cur_adc && spec->cur_adc != new_adc) {
1038 /* stream is running, let's swap the current ADC */
1039 snd_hda_codec_cleanup_stream(codec, spec->cur_adc);
1040 spec->cur_adc = new_adc;
1041 snd_hda_codec_setup_stream(codec, new_adc,
1042 spec->cur_adc_stream_tag, 0,
1043 spec->cur_adc_format);
1047 static void alc_mic_automute(struct hda_codec *codec)
1049 struct alc_spec *spec = codec->spec;
1050 struct alc_mic_route *dead, *alive;
1051 unsigned int present, type;
1054 if (!spec->auto_mic)
1056 if (!spec->int_mic.pin || !spec->ext_mic.pin)
1058 if (snd_BUG_ON(!spec->adc_nids))
1061 if (spec->dual_adc_switch) {
1062 alc_dual_mic_adc_auto_switch(codec);
1066 cap_nid = spec->capsrc_nids ? spec->capsrc_nids[0] : spec->adc_nids[0];
1068 present = snd_hda_jack_detect(codec, spec->ext_mic.pin);
1070 alive = &spec->ext_mic;
1071 dead = &spec->int_mic;
1073 alive = &spec->int_mic;
1074 dead = &spec->ext_mic;
1077 type = get_wcaps_type(get_wcaps(codec, cap_nid));
1078 if (type == AC_WID_AUD_MIX) {
1079 /* Matrix-mixer style (e.g. ALC882) */
1080 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1083 snd_hda_codec_amp_stereo(codec, cap_nid, HDA_INPUT,
1085 HDA_AMP_MUTE, HDA_AMP_MUTE);
1087 /* MUX style (e.g. ALC880) */
1088 snd_hda_codec_write_cache(codec, cap_nid, 0,
1089 AC_VERB_SET_CONNECT_SEL,
1093 /* FIXME: analog mixer */
1096 /* unsolicited event for HP jack sensing */
1097 static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
1099 if (codec->vendor_id == 0x10ec0880)
1104 case ALC880_HP_EVENT:
1105 alc_automute_pin(codec);
1107 case ALC880_MIC_EVENT:
1108 alc_mic_automute(codec);
1113 static void alc_inithook(struct hda_codec *codec)
1115 alc_automute_pin(codec);
1116 alc_mic_automute(codec);
1119 /* additional initialization for ALC888 variants */
1120 static void alc888_coef_init(struct hda_codec *codec)
1124 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0);
1125 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1126 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1127 if ((tmp & 0xf0) == 0x20)
1129 snd_hda_codec_read(codec, 0x20, 0,
1130 AC_VERB_SET_PROC_COEF, 0x830);
1133 snd_hda_codec_read(codec, 0x20, 0,
1134 AC_VERB_SET_PROC_COEF, 0x3030);
1137 static void alc889_coef_init(struct hda_codec *codec)
1141 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1142 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
1143 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
1144 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, tmp|0x2010);
1147 /* turn on/off EAPD control (only if available) */
1148 static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
1150 if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
1152 if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
1153 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
1157 static void alc_auto_init_amp(struct hda_codec *codec, int type)
1162 case ALC_INIT_GPIO1:
1163 snd_hda_sequence_write(codec, alc_gpio1_init_verbs);
1165 case ALC_INIT_GPIO2:
1166 snd_hda_sequence_write(codec, alc_gpio2_init_verbs);
1168 case ALC_INIT_GPIO3:
1169 snd_hda_sequence_write(codec, alc_gpio3_init_verbs);
1171 case ALC_INIT_DEFAULT:
1172 switch (codec->vendor_id) {
1174 set_eapd(codec, 0x0f, 1);
1175 set_eapd(codec, 0x10, 1);
1188 set_eapd(codec, 0x14, 1);
1189 set_eapd(codec, 0x15, 1);
1192 switch (codec->vendor_id) {
1194 snd_hda_codec_write(codec, 0x1a, 0,
1195 AC_VERB_SET_COEF_INDEX, 7);
1196 tmp = snd_hda_codec_read(codec, 0x1a, 0,
1197 AC_VERB_GET_PROC_COEF, 0);
1198 snd_hda_codec_write(codec, 0x1a, 0,
1199 AC_VERB_SET_COEF_INDEX, 7);
1200 snd_hda_codec_write(codec, 0x1a, 0,
1201 AC_VERB_SET_PROC_COEF,
1211 alc889_coef_init(codec);
1214 alc888_coef_init(codec);
1216 #if 0 /* XXX: This may cause the silent output on speaker on some machines */
1219 snd_hda_codec_write(codec, 0x20, 0,
1220 AC_VERB_SET_COEF_INDEX, 7);
1221 tmp = snd_hda_codec_read(codec, 0x20, 0,
1222 AC_VERB_GET_PROC_COEF, 0);
1223 snd_hda_codec_write(codec, 0x20, 0,
1224 AC_VERB_SET_COEF_INDEX, 7);
1225 snd_hda_codec_write(codec, 0x20, 0,
1226 AC_VERB_SET_PROC_COEF,
1235 static void alc_init_auto_hp(struct hda_codec *codec)
1237 struct alc_spec *spec = codec->spec;
1239 if (!spec->autocfg.hp_pins[0])
1242 if (!spec->autocfg.speaker_pins[0]) {
1243 if (spec->autocfg.line_out_pins[0] &&
1244 spec->autocfg.line_out_type == AUTO_PIN_SPEAKER_OUT)
1245 spec->autocfg.speaker_pins[0] =
1246 spec->autocfg.line_out_pins[0];
1251 snd_printdd("realtek: Enable HP auto-muting on NID 0x%x\n",
1252 spec->autocfg.hp_pins[0]);
1253 snd_hda_codec_write_cache(codec, spec->autocfg.hp_pins[0], 0,
1254 AC_VERB_SET_UNSOLICITED_ENABLE,
1255 AC_USRSP_EN | ALC880_HP_EVENT);
1256 spec->unsol_event = alc_sku_unsol_event;
1259 static void alc_init_auto_mic(struct hda_codec *codec)
1261 struct alc_spec *spec = codec->spec;
1262 struct auto_pin_cfg *cfg = &spec->autocfg;
1263 hda_nid_t fixed, ext;
1266 /* there must be only two mic inputs exclusively */
1267 for (i = AUTO_PIN_LINE; i < AUTO_PIN_LAST; i++)
1268 if (cfg->input_pins[i])
1272 for (i = AUTO_PIN_MIC; i <= AUTO_PIN_FRONT_MIC; i++) {
1273 hda_nid_t nid = cfg->input_pins[i];
1274 unsigned int defcfg;
1277 defcfg = snd_hda_codec_get_pincfg(codec, nid);
1278 switch (get_defcfg_connect(defcfg)) {
1279 case AC_JACK_PORT_FIXED:
1281 return; /* already occupied */
1284 case AC_JACK_PORT_COMPLEX:
1286 return; /* already occupied */
1290 return; /* invalid entry */
1295 if (!(get_wcaps(codec, ext) & AC_WCAP_UNSOL_CAP))
1296 return; /* no unsol support */
1297 snd_printdd("realtek: Enable auto-mic switch on NID 0x%x/0x%x\n",
1299 spec->ext_mic.pin = ext;
1300 spec->int_mic.pin = fixed;
1301 spec->ext_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1302 spec->int_mic.mux_idx = MUX_IDX_UNDEF; /* set later */
1304 snd_hda_codec_write_cache(codec, spec->ext_mic.pin, 0,
1305 AC_VERB_SET_UNSOLICITED_ENABLE,
1306 AC_USRSP_EN | ALC880_MIC_EVENT);
1307 spec->unsol_event = alc_sku_unsol_event;
1310 static int alc_auto_parse_customize_define(struct hda_codec *codec)
1312 unsigned int ass, tmp, i;
1314 struct alc_spec *spec = codec->spec;
1316 spec->cdefine.enable_pcbeep = 1; /* assume always enabled */
1318 ass = codec->subsystem_id & 0xffff;
1319 if (ass != codec->bus->pci->subsystem_device && (ass & 1))
1323 if (codec->vendor_id == 0x10ec0260)
1325 ass = snd_hda_codec_get_pincfg(codec, nid);
1328 printk(KERN_INFO "hda_codec: %s: SKU not ready 0x%08x\n",
1329 codec->chip_name, ass);
1335 for (i = 1; i < 16; i++) {
1339 if (((ass >> 16) & 0xf) != tmp)
1342 spec->cdefine.port_connectivity = ass >> 30;
1343 spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
1344 spec->cdefine.check_sum = (ass >> 16) & 0xf;
1345 spec->cdefine.customization = ass >> 8;
1347 spec->cdefine.sku_cfg = ass;
1348 spec->cdefine.external_amp = (ass & 0x38) >> 3;
1349 spec->cdefine.platform_type = (ass & 0x4) >> 2;
1350 spec->cdefine.swap = (ass & 0x2) >> 1;
1351 spec->cdefine.override = ass & 0x1;
1353 snd_printd("SKU: Nid=0x%x sku_cfg=0x%08x\n",
1354 nid, spec->cdefine.sku_cfg);
1355 snd_printd("SKU: port_connectivity=0x%x\n",
1356 spec->cdefine.port_connectivity);
1357 snd_printd("SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
1358 snd_printd("SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
1359 snd_printd("SKU: customization=0x%08x\n", spec->cdefine.customization);
1360 snd_printd("SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
1361 snd_printd("SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
1362 snd_printd("SKU: swap=0x%x\n", spec->cdefine.swap);
1363 snd_printd("SKU: override=0x%x\n", spec->cdefine.override);
1368 /* check subsystem ID and set up device-specific initialization;
1369 * return 1 if initialized, 0 if invalid SSID
1371 /* 32-bit subsystem ID for BIOS loading in HD Audio codec.
1372 * 31 ~ 16 : Manufacture ID
1374 * 7 ~ 0 : Assembly ID
1375 * port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
1377 static int alc_subsystem_id(struct hda_codec *codec,
1378 hda_nid_t porta, hda_nid_t porte,
1379 hda_nid_t portd, hda_nid_t porti)
1381 unsigned int ass, tmp, i;
1383 struct alc_spec *spec = codec->spec;
1385 ass = codec->subsystem_id & 0xffff;
1386 if ((ass != codec->bus->pci->subsystem_device) && (ass & 1))
1389 /* invalid SSID, check the special NID pin defcfg instead */
1391 * 31~30 : port connectivity
1394 * 19~16 : Check sum (15:1)
1399 if (codec->vendor_id == 0x10ec0260)
1401 ass = snd_hda_codec_get_pincfg(codec, nid);
1402 snd_printd("realtek: No valid SSID, "
1403 "checking pincfg 0x%08x for NID 0x%x\n",
1407 if ((ass >> 30) != 1) /* no physical connection */
1412 for (i = 1; i < 16; i++) {
1416 if (((ass >> 16) & 0xf) != tmp)
1419 snd_printd("realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
1420 ass & 0xffff, codec->vendor_id);
1424 * 2 : 0 --> Desktop, 1 --> Laptop
1425 * 3~5 : External Amplifier control
1428 tmp = (ass & 0x38) >> 3; /* external Amp control */
1431 spec->init_amp = ALC_INIT_GPIO1;
1434 spec->init_amp = ALC_INIT_GPIO2;
1437 spec->init_amp = ALC_INIT_GPIO3;
1440 spec->init_amp = ALC_INIT_DEFAULT;
1444 /* is laptop or Desktop and enable the function "Mute internal speaker
1445 * when the external headphone out jack is plugged"
1447 if (!(ass & 0x8000))
1450 * 10~8 : Jack location
1451 * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
1453 * 15 : 1 --> enable the function "Mute internal speaker
1454 * when the external headphone out jack is plugged"
1456 if (!spec->autocfg.hp_pins[0]) {
1458 tmp = (ass >> 11) & 0x3; /* HP to chassis */
1469 for (i = 0; i < spec->autocfg.line_outs; i++)
1470 if (spec->autocfg.line_out_pins[i] == nid)
1472 spec->autocfg.hp_pins[0] = nid;
1475 alc_init_auto_hp(codec);
1476 alc_init_auto_mic(codec);
1480 static void alc_ssid_check(struct hda_codec *codec,
1481 hda_nid_t porta, hda_nid_t porte,
1482 hda_nid_t portd, hda_nid_t porti)
1484 if (!alc_subsystem_id(codec, porta, porte, portd, porti)) {
1485 struct alc_spec *spec = codec->spec;
1486 snd_printd("realtek: "
1487 "Enable default setup for auto mode as fallback\n");
1488 spec->init_amp = ALC_INIT_DEFAULT;
1489 alc_init_auto_hp(codec);
1490 alc_init_auto_mic(codec);
1495 * Fix-up pin default configurations and add default verbs
1504 const struct alc_pincfg *pins;
1505 const struct hda_verb *verbs;
1508 static void alc_pick_fixup(struct hda_codec *codec,
1509 const struct snd_pci_quirk *quirk,
1510 const struct alc_fixup *fix,
1513 const struct alc_pincfg *cfg;
1515 quirk = snd_pci_quirk_lookup(codec->bus->pci, quirk);
1518 fix += quirk->value;
1520 if (pre_init && cfg) {
1521 #ifdef CONFIG_SND_DEBUG_VERBOSE
1522 snd_printdd(KERN_INFO "hda_codec: %s: Apply pincfg for %s\n",
1523 codec->chip_name, quirk->name);
1525 for (; cfg->nid; cfg++)
1526 snd_hda_codec_set_pincfg(codec, cfg->nid, cfg->val);
1528 if (!pre_init && fix->verbs) {
1529 #ifdef CONFIG_SND_DEBUG_VERBOSE
1530 snd_printdd(KERN_INFO "hda_codec: %s: Apply fix-verbs for %s\n",
1531 codec->chip_name, quirk->name);
1533 add_verb(codec->spec, fix->verbs);
1537 static int alc_read_coef_idx(struct hda_codec *codec,
1538 unsigned int coef_idx)
1541 snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX,
1543 val = snd_hda_codec_read(codec, 0x20, 0,
1544 AC_VERB_GET_PROC_COEF, 0);
1548 /* set right pin controls for digital I/O */
1549 static void alc_auto_init_digital(struct hda_codec *codec)
1551 struct alc_spec *spec = codec->spec;
1555 for (i = 0; i < spec->autocfg.dig_outs; i++) {
1556 pin = spec->autocfg.dig_out_pins[i];
1558 snd_hda_codec_write(codec, pin, 0,
1559 AC_VERB_SET_PIN_WIDGET_CONTROL,
1563 pin = spec->autocfg.dig_in_pin;
1565 snd_hda_codec_write(codec, pin, 0,
1566 AC_VERB_SET_PIN_WIDGET_CONTROL,
1570 /* parse digital I/Os and set up NIDs in BIOS auto-parse mode */
1571 static void alc_auto_parse_digital(struct hda_codec *codec)
1573 struct alc_spec *spec = codec->spec;
1577 /* support multiple SPDIFs; the secondary is set up as a slave */
1578 for (i = 0; i < spec->autocfg.dig_outs; i++) {
1579 err = snd_hda_get_connections(codec,
1580 spec->autocfg.dig_out_pins[i],
1585 spec->multiout.dig_out_nid = dig_nid;
1586 spec->dig_out_type = spec->autocfg.dig_out_type[0];
1588 spec->multiout.slave_dig_outs = spec->slave_dig_outs;
1589 if (i >= ARRAY_SIZE(spec->slave_dig_outs) - 1)
1591 spec->slave_dig_outs[i - 1] = dig_nid;
1595 if (spec->autocfg.dig_in_pin) {
1597 err = snd_hda_get_connections(codec,
1598 spec->autocfg.dig_in_pin,
1601 spec->dig_in_nid = dig_nid;
1612 static struct hda_verb alc888_4ST_ch2_intel_init[] = {
1613 /* Mic-in jack as mic in */
1614 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1615 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1616 /* Line-in jack as Line in */
1617 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
1618 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1619 /* Line-Out as Front */
1620 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1627 static struct hda_verb alc888_4ST_ch4_intel_init[] = {
1628 /* Mic-in jack as mic in */
1629 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
1630 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
1631 /* Line-in jack as Surround */
1632 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1633 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1634 /* Line-Out as Front */
1635 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00},
1642 static struct hda_verb alc888_4ST_ch6_intel_init[] = {
1643 /* Mic-in jack as CLFE */
1644 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1645 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1646 /* Line-in jack as Surround */
1647 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1648 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1649 /* Line-Out as CLFE (workaround because Mic-in is not loud enough) */
1650 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1657 static struct hda_verb alc888_4ST_ch8_intel_init[] = {
1658 /* Mic-in jack as CLFE */
1659 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1660 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1661 /* Line-in jack as Surround */
1662 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
1663 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
1664 /* Line-Out as Side */
1665 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1669 static struct hda_channel_mode alc888_4ST_8ch_intel_modes[4] = {
1670 { 2, alc888_4ST_ch2_intel_init },
1671 { 4, alc888_4ST_ch4_intel_init },
1672 { 6, alc888_4ST_ch6_intel_init },
1673 { 8, alc888_4ST_ch8_intel_init },
1677 * ALC888 Fujitsu Siemens Amillo xa3530
1680 static struct hda_verb alc888_fujitsu_xa3530_verbs[] = {
1681 /* Front Mic: set to PIN_IN (empty by default) */
1682 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1683 /* Connect Internal HP to Front */
1684 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1685 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1686 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1687 /* Connect Bass HP to Front */
1688 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1689 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1690 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1691 /* Connect Line-Out side jack (SPDIF) to Side */
1692 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1693 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1694 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
1695 /* Connect Mic jack to CLFE */
1696 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1697 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1698 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
1699 /* Connect Line-in jack to Surround */
1700 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1701 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1702 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
1703 /* Connect HP out jack to Front */
1704 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1705 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1706 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
1707 /* Enable unsolicited event for HP jack and Line-out jack */
1708 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1709 {0x17, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1713 static void alc_automute_amp(struct hda_codec *codec)
1715 struct alc_spec *spec = codec->spec;
1720 spec->jack_present = 0;
1721 for (i = 0; i < ARRAY_SIZE(spec->autocfg.hp_pins); i++) {
1722 nid = spec->autocfg.hp_pins[i];
1725 if (snd_hda_jack_detect(codec, nid)) {
1726 spec->jack_present = 1;
1731 mute = spec->jack_present ? HDA_AMP_MUTE : 0;
1732 /* Toggle internal speakers muting */
1733 for (i = 0; i < ARRAY_SIZE(spec->autocfg.speaker_pins); i++) {
1734 nid = spec->autocfg.speaker_pins[i];
1737 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
1738 HDA_AMP_MUTE, mute);
1742 static void alc_automute_amp_unsol_event(struct hda_codec *codec,
1745 if (codec->vendor_id == 0x10ec0880)
1749 if (res == ALC880_HP_EVENT)
1750 alc_automute_amp(codec);
1753 static void alc889_automute_setup(struct hda_codec *codec)
1755 struct alc_spec *spec = codec->spec;
1757 spec->autocfg.hp_pins[0] = 0x15;
1758 spec->autocfg.speaker_pins[0] = 0x14;
1759 spec->autocfg.speaker_pins[1] = 0x16;
1760 spec->autocfg.speaker_pins[2] = 0x17;
1761 spec->autocfg.speaker_pins[3] = 0x19;
1762 spec->autocfg.speaker_pins[4] = 0x1a;
1765 static void alc889_intel_init_hook(struct hda_codec *codec)
1767 alc889_coef_init(codec);
1768 alc_automute_amp(codec);
1771 static void alc888_fujitsu_xa3530_setup(struct hda_codec *codec)
1773 struct alc_spec *spec = codec->spec;
1775 spec->autocfg.hp_pins[0] = 0x17; /* line-out */
1776 spec->autocfg.hp_pins[1] = 0x1b; /* hp */
1777 spec->autocfg.speaker_pins[0] = 0x14; /* speaker */
1778 spec->autocfg.speaker_pins[1] = 0x15; /* bass */
1782 * ALC888 Acer Aspire 4930G model
1785 static struct hda_verb alc888_acer_aspire_4930g_verbs[] = {
1786 /* Front Mic: set to PIN_IN (empty by default) */
1787 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1788 /* Unselect Front Mic by default in input mixer 3 */
1789 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1790 /* Enable unsolicited event for HP jack */
1791 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1792 /* Connect Internal HP to front */
1793 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1794 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1795 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1796 /* Connect HP out to front */
1797 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1798 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1799 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1804 * ALC888 Acer Aspire 6530G model
1807 static struct hda_verb alc888_acer_aspire_6530g_verbs[] = {
1808 /* Route to built-in subwoofer as well as speakers */
1809 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1810 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1811 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
1812 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
1813 /* Bias voltage on for external mic port */
1814 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN | PIN_VREF80},
1815 /* Front Mic: set to PIN_IN (empty by default) */
1816 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1817 /* Unselect Front Mic by default in input mixer 3 */
1818 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1819 /* Enable unsolicited event for HP jack */
1820 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1821 /* Enable speaker output */
1822 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1823 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1824 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
1825 /* Enable headphone output */
1826 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1827 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1828 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1829 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
1834 * ALC889 Acer Aspire 8930G model
1837 static struct hda_verb alc889_acer_aspire_8930g_verbs[] = {
1838 /* Front Mic: set to PIN_IN (empty by default) */
1839 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
1840 /* Unselect Front Mic by default in input mixer 3 */
1841 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0xb)},
1842 /* Enable unsolicited event for HP jack */
1843 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
1844 /* Connect Internal Front to Front */
1845 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1846 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1847 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
1848 /* Connect Internal Rear to Rear */
1849 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1850 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1851 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
1852 /* Connect Internal CLFE to CLFE */
1853 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
1854 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1855 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
1856 /* Connect HP out to Front */
1857 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | PIN_HP},
1858 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
1859 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
1860 /* Enable all DACs */
1861 /* DAC DISABLE/MUTE 1? */
1862 /* setting bits 1-5 disables DAC nids 0x02-0x06 apparently. Init=0x38 */
1863 {0x20, AC_VERB_SET_COEF_INDEX, 0x03},
1864 {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1865 /* DAC DISABLE/MUTE 2? */
1866 /* some bit here disables the other DACs. Init=0x4900 */
1867 {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
1868 {0x20, AC_VERB_SET_PROC_COEF, 0x0000},
1870 * This laptop has a stereo digital microphone. The mics are only 1cm apart
1871 * which makes the stereo useless. However, either the mic or the ALC889
1872 * makes the signal become a difference/sum signal instead of standard
1873 * stereo, which is annoying. So instead we flip this bit which makes the
1874 * codec replicate the sum signal to both channels, turning it into a
1877 /* DMIC_CONTROL? Init value = 0x0001 */
1878 {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
1879 {0x20, AC_VERB_SET_PROC_COEF, 0x0003},
1883 static struct hda_input_mux alc888_2_capture_sources[2] = {
1884 /* Front mic only available on one ADC */
1891 { "Front Mic", 0xb },
1904 static struct hda_input_mux alc888_acer_aspire_6530_sources[2] = {
1905 /* Interal mic only available on one ADC */
1912 { "Input Mix", 0xa },
1922 { "Input Mix", 0xa },
1927 static struct hda_input_mux alc889_capture_sources[3] = {
1928 /* Digital mic only available on first "ADC" */
1935 { "Front Mic", 0xb },
1936 { "Input Mix", 0xa },
1945 { "Input Mix", 0xa },
1954 { "Input Mix", 0xa },
1959 static struct snd_kcontrol_new alc888_base_mixer[] = {
1960 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1961 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1962 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1963 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1964 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1966 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1967 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1968 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1969 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
1970 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
1971 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
1972 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
1973 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1974 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1975 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1976 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1977 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
1981 static struct snd_kcontrol_new alc889_acer_aspire_8930g_mixer[] = {
1982 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
1983 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
1984 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
1985 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
1986 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
1988 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
1989 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
1990 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
1991 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
1992 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
1993 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
1994 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
1995 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2000 static void alc888_acer_aspire_4930g_setup(struct hda_codec *codec)
2002 struct alc_spec *spec = codec->spec;
2004 spec->autocfg.hp_pins[0] = 0x15;
2005 spec->autocfg.speaker_pins[0] = 0x14;
2006 spec->autocfg.speaker_pins[1] = 0x16;
2007 spec->autocfg.speaker_pins[2] = 0x17;
2010 static void alc888_acer_aspire_6530g_setup(struct hda_codec *codec)
2012 struct alc_spec *spec = codec->spec;
2014 spec->autocfg.hp_pins[0] = 0x15;
2015 spec->autocfg.speaker_pins[0] = 0x14;
2016 spec->autocfg.speaker_pins[1] = 0x16;
2017 spec->autocfg.speaker_pins[2] = 0x17;
2020 static void alc889_acer_aspire_8930g_setup(struct hda_codec *codec)
2022 struct alc_spec *spec = codec->spec;
2024 spec->autocfg.hp_pins[0] = 0x15;
2025 spec->autocfg.speaker_pins[0] = 0x14;
2026 spec->autocfg.speaker_pins[1] = 0x16;
2027 spec->autocfg.speaker_pins[2] = 0x1b;
2031 * ALC880 3-stack model
2033 * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0e)
2034 * Pin assignment: Front = 0x14, Line-In/Surr = 0x1a, Mic/CLFE = 0x18,
2035 * F-Mic = 0x1b, HP = 0x19
2038 static hda_nid_t alc880_dac_nids[4] = {
2039 /* front, rear, clfe, rear_surr */
2040 0x02, 0x05, 0x04, 0x03
2043 static hda_nid_t alc880_adc_nids[3] = {
2048 /* The datasheet says the node 0x07 is connected from inputs,
2049 * but it shows zero connection in the real implementation on some devices.
2050 * Note: this is a 915GAV bug, fixed on 915GLV
2052 static hda_nid_t alc880_adc_nids_alt[2] = {
2057 #define ALC880_DIGOUT_NID 0x06
2058 #define ALC880_DIGIN_NID 0x0a
2060 static struct hda_input_mux alc880_capture_source = {
2064 { "Front Mic", 0x3 },
2070 /* channel source setting (2/6 channel selection for 3-stack) */
2072 static struct hda_verb alc880_threestack_ch2_init[] = {
2073 /* set line-in to input, mute it */
2074 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2075 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2076 /* set mic-in to input vref 80%, mute it */
2077 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
2078 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2083 static struct hda_verb alc880_threestack_ch6_init[] = {
2084 /* set line-in to output, unmute it */
2085 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2086 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2087 /* set mic-in to output, unmute it */
2088 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2089 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2093 static struct hda_channel_mode alc880_threestack_modes[2] = {
2094 { 2, alc880_threestack_ch2_init },
2095 { 6, alc880_threestack_ch6_init },
2098 static struct snd_kcontrol_new alc880_three_stack_mixer[] = {
2099 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2100 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2101 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
2102 HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
2103 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2104 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2105 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2106 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2107 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2108 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2109 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2110 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2111 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2112 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2113 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
2114 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
2115 HDA_CODEC_MUTE("Headphone Playback Switch", 0x19, 0x0, HDA_OUTPUT),
2117 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2118 .name = "Channel Mode",
2119 .info = alc_ch_mode_info,
2120 .get = alc_ch_mode_get,
2121 .put = alc_ch_mode_put,
2126 /* capture mixer elements */
2127 static int alc_cap_vol_info(struct snd_kcontrol *kcontrol,
2128 struct snd_ctl_elem_info *uinfo)
2130 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2131 struct alc_spec *spec = codec->spec;
2134 mutex_lock(&codec->control_mutex);
2135 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
2137 err = snd_hda_mixer_amp_volume_info(kcontrol, uinfo);
2138 mutex_unlock(&codec->control_mutex);
2142 static int alc_cap_vol_tlv(struct snd_kcontrol *kcontrol, int op_flag,
2143 unsigned int size, unsigned int __user *tlv)
2145 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2146 struct alc_spec *spec = codec->spec;
2149 mutex_lock(&codec->control_mutex);
2150 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[0], 3, 0,
2152 err = snd_hda_mixer_amp_tlv(kcontrol, op_flag, size, tlv);
2153 mutex_unlock(&codec->control_mutex);
2157 typedef int (*getput_call_t)(struct snd_kcontrol *kcontrol,
2158 struct snd_ctl_elem_value *ucontrol);
2160 static int alc_cap_getput_caller(struct snd_kcontrol *kcontrol,
2161 struct snd_ctl_elem_value *ucontrol,
2164 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2165 struct alc_spec *spec = codec->spec;
2166 unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
2169 mutex_lock(&codec->control_mutex);
2170 kcontrol->private_value = HDA_COMPOSE_AMP_VAL(spec->adc_nids[adc_idx],
2172 err = func(kcontrol, ucontrol);
2173 mutex_unlock(&codec->control_mutex);
2177 static int alc_cap_vol_get(struct snd_kcontrol *kcontrol,
2178 struct snd_ctl_elem_value *ucontrol)
2180 return alc_cap_getput_caller(kcontrol, ucontrol,
2181 snd_hda_mixer_amp_volume_get);
2184 static int alc_cap_vol_put(struct snd_kcontrol *kcontrol,
2185 struct snd_ctl_elem_value *ucontrol)
2187 return alc_cap_getput_caller(kcontrol, ucontrol,
2188 snd_hda_mixer_amp_volume_put);
2191 /* capture mixer elements */
2192 #define alc_cap_sw_info snd_ctl_boolean_stereo_info
2194 static int alc_cap_sw_get(struct snd_kcontrol *kcontrol,
2195 struct snd_ctl_elem_value *ucontrol)
2197 return alc_cap_getput_caller(kcontrol, ucontrol,
2198 snd_hda_mixer_amp_switch_get);
2201 static int alc_cap_sw_put(struct snd_kcontrol *kcontrol,
2202 struct snd_ctl_elem_value *ucontrol)
2204 return alc_cap_getput_caller(kcontrol, ucontrol,
2205 snd_hda_mixer_amp_switch_put);
2208 #define _DEFINE_CAPMIX(num) \
2210 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2211 .name = "Capture Switch", \
2212 .access = SNDRV_CTL_ELEM_ACCESS_READWRITE, \
2214 .info = alc_cap_sw_info, \
2215 .get = alc_cap_sw_get, \
2216 .put = alc_cap_sw_put, \
2219 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2220 .name = "Capture Volume", \
2221 .access = (SNDRV_CTL_ELEM_ACCESS_READWRITE | \
2222 SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
2223 SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK), \
2225 .info = alc_cap_vol_info, \
2226 .get = alc_cap_vol_get, \
2227 .put = alc_cap_vol_put, \
2228 .tlv = { .c = alc_cap_vol_tlv }, \
2231 #define _DEFINE_CAPSRC(num) \
2233 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
2234 /* .name = "Capture Source", */ \
2235 .name = "Input Source", \
2237 .info = alc_mux_enum_info, \
2238 .get = alc_mux_enum_get, \
2239 .put = alc_mux_enum_put, \
2242 #define DEFINE_CAPMIX(num) \
2243 static struct snd_kcontrol_new alc_capture_mixer ## num[] = { \
2244 _DEFINE_CAPMIX(num), \
2245 _DEFINE_CAPSRC(num), \
2249 #define DEFINE_CAPMIX_NOSRC(num) \
2250 static struct snd_kcontrol_new alc_capture_mixer_nosrc ## num[] = { \
2251 _DEFINE_CAPMIX(num), \
2255 /* up to three ADCs */
2259 DEFINE_CAPMIX_NOSRC(1);
2260 DEFINE_CAPMIX_NOSRC(2);
2261 DEFINE_CAPMIX_NOSRC(3);
2264 * ALC880 5-stack model
2266 * DAC: Front = 0x02 (0x0c), Surr = 0x05 (0x0f), CLFE = 0x04 (0x0d),
2268 * Pin assignment: Front = 0x14, Surr = 0x17, CLFE = 0x16
2269 * Line-In/Side = 0x1a, Mic = 0x18, F-Mic = 0x1b, HP = 0x19
2272 /* additional mixers to alc880_three_stack_mixer */
2273 static struct snd_kcontrol_new alc880_five_stack_mixer[] = {
2274 HDA_CODEC_VOLUME("Side Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2275 HDA_BIND_MUTE("Side Playback Switch", 0x0d, 2, HDA_INPUT),
2279 /* channel source setting (6/8 channel selection for 5-stack) */
2281 static struct hda_verb alc880_fivestack_ch6_init[] = {
2282 /* set line-in to input, mute it */
2283 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
2284 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
2289 static struct hda_verb alc880_fivestack_ch8_init[] = {
2290 /* set line-in to output, unmute it */
2291 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
2292 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
2296 static struct hda_channel_mode alc880_fivestack_modes[2] = {
2297 { 6, alc880_fivestack_ch6_init },
2298 { 8, alc880_fivestack_ch8_init },
2303 * ALC880 6-stack model
2305 * DAC: Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e),
2306 * Side = 0x05 (0x0f)
2307 * Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, Side = 0x17,
2308 * Mic = 0x18, F-Mic = 0x19, Line = 0x1a, HP = 0x1b
2311 static hda_nid_t alc880_6st_dac_nids[4] = {
2312 /* front, rear, clfe, rear_surr */
2313 0x02, 0x03, 0x04, 0x05
2316 static struct hda_input_mux alc880_6stack_capture_source = {
2320 { "Front Mic", 0x1 },
2326 /* fixed 8-channels */
2327 static struct hda_channel_mode alc880_sixstack_modes[1] = {
2331 static struct snd_kcontrol_new alc880_six_stack_mixer[] = {
2332 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2333 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2334 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2335 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2336 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2337 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2338 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2339 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2340 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
2341 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
2342 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2343 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2344 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2345 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2346 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2347 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2348 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2349 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2351 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2352 .name = "Channel Mode",
2353 .info = alc_ch_mode_info,
2354 .get = alc_ch_mode_get,
2355 .put = alc_ch_mode_put,
2364 * W810 has rear IO for:
2367 * Center/LFE (DAC 04)
2370 * The system also has a pair of internal speakers, and a headphone jack.
2371 * These are both connected to Line2 on the codec, hence to DAC 02.
2373 * There is a variable resistor to control the speaker or headphone
2374 * volume. This is a hardware-only device without a software API.
2376 * Plugging headphones in will disable the internal speakers. This is
2377 * implemented in hardware, not via the driver using jack sense. In
2378 * a similar fashion, plugging into the rear socket marked "front" will
2379 * disable both the speakers and headphones.
2381 * For input, there's a microphone jack, and an "audio in" jack.
2382 * These may not do anything useful with this driver yet, because I
2383 * haven't setup any initialization verbs for these yet...
2386 static hda_nid_t alc880_w810_dac_nids[3] = {
2387 /* front, rear/surround, clfe */
2391 /* fixed 6 channels */
2392 static struct hda_channel_mode alc880_w810_modes[1] = {
2396 /* Pin assignment: Front = 0x14, Surr = 0x15, CLFE = 0x16, HP = 0x1b */
2397 static struct snd_kcontrol_new alc880_w810_base_mixer[] = {
2398 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2399 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2400 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2401 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2402 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2403 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2404 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2405 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2406 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2414 * DAC: Front = 0x02 (0x0c), HP = 0x03 (0x0d)
2415 * Pin assignment: Front = 0x14, HP = 0x15, Mic = 0x18, Mic2 = 0x19(?),
2419 static hda_nid_t alc880_z71v_dac_nids[1] = {
2422 #define ALC880_Z71V_HP_DAC 0x03
2424 /* fixed 2 channels */
2425 static struct hda_channel_mode alc880_2_jack_modes[1] = {
2429 static struct snd_kcontrol_new alc880_z71v_mixer[] = {
2430 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2431 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2432 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2433 HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
2434 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2435 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2436 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2437 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2443 * ALC880 F1734 model
2445 * DAC: HP = 0x02 (0x0c), Front = 0x03 (0x0d)
2446 * Pin assignment: HP = 0x14, Front = 0x15, Mic = 0x18
2449 static hda_nid_t alc880_f1734_dac_nids[1] = {
2452 #define ALC880_F1734_HP_DAC 0x02
2454 static struct snd_kcontrol_new alc880_f1734_mixer[] = {
2455 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2456 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2457 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2458 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2459 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2460 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2461 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2462 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2466 static struct hda_input_mux alc880_f1734_capture_source = {
2478 * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2479 * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2480 * Mic = 0x18, Line = 0x1a
2483 #define alc880_asus_dac_nids alc880_w810_dac_nids /* identical with w810 */
2484 #define alc880_asus_modes alc880_threestack_modes /* 2/6 channel mode */
2486 static struct snd_kcontrol_new alc880_asus_mixer[] = {
2487 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2488 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
2489 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2490 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
2491 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2492 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2493 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2494 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2495 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2496 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2497 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2498 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2499 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2500 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2502 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2503 .name = "Channel Mode",
2504 .info = alc_ch_mode_info,
2505 .get = alc_ch_mode_get,
2506 .put = alc_ch_mode_put,
2512 * ALC880 ASUS W1V model
2514 * DAC: HP/Front = 0x02 (0x0c), Surr = 0x03 (0x0d), CLFE = 0x04 (0x0e)
2515 * Pin assignment: HP/Front = 0x14, Surr = 0x15, CLFE = 0x16,
2516 * Mic = 0x18, Line = 0x1a, Line2 = 0x1b
2519 /* additional mixers to alc880_asus_mixer */
2520 static struct snd_kcontrol_new alc880_asus_w1v_mixer[] = {
2521 HDA_CODEC_VOLUME("Line2 Playback Volume", 0x0b, 0x03, HDA_INPUT),
2522 HDA_CODEC_MUTE("Line2 Playback Switch", 0x0b, 0x03, HDA_INPUT),
2527 static struct snd_kcontrol_new alc880_tcl_s700_mixer[] = {
2528 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2529 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
2530 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
2531 HDA_CODEC_VOLUME("CD Playback Volume", 0x0B, 0x04, HDA_INPUT),
2532 HDA_CODEC_MUTE("CD Playback Switch", 0x0B, 0x04, HDA_INPUT),
2533 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0B, 0x0, HDA_INPUT),
2534 HDA_CODEC_MUTE("Mic Playback Switch", 0x0B, 0x0, HDA_INPUT),
2535 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
2536 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
2541 static struct snd_kcontrol_new alc880_uniwill_mixer[] = {
2542 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2543 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2544 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2545 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2546 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
2547 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
2548 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
2549 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
2550 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2551 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2552 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
2553 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
2554 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2555 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2556 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2557 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2559 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2560 .name = "Channel Mode",
2561 .info = alc_ch_mode_info,
2562 .get = alc_ch_mode_get,
2563 .put = alc_ch_mode_put,
2568 static struct snd_kcontrol_new alc880_fujitsu_mixer[] = {
2569 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2570 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2571 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2572 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2573 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
2574 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
2575 HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2576 HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2577 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
2578 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
2582 static struct snd_kcontrol_new alc880_uniwill_p53_mixer[] = {
2583 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
2584 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
2585 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
2586 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
2587 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
2588 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
2593 * virtual master controls
2597 * slave controls for virtual master
2599 static const char *alc_slave_vols[] = {
2600 "Front Playback Volume",
2601 "Surround Playback Volume",
2602 "Center Playback Volume",
2603 "LFE Playback Volume",
2604 "Side Playback Volume",
2605 "Headphone Playback Volume",
2606 "Speaker Playback Volume",
2607 "Mono Playback Volume",
2608 "Line-Out Playback Volume",
2609 "PCM Playback Volume",
2613 static const char *alc_slave_sws[] = {
2614 "Front Playback Switch",
2615 "Surround Playback Switch",
2616 "Center Playback Switch",
2617 "LFE Playback Switch",
2618 "Side Playback Switch",
2619 "Headphone Playback Switch",
2620 "Speaker Playback Switch",
2621 "Mono Playback Switch",
2622 "IEC958 Playback Switch",
2623 "Line-Out Playback Switch",
2624 "PCM Playback Switch",
2629 * build control elements
2632 #define NID_MAPPING (-1)
2634 #define SUBDEV_SPEAKER_ (0 << 6)
2635 #define SUBDEV_HP_ (1 << 6)
2636 #define SUBDEV_LINE_ (2 << 6)
2637 #define SUBDEV_SPEAKER(x) (SUBDEV_SPEAKER_ | ((x) & 0x3f))
2638 #define SUBDEV_HP(x) (SUBDEV_HP_ | ((x) & 0x3f))
2639 #define SUBDEV_LINE(x) (SUBDEV_LINE_ | ((x) & 0x3f))
2641 static void alc_free_kctls(struct hda_codec *codec);
2643 #ifdef CONFIG_SND_HDA_INPUT_BEEP
2644 /* additional beep mixers; the actual parameters are overwritten at build */
2645 static struct snd_kcontrol_new alc_beep_mixer[] = {
2646 HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
2647 HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
2652 static int alc_build_controls(struct hda_codec *codec)
2654 struct alc_spec *spec = codec->spec;
2655 struct snd_kcontrol *kctl = NULL;
2656 struct snd_kcontrol_new *knew;
2661 for (i = 0; i < spec->num_mixers; i++) {
2662 err = snd_hda_add_new_ctls(codec, spec->mixers[i]);
2666 if (spec->cap_mixer) {
2667 err = snd_hda_add_new_ctls(codec, spec->cap_mixer);
2671 if (spec->multiout.dig_out_nid) {
2672 err = snd_hda_create_spdif_out_ctls(codec,
2673 spec->multiout.dig_out_nid);
2676 if (!spec->no_analog) {
2677 err = snd_hda_create_spdif_share_sw(codec,
2681 spec->multiout.share_spdif = 1;
2684 if (spec->dig_in_nid) {
2685 err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
2690 #ifdef CONFIG_SND_HDA_INPUT_BEEP
2691 /* create beep controls if needed */
2692 if (spec->beep_amp) {
2693 struct snd_kcontrol_new *knew;
2694 for (knew = alc_beep_mixer; knew->name; knew++) {
2695 struct snd_kcontrol *kctl;
2696 kctl = snd_ctl_new1(knew, codec);
2699 kctl->private_value = spec->beep_amp;
2700 err = snd_hda_ctl_add(codec, 0, kctl);
2707 /* if we have no master control, let's create it */
2708 if (!spec->no_analog &&
2709 !snd_hda_find_mixer_ctl(codec, "Master Playback Volume")) {
2710 unsigned int vmaster_tlv[4];
2711 snd_hda_set_vmaster_tlv(codec, spec->vmaster_nid,
2712 HDA_OUTPUT, vmaster_tlv);
2713 err = snd_hda_add_vmaster(codec, "Master Playback Volume",
2714 vmaster_tlv, alc_slave_vols);
2718 if (!spec->no_analog &&
2719 !snd_hda_find_mixer_ctl(codec, "Master Playback Switch")) {
2720 err = snd_hda_add_vmaster(codec, "Master Playback Switch",
2721 NULL, alc_slave_sws);
2726 /* assign Capture Source enums to NID */
2727 if (spec->capsrc_nids || spec->adc_nids) {
2728 kctl = snd_hda_find_mixer_ctl(codec, "Capture Source");
2730 kctl = snd_hda_find_mixer_ctl(codec, "Input Source");
2731 for (i = 0; kctl && i < kctl->count; i++) {
2732 hda_nid_t *nids = spec->capsrc_nids;
2734 nids = spec->adc_nids;
2735 err = snd_hda_add_nid(codec, kctl, i, nids[i]);
2740 if (spec->cap_mixer) {
2741 const char *kname = kctl ? kctl->id.name : NULL;
2742 for (knew = spec->cap_mixer; knew->name; knew++) {
2743 if (kname && strcmp(knew->name, kname) == 0)
2745 kctl = snd_hda_find_mixer_ctl(codec, knew->name);
2746 for (i = 0; kctl && i < kctl->count; i++) {
2747 err = snd_hda_add_nid(codec, kctl, i,
2755 /* other nid->control mapping */
2756 for (i = 0; i < spec->num_mixers; i++) {
2757 for (knew = spec->mixers[i]; knew->name; knew++) {
2758 if (knew->iface != NID_MAPPING)
2760 kctl = snd_hda_find_mixer_ctl(codec, knew->name);
2763 u = knew->subdevice;
2764 for (j = 0; j < 4; j++, u >>= 8) {
2769 case SUBDEV_SPEAKER_:
2770 nid = spec->autocfg.speaker_pins[nid];
2773 nid = spec->autocfg.line_out_pins[nid];
2776 nid = spec->autocfg.hp_pins[nid];
2781 err = snd_hda_add_nid(codec, kctl, 0, nid);
2785 u = knew->private_value;
2786 for (j = 0; j < 4; j++, u >>= 8) {
2790 err = snd_hda_add_nid(codec, kctl, 0, nid);
2797 alc_free_kctls(codec); /* no longer needed */
2804 * initialize the codec volumes, etc
2808 * generic initialization of ADC, input mixers and output mixers
2810 static struct hda_verb alc880_volume_init_verbs[] = {
2812 * Unmute ADC0-2 and set the default input to mic-in
2814 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
2815 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2816 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
2817 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2818 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
2819 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2821 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
2823 * Note: PASD motherboards uses the Line In 2 as the input for front
2826 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
2827 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2828 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2829 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
2830 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
2831 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
2832 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
2833 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
2836 * Set up output mixers (0x0c - 0x0f)
2838 /* set vol=0 to output mixers */
2839 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2840 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2841 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2842 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
2843 /* set up input amps for analog loopback */
2844 /* Amp Indices: DAC = 0, mixer = 1 */
2845 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2846 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2847 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2848 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2849 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2850 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2851 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
2852 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2858 * 3-stack pin configuration:
2859 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
2861 static struct hda_verb alc880_pin_3stack_init_verbs[] = {
2863 * preset connection lists of input pins
2864 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2866 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
2867 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2868 {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
2871 * Set pin mode and muting
2873 /* set front pin widgets 0x14 for output */
2874 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2875 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2876 /* Mic1 (rear panel) pin widget for input and vref at 80% */
2877 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2878 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2879 /* Mic2 (as headphone out) for HP output */
2880 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2881 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2882 /* Line In pin widget for input */
2883 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2884 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2885 /* Line2 (as front mic) pin widget for input and vref at 80% */
2886 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2887 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2888 /* CD pin widget for input */
2889 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2895 * 5-stack pin configuration:
2896 * front = 0x14, surround = 0x17, clfe = 0x16, mic = 0x18, HP = 0x19,
2897 * line-in/side = 0x1a, f-mic = 0x1b
2899 static struct hda_verb alc880_pin_5stack_init_verbs[] = {
2901 * preset connection lists of input pins
2902 * 0 = front, 1 = rear_surr, 2 = CLFE, 3 = surround
2904 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2905 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/side */
2908 * Set pin mode and muting
2910 /* set pin widgets 0x14-0x17 for output */
2911 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2912 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2913 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2914 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2915 /* unmute pins for output (no gain on this amp) */
2916 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2917 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2918 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2919 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2921 /* Mic1 (rear panel) pin widget for input and vref at 80% */
2922 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2923 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2924 /* Mic2 (as headphone out) for HP output */
2925 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2926 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2927 /* Line In pin widget for input */
2928 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2929 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2930 /* Line2 (as front mic) pin widget for input and vref at 80% */
2931 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2932 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2933 /* CD pin widget for input */
2934 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2940 * W810 pin configuration:
2941 * front = 0x14, surround = 0x15, clfe = 0x16, HP = 0x1b
2943 static struct hda_verb alc880_pin_w810_init_verbs[] = {
2944 /* hphone/speaker input selector: front DAC */
2945 {0x13, AC_VERB_SET_CONNECT_SEL, 0x0},
2947 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2948 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2949 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2950 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2951 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2952 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2954 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2955 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2961 * Z71V pin configuration:
2962 * Speaker-out = 0x14, HP = 0x15, Mic = 0x18, Line-in = 0x1a, Mic2 = 0x1b (?)
2964 static struct hda_verb alc880_pin_z71v_init_verbs[] = {
2965 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2966 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2967 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
2968 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2970 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2971 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2972 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2973 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
2979 * 6-stack pin configuration:
2980 * front = 0x14, surr = 0x15, clfe = 0x16, side = 0x17, mic = 0x18,
2981 * f-mic = 0x19, line = 0x1a, HP = 0x1b
2983 static struct hda_verb alc880_pin_6stack_init_verbs[] = {
2984 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
2986 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2987 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2988 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2989 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2990 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2991 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2992 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
2993 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
2995 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2996 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2997 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
2998 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
2999 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3000 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3001 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3002 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3003 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3009 * Uniwill pin configuration:
3010 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x18, internal mic = 0x19,
3013 static struct hda_verb alc880_uniwill_init_verbs[] = {
3014 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3016 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3017 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3018 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3019 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3020 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3021 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3022 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3023 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3024 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3025 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
3026 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3027 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
3028 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3029 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
3031 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3032 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3033 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3034 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3035 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3036 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3037 /* {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, */
3038 /* {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
3039 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3041 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3042 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
3049 * HP = 0x14, InternalSpeaker = 0x15, mic = 0x19,
3051 static struct hda_verb alc880_uniwill_p53_init_verbs[] = {
3052 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3054 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3055 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3056 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3057 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3058 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3059 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3060 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3061 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
3062 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3063 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
3064 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
3065 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
3067 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3068 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3069 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3070 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3071 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3072 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3074 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3075 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_DCVOL_EVENT},
3080 static struct hda_verb alc880_beep_init_verbs[] = {
3081 { 0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5) },
3085 /* auto-toggle front mic */
3086 static void alc880_uniwill_mic_automute(struct hda_codec *codec)
3088 unsigned int present;
3091 present = snd_hda_jack_detect(codec, 0x18);
3092 bits = present ? HDA_AMP_MUTE : 0;
3093 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
3096 static void alc880_uniwill_setup(struct hda_codec *codec)
3098 struct alc_spec *spec = codec->spec;
3100 spec->autocfg.hp_pins[0] = 0x14;
3101 spec->autocfg.speaker_pins[0] = 0x15;
3102 spec->autocfg.speaker_pins[0] = 0x16;
3105 static void alc880_uniwill_init_hook(struct hda_codec *codec)
3107 alc_automute_amp(codec);
3108 alc880_uniwill_mic_automute(codec);
3111 static void alc880_uniwill_unsol_event(struct hda_codec *codec,
3114 /* Looks like the unsol event is incompatible with the standard
3115 * definition. 4bit tag is placed at 28 bit!
3117 switch (res >> 28) {
3118 case ALC880_MIC_EVENT:
3119 alc880_uniwill_mic_automute(codec);
3122 alc_automute_amp_unsol_event(codec, res);
3127 static void alc880_uniwill_p53_setup(struct hda_codec *codec)
3129 struct alc_spec *spec = codec->spec;
3131 spec->autocfg.hp_pins[0] = 0x14;
3132 spec->autocfg.speaker_pins[0] = 0x15;
3135 static void alc880_uniwill_p53_dcvol_automute(struct hda_codec *codec)
3137 unsigned int present;
3139 present = snd_hda_codec_read(codec, 0x21, 0,
3140 AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
3141 present &= HDA_AMP_VOLMASK;
3142 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_OUTPUT, 0,
3143 HDA_AMP_VOLMASK, present);
3144 snd_hda_codec_amp_stereo(codec, 0x0d, HDA_OUTPUT, 0,
3145 HDA_AMP_VOLMASK, present);
3148 static void alc880_uniwill_p53_unsol_event(struct hda_codec *codec,
3151 /* Looks like the unsol event is incompatible with the standard
3152 * definition. 4bit tag is placed at 28 bit!
3154 if ((res >> 28) == ALC880_DCVOL_EVENT)
3155 alc880_uniwill_p53_dcvol_automute(codec);
3157 alc_automute_amp_unsol_event(codec, res);
3161 * F1734 pin configuration:
3162 * HP = 0x14, speaker-out = 0x15, mic = 0x18
3164 static struct hda_verb alc880_pin_f1734_init_verbs[] = {
3165 {0x07, AC_VERB_SET_CONNECT_SEL, 0x01},
3166 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
3167 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
3168 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
3169 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
3171 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3172 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3173 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3174 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3176 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3177 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3178 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
3179 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3180 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3181 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3182 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3183 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3184 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3186 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
3187 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_DCVOL_EVENT},
3193 * ASUS pin configuration:
3194 * HP/front = 0x14, surr = 0x15, clfe = 0x16, mic = 0x18, line = 0x1a
3196 static struct hda_verb alc880_pin_asus_init_verbs[] = {
3197 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02},
3198 {0x11, AC_VERB_SET_CONNECT_SEL, 0x00},
3199 {0x12, AC_VERB_SET_CONNECT_SEL, 0x01},
3200 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00},
3202 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3203 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3204 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3205 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3206 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3207 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3208 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3209 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3211 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3212 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3213 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3214 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3215 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3216 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3217 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3218 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3219 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3224 /* Enable GPIO mask and set output */
3225 #define alc880_gpio1_init_verbs alc_gpio1_init_verbs
3226 #define alc880_gpio2_init_verbs alc_gpio2_init_verbs
3227 #define alc880_gpio3_init_verbs alc_gpio3_init_verbs
3229 /* Clevo m520g init */
3230 static struct hda_verb alc880_pin_clevo_init_verbs[] = {
3231 /* headphone output */
3232 {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3234 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3235 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3237 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3238 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3240 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3241 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3242 /* Mic1 (rear panel) */
3243 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3244 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3245 /* Mic2 (front panel) */
3246 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3247 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3249 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3250 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3251 /* change to EAPD mode */
3252 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3253 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
3258 static struct hda_verb alc880_pin_tcl_S700_init_verbs[] = {
3259 /* change to EAPD mode */
3260 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3261 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
3263 /* Headphone output */
3264 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3266 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3267 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
3269 /* Line In pin widget for input */
3270 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3271 /* CD pin widget for input */
3272 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3273 /* Mic1 (rear panel) pin widget for input and vref at 80% */
3274 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3276 /* change to EAPD mode */
3277 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3278 {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
3284 * LG m1 express dual
3287 * Rear Line-In/Out (blue): 0x14
3288 * Build-in Mic-In: 0x15
3290 * HP-Out (green): 0x1b
3291 * Mic-In/Out (red): 0x19
3295 /* To make 5.1 output working (green=Front, blue=Surr, red=CLFE) */
3296 static hda_nid_t alc880_lg_dac_nids[3] = {
3300 /* seems analog CD is not working */
3301 static struct hda_input_mux alc880_lg_capture_source = {
3306 { "Internal Mic", 0x6 },
3310 /* 2,4,6 channel modes */
3311 static struct hda_verb alc880_lg_ch2_init[] = {
3312 /* set line-in and mic-in to input */
3313 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
3314 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3318 static struct hda_verb alc880_lg_ch4_init[] = {
3319 /* set line-in to out and mic-in to input */
3320 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3321 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
3325 static struct hda_verb alc880_lg_ch6_init[] = {
3326 /* set line-in and mic-in to output */
3327 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3328 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
3332 static struct hda_channel_mode alc880_lg_ch_modes[3] = {
3333 { 2, alc880_lg_ch2_init },
3334 { 4, alc880_lg_ch4_init },
3335 { 6, alc880_lg_ch6_init },
3338 static struct snd_kcontrol_new alc880_lg_mixer[] = {
3339 HDA_CODEC_VOLUME("Front Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3340 HDA_BIND_MUTE("Front Playback Switch", 0x0f, 2, HDA_INPUT),
3341 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3342 HDA_BIND_MUTE("Surround Playback Switch", 0x0c, 2, HDA_INPUT),
3343 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0d, 1, 0x0, HDA_OUTPUT),
3344 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
3345 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
3346 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
3347 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3348 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
3349 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x06, HDA_INPUT),
3350 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x06, HDA_INPUT),
3351 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x07, HDA_INPUT),
3352 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x07, HDA_INPUT),
3354 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3355 .name = "Channel Mode",
3356 .info = alc_ch_mode_info,
3357 .get = alc_ch_mode_get,
3358 .put = alc_ch_mode_put,
3363 static struct hda_verb alc880_lg_init_verbs[] = {
3364 /* set capture source to mic-in */
3365 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3366 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3367 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
3368 /* mute all amp mixer inputs */
3369 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(5)},
3370 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
3371 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3372 /* line-in to input */
3373 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
3374 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3376 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3377 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3379 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3380 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3381 /* mic-in to input */
3382 {0x11, AC_VERB_SET_CONNECT_SEL, 0x01},
3383 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3384 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3386 {0x13, AC_VERB_SET_CONNECT_SEL, 0x03},
3387 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3388 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3390 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3394 /* toggle speaker-output according to the hp-jack state */
3395 static void alc880_lg_setup(struct hda_codec *codec)
3397 struct alc_spec *spec = codec->spec;
3399 spec->autocfg.hp_pins[0] = 0x1b;
3400 spec->autocfg.speaker_pins[0] = 0x17;
3409 * Built-in Mic-In: 0x19
3415 static struct hda_input_mux alc880_lg_lw_capture_source = {
3419 { "Internal Mic", 0x1 },
3424 #define alc880_lg_lw_modes alc880_threestack_modes
3426 static struct snd_kcontrol_new alc880_lg_lw_mixer[] = {
3427 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3428 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
3429 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
3430 HDA_BIND_MUTE("Surround Playback Switch", 0x0f, 2, HDA_INPUT),
3431 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
3432 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
3433 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
3434 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
3435 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
3436 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
3437 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3438 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3439 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
3440 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
3442 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3443 .name = "Channel Mode",
3444 .info = alc_ch_mode_info,
3445 .get = alc_ch_mode_get,
3446 .put = alc_ch_mode_put,
3451 static struct hda_verb alc880_lg_lw_init_verbs[] = {
3452 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3453 {0x10, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
3454 {0x12, AC_VERB_SET_CONNECT_SEL, 0x03}, /* line/surround */
3456 /* set capture source to mic-in */
3457 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3458 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3459 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3460 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
3462 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3463 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3465 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3466 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3467 /* mic-in to input */
3468 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3469 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3471 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3472 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3474 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3478 /* toggle speaker-output according to the hp-jack state */
3479 static void alc880_lg_lw_setup(struct hda_codec *codec)
3481 struct alc_spec *spec = codec->spec;
3483 spec->autocfg.hp_pins[0] = 0x1b;
3484 spec->autocfg.speaker_pins[0] = 0x14;
3487 static struct snd_kcontrol_new alc880_medion_rim_mixer[] = {
3488 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
3489 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
3490 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
3491 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
3492 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
3493 HDA_CODEC_MUTE("Internal Playback Switch", 0x0b, 0x1, HDA_INPUT),
3497 static struct hda_input_mux alc880_medion_rim_capture_source = {
3501 { "Internal Mic", 0x1 },
3505 static struct hda_verb alc880_medion_rim_init_verbs[] = {
3506 {0x13, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
3508 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3509 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3511 /* Mic1 (rear panel) pin widget for input and vref at 80% */
3512 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
3513 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3514 /* Mic2 (as headphone out) for HP output */
3515 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
3516 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
3517 /* Internal Speaker */
3518 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
3519 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
3521 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
3522 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
3524 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
3528 /* toggle speaker-output according to the hp-jack state */
3529 static void alc880_medion_rim_automute(struct hda_codec *codec)
3531 struct alc_spec *spec = codec->spec;
3532 alc_automute_amp(codec);
3534 if (spec->jack_present)
3535 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 0);
3537 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, 2);
3540 static void alc880_medion_rim_unsol_event(struct hda_codec *codec,
3543 /* Looks like the unsol event is incompatible with the standard
3544 * definition. 4bit tag is placed at 28 bit!
3546 if ((res >> 28) == ALC880_HP_EVENT)
3547 alc880_medion_rim_automute(codec);
3550 static void alc880_medion_rim_setup(struct hda_codec *codec)
3552 struct alc_spec *spec = codec->spec;
3554 spec->autocfg.hp_pins[0] = 0x14;
3555 spec->autocfg.speaker_pins[0] = 0x1b;
3558 #ifdef CONFIG_SND_HDA_POWER_SAVE
3559 static struct hda_amp_list alc880_loopbacks[] = {
3560 { 0x0b, HDA_INPUT, 0 },
3561 { 0x0b, HDA_INPUT, 1 },
3562 { 0x0b, HDA_INPUT, 2 },
3563 { 0x0b, HDA_INPUT, 3 },
3564 { 0x0b, HDA_INPUT, 4 },
3568 static struct hda_amp_list alc880_lg_loopbacks[] = {
3569 { 0x0b, HDA_INPUT, 1 },
3570 { 0x0b, HDA_INPUT, 6 },
3571 { 0x0b, HDA_INPUT, 7 },
3580 static int alc_init(struct hda_codec *codec)
3582 struct alc_spec *spec = codec->spec;
3586 alc_auto_init_amp(codec, spec->init_amp);
3588 for (i = 0; i < spec->num_init_verbs; i++)
3589 snd_hda_sequence_write(codec, spec->init_verbs[i]);
3591 if (spec->init_hook)
3592 spec->init_hook(codec);
3594 #ifdef CONFIG_SND_HDA_POWER_SAVE
3595 if (codec->patch_ops.check_power_status)
3596 codec->patch_ops.check_power_status(codec, 0x01);
3601 static void alc_unsol_event(struct hda_codec *codec, unsigned int res)
3603 struct alc_spec *spec = codec->spec;
3605 if (spec->unsol_event)
3606 spec->unsol_event(codec, res);
3609 #ifdef CONFIG_SND_HDA_POWER_SAVE
3610 static int alc_check_power_status(struct hda_codec *codec, hda_nid_t nid)
3612 struct alc_spec *spec = codec->spec;
3613 return snd_hda_check_amp_list_power(codec, &spec->loopback, nid);
3618 * Analog playback callbacks
3620 static int alc880_playback_pcm_open(struct hda_pcm_stream *hinfo,
3621 struct hda_codec *codec,
3622 struct snd_pcm_substream *substream)
3624 struct alc_spec *spec = codec->spec;
3625 return snd_hda_multi_out_analog_open(codec, &spec->multiout, substream,
3629 static int alc880_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3630 struct hda_codec *codec,
3631 unsigned int stream_tag,
3632 unsigned int format,
3633 struct snd_pcm_substream *substream)
3635 struct alc_spec *spec = codec->spec;
3636 return snd_hda_multi_out_analog_prepare(codec, &spec->multiout,
3637 stream_tag, format, substream);
3640 static int alc880_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3641 struct hda_codec *codec,
3642 struct snd_pcm_substream *substream)
3644 struct alc_spec *spec = codec->spec;
3645 return snd_hda_multi_out_analog_cleanup(codec, &spec->multiout);
3651 static int alc880_dig_playback_pcm_open(struct hda_pcm_stream *hinfo,
3652 struct hda_codec *codec,
3653 struct snd_pcm_substream *substream)
3655 struct alc_spec *spec = codec->spec;
3656 return snd_hda_multi_out_dig_open(codec, &spec->multiout);
3659 static int alc880_dig_playback_pcm_prepare(struct hda_pcm_stream *hinfo,
3660 struct hda_codec *codec,
3661 unsigned int stream_tag,
3662 unsigned int format,
3663 struct snd_pcm_substream *substream)
3665 struct alc_spec *spec = codec->spec;
3666 return snd_hda_multi_out_dig_prepare(codec, &spec->multiout,
3667 stream_tag, format, substream);
3670 static int alc880_dig_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
3671 struct hda_codec *codec,
3672 struct snd_pcm_substream *substream)
3674 struct alc_spec *spec = codec->spec;
3675 return snd_hda_multi_out_dig_cleanup(codec, &spec->multiout);
3678 static int alc880_dig_playback_pcm_close(struct hda_pcm_stream *hinfo,
3679 struct hda_codec *codec,
3680 struct snd_pcm_substream *substream)
3682 struct alc_spec *spec = codec->spec;
3683 return snd_hda_multi_out_dig_close(codec, &spec->multiout);
3689 static int alc880_alt_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3690 struct hda_codec *codec,
3691 unsigned int stream_tag,
3692 unsigned int format,
3693 struct snd_pcm_substream *substream)
3695 struct alc_spec *spec = codec->spec;
3697 snd_hda_codec_setup_stream(codec, spec->adc_nids[substream->number + 1],
3698 stream_tag, 0, format);
3702 static int alc880_alt_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3703 struct hda_codec *codec,
3704 struct snd_pcm_substream *substream)
3706 struct alc_spec *spec = codec->spec;
3708 snd_hda_codec_cleanup_stream(codec,
3709 spec->adc_nids[substream->number + 1]);
3713 /* analog capture with dynamic dual-adc changes */
3714 static int dualmic_capture_pcm_prepare(struct hda_pcm_stream *hinfo,
3715 struct hda_codec *codec,
3716 unsigned int stream_tag,
3717 unsigned int format,
3718 struct snd_pcm_substream *substream)
3720 struct alc_spec *spec = codec->spec;
3721 spec->cur_adc = spec->adc_nids[spec->cur_adc_idx];
3722 spec->cur_adc_stream_tag = stream_tag;
3723 spec->cur_adc_format = format;
3724 snd_hda_codec_setup_stream(codec, spec->cur_adc, stream_tag, 0, format);
3728 static int dualmic_capture_pcm_cleanup(struct hda_pcm_stream *hinfo,
3729 struct hda_codec *codec,
3730 struct snd_pcm_substream *substream)
3732 struct alc_spec *spec = codec->spec;
3733 snd_hda_codec_cleanup_stream(codec, spec->cur_adc);
3738 static struct hda_pcm_stream dualmic_pcm_analog_capture = {
3742 .nid = 0, /* fill later */
3744 .prepare = dualmic_capture_pcm_prepare,
3745 .cleanup = dualmic_capture_pcm_cleanup
3751 static struct hda_pcm_stream alc880_pcm_analog_playback = {
3755 /* NID is set in alc_build_pcms */
3757 .open = alc880_playback_pcm_open,
3758 .prepare = alc880_playback_pcm_prepare,
3759 .cleanup = alc880_playback_pcm_cleanup
3763 static struct hda_pcm_stream alc880_pcm_analog_capture = {
3767 /* NID is set in alc_build_pcms */
3770 static struct hda_pcm_stream alc880_pcm_analog_alt_playback = {
3774 /* NID is set in alc_build_pcms */
3777 static struct hda_pcm_stream alc880_pcm_analog_alt_capture = {
3778 .substreams = 2, /* can be overridden */
3781 /* NID is set in alc_build_pcms */
3783 .prepare = alc880_alt_capture_pcm_prepare,
3784 .cleanup = alc880_alt_capture_pcm_cleanup
3788 static struct hda_pcm_stream alc880_pcm_digital_playback = {
3792 /* NID is set in alc_build_pcms */
3794 .open = alc880_dig_playback_pcm_open,
3795 .close = alc880_dig_playback_pcm_close,
3796 .prepare = alc880_dig_playback_pcm_prepare,
3797 .cleanup = alc880_dig_playback_pcm_cleanup
3801 static struct hda_pcm_stream alc880_pcm_digital_capture = {
3805 /* NID is set in alc_build_pcms */
3808 /* Used by alc_build_pcms to flag that a PCM has no playback stream */
3809 static struct hda_pcm_stream alc_pcm_null_stream = {
3815 static int alc_build_pcms(struct hda_codec *codec)
3817 struct alc_spec *spec = codec->spec;
3818 struct hda_pcm *info = spec->pcm_rec;
3821 codec->num_pcms = 1;
3822 codec->pcm_info = info;
3824 if (spec->no_analog)
3827 snprintf(spec->stream_name_analog, sizeof(spec->stream_name_analog),
3828 "%s Analog", codec->chip_name);
3829 info->name = spec->stream_name_analog;
3831 if (spec->stream_analog_playback) {
3832 if (snd_BUG_ON(!spec->multiout.dac_nids))
3834 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_analog_playback);
3835 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dac_nids[0];
3837 if (spec->stream_analog_capture) {
3838 if (snd_BUG_ON(!spec->adc_nids))
3840 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_analog_capture);
3841 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
3844 if (spec->channel_mode) {
3845 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = 0;
3846 for (i = 0; i < spec->num_channel_mode; i++) {
3847 if (spec->channel_mode[i].channels > info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max) {
3848 info->stream[SNDRV_PCM_STREAM_PLAYBACK].channels_max = spec->channel_mode[i].channels;
3854 /* SPDIF for stream index #1 */
3855 if (spec->multiout.dig_out_nid || spec->dig_in_nid) {
3856 snprintf(spec->stream_name_digital,
3857 sizeof(spec->stream_name_digital),
3858 "%s Digital", codec->chip_name);
3859 codec->num_pcms = 2;
3860 codec->slave_dig_outs = spec->multiout.slave_dig_outs;
3861 info = spec->pcm_rec + 1;
3862 info->name = spec->stream_name_digital;
3863 if (spec->dig_out_type)
3864 info->pcm_type = spec->dig_out_type;
3866 info->pcm_type = HDA_PCM_TYPE_SPDIF;
3867 if (spec->multiout.dig_out_nid &&
3868 spec->stream_digital_playback) {
3869 info->stream[SNDRV_PCM_STREAM_PLAYBACK] = *(spec->stream_digital_playback);
3870 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = spec->multiout.dig_out_nid;
3872 if (spec->dig_in_nid &&
3873 spec->stream_digital_capture) {
3874 info->stream[SNDRV_PCM_STREAM_CAPTURE] = *(spec->stream_digital_capture);
3875 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->dig_in_nid;
3877 /* FIXME: do we need this for all Realtek codec models? */
3878 codec->spdif_status_reset = 1;
3881 if (spec->no_analog)
3884 /* If the use of more than one ADC is requested for the current
3885 * model, configure a second analog capture-only PCM.
3887 /* Additional Analaog capture for index #2 */
3888 if ((spec->alt_dac_nid && spec->stream_analog_alt_playback) ||
3889 (spec->num_adc_nids > 1 && spec->stream_analog_alt_capture)) {
3890 codec->num_pcms = 3;
3891 info = spec->pcm_rec + 2;
3892 info->name = spec->stream_name_analog;
3893 if (spec->alt_dac_nid) {
3894 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3895 *spec->stream_analog_alt_playback;
3896 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
3899 info->stream[SNDRV_PCM_STREAM_PLAYBACK] =
3900 alc_pcm_null_stream;
3901 info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid = 0;
3903 if (spec->num_adc_nids > 1) {
3904 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3905 *spec->stream_analog_alt_capture;
3906 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid =
3908 info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams =
3909 spec->num_adc_nids - 1;
3911 info->stream[SNDRV_PCM_STREAM_CAPTURE] =
3912 alc_pcm_null_stream;
3913 info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = 0;
3920 static inline void alc_shutup(struct hda_codec *codec)
3922 snd_hda_shutup_pins(codec);
3925 static void alc_free_kctls(struct hda_codec *codec)
3927 struct alc_spec *spec = codec->spec;
3929 if (spec->kctls.list) {
3930 struct snd_kcontrol_new *kctl = spec->kctls.list;
3932 for (i = 0; i < spec->kctls.used; i++)
3933 kfree(kctl[i].name);
3935 snd_array_free(&spec->kctls);
3938 static void alc_free(struct hda_codec *codec)
3940 struct alc_spec *spec = codec->spec;
3946 alc_free_kctls(codec);
3948 snd_hda_detach_beep_device(codec);
3951 #ifdef CONFIG_SND_HDA_POWER_SAVE
3952 static void alc_power_eapd(struct hda_codec *codec)
3954 /* We currently only handle front, HP */
3955 switch (codec->vendor_id) {
3957 set_eapd(codec, 0x0f, 0);
3958 set_eapd(codec, 0x10, 0);
3971 set_eapd(codec, 0x14, 0);
3972 set_eapd(codec, 0x15, 0);
3977 static int alc_suspend(struct hda_codec *codec, pm_message_t state)
3979 struct alc_spec *spec = codec->spec;
3981 if (spec && spec->power_hook)
3982 spec->power_hook(codec);
3987 #ifdef SND_HDA_NEEDS_RESUME
3988 static int alc_resume(struct hda_codec *codec)
3990 codec->patch_ops.init(codec);
3991 snd_hda_codec_resume_amp(codec);
3992 snd_hda_codec_resume_cache(codec);
3993 #ifdef CONFIG_SND_HDA_POWER_SAVE
3994 if (codec->patch_ops.check_power_status)
3995 codec->patch_ops.check_power_status(codec, 0x01);
4003 static struct hda_codec_ops alc_patch_ops = {
4004 .build_controls = alc_build_controls,
4005 .build_pcms = alc_build_pcms,
4008 .unsol_event = alc_unsol_event,
4009 #ifdef SND_HDA_NEEDS_RESUME
4010 .resume = alc_resume,
4012 #ifdef CONFIG_SND_HDA_POWER_SAVE
4013 .suspend = alc_suspend,
4014 .check_power_status = alc_check_power_status,
4016 .reboot_notify = alc_shutup,
4019 /* replace the codec chip_name with the given string */
4020 static int alc_codec_rename(struct hda_codec *codec, const char *name)
4022 kfree(codec->chip_name);
4023 codec->chip_name = kstrdup(name, GFP_KERNEL);
4024 if (!codec->chip_name) {
4032 * Test configuration for debugging
4034 * Almost all inputs/outputs are enabled. I/O pins can be configured via
4037 #ifdef CONFIG_SND_DEBUG
4038 static hda_nid_t alc880_test_dac_nids[4] = {
4039 0x02, 0x03, 0x04, 0x05
4042 static struct hda_input_mux alc880_test_capture_source = {
4051 { "Surround", 0x6 },
4055 static struct hda_channel_mode alc880_test_modes[4] = {
4062 static int alc_test_pin_ctl_info(struct snd_kcontrol *kcontrol,
4063 struct snd_ctl_elem_info *uinfo)
4065 static char *texts[] = {
4066 "N/A", "Line Out", "HP Out",
4067 "In Hi-Z", "In 50%", "In Grd", "In 80%", "In 100%"
4069 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4071 uinfo->value.enumerated.items = 8;
4072 if (uinfo->value.enumerated.item >= 8)
4073 uinfo->value.enumerated.item = 7;
4074 strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
4078 static int alc_test_pin_ctl_get(struct snd_kcontrol *kcontrol,
4079 struct snd_ctl_elem_value *ucontrol)
4081 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4082 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
4083 unsigned int pin_ctl, item = 0;
4085 pin_ctl = snd_hda_codec_read(codec, nid, 0,
4086 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4087 if (pin_ctl & AC_PINCTL_OUT_EN) {
4088 if (pin_ctl & AC_PINCTL_HP_EN)
4092 } else if (pin_ctl & AC_PINCTL_IN_EN) {
4093 switch (pin_ctl & AC_PINCTL_VREFEN) {
4094 case AC_PINCTL_VREF_HIZ: item = 3; break;
4095 case AC_PINCTL_VREF_50: item = 4; break;
4096 case AC_PINCTL_VREF_GRD: item = 5; break;
4097 case AC_PINCTL_VREF_80: item = 6; break;
4098 case AC_PINCTL_VREF_100: item = 7; break;
4101 ucontrol->value.enumerated.item[0] = item;
4105 static int alc_test_pin_ctl_put(struct snd_kcontrol *kcontrol,
4106 struct snd_ctl_elem_value *ucontrol)
4108 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4109 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
4110 static unsigned int ctls[] = {
4111 0, AC_PINCTL_OUT_EN, AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN,
4112 AC_PINCTL_IN_EN | AC_PINCTL_VREF_HIZ,
4113 AC_PINCTL_IN_EN | AC_PINCTL_VREF_50,
4114 AC_PINCTL_IN_EN | AC_PINCTL_VREF_GRD,
4115 AC_PINCTL_IN_EN | AC_PINCTL_VREF_80,
4116 AC_PINCTL_IN_EN | AC_PINCTL_VREF_100,
4118 unsigned int old_ctl, new_ctl;
4120 old_ctl = snd_hda_codec_read(codec, nid, 0,
4121 AC_VERB_GET_PIN_WIDGET_CONTROL, 0);
4122 new_ctl = ctls[ucontrol->value.enumerated.item[0]];
4123 if (old_ctl != new_ctl) {
4125 snd_hda_codec_write_cache(codec, nid, 0,
4126 AC_VERB_SET_PIN_WIDGET_CONTROL,
4128 val = ucontrol->value.enumerated.item[0] >= 3 ?
4130 snd_hda_codec_amp_stereo(codec, nid, HDA_OUTPUT, 0,
4137 static int alc_test_pin_src_info(struct snd_kcontrol *kcontrol,
4138 struct snd_ctl_elem_info *uinfo)
4140 static char *texts[] = {
4141 "Front", "Surround", "CLFE", "Side"
4143 uinfo->type = SNDRV_CTL_ELEM_TYPE_ENUMERATED;
4145 uinfo->value.enumerated.items = 4;
4146 if (uinfo->value.enumerated.item >= 4)
4147 uinfo->value.enumerated.item = 3;
4148 strcpy(uinfo->value.enumerated.name, texts[uinfo->value.enumerated.item]);
4152 static int alc_test_pin_src_get(struct snd_kcontrol *kcontrol,
4153 struct snd_ctl_elem_value *ucontrol)
4155 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4156 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
4159 sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0);
4160 ucontrol->value.enumerated.item[0] = sel & 3;
4164 static int alc_test_pin_src_put(struct snd_kcontrol *kcontrol,
4165 struct snd_ctl_elem_value *ucontrol)
4167 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
4168 hda_nid_t nid = (hda_nid_t)kcontrol->private_value;
4171 sel = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_CONNECT_SEL, 0) & 3;
4172 if (ucontrol->value.enumerated.item[0] != sel) {
4173 sel = ucontrol->value.enumerated.item[0] & 3;
4174 snd_hda_codec_write_cache(codec, nid, 0,
4175 AC_VERB_SET_CONNECT_SEL, sel);
4181 #define PIN_CTL_TEST(xname,nid) { \
4182 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4184 .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
4185 .info = alc_test_pin_ctl_info, \
4186 .get = alc_test_pin_ctl_get, \
4187 .put = alc_test_pin_ctl_put, \
4188 .private_value = nid \
4191 #define PIN_SRC_TEST(xname,nid) { \
4192 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
4194 .subdevice = HDA_SUBDEV_NID_FLAG | nid, \
4195 .info = alc_test_pin_src_info, \
4196 .get = alc_test_pin_src_get, \
4197 .put = alc_test_pin_src_put, \
4198 .private_value = nid \
4201 static struct snd_kcontrol_new alc880_test_mixer[] = {
4202 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
4203 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
4204 HDA_CODEC_VOLUME("CLFE Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
4205 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
4206 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
4207 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
4208 HDA_BIND_MUTE("CLFE Playback Switch", 0x0e, 2, HDA_INPUT),
4209 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
4210 PIN_CTL_TEST("Front Pin Mode", 0x14),
4211 PIN_CTL_TEST("Surround Pin Mode", 0x15),
4212 PIN_CTL_TEST("CLFE Pin Mode", 0x16),
4213 PIN_CTL_TEST("Side Pin Mode", 0x17),
4214 PIN_CTL_TEST("In-1 Pin Mode", 0x18),
4215 PIN_CTL_TEST("In-2 Pin Mode", 0x19),
4216 PIN_CTL_TEST("In-3 Pin Mode", 0x1a),
4217 PIN_CTL_TEST("In-4 Pin Mode", 0x1b),
4218 PIN_SRC_TEST("In-1 Pin Source", 0x18),
4219 PIN_SRC_TEST("In-2 Pin Source", 0x19),
4220 PIN_SRC_TEST("In-3 Pin Source", 0x1a),
4221 PIN_SRC_TEST("In-4 Pin Source", 0x1b),
4222 HDA_CODEC_VOLUME("In-1 Playback Volume", 0x0b, 0x0, HDA_INPUT),
4223 HDA_CODEC_MUTE("In-1 Playback Switch", 0x0b, 0x0, HDA_INPUT),
4224 HDA_CODEC_VOLUME("In-2 Playback Volume", 0x0b, 0x1, HDA_INPUT),
4225 HDA_CODEC_MUTE("In-2 Playback Switch", 0x0b, 0x1, HDA_INPUT),
4226 HDA_CODEC_VOLUME("In-3 Playback Volume", 0x0b, 0x2, HDA_INPUT),
4227 HDA_CODEC_MUTE("In-3 Playback Switch", 0x0b, 0x2, HDA_INPUT),
4228 HDA_CODEC_VOLUME("In-4 Playback Volume", 0x0b, 0x3, HDA_INPUT),
4229 HDA_CODEC_MUTE("In-4 Playback Switch", 0x0b, 0x3, HDA_INPUT),
4230 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x4, HDA_INPUT),
4231 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x4, HDA_INPUT),
4233 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
4234 .name = "Channel Mode",
4235 .info = alc_ch_mode_info,
4236 .get = alc_ch_mode_get,
4237 .put = alc_ch_mode_put,
4242 static struct hda_verb alc880_test_init_verbs[] = {
4243 /* Unmute inputs of 0x0c - 0x0f */
4244 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4245 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4246 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4247 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4248 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4249 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4250 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
4251 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
4252 /* Vol output for 0x0c-0x0f */
4253 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4254 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4255 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4256 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
4257 /* Set output pins 0x14-0x17 */
4258 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4259 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4260 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4261 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
4262 /* Unmute output pins 0x14-0x17 */
4263 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4264 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4265 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4266 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
4267 /* Set input pins 0x18-0x1c */
4268 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4269 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
4270 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4271 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4272 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
4273 /* Mute input pins 0x18-0x1b */
4274 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4275 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4276 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4277 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
4279 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4280 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
4281 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4282 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
4283 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4284 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
4285 /* Analog input/passthru */
4286 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
4287 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
4288 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
4289 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
4290 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
4298 static const char *alc880_models[ALC880_MODEL_LAST] = {
4299 [ALC880_3ST] = "3stack",
4300 [ALC880_TCL_S700] = "tcl",
4301 [ALC880_3ST_DIG] = "3stack-digout",
4302 [ALC880_CLEVO] = "clevo",
4303 [ALC880_5ST] = "5stack",
4304 [ALC880_5ST_DIG] = "5stack-digout",
4305 [ALC880_W810] = "w810",
4306 [ALC880_Z71V] = "z71v",
4307 [ALC880_6ST] = "6stack",
4308 [ALC880_6ST_DIG] = "6stack-digout",
4309 [ALC880_ASUS] = "asus",
4310 [ALC880_ASUS_W1V] = "asus-w1v",
4311 [ALC880_ASUS_DIG] = "asus-dig",
4312 [ALC880_ASUS_DIG2] = "asus-dig2",
4313 [ALC880_UNIWILL_DIG] = "uniwill",
4314 [ALC880_UNIWILL_P53] = "uniwill-p53",
4315 [ALC880_FUJITSU] = "fujitsu",
4316 [ALC880_F1734] = "F1734",
4318 [ALC880_LG_LW] = "lg-lw",
4319 [ALC880_MEDION_RIM] = "medion",
4320 #ifdef CONFIG_SND_DEBUG
4321 [ALC880_TEST] = "test",
4323 [ALC880_AUTO] = "auto",
4326 static struct snd_pci_quirk alc880_cfg_tbl[] = {
4327 SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_W810),
4328 SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_5ST_DIG),
4329 SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_6ST),
4330 SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_3ST_DIG),
4331 SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_6ST_DIG),
4332 SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_6ST_DIG),
4333 SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_6ST_DIG),
4334 SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_3ST_DIG),
4335 SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_3ST),
4336 SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_6ST_DIG),
4337 SND_PCI_QUIRK(0x103c, 0x2a09, "HP", ALC880_5ST),
4338 SND_PCI_QUIRK(0x1043, 0x10b3, "ASUS W1V", ALC880_ASUS_W1V),
4339 SND_PCI_QUIRK(0x1043, 0x10c2, "ASUS W6A", ALC880_ASUS_DIG),
4340 SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS Wxx", ALC880_ASUS_DIG),
4341 SND_PCI_QUIRK(0x1043, 0x1113, "ASUS", ALC880_ASUS_DIG),
4342 SND_PCI_QUIRK(0x1043, 0x1123, "ASUS", ALC880_ASUS_DIG),
4343 SND_PCI_QUIRK(0x1043, 0x1173, "ASUS", ALC880_ASUS_DIG),
4344 SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_Z71V),
4345 /* SND_PCI_QUIRK(0x1043, 0x1964, "ASUS", ALC880_ASUS_DIG), */
4346 SND_PCI_QUIRK(0x1043, 0x1973, "ASUS", ALC880_ASUS_DIG),
4347 SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS", ALC880_ASUS_DIG),
4348 SND_PCI_QUIRK(0x1043, 0x814e, "ASUS P5GD1 w/SPDIF", ALC880_6ST_DIG),
4349 SND_PCI_QUIRK(0x1043, 0x8181, "ASUS P4GPL", ALC880_ASUS_DIG),
4350 SND_PCI_QUIRK(0x1043, 0x8196, "ASUS P5GD1", ALC880_6ST),
4351 SND_PCI_QUIRK(0x1043, 0x81b4, "ASUS", ALC880_6ST),
4352 SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_ASUS), /* default ASUS */
4353 SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_3ST),
4354 SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_3ST),
4355 SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_5ST),
4356 SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_5ST),
4357 SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_5ST),
4358 SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_6ST_DIG),
4359 SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_6ST_DIG),
4360 SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_6ST_DIG),
4361 SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_6ST_DIG),
4362 SND_PCI_QUIRK(0x1558, 0x0520, "Clevo m520G", ALC880_CLEVO),
4363 SND_PCI_QUIRK(0x1558, 0x0660, "Clevo m655n", ALC880_CLEVO),
4364 SND_PCI_QUIRK(0x1558, 0x5401, "ASUS", ALC880_ASUS_DIG2),
4365 SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_5ST_DIG),
4366 SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_UNIWILL_DIG),
4367 SND_PCI_QUIRK(0x1584, 0x9054, "Uniwlll", ALC880_F1734),
4368 SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_UNIWILL),
4369 SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_UNIWILL_P53),
4370 SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_W810),
4371 SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_MEDION_RIM),
4372 SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_5ST_DIG),
4373 SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG),
4374 SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734),
4375 SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU),
4376 SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_F1734),
4377 SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU),
4378 SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW),
4379 SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_LG),
4380 SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_LG),
4381 SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_LG_LW),
4382 SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_TCL_S700),
4383 SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_6ST_DIG), /* broken BIOS */
4384 SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_6ST_DIG),
4385 SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_5ST_DIG),
4386 SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_5ST_DIG),
4387 SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_5ST_DIG),
4388 SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_3ST_DIG),
4389 SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_5ST_DIG),
4390 SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_3ST_DIG),
4391 SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_3ST_DIG),
4392 SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_5ST_DIG),
4393 SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_5ST_DIG),
4394 SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_5ST_DIG),
4396 SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_3ST),
4397 SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_5ST_DIG),
4398 SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_6ST_DIG),
4403 * ALC880 codec presets
4405 static struct alc_config_preset alc880_presets[] = {
4407 .mixers = { alc880_three_stack_mixer },
4408 .init_verbs = { alc880_volume_init_verbs,
4409 alc880_pin_3stack_init_verbs },
4410 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4411 .dac_nids = alc880_dac_nids,
4412 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4413 .channel_mode = alc880_threestack_modes,
4415 .input_mux = &alc880_capture_source,
4417 [ALC880_3ST_DIG] = {
4418 .mixers = { alc880_three_stack_mixer },
4419 .init_verbs = { alc880_volume_init_verbs,
4420 alc880_pin_3stack_init_verbs },
4421 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4422 .dac_nids = alc880_dac_nids,
4423 .dig_out_nid = ALC880_DIGOUT_NID,
4424 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4425 .channel_mode = alc880_threestack_modes,
4427 .input_mux = &alc880_capture_source,
4429 [ALC880_TCL_S700] = {
4430 .mixers = { alc880_tcl_s700_mixer },
4431 .init_verbs = { alc880_volume_init_verbs,
4432 alc880_pin_tcl_S700_init_verbs,
4433 alc880_gpio2_init_verbs },
4434 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4435 .dac_nids = alc880_dac_nids,
4436 .adc_nids = alc880_adc_nids_alt, /* FIXME: correct? */
4437 .num_adc_nids = 1, /* single ADC */
4439 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4440 .channel_mode = alc880_2_jack_modes,
4441 .input_mux = &alc880_capture_source,
4444 .mixers = { alc880_three_stack_mixer,
4445 alc880_five_stack_mixer},
4446 .init_verbs = { alc880_volume_init_verbs,
4447 alc880_pin_5stack_init_verbs },
4448 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4449 .dac_nids = alc880_dac_nids,
4450 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4451 .channel_mode = alc880_fivestack_modes,
4452 .input_mux = &alc880_capture_source,
4454 [ALC880_5ST_DIG] = {
4455 .mixers = { alc880_three_stack_mixer,
4456 alc880_five_stack_mixer },
4457 .init_verbs = { alc880_volume_init_verbs,
4458 alc880_pin_5stack_init_verbs },
4459 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4460 .dac_nids = alc880_dac_nids,
4461 .dig_out_nid = ALC880_DIGOUT_NID,
4462 .num_channel_mode = ARRAY_SIZE(alc880_fivestack_modes),
4463 .channel_mode = alc880_fivestack_modes,
4464 .input_mux = &alc880_capture_source,
4467 .mixers = { alc880_six_stack_mixer },
4468 .init_verbs = { alc880_volume_init_verbs,
4469 alc880_pin_6stack_init_verbs },
4470 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4471 .dac_nids = alc880_6st_dac_nids,
4472 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4473 .channel_mode = alc880_sixstack_modes,
4474 .input_mux = &alc880_6stack_capture_source,
4476 [ALC880_6ST_DIG] = {
4477 .mixers = { alc880_six_stack_mixer },
4478 .init_verbs = { alc880_volume_init_verbs,
4479 alc880_pin_6stack_init_verbs },
4480 .num_dacs = ARRAY_SIZE(alc880_6st_dac_nids),
4481 .dac_nids = alc880_6st_dac_nids,
4482 .dig_out_nid = ALC880_DIGOUT_NID,
4483 .num_channel_mode = ARRAY_SIZE(alc880_sixstack_modes),
4484 .channel_mode = alc880_sixstack_modes,
4485 .input_mux = &alc880_6stack_capture_source,
4488 .mixers = { alc880_w810_base_mixer },
4489 .init_verbs = { alc880_volume_init_verbs,
4490 alc880_pin_w810_init_verbs,
4491 alc880_gpio2_init_verbs },
4492 .num_dacs = ARRAY_SIZE(alc880_w810_dac_nids),
4493 .dac_nids = alc880_w810_dac_nids,
4494 .dig_out_nid = ALC880_DIGOUT_NID,
4495 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4496 .channel_mode = alc880_w810_modes,
4497 .input_mux = &alc880_capture_source,
4500 .mixers = { alc880_z71v_mixer },
4501 .init_verbs = { alc880_volume_init_verbs,
4502 alc880_pin_z71v_init_verbs },
4503 .num_dacs = ARRAY_SIZE(alc880_z71v_dac_nids),
4504 .dac_nids = alc880_z71v_dac_nids,
4505 .dig_out_nid = ALC880_DIGOUT_NID,
4507 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4508 .channel_mode = alc880_2_jack_modes,
4509 .input_mux = &alc880_capture_source,
4512 .mixers = { alc880_f1734_mixer },
4513 .init_verbs = { alc880_volume_init_verbs,
4514 alc880_pin_f1734_init_verbs },
4515 .num_dacs = ARRAY_SIZE(alc880_f1734_dac_nids),
4516 .dac_nids = alc880_f1734_dac_nids,
4518 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4519 .channel_mode = alc880_2_jack_modes,
4520 .input_mux = &alc880_f1734_capture_source,
4521 .unsol_event = alc880_uniwill_p53_unsol_event,
4522 .setup = alc880_uniwill_p53_setup,
4523 .init_hook = alc_automute_amp,
4526 .mixers = { alc880_asus_mixer },
4527 .init_verbs = { alc880_volume_init_verbs,
4528 alc880_pin_asus_init_verbs,
4529 alc880_gpio1_init_verbs },
4530 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4531 .dac_nids = alc880_asus_dac_nids,
4532 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4533 .channel_mode = alc880_asus_modes,
4535 .input_mux = &alc880_capture_source,
4537 [ALC880_ASUS_DIG] = {
4538 .mixers = { alc880_asus_mixer },
4539 .init_verbs = { alc880_volume_init_verbs,
4540 alc880_pin_asus_init_verbs,
4541 alc880_gpio1_init_verbs },
4542 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4543 .dac_nids = alc880_asus_dac_nids,
4544 .dig_out_nid = ALC880_DIGOUT_NID,
4545 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4546 .channel_mode = alc880_asus_modes,
4548 .input_mux = &alc880_capture_source,
4550 [ALC880_ASUS_DIG2] = {
4551 .mixers = { alc880_asus_mixer },
4552 .init_verbs = { alc880_volume_init_verbs,
4553 alc880_pin_asus_init_verbs,
4554 alc880_gpio2_init_verbs }, /* use GPIO2 */
4555 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4556 .dac_nids = alc880_asus_dac_nids,
4557 .dig_out_nid = ALC880_DIGOUT_NID,
4558 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4559 .channel_mode = alc880_asus_modes,
4561 .input_mux = &alc880_capture_source,
4563 [ALC880_ASUS_W1V] = {
4564 .mixers = { alc880_asus_mixer, alc880_asus_w1v_mixer },
4565 .init_verbs = { alc880_volume_init_verbs,
4566 alc880_pin_asus_init_verbs,
4567 alc880_gpio1_init_verbs },
4568 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4569 .dac_nids = alc880_asus_dac_nids,
4570 .dig_out_nid = ALC880_DIGOUT_NID,
4571 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4572 .channel_mode = alc880_asus_modes,
4574 .input_mux = &alc880_capture_source,
4576 [ALC880_UNIWILL_DIG] = {
4577 .mixers = { alc880_asus_mixer },
4578 .init_verbs = { alc880_volume_init_verbs,
4579 alc880_pin_asus_init_verbs },
4580 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4581 .dac_nids = alc880_asus_dac_nids,
4582 .dig_out_nid = ALC880_DIGOUT_NID,
4583 .num_channel_mode = ARRAY_SIZE(alc880_asus_modes),
4584 .channel_mode = alc880_asus_modes,
4586 .input_mux = &alc880_capture_source,
4588 [ALC880_UNIWILL] = {
4589 .mixers = { alc880_uniwill_mixer },
4590 .init_verbs = { alc880_volume_init_verbs,
4591 alc880_uniwill_init_verbs },
4592 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4593 .dac_nids = alc880_asus_dac_nids,
4594 .dig_out_nid = ALC880_DIGOUT_NID,
4595 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4596 .channel_mode = alc880_threestack_modes,
4598 .input_mux = &alc880_capture_source,
4599 .unsol_event = alc880_uniwill_unsol_event,
4600 .setup = alc880_uniwill_setup,
4601 .init_hook = alc880_uniwill_init_hook,
4603 [ALC880_UNIWILL_P53] = {
4604 .mixers = { alc880_uniwill_p53_mixer },
4605 .init_verbs = { alc880_volume_init_verbs,
4606 alc880_uniwill_p53_init_verbs },
4607 .num_dacs = ARRAY_SIZE(alc880_asus_dac_nids),
4608 .dac_nids = alc880_asus_dac_nids,
4609 .num_channel_mode = ARRAY_SIZE(alc880_w810_modes),
4610 .channel_mode = alc880_threestack_modes,
4611 .input_mux = &alc880_capture_source,
4612 .unsol_event = alc880_uniwill_p53_unsol_event,
4613 .setup = alc880_uniwill_p53_setup,
4614 .init_hook = alc_automute_amp,
4616 [ALC880_FUJITSU] = {
4617 .mixers = { alc880_fujitsu_mixer },
4618 .init_verbs = { alc880_volume_init_verbs,
4619 alc880_uniwill_p53_init_verbs,
4620 alc880_beep_init_verbs },
4621 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4622 .dac_nids = alc880_dac_nids,
4623 .dig_out_nid = ALC880_DIGOUT_NID,
4624 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4625 .channel_mode = alc880_2_jack_modes,
4626 .input_mux = &alc880_capture_source,
4627 .unsol_event = alc880_uniwill_p53_unsol_event,
4628 .setup = alc880_uniwill_p53_setup,
4629 .init_hook = alc_automute_amp,
4632 .mixers = { alc880_three_stack_mixer },
4633 .init_verbs = { alc880_volume_init_verbs,
4634 alc880_pin_clevo_init_verbs },
4635 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4636 .dac_nids = alc880_dac_nids,
4638 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
4639 .channel_mode = alc880_threestack_modes,
4641 .input_mux = &alc880_capture_source,
4644 .mixers = { alc880_lg_mixer },
4645 .init_verbs = { alc880_volume_init_verbs,
4646 alc880_lg_init_verbs },
4647 .num_dacs = ARRAY_SIZE(alc880_lg_dac_nids),
4648 .dac_nids = alc880_lg_dac_nids,
4649 .dig_out_nid = ALC880_DIGOUT_NID,
4650 .num_channel_mode = ARRAY_SIZE(alc880_lg_ch_modes),
4651 .channel_mode = alc880_lg_ch_modes,
4653 .input_mux = &alc880_lg_capture_source,
4654 .unsol_event = alc_automute_amp_unsol_event,
4655 .setup = alc880_lg_setup,
4656 .init_hook = alc_automute_amp,
4657 #ifdef CONFIG_SND_HDA_POWER_SAVE
4658 .loopbacks = alc880_lg_loopbacks,
4662 .mixers = { alc880_lg_lw_mixer },
4663 .init_verbs = { alc880_volume_init_verbs,
4664 alc880_lg_lw_init_verbs },
4665 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4666 .dac_nids = alc880_dac_nids,
4667 .dig_out_nid = ALC880_DIGOUT_NID,
4668 .num_channel_mode = ARRAY_SIZE(alc880_lg_lw_modes),
4669 .channel_mode = alc880_lg_lw_modes,
4670 .input_mux = &alc880_lg_lw_capture_source,
4671 .unsol_event = alc_automute_amp_unsol_event,
4672 .setup = alc880_lg_lw_setup,
4673 .init_hook = alc_automute_amp,
4675 [ALC880_MEDION_RIM] = {
4676 .mixers = { alc880_medion_rim_mixer },
4677 .init_verbs = { alc880_volume_init_verbs,
4678 alc880_medion_rim_init_verbs,
4679 alc_gpio2_init_verbs },
4680 .num_dacs = ARRAY_SIZE(alc880_dac_nids),
4681 .dac_nids = alc880_dac_nids,
4682 .dig_out_nid = ALC880_DIGOUT_NID,
4683 .num_channel_mode = ARRAY_SIZE(alc880_2_jack_modes),
4684 .channel_mode = alc880_2_jack_modes,
4685 .input_mux = &alc880_medion_rim_capture_source,
4686 .unsol_event = alc880_medion_rim_unsol_event,
4687 .setup = alc880_medion_rim_setup,
4688 .init_hook = alc880_medion_rim_automute,
4690 #ifdef CONFIG_SND_DEBUG
4692 .mixers = { alc880_test_mixer },
4693 .init_verbs = { alc880_test_init_verbs },
4694 .num_dacs = ARRAY_SIZE(alc880_test_dac_nids),
4695 .dac_nids = alc880_test_dac_nids,
4696 .dig_out_nid = ALC880_DIGOUT_NID,
4697 .num_channel_mode = ARRAY_SIZE(alc880_test_modes),
4698 .channel_mode = alc880_test_modes,
4699 .input_mux = &alc880_test_capture_source,
4705 * Automatic parse of I/O pins from the BIOS configuration
4710 ALC_CTL_WIDGET_MUTE,
4713 static struct snd_kcontrol_new alc880_control_templates[] = {
4714 HDA_CODEC_VOLUME(NULL, 0, 0, 0),
4715 HDA_CODEC_MUTE(NULL, 0, 0, 0),
4716 HDA_BIND_MUTE(NULL, 0, 0, 0),
4719 /* add dynamic controls */
4720 static int add_control(struct alc_spec *spec, int type, const char *name,
4723 struct snd_kcontrol_new *knew;
4725 snd_array_init(&spec->kctls, sizeof(*knew), 32);
4726 knew = snd_array_new(&spec->kctls);
4729 *knew = alc880_control_templates[type];
4730 knew->name = kstrdup(name, GFP_KERNEL);
4733 if (get_amp_nid_(val))
4734 knew->subdevice = HDA_SUBDEV_AMP_FLAG;
4735 knew->private_value = val;
4739 static int add_control_with_pfx(struct alc_spec *spec, int type,
4740 const char *pfx, const char *dir,
4741 const char *sfx, unsigned long val)
4744 snprintf(name, sizeof(name), "%s %s %s", pfx, dir, sfx);
4745 return add_control(spec, type, name, val);
4748 #define add_pb_vol_ctrl(spec, type, pfx, val) \
4749 add_control_with_pfx(spec, type, pfx, "Playback", "Volume", val)
4750 #define add_pb_sw_ctrl(spec, type, pfx, val) \
4751 add_control_with_pfx(spec, type, pfx, "Playback", "Switch", val)
4753 #define alc880_is_fixed_pin(nid) ((nid) >= 0x14 && (nid) <= 0x17)
4754 #define alc880_fixed_pin_idx(nid) ((nid) - 0x14)
4755 #define alc880_is_multi_pin(nid) ((nid) >= 0x18)
4756 #define alc880_multi_pin_idx(nid) ((nid) - 0x18)
4757 #define alc880_idx_to_dac(nid) ((nid) + 0x02)
4758 #define alc880_dac_to_idx(nid) ((nid) - 0x02)
4759 #define alc880_idx_to_mixer(nid) ((nid) + 0x0c)
4760 #define alc880_idx_to_selector(nid) ((nid) + 0x10)
4761 #define ALC880_PIN_CD_NID 0x1c
4763 /* fill in the dac_nids table from the parsed pin configuration */
4764 static int alc880_auto_fill_dac_nids(struct alc_spec *spec,
4765 const struct auto_pin_cfg *cfg)
4771 memset(assigned, 0, sizeof(assigned));
4772 spec->multiout.dac_nids = spec->private_dac_nids;
4774 /* check the pins hardwired to audio widget */
4775 for (i = 0; i < cfg->line_outs; i++) {
4776 nid = cfg->line_out_pins[i];
4777 if (alc880_is_fixed_pin(nid)) {
4778 int idx = alc880_fixed_pin_idx(nid);
4779 spec->multiout.dac_nids[i] = alc880_idx_to_dac(idx);
4783 /* left pins can be connect to any audio widget */
4784 for (i = 0; i < cfg->line_outs; i++) {
4785 nid = cfg->line_out_pins[i];
4786 if (alc880_is_fixed_pin(nid))
4788 /* search for an empty channel */
4789 for (j = 0; j < cfg->line_outs; j++) {
4791 spec->multiout.dac_nids[i] =
4792 alc880_idx_to_dac(j);
4798 spec->multiout.num_dacs = cfg->line_outs;
4802 /* add playback controls from the parsed DAC table */
4803 static int alc880_auto_create_multi_out_ctls(struct alc_spec *spec,
4804 const struct auto_pin_cfg *cfg)
4806 static const char *chname[4] = {
4807 "Front", "Surround", NULL /*CLFE*/, "Side"
4812 for (i = 0; i < cfg->line_outs; i++) {
4813 if (!spec->multiout.dac_nids[i])
4815 nid = alc880_idx_to_mixer(alc880_dac_to_idx(spec->multiout.dac_nids[i]));
4818 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4820 HDA_COMPOSE_AMP_VAL(nid, 1, 0,
4824 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
4826 HDA_COMPOSE_AMP_VAL(nid, 2, 0,
4830 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4832 HDA_COMPOSE_AMP_VAL(nid, 1, 2,
4836 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
4838 HDA_COMPOSE_AMP_VAL(nid, 2, 2,
4844 if (cfg->line_outs == 1 &&
4845 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
4849 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
4850 HDA_COMPOSE_AMP_VAL(nid, 3, 0,
4854 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
4855 HDA_COMPOSE_AMP_VAL(nid, 3, 2,
4864 /* add playback controls for speaker and HP outputs */
4865 static int alc880_auto_create_extra_out(struct alc_spec *spec, hda_nid_t pin,
4874 if (alc880_is_fixed_pin(pin)) {
4875 nid = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
4876 /* specify the DAC as the extra output */
4877 if (!spec->multiout.hp_nid)
4878 spec->multiout.hp_nid = nid;
4880 spec->multiout.extra_out_nid[0] = nid;
4881 /* control HP volume/switch on the output mixer amp */
4882 nid = alc880_idx_to_mixer(alc880_fixed_pin_idx(pin));
4883 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
4884 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT));
4887 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
4888 HDA_COMPOSE_AMP_VAL(nid, 3, 2, HDA_INPUT));
4891 } else if (alc880_is_multi_pin(pin)) {
4892 /* set manual connection */
4893 /* we have only a switch on HP-out PIN */
4894 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
4895 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
4902 /* create input playback/capture controls for the given pin */
4903 static int new_analog_input(struct alc_spec *spec, hda_nid_t pin,
4904 const char *ctlname,
4905 int idx, hda_nid_t mix_nid)
4909 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
4910 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4913 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
4914 HDA_COMPOSE_AMP_VAL(mix_nid, 3, idx, HDA_INPUT));
4920 static int alc_is_input_pin(struct hda_codec *codec, hda_nid_t nid)
4922 unsigned int pincap = snd_hda_query_pin_caps(codec, nid);
4923 return (pincap & AC_PINCAP_IN) != 0;
4926 /* create playback/capture controls for input pins */
4927 static int alc_auto_create_input_ctls(struct hda_codec *codec,
4928 const struct auto_pin_cfg *cfg,
4930 hda_nid_t cap1, hda_nid_t cap2)
4932 struct alc_spec *spec = codec->spec;
4933 struct hda_input_mux *imux = &spec->private_imux[0];
4936 for (i = 0; i < AUTO_PIN_LAST; i++) {
4939 pin = cfg->input_pins[i];
4940 if (!alc_is_input_pin(codec, pin))
4944 idx = get_connection_index(codec, mixer, pin);
4946 err = new_analog_input(spec, pin,
4947 auto_pin_cfg_labels[i],
4956 idx = get_connection_index(codec, cap1, pin);
4957 if (idx < 0 && cap2)
4958 idx = get_connection_index(codec, cap2, pin);
4960 imux->items[imux->num_items].label =
4961 auto_pin_cfg_labels[i];
4962 imux->items[imux->num_items].index = idx;
4969 static int alc880_auto_create_input_ctls(struct hda_codec *codec,
4970 const struct auto_pin_cfg *cfg)
4972 return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x08, 0x09);
4975 static void alc_set_pin_output(struct hda_codec *codec, hda_nid_t nid,
4976 unsigned int pin_type)
4978 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4981 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_AMP_GAIN_MUTE,
4985 static void alc880_auto_set_output_and_unmute(struct hda_codec *codec,
4986 hda_nid_t nid, int pin_type,
4989 alc_set_pin_output(codec, nid, pin_type);
4990 /* need the manual connection? */
4991 if (alc880_is_multi_pin(nid)) {
4992 struct alc_spec *spec = codec->spec;
4993 int idx = alc880_multi_pin_idx(nid);
4994 snd_hda_codec_write(codec, alc880_idx_to_selector(idx), 0,
4995 AC_VERB_SET_CONNECT_SEL,
4996 alc880_dac_to_idx(spec->multiout.dac_nids[dac_idx]));
5000 static int get_pin_type(int line_out_type)
5002 if (line_out_type == AUTO_PIN_HP_OUT)
5008 static void alc880_auto_init_multi_out(struct hda_codec *codec)
5010 struct alc_spec *spec = codec->spec;
5013 for (i = 0; i < spec->autocfg.line_outs; i++) {
5014 hda_nid_t nid = spec->autocfg.line_out_pins[i];
5015 int pin_type = get_pin_type(spec->autocfg.line_out_type);
5016 alc880_auto_set_output_and_unmute(codec, nid, pin_type, i);
5020 static void alc880_auto_init_extra_out(struct hda_codec *codec)
5022 struct alc_spec *spec = codec->spec;
5025 pin = spec->autocfg.speaker_pins[0];
5026 if (pin) /* connect to front */
5027 alc880_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
5028 pin = spec->autocfg.hp_pins[0];
5029 if (pin) /* connect to front */
5030 alc880_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
5033 static void alc880_auto_init_analog_input(struct hda_codec *codec)
5035 struct alc_spec *spec = codec->spec;
5038 for (i = 0; i < AUTO_PIN_LAST; i++) {
5039 hda_nid_t nid = spec->autocfg.input_pins[i];
5040 if (alc_is_input_pin(codec, nid)) {
5041 alc_set_input_pin(codec, nid, i);
5042 if (nid != ALC880_PIN_CD_NID &&
5043 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
5044 snd_hda_codec_write(codec, nid, 0,
5045 AC_VERB_SET_AMP_GAIN_MUTE,
5051 static void alc880_auto_init_input_src(struct hda_codec *codec)
5053 struct alc_spec *spec = codec->spec;
5056 for (c = 0; c < spec->num_adc_nids; c++) {
5057 unsigned int mux_idx;
5058 const struct hda_input_mux *imux;
5059 mux_idx = c >= spec->num_mux_defs ? 0 : c;
5060 imux = &spec->input_mux[mux_idx];
5061 if (!imux->num_items && mux_idx > 0)
5062 imux = &spec->input_mux[0];
5064 snd_hda_codec_write(codec, spec->adc_nids[c], 0,
5065 AC_VERB_SET_CONNECT_SEL,
5066 imux->items[0].index);
5070 /* parse the BIOS configuration and set up the alc_spec */
5071 /* return 1 if successful, 0 if the proper config is not found,
5072 * or a negative error code
5074 static int alc880_parse_auto_config(struct hda_codec *codec)
5076 struct alc_spec *spec = codec->spec;
5078 static hda_nid_t alc880_ignore[] = { 0x1d, 0 };
5080 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
5084 if (!spec->autocfg.line_outs)
5085 return 0; /* can't find valid BIOS pin config */
5087 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
5090 err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
5093 err = alc880_auto_create_extra_out(spec,
5094 spec->autocfg.speaker_pins[0],
5098 err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
5102 err = alc880_auto_create_input_ctls(codec, &spec->autocfg);
5106 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
5108 alc_auto_parse_digital(codec);
5110 if (spec->kctls.list)
5111 add_mixer(spec, spec->kctls.list);
5113 add_verb(spec, alc880_volume_init_verbs);
5115 spec->num_mux_defs = 1;
5116 spec->input_mux = &spec->private_imux[0];
5118 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
5123 /* additional initialization for auto-configuration model */
5124 static void alc880_auto_init(struct hda_codec *codec)
5126 struct alc_spec *spec = codec->spec;
5127 alc880_auto_init_multi_out(codec);
5128 alc880_auto_init_extra_out(codec);
5129 alc880_auto_init_analog_input(codec);
5130 alc880_auto_init_input_src(codec);
5131 alc_auto_init_digital(codec);
5132 if (spec->unsol_event)
5133 alc_inithook(codec);
5136 /* check the ADC/MUX contains all input pins; some ADC/MUX contains only
5137 * one of two digital mic pins, e.g. on ALC272
5139 static void fixup_automic_adc(struct hda_codec *codec)
5141 struct alc_spec *spec = codec->spec;
5144 for (i = 0; i < spec->num_adc_nids; i++) {
5145 hda_nid_t cap = spec->capsrc_nids ?
5146 spec->capsrc_nids[i] : spec->adc_nids[i];
5149 iidx = get_connection_index(codec, cap, spec->int_mic.pin);
5152 eidx = get_connection_index(codec, cap, spec->ext_mic.pin);
5155 spec->int_mic.mux_idx = iidx;
5156 spec->ext_mic.mux_idx = eidx;
5157 if (spec->capsrc_nids)
5158 spec->capsrc_nids += i;
5159 spec->adc_nids += i;
5160 spec->num_adc_nids = 1;
5163 snd_printd(KERN_INFO "hda_codec: %s: "
5164 "No ADC/MUX containing both 0x%x and 0x%x pins\n",
5165 codec->chip_name, spec->int_mic.pin, spec->ext_mic.pin);
5166 spec->auto_mic = 0; /* disable auto-mic to be sure */
5169 /* select or unmute the given capsrc route */
5170 static void select_or_unmute_capsrc(struct hda_codec *codec, hda_nid_t cap,
5173 if (get_wcaps_type(get_wcaps(codec, cap)) == AC_WID_AUD_MIX) {
5174 snd_hda_codec_amp_stereo(codec, cap, HDA_INPUT, idx,
5177 snd_hda_codec_write_cache(codec, cap, 0,
5178 AC_VERB_SET_CONNECT_SEL, idx);
5182 /* set the default connection to that pin */
5183 static int init_capsrc_for_pin(struct hda_codec *codec, hda_nid_t pin)
5185 struct alc_spec *spec = codec->spec;
5188 for (i = 0; i < spec->num_adc_nids; i++) {
5189 hda_nid_t cap = spec->capsrc_nids ?
5190 spec->capsrc_nids[i] : spec->adc_nids[i];
5193 idx = get_connection_index(codec, cap, pin);
5196 select_or_unmute_capsrc(codec, cap, idx);
5197 return i; /* return the found index */
5199 return -1; /* not found */
5202 /* choose the ADC/MUX containing the input pin and initialize the setup */
5203 static void fixup_single_adc(struct hda_codec *codec)
5205 struct alc_spec *spec = codec->spec;
5209 /* search for the input pin; there must be only one */
5210 for (i = 0; i < AUTO_PIN_LAST; i++) {
5211 if (spec->autocfg.input_pins[i]) {
5212 pin = spec->autocfg.input_pins[i];
5218 i = init_capsrc_for_pin(codec, pin);
5220 /* use only this ADC */
5221 if (spec->capsrc_nids)
5222 spec->capsrc_nids += i;
5223 spec->adc_nids += i;
5224 spec->num_adc_nids = 1;
5228 /* initialize dual adcs */
5229 static void fixup_dual_adc_switch(struct hda_codec *codec)
5231 struct alc_spec *spec = codec->spec;
5232 init_capsrc_for_pin(codec, spec->ext_mic.pin);
5233 init_capsrc_for_pin(codec, spec->int_mic.pin);
5236 static void set_capture_mixer(struct hda_codec *codec)
5238 struct alc_spec *spec = codec->spec;
5239 static struct snd_kcontrol_new *caps[2][3] = {
5240 { alc_capture_mixer_nosrc1,
5241 alc_capture_mixer_nosrc2,
5242 alc_capture_mixer_nosrc3 },
5243 { alc_capture_mixer1,
5245 alc_capture_mixer3 },
5247 if (spec->num_adc_nids > 0 && spec->num_adc_nids <= 3) {
5249 int num_adcs = spec->num_adc_nids;
5250 if (spec->dual_adc_switch)
5251 fixup_dual_adc_switch(codec);
5252 else if (spec->auto_mic)
5253 fixup_automic_adc(codec);
5254 else if (spec->input_mux) {
5255 if (spec->input_mux->num_items > 1)
5257 else if (spec->input_mux->num_items == 1)
5258 fixup_single_adc(codec);
5260 if (spec->dual_adc_switch)
5262 spec->cap_mixer = caps[mux][num_adcs - 1];
5266 /* fill adc_nids (and capsrc_nids) containing all active input pins */
5267 static void fillup_priv_adc_nids(struct hda_codec *codec, hda_nid_t *nids,
5270 struct alc_spec *spec = codec->spec;
5272 hda_nid_t fallback_adc = 0, fallback_cap = 0;
5274 for (n = 0; n < num_nids; n++) {
5276 hda_nid_t conn[HDA_MAX_NUM_INPUTS];
5280 if (get_wcaps_type(get_wcaps(codec, adc)) != AC_WID_AUD_IN)
5283 nconns = snd_hda_get_connections(codec, cap, conn,
5287 nconns = snd_hda_get_connections(codec, cap, conn,
5292 if (!fallback_adc) {
5296 for (i = 0; i < AUTO_PIN_LAST; i++) {
5297 hda_nid_t nid = spec->autocfg.input_pins[i];
5300 for (j = 0; j < nconns; j++) {
5307 if (i >= AUTO_PIN_LAST) {
5308 int num_adcs = spec->num_adc_nids;
5309 spec->private_adc_nids[num_adcs] = adc;
5310 spec->private_capsrc_nids[num_adcs] = cap;
5311 spec->num_adc_nids++;
5312 spec->adc_nids = spec->private_adc_nids;
5314 spec->capsrc_nids = spec->private_capsrc_nids;
5317 if (!spec->num_adc_nids) {
5318 printk(KERN_WARNING "hda_codec: %s: no valid ADC found;"
5319 " using fallback 0x%x\n",
5320 codec->chip_name, fallback_adc);
5321 spec->private_adc_nids[0] = fallback_adc;
5322 spec->adc_nids = spec->private_adc_nids;
5323 if (fallback_adc != fallback_cap) {
5324 spec->private_capsrc_nids[0] = fallback_cap;
5325 spec->capsrc_nids = spec->private_adc_nids;
5330 #ifdef CONFIG_SND_HDA_INPUT_BEEP
5331 #define set_beep_amp(spec, nid, idx, dir) \
5332 ((spec)->beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir))
5334 static struct snd_pci_quirk beep_white_list[] = {
5335 SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
5336 SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
5340 static inline int has_cdefine_beep(struct hda_codec *codec)
5342 struct alc_spec *spec = codec->spec;
5343 const struct snd_pci_quirk *q;
5344 q = snd_pci_quirk_lookup(codec->bus->pci, beep_white_list);
5347 return spec->cdefine.enable_pcbeep;
5350 #define set_beep_amp(spec, nid, idx, dir) /* NOP */
5351 #define has_cdefine_beep(codec) 0
5355 * OK, here we have finally the patch for ALC880
5358 static int patch_alc880(struct hda_codec *codec)
5360 struct alc_spec *spec;
5364 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
5370 board_config = snd_hda_check_board_config(codec, ALC880_MODEL_LAST,
5373 if (board_config < 0) {
5374 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
5376 board_config = ALC880_AUTO;
5379 if (board_config == ALC880_AUTO) {
5380 /* automatic parse from the BIOS config */
5381 err = alc880_parse_auto_config(codec);
5387 "hda_codec: Cannot set up configuration "
5388 "from BIOS. Using 3-stack mode...\n");
5389 board_config = ALC880_3ST;
5393 err = snd_hda_attach_beep_device(codec, 0x1);
5399 if (board_config != ALC880_AUTO)
5400 setup_preset(codec, &alc880_presets[board_config]);
5402 spec->stream_analog_playback = &alc880_pcm_analog_playback;
5403 spec->stream_analog_capture = &alc880_pcm_analog_capture;
5404 spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
5406 spec->stream_digital_playback = &alc880_pcm_digital_playback;
5407 spec->stream_digital_capture = &alc880_pcm_digital_capture;
5409 if (!spec->adc_nids && spec->input_mux) {
5410 /* check whether NID 0x07 is valid */
5411 unsigned int wcap = get_wcaps(codec, alc880_adc_nids[0]);
5413 wcap = get_wcaps_type(wcap);
5414 if (wcap != AC_WID_AUD_IN) {
5415 spec->adc_nids = alc880_adc_nids_alt;
5416 spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids_alt);
5418 spec->adc_nids = alc880_adc_nids;
5419 spec->num_adc_nids = ARRAY_SIZE(alc880_adc_nids);
5422 set_capture_mixer(codec);
5423 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
5425 spec->vmaster_nid = 0x0c;
5427 codec->patch_ops = alc_patch_ops;
5428 if (board_config == ALC880_AUTO)
5429 spec->init_hook = alc880_auto_init;
5430 #ifdef CONFIG_SND_HDA_POWER_SAVE
5431 if (!spec->loopback.amplist)
5432 spec->loopback.amplist = alc880_loopbacks;
5443 static hda_nid_t alc260_dac_nids[1] = {
5448 static hda_nid_t alc260_adc_nids[1] = {
5453 static hda_nid_t alc260_adc_nids_alt[1] = {
5458 /* NIDs used when simultaneous access to both ADCs makes sense. Note that
5459 * alc260_capture_mixer assumes ADC0 (nid 0x04) is the first ADC.
5461 static hda_nid_t alc260_dual_adc_nids[2] = {
5466 #define ALC260_DIGOUT_NID 0x03
5467 #define ALC260_DIGIN_NID 0x06
5469 static struct hda_input_mux alc260_capture_source = {
5473 { "Front Mic", 0x1 },
5479 /* On Fujitsu S702x laptops capture only makes sense from Mic/LineIn jack,
5480 * headphone jack and the internal CD lines since these are the only pins at
5481 * which audio can appear. For flexibility, also allow the option of
5482 * recording the mixer output on the second ADC (ADC0 doesn't have a
5483 * connection to the mixer output).
5485 static struct hda_input_mux alc260_fujitsu_capture_sources[2] = {
5489 { "Mic/Line", 0x0 },
5491 { "Headphone", 0x2 },
5497 { "Mic/Line", 0x0 },
5499 { "Headphone", 0x2 },
5506 /* Acer TravelMate(/Extensa/Aspire) notebooks have similar configuration to
5507 * the Fujitsu S702x, but jacks are marked differently.
5509 static struct hda_input_mux alc260_acer_capture_sources[2] = {
5516 { "Headphone", 0x5 },
5525 { "Headphone", 0x6 },
5531 /* Maxdata Favorit 100XS */
5532 static struct hda_input_mux alc260_favorit100_capture_sources[2] = {
5536 { "Line/Mic", 0x0 },
5543 { "Line/Mic", 0x0 },
5551 * This is just place-holder, so there's something for alc_build_pcms to look
5552 * at when it calculates the maximum number of channels. ALC260 has no mixer
5553 * element which allows changing the channel mode, so the verb list is
5556 static struct hda_channel_mode alc260_modes[1] = {
5561 /* Mixer combinations
5563 * basic: base_output + input + pc_beep + capture
5564 * HP: base_output + input + capture_alt
5565 * HP_3013: hp_3013 + input + capture
5566 * fujitsu: fujitsu + capture
5567 * acer: acer + capture
5570 static struct snd_kcontrol_new alc260_base_output_mixer[] = {
5571 HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5572 HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5573 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5574 HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5575 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5576 HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5580 static struct snd_kcontrol_new alc260_input_mixer[] = {
5581 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5582 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5583 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5584 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5585 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5586 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5587 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x07, 0x01, HDA_INPUT),
5588 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x07, 0x01, HDA_INPUT),
5592 /* update HP, line and mono out pins according to the master switch */
5593 static void alc260_hp_master_update(struct hda_codec *codec,
5594 hda_nid_t hp, hda_nid_t line,
5597 struct alc_spec *spec = codec->spec;
5598 unsigned int val = spec->master_sw ? PIN_HP : 0;
5599 /* change HP and line-out pins */
5600 snd_hda_codec_write(codec, hp, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5602 snd_hda_codec_write(codec, line, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5604 /* mono (speaker) depending on the HP jack sense */
5605 val = (val && !spec->jack_present) ? PIN_OUT : 0;
5606 snd_hda_codec_write(codec, mono, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5610 static int alc260_hp_master_sw_get(struct snd_kcontrol *kcontrol,
5611 struct snd_ctl_elem_value *ucontrol)
5613 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5614 struct alc_spec *spec = codec->spec;
5615 *ucontrol->value.integer.value = spec->master_sw;
5619 static int alc260_hp_master_sw_put(struct snd_kcontrol *kcontrol,
5620 struct snd_ctl_elem_value *ucontrol)
5622 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
5623 struct alc_spec *spec = codec->spec;
5624 int val = !!*ucontrol->value.integer.value;
5625 hda_nid_t hp, line, mono;
5627 if (val == spec->master_sw)
5629 spec->master_sw = val;
5630 hp = (kcontrol->private_value >> 16) & 0xff;
5631 line = (kcontrol->private_value >> 8) & 0xff;
5632 mono = kcontrol->private_value & 0xff;
5633 alc260_hp_master_update(codec, hp, line, mono);
5637 static struct snd_kcontrol_new alc260_hp_output_mixer[] = {
5639 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5640 .name = "Master Playback Switch",
5641 .subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
5642 .info = snd_ctl_boolean_mono_info,
5643 .get = alc260_hp_master_sw_get,
5644 .put = alc260_hp_master_sw_put,
5645 .private_value = (0x0f << 16) | (0x10 << 8) | 0x11
5647 HDA_CODEC_VOLUME("Front Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5648 HDA_BIND_MUTE("Front Playback Switch", 0x08, 2, HDA_INPUT),
5649 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5650 HDA_BIND_MUTE("Headphone Playback Switch", 0x09, 2, HDA_INPUT),
5651 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5653 HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2, HDA_INPUT),
5657 static struct hda_verb alc260_hp_unsol_verbs[] = {
5658 {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5662 static void alc260_hp_automute(struct hda_codec *codec)
5664 struct alc_spec *spec = codec->spec;
5666 spec->jack_present = snd_hda_jack_detect(codec, 0x10);
5667 alc260_hp_master_update(codec, 0x0f, 0x10, 0x11);
5670 static void alc260_hp_unsol_event(struct hda_codec *codec, unsigned int res)
5672 if ((res >> 26) == ALC880_HP_EVENT)
5673 alc260_hp_automute(codec);
5676 static struct snd_kcontrol_new alc260_hp_3013_mixer[] = {
5678 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
5679 .name = "Master Playback Switch",
5680 .subdevice = HDA_SUBDEV_NID_FLAG | 0x11,
5681 .info = snd_ctl_boolean_mono_info,
5682 .get = alc260_hp_master_sw_get,
5683 .put = alc260_hp_master_sw_put,
5684 .private_value = (0x15 << 16) | (0x10 << 8) | 0x11
5686 HDA_CODEC_VOLUME("Front Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5687 HDA_CODEC_MUTE("Front Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5688 HDA_CODEC_VOLUME("Aux-In Playback Volume", 0x07, 0x06, HDA_INPUT),
5689 HDA_CODEC_MUTE("Aux-In Playback Switch", 0x07, 0x06, HDA_INPUT),
5690 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5691 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
5692 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
5693 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x11, 1, 0x0, HDA_OUTPUT),
5697 static struct hda_bind_ctls alc260_dc7600_bind_master_vol = {
5698 .ops = &snd_hda_bind_vol,
5700 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_OUTPUT),
5701 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_OUTPUT),
5702 HDA_COMPOSE_AMP_VAL(0x0a, 3, 0, HDA_OUTPUT),
5707 static struct hda_bind_ctls alc260_dc7600_bind_switch = {
5708 .ops = &snd_hda_bind_sw,
5710 HDA_COMPOSE_AMP_VAL(0x11, 3, 0, HDA_OUTPUT),
5711 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
5716 static struct snd_kcontrol_new alc260_hp_dc7600_mixer[] = {
5717 HDA_BIND_VOL("Master Playback Volume", &alc260_dc7600_bind_master_vol),
5718 HDA_BIND_SW("LineOut Playback Switch", &alc260_dc7600_bind_switch),
5719 HDA_CODEC_MUTE("Speaker Playback Switch", 0x0f, 0x0, HDA_OUTPUT),
5720 HDA_CODEC_MUTE("Headphone Playback Switch", 0x10, 0x0, HDA_OUTPUT),
5724 static struct hda_verb alc260_hp_3013_unsol_verbs[] = {
5725 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
5729 static void alc260_hp_3013_automute(struct hda_codec *codec)
5731 struct alc_spec *spec = codec->spec;
5733 spec->jack_present = snd_hda_jack_detect(codec, 0x15);
5734 alc260_hp_master_update(codec, 0x15, 0x10, 0x11);
5737 static void alc260_hp_3013_unsol_event(struct hda_codec *codec,
5740 if ((res >> 26) == ALC880_HP_EVENT)
5741 alc260_hp_3013_automute(codec);
5744 static void alc260_hp_3012_automute(struct hda_codec *codec)
5746 unsigned int bits = snd_hda_jack_detect(codec, 0x10) ? 0 : PIN_OUT;
5748 snd_hda_codec_write(codec, 0x0f, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5750 snd_hda_codec_write(codec, 0x11, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5752 snd_hda_codec_write(codec, 0x15, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5756 static void alc260_hp_3012_unsol_event(struct hda_codec *codec,
5759 if ((res >> 26) == ALC880_HP_EVENT)
5760 alc260_hp_3012_automute(codec);
5763 /* Fujitsu S702x series laptops. ALC260 pin usage: Mic/Line jack = 0x12,
5764 * HP jack = 0x14, CD audio = 0x16, internal speaker = 0x10.
5766 static struct snd_kcontrol_new alc260_fujitsu_mixer[] = {
5767 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5768 HDA_BIND_MUTE("Headphone Playback Switch", 0x08, 2, HDA_INPUT),
5769 ALC_PIN_MODE("Headphone Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5770 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5771 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5772 HDA_CODEC_VOLUME("Mic/Line Playback Volume", 0x07, 0x0, HDA_INPUT),
5773 HDA_CODEC_MUTE("Mic/Line Playback Switch", 0x07, 0x0, HDA_INPUT),
5774 ALC_PIN_MODE("Mic/Line Jack Mode", 0x12, ALC_PIN_DIR_IN),
5775 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x09, 0x0, HDA_OUTPUT),
5776 HDA_BIND_MUTE("Speaker Playback Switch", 0x09, 2, HDA_INPUT),
5780 /* Mixer for Acer TravelMate(/Extensa/Aspire) notebooks. Note that current
5781 * versions of the ALC260 don't act on requests to enable mic bias from NID
5782 * 0x0f (used to drive the headphone jack in these laptops). The ALC260
5783 * datasheet doesn't mention this restriction. At this stage it's not clear
5784 * whether this behaviour is intentional or is a hardware bug in chip
5785 * revisions available in early 2006. Therefore for now allow the
5786 * "Headphone Jack Mode" control to span all choices, but if it turns out
5787 * that the lack of mic bias for this NID is intentional we could change the
5788 * mode from ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
5790 * In addition, Acer TravelMate(/Extensa/Aspire) notebooks in early 2006
5791 * don't appear to make the mic bias available from the "line" jack, even
5792 * though the NID used for this jack (0x14) can supply it. The theory is
5793 * that perhaps Acer have included blocking capacitors between the ALC260
5794 * and the output jack. If this turns out to be the case for all such
5795 * models the "Line Jack Mode" mode could be changed from ALC_PIN_DIR_INOUT
5796 * to ALC_PIN_DIR_INOUT_NOMICBIAS.
5798 * The C20x Tablet series have a mono internal speaker which is controlled
5799 * via the chip's Mono sum widget and pin complex, so include the necessary
5800 * controls for such models. On models without a "mono speaker" the control
5801 * won't do anything.
5803 static struct snd_kcontrol_new alc260_acer_mixer[] = {
5804 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5805 HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5806 ALC_PIN_MODE("Headphone Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5807 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0a, 1, 0x0,
5809 HDA_BIND_MUTE_MONO("Speaker Playback Switch", 0x0a, 1, 2,
5811 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5812 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5813 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5814 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5815 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5816 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5817 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5818 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5822 /* Maxdata Favorit 100XS: one output and one input (0x12) jack
5824 static struct snd_kcontrol_new alc260_favorit100_mixer[] = {
5825 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5826 HDA_BIND_MUTE("Master Playback Switch", 0x08, 2, HDA_INPUT),
5827 ALC_PIN_MODE("Output Jack Mode", 0x0f, ALC_PIN_DIR_INOUT),
5828 HDA_CODEC_VOLUME("Line/Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5829 HDA_CODEC_MUTE("Line/Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5830 ALC_PIN_MODE("Line/Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5834 /* Packard bell V7900 ALC260 pin usage: HP = 0x0f, Mic jack = 0x12,
5835 * Line In jack = 0x14, CD audio = 0x16, pc beep = 0x17.
5837 static struct snd_kcontrol_new alc260_will_mixer[] = {
5838 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5839 HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5840 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5841 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5842 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5843 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5844 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5845 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5846 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
5847 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
5851 /* Replacer 672V ALC260 pin usage: Mic jack = 0x12,
5852 * Line In jack = 0x14, ATAPI Mic = 0x13, speaker = 0x0f.
5854 static struct snd_kcontrol_new alc260_replacer_672v_mixer[] = {
5855 HDA_CODEC_VOLUME("Master Playback Volume", 0x08, 0x0, HDA_OUTPUT),
5856 HDA_BIND_MUTE("Master Playback Switch", 0x08, 0x2, HDA_INPUT),
5857 HDA_CODEC_VOLUME("Mic Playback Volume", 0x07, 0x0, HDA_INPUT),
5858 HDA_CODEC_MUTE("Mic Playback Switch", 0x07, 0x0, HDA_INPUT),
5859 ALC_PIN_MODE("Mic Jack Mode", 0x12, ALC_PIN_DIR_IN),
5860 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x07, 0x1, HDA_INPUT),
5861 HDA_CODEC_MUTE("ATATI Mic Playback Switch", 0x07, 0x1, HDA_INPUT),
5862 HDA_CODEC_VOLUME("Line Playback Volume", 0x07, 0x02, HDA_INPUT),
5863 HDA_CODEC_MUTE("Line Playback Switch", 0x07, 0x02, HDA_INPUT),
5864 ALC_PIN_MODE("Line Jack Mode", 0x14, ALC_PIN_DIR_INOUT),
5869 * initialization verbs
5871 static struct hda_verb alc260_init_verbs[] = {
5872 /* Line In pin widget for input */
5873 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5874 /* CD pin widget for input */
5875 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
5876 /* Mic1 (rear panel) pin widget for input and vref at 80% */
5877 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5878 /* Mic2 (front panel) pin widget for input and vref at 80% */
5879 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
5880 /* LINE-2 is used for line-out in rear */
5881 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5882 /* select line-out */
5883 {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
5885 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5887 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
5889 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
5890 /* mute capture amp left and right */
5891 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5892 /* set connection select to line in (default select for this ADC) */
5893 {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5894 /* mute capture amp left and right */
5895 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
5896 /* set connection select to line in (default select for this ADC) */
5897 {0x05, AC_VERB_SET_CONNECT_SEL, 0x02},
5898 /* set vol=0 Line-Out mixer amp left and right */
5899 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5900 /* unmute pin widget amp left and right (no gain on this amp) */
5901 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5902 /* set vol=0 HP mixer amp left and right */
5903 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5904 /* unmute pin widget amp left and right (no gain on this amp) */
5905 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5906 /* set vol=0 Mono mixer amp left and right */
5907 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
5908 /* unmute pin widget amp left and right (no gain on this amp) */
5909 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5910 /* unmute LINE-2 out pin */
5911 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
5912 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5915 /* mute analog inputs */
5916 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5917 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5918 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5919 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5920 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5921 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5922 /* mute Front out path */
5923 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5924 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5925 /* mute Headphone out path */
5926 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5927 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5928 /* mute Mono out path */
5929 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5930 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5934 #if 0 /* should be identical with alc260_init_verbs? */
5935 static struct hda_verb alc260_hp_init_verbs[] = {
5936 /* Headphone and output */
5937 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5939 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5940 /* Mic1 (rear panel) pin widget for input and vref at 80% */
5941 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5942 /* Mic2 (front panel) pin widget for input and vref at 80% */
5943 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5944 /* Line In pin widget for input */
5945 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5946 /* Line-2 pin widget for output */
5947 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5948 /* CD pin widget for input */
5949 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5950 /* unmute amp left and right */
5951 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
5952 /* set connection select to line in (default select for this ADC) */
5953 {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
5954 /* unmute Line-Out mixer amp left and right (volume = 0) */
5955 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5956 /* mute pin widget amp left and right (no gain on this amp) */
5957 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5958 /* unmute HP mixer amp left and right (volume = 0) */
5959 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
5960 /* mute pin widget amp left and right (no gain on this amp) */
5961 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
5962 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
5965 /* mute analog inputs */
5966 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
5967 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
5968 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
5969 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
5970 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
5971 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
5972 /* Unmute Front out path */
5973 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5974 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5975 /* Unmute Headphone out path */
5976 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5977 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5978 /* Unmute Mono out path */
5979 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
5980 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
5985 static struct hda_verb alc260_hp_3013_init_verbs[] = {
5986 /* Line out and output */
5987 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5989 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
5990 /* Mic1 (rear panel) pin widget for input and vref at 80% */
5991 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5992 /* Mic2 (front panel) pin widget for input and vref at 80% */
5993 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
5994 /* Line In pin widget for input */
5995 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
5996 /* Headphone pin widget for output */
5997 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
5998 /* CD pin widget for input */
5999 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
6000 /* unmute amp left and right */
6001 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000},
6002 /* set connection select to line in (default select for this ADC) */
6003 {0x04, AC_VERB_SET_CONNECT_SEL, 0x02},
6004 /* unmute Line-Out mixer amp left and right (volume = 0) */
6005 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
6006 /* mute pin widget amp left and right (no gain on this amp) */
6007 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
6008 /* unmute HP mixer amp left and right (volume = 0) */
6009 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
6010 /* mute pin widget amp left and right (no gain on this amp) */
6011 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
6012 /* Amp Indexes: CD = 0x04, Line In 1 = 0x02, Mic 1 = 0x00 &
6015 /* mute analog inputs */
6016 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6017 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6018 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
6019 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
6020 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
6021 /* Amp Indexes: DAC = 0x01 & mixer = 0x00 */
6022 /* Unmute Front out path */
6023 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
6024 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
6025 /* Unmute Headphone out path */
6026 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
6027 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
6028 /* Unmute Mono out path */
6029 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
6030 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
6034 /* Initialisation sequence for ALC260 as configured in Fujitsu S702x
6035 * laptops. ALC260 pin usage: Mic/Line jack = 0x12, HP jack = 0x14, CD
6036 * audio = 0x16, internal speaker = 0x10.
6038 static struct hda_verb alc260_fujitsu_init_verbs[] = {
6039 /* Disable all GPIOs */
6040 {0x01, AC_VERB_SET_GPIO_MASK, 0},
6041 /* Internal speaker is connected to headphone pin */
6042 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6043 /* Headphone/Line-out jack connects to Line1 pin; make it an output */
6044 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6045 /* Mic/Line-in jack is connected to mic1 pin, so make it an input */
6046 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
6047 /* Ensure all other unused pins are disabled and muted. */
6048 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6049 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6050 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6051 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6052 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6053 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6054 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6055 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6057 /* Disable digital (SPDIF) pins */
6058 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6059 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6061 /* Ensure Line1 pin widget takes its input from the OUT1 sum bus
6062 * when acting as an output.
6064 {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6066 /* Start with output sum widgets muted and their output gains at min */
6067 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6068 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6069 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6070 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6071 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6072 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6073 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6074 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6075 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6077 /* Unmute HP pin widget amp left and right (no equiv mixer ctrl) */
6078 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6079 /* Unmute Line1 pin widget output buffer since it starts as an output.
6080 * If the pin mode is changed by the user the pin mode control will
6081 * take care of enabling the pin's input/output buffers as needed.
6082 * Therefore there's no need to enable the input buffer at this
6085 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6086 /* Unmute input buffer of pin widget used for Line-in (no equiv
6089 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6091 /* Mute capture amp left and right */
6092 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6093 /* Set ADC connection select to match default mixer setting - line
6096 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6098 /* Do the same for the second ADC: mute capture input amp and
6099 * set ADC connection to line in (on mic1 pin)
6101 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6102 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6104 /* Mute all inputs to mixer widget (even unconnected ones) */
6105 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6106 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6107 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6108 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6109 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6110 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6111 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6112 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6117 /* Initialisation sequence for ALC260 as configured in Acer TravelMate and
6118 * similar laptops (adapted from Fujitsu init verbs).
6120 static struct hda_verb alc260_acer_init_verbs[] = {
6121 /* On TravelMate laptops, GPIO 0 enables the internal speaker and
6122 * the headphone jack. Turn this on and rely on the standard mute
6123 * methods whenever the user wants to turn these outputs off.
6125 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
6126 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
6127 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
6128 /* Internal speaker/Headphone jack is connected to Line-out pin */
6129 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6130 /* Internal microphone/Mic jack is connected to Mic1 pin */
6131 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
6132 /* Line In jack is connected to Line1 pin */
6133 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
6134 /* Some Acers (eg: C20x Tablets) use Mono pin for internal speaker */
6135 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6136 /* Ensure all other unused pins are disabled and muted. */
6137 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6138 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6139 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6140 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6141 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6142 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6143 /* Disable digital (SPDIF) pins */
6144 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6145 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6147 /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
6148 * bus when acting as outputs.
6150 {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6151 {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6153 /* Start with output sum widgets muted and their output gains at min */
6154 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6155 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6156 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6157 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6158 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6159 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6160 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6161 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6162 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6164 /* Unmute Line-out pin widget amp left and right
6165 * (no equiv mixer ctrl)
6167 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6168 /* Unmute mono pin widget amp output (no equiv mixer ctrl) */
6169 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6170 /* Unmute Mic1 and Line1 pin widget input buffers since they start as
6171 * inputs. If the pin mode is changed by the user the pin mode control
6172 * will take care of enabling the pin's input/output buffers as needed.
6173 * Therefore there's no need to enable the input buffer at this
6176 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6177 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6179 /* Mute capture amp left and right */
6180 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6181 /* Set ADC connection select to match default mixer setting - mic
6184 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6186 /* Do similar with the second ADC: mute capture input amp and
6187 * set ADC connection to mic to match ALSA's default state.
6189 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6190 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6192 /* Mute all inputs to mixer widget (even unconnected ones) */
6193 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6194 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6195 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6196 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6197 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6198 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6199 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6200 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6205 /* Initialisation sequence for Maxdata Favorit 100XS
6206 * (adapted from Acer init verbs).
6208 static struct hda_verb alc260_favorit100_init_verbs[] = {
6209 /* GPIO 0 enables the output jack.
6210 * Turn this on and rely on the standard mute
6211 * methods whenever the user wants to turn these outputs off.
6213 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
6214 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
6215 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
6216 /* Line/Mic input jack is connected to Mic1 pin */
6217 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
6218 /* Ensure all other unused pins are disabled and muted. */
6219 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6220 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6221 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6222 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6223 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6224 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6225 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6226 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6227 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6228 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6229 /* Disable digital (SPDIF) pins */
6230 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6231 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6233 /* Ensure Mic1 and Line1 pin widgets take input from the OUT1 sum
6234 * bus when acting as outputs.
6236 {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6237 {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6239 /* Start with output sum widgets muted and their output gains at min */
6240 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6241 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6242 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6243 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6244 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6245 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6246 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6247 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6248 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6250 /* Unmute Line-out pin widget amp left and right
6251 * (no equiv mixer ctrl)
6253 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6254 /* Unmute Mic1 and Line1 pin widget input buffers since they start as
6255 * inputs. If the pin mode is changed by the user the pin mode control
6256 * will take care of enabling the pin's input/output buffers as needed.
6257 * Therefore there's no need to enable the input buffer at this
6260 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6262 /* Mute capture amp left and right */
6263 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6264 /* Set ADC connection select to match default mixer setting - mic
6267 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6269 /* Do similar with the second ADC: mute capture input amp and
6270 * set ADC connection to mic to match ALSA's default state.
6272 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6273 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6275 /* Mute all inputs to mixer widget (even unconnected ones) */
6276 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6277 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6278 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6279 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6280 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6281 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6282 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6283 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6288 static struct hda_verb alc260_will_verbs[] = {
6289 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6290 {0x0b, AC_VERB_SET_CONNECT_SEL, 0x00},
6291 {0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
6292 {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
6293 {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
6294 {0x1a, AC_VERB_SET_PROC_COEF, 0x3040},
6298 static struct hda_verb alc260_replacer_672v_verbs[] = {
6299 {0x0f, AC_VERB_SET_EAPD_BTLENABLE, 0x02},
6300 {0x1a, AC_VERB_SET_COEF_INDEX, 0x07},
6301 {0x1a, AC_VERB_SET_PROC_COEF, 0x3050},
6303 {0x01, AC_VERB_SET_GPIO_MASK, 0x01},
6304 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
6305 {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
6307 {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6311 /* toggle speaker-output according to the hp-jack state */
6312 static void alc260_replacer_672v_automute(struct hda_codec *codec)
6314 unsigned int present;
6316 /* speaker --> GPIO Data 0, hp or spdif --> GPIO data 1 */
6317 present = snd_hda_jack_detect(codec, 0x0f);
6319 snd_hda_codec_write_cache(codec, 0x01, 0,
6320 AC_VERB_SET_GPIO_DATA, 1);
6321 snd_hda_codec_write_cache(codec, 0x0f, 0,
6322 AC_VERB_SET_PIN_WIDGET_CONTROL,
6325 snd_hda_codec_write_cache(codec, 0x01, 0,
6326 AC_VERB_SET_GPIO_DATA, 0);
6327 snd_hda_codec_write_cache(codec, 0x0f, 0,
6328 AC_VERB_SET_PIN_WIDGET_CONTROL,
6333 static void alc260_replacer_672v_unsol_event(struct hda_codec *codec,
6336 if ((res >> 26) == ALC880_HP_EVENT)
6337 alc260_replacer_672v_automute(codec);
6340 static struct hda_verb alc260_hp_dc7600_verbs[] = {
6341 {0x05, AC_VERB_SET_CONNECT_SEL, 0x01},
6342 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
6343 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6344 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
6345 {0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6346 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6347 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
6348 {0x10, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6349 {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6350 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
6354 /* Test configuration for debugging, modelled after the ALC880 test
6357 #ifdef CONFIG_SND_DEBUG
6358 static hda_nid_t alc260_test_dac_nids[1] = {
6361 static hda_nid_t alc260_test_adc_nids[2] = {
6364 /* For testing the ALC260, each input MUX needs its own definition since
6365 * the signal assignments are different. This assumes that the first ADC
6368 static struct hda_input_mux alc260_test_capture_sources[2] = {
6372 { "MIC1 pin", 0x0 },
6373 { "MIC2 pin", 0x1 },
6374 { "LINE1 pin", 0x2 },
6375 { "LINE2 pin", 0x3 },
6377 { "LINE-OUT pin", 0x5 },
6378 { "HP-OUT pin", 0x6 },
6384 { "MIC1 pin", 0x0 },
6385 { "MIC2 pin", 0x1 },
6386 { "LINE1 pin", 0x2 },
6387 { "LINE2 pin", 0x3 },
6390 { "LINE-OUT pin", 0x6 },
6391 { "HP-OUT pin", 0x7 },
6395 static struct snd_kcontrol_new alc260_test_mixer[] = {
6396 /* Output driver widgets */
6397 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0a, 1, 0x0, HDA_OUTPUT),
6398 HDA_BIND_MUTE_MONO("Mono Playback Switch", 0x0a, 1, 2, HDA_INPUT),
6399 HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x09, 0x0, HDA_OUTPUT),
6400 HDA_BIND_MUTE("LOUT2 Playback Switch", 0x09, 2, HDA_INPUT),
6401 HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x08, 0x0, HDA_OUTPUT),
6402 HDA_BIND_MUTE("LOUT1 Playback Switch", 0x08, 2, HDA_INPUT),
6404 /* Modes for retasking pin widgets
6405 * Note: the ALC260 doesn't seem to act on requests to enable mic
6406 * bias from NIDs 0x0f and 0x10. The ALC260 datasheet doesn't
6407 * mention this restriction. At this stage it's not clear whether
6408 * this behaviour is intentional or is a hardware bug in chip
6409 * revisions available at least up until early 2006. Therefore for
6410 * now allow the "HP-OUT" and "LINE-OUT" Mode controls to span all
6411 * choices, but if it turns out that the lack of mic bias for these
6412 * NIDs is intentional we could change their modes from
6413 * ALC_PIN_DIR_INOUT to ALC_PIN_DIR_INOUT_NOMICBIAS.
6415 ALC_PIN_MODE("HP-OUT pin mode", 0x10, ALC_PIN_DIR_INOUT),
6416 ALC_PIN_MODE("LINE-OUT pin mode", 0x0f, ALC_PIN_DIR_INOUT),
6417 ALC_PIN_MODE("LINE2 pin mode", 0x15, ALC_PIN_DIR_INOUT),
6418 ALC_PIN_MODE("LINE1 pin mode", 0x14, ALC_PIN_DIR_INOUT),
6419 ALC_PIN_MODE("MIC2 pin mode", 0x13, ALC_PIN_DIR_INOUT),
6420 ALC_PIN_MODE("MIC1 pin mode", 0x12, ALC_PIN_DIR_INOUT),
6422 /* Loopback mixer controls */
6423 HDA_CODEC_VOLUME("MIC1 Playback Volume", 0x07, 0x00, HDA_INPUT),
6424 HDA_CODEC_MUTE("MIC1 Playback Switch", 0x07, 0x00, HDA_INPUT),
6425 HDA_CODEC_VOLUME("MIC2 Playback Volume", 0x07, 0x01, HDA_INPUT),
6426 HDA_CODEC_MUTE("MIC2 Playback Switch", 0x07, 0x01, HDA_INPUT),
6427 HDA_CODEC_VOLUME("LINE1 Playback Volume", 0x07, 0x02, HDA_INPUT),
6428 HDA_CODEC_MUTE("LINE1 Playback Switch", 0x07, 0x02, HDA_INPUT),
6429 HDA_CODEC_VOLUME("LINE2 Playback Volume", 0x07, 0x03, HDA_INPUT),
6430 HDA_CODEC_MUTE("LINE2 Playback Switch", 0x07, 0x03, HDA_INPUT),
6431 HDA_CODEC_VOLUME("CD Playback Volume", 0x07, 0x04, HDA_INPUT),
6432 HDA_CODEC_MUTE("CD Playback Switch", 0x07, 0x04, HDA_INPUT),
6433 HDA_CODEC_VOLUME("LINE-OUT loopback Playback Volume", 0x07, 0x06, HDA_INPUT),
6434 HDA_CODEC_MUTE("LINE-OUT loopback Playback Switch", 0x07, 0x06, HDA_INPUT),
6435 HDA_CODEC_VOLUME("HP-OUT loopback Playback Volume", 0x07, 0x7, HDA_INPUT),
6436 HDA_CODEC_MUTE("HP-OUT loopback Playback Switch", 0x07, 0x7, HDA_INPUT),
6438 /* Controls for GPIO pins, assuming they are configured as outputs */
6439 ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
6440 ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
6441 ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
6442 ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
6444 /* Switches to allow the digital IO pins to be enabled. The datasheet
6445 * is ambigious as to which NID is which; testing on laptops which
6446 * make this output available should provide clarification.
6448 ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x03, 0x01),
6449 ALC_SPDIF_CTRL_SWITCH("SPDIF Capture Switch", 0x06, 0x01),
6451 /* A switch allowing EAPD to be enabled. Some laptops seem to use
6452 * this output to turn on an external amplifier.
6454 ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
6455 ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
6459 static struct hda_verb alc260_test_init_verbs[] = {
6460 /* Enable all GPIOs as outputs with an initial value of 0 */
6461 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x0f},
6462 {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
6463 {0x01, AC_VERB_SET_GPIO_MASK, 0x0f},
6465 /* Enable retasking pins as output, initially without power amp */
6466 {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6467 {0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6468 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6469 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6470 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6471 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
6473 /* Disable digital (SPDIF) pins initially, but users can enable
6474 * them via a mixer switch. In the case of SPDIF-out, this initverb
6475 * payload also sets the generation to 0, output to be in "consumer"
6476 * PCM format, copyright asserted, no pre-emphasis and no validity
6479 {0x03, AC_VERB_SET_DIGI_CONVERT_1, 0},
6480 {0x06, AC_VERB_SET_DIGI_CONVERT_1, 0},
6482 /* Ensure mic1, mic2, line1 and line2 pin widgets take input from the
6483 * OUT1 sum bus when acting as an output.
6485 {0x0b, AC_VERB_SET_CONNECT_SEL, 0},
6486 {0x0c, AC_VERB_SET_CONNECT_SEL, 0},
6487 {0x0d, AC_VERB_SET_CONNECT_SEL, 0},
6488 {0x0e, AC_VERB_SET_CONNECT_SEL, 0},
6490 /* Start with output sum widgets muted and their output gains at min */
6491 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6492 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6493 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6494 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6495 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6496 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6497 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6498 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6499 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6501 /* Unmute retasking pin widget output buffers since the default
6502 * state appears to be output. As the pin mode is changed by the
6503 * user the pin mode control will take care of enabling the pin's
6504 * input/output buffers as needed.
6506 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6507 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6508 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6509 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6510 {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6511 {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6512 /* Also unmute the mono-out pin widget */
6513 {0x11, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
6515 /* Mute capture amp left and right */
6516 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6517 /* Set ADC connection select to match default mixer setting (mic1
6520 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6522 /* Do the same for the second ADC: mute capture input amp and
6523 * set ADC connection to mic1 pin
6525 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6526 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6528 /* Mute all inputs to mixer widget (even unconnected ones) */
6529 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)}, /* mic1 pin */
6530 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)}, /* mic2 pin */
6531 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)}, /* line1 pin */
6532 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)}, /* line2 pin */
6533 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)}, /* CD pin */
6534 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)}, /* Beep-gen pin */
6535 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)}, /* Line-out pin */
6536 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)}, /* HP-pin pin */
6542 #define alc260_pcm_analog_playback alc880_pcm_analog_alt_playback
6543 #define alc260_pcm_analog_capture alc880_pcm_analog_capture
6545 #define alc260_pcm_digital_playback alc880_pcm_digital_playback
6546 #define alc260_pcm_digital_capture alc880_pcm_digital_capture
6549 * for BIOS auto-configuration
6552 static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid,
6553 const char *pfx, int *vol_bits)
6556 unsigned long vol_val, sw_val;
6559 if (nid >= 0x0f && nid < 0x11) {
6560 nid_vol = nid - 0x7;
6561 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6562 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6563 } else if (nid == 0x11) {
6564 nid_vol = nid - 0x7;
6565 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 2, 0, HDA_OUTPUT);
6566 sw_val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
6567 } else if (nid >= 0x12 && nid <= 0x15) {
6569 vol_val = HDA_COMPOSE_AMP_VAL(nid_vol, 3, 0, HDA_OUTPUT);
6570 sw_val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
6574 if (!(*vol_bits & (1 << nid_vol))) {
6575 /* first control for the volume widget */
6576 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, vol_val);
6579 *vol_bits |= (1 << nid_vol);
6581 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, sw_val);
6587 /* add playback controls from the parsed DAC table */
6588 static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec,
6589 const struct auto_pin_cfg *cfg)
6595 spec->multiout.num_dacs = 1;
6596 spec->multiout.dac_nids = spec->private_dac_nids;
6597 spec->multiout.dac_nids[0] = 0x02;
6599 nid = cfg->line_out_pins[0];
6602 if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
6604 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
6608 err = alc260_add_playback_controls(spec, nid, pfx, &vols);
6613 nid = cfg->speaker_pins[0];
6615 err = alc260_add_playback_controls(spec, nid, "Speaker", &vols);
6620 nid = cfg->hp_pins[0];
6622 err = alc260_add_playback_controls(spec, nid, "Headphone",
6630 /* create playback/capture controls for input pins */
6631 static int alc260_auto_create_input_ctls(struct hda_codec *codec,
6632 const struct auto_pin_cfg *cfg)
6634 return alc_auto_create_input_ctls(codec, cfg, 0x07, 0x04, 0x05);
6637 static void alc260_auto_set_output_and_unmute(struct hda_codec *codec,
6638 hda_nid_t nid, int pin_type,
6641 alc_set_pin_output(codec, nid, pin_type);
6642 /* need the manual connection? */
6644 int idx = nid - 0x12;
6645 snd_hda_codec_write(codec, idx + 0x0b, 0,
6646 AC_VERB_SET_CONNECT_SEL, sel_idx);
6650 static void alc260_auto_init_multi_out(struct hda_codec *codec)
6652 struct alc_spec *spec = codec->spec;
6655 nid = spec->autocfg.line_out_pins[0];
6657 int pin_type = get_pin_type(spec->autocfg.line_out_type);
6658 alc260_auto_set_output_and_unmute(codec, nid, pin_type, 0);
6661 nid = spec->autocfg.speaker_pins[0];
6663 alc260_auto_set_output_and_unmute(codec, nid, PIN_OUT, 0);
6665 nid = spec->autocfg.hp_pins[0];
6667 alc260_auto_set_output_and_unmute(codec, nid, PIN_HP, 0);
6670 #define ALC260_PIN_CD_NID 0x16
6671 static void alc260_auto_init_analog_input(struct hda_codec *codec)
6673 struct alc_spec *spec = codec->spec;
6676 for (i = 0; i < AUTO_PIN_LAST; i++) {
6677 hda_nid_t nid = spec->autocfg.input_pins[i];
6679 alc_set_input_pin(codec, nid, i);
6680 if (nid != ALC260_PIN_CD_NID &&
6681 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
6682 snd_hda_codec_write(codec, nid, 0,
6683 AC_VERB_SET_AMP_GAIN_MUTE,
6689 #define alc260_auto_init_input_src alc880_auto_init_input_src
6692 * generic initialization of ADC, input mixers and output mixers
6694 static struct hda_verb alc260_volume_init_verbs[] = {
6696 * Unmute ADC0-1 and set the default input to mic-in
6698 {0x04, AC_VERB_SET_CONNECT_SEL, 0x00},
6699 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6700 {0x05, AC_VERB_SET_CONNECT_SEL, 0x00},
6701 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6703 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
6705 * Note: PASD motherboards uses the Line In 2 as the input for
6706 * front panel mic (mic 2)
6708 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
6709 /* mute analog inputs */
6710 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
6711 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
6712 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
6713 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
6714 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
6717 * Set up output mixers (0x08 - 0x0a)
6719 /* set vol=0 to output mixers */
6720 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6721 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6722 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
6723 /* set up input amps for analog loopback */
6724 /* Amp Indices: DAC = 0, mixer = 1 */
6725 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6726 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6727 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6728 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6729 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
6730 {0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
6735 static int alc260_parse_auto_config(struct hda_codec *codec)
6737 struct alc_spec *spec = codec->spec;
6739 static hda_nid_t alc260_ignore[] = { 0x17, 0 };
6741 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
6745 err = alc260_auto_create_multi_out_ctls(spec, &spec->autocfg);
6748 if (!spec->kctls.list)
6749 return 0; /* can't find valid BIOS pin config */
6750 err = alc260_auto_create_input_ctls(codec, &spec->autocfg);
6754 spec->multiout.max_channels = 2;
6756 if (spec->autocfg.dig_outs)
6757 spec->multiout.dig_out_nid = ALC260_DIGOUT_NID;
6758 if (spec->kctls.list)
6759 add_mixer(spec, spec->kctls.list);
6761 add_verb(spec, alc260_volume_init_verbs);
6763 spec->num_mux_defs = 1;
6764 spec->input_mux = &spec->private_imux[0];
6766 alc_ssid_check(codec, 0x10, 0x15, 0x0f, 0);
6771 /* additional initialization for auto-configuration model */
6772 static void alc260_auto_init(struct hda_codec *codec)
6774 struct alc_spec *spec = codec->spec;
6775 alc260_auto_init_multi_out(codec);
6776 alc260_auto_init_analog_input(codec);
6777 alc260_auto_init_input_src(codec);
6778 alc_auto_init_digital(codec);
6779 if (spec->unsol_event)
6780 alc_inithook(codec);
6783 #ifdef CONFIG_SND_HDA_POWER_SAVE
6784 static struct hda_amp_list alc260_loopbacks[] = {
6785 { 0x07, HDA_INPUT, 0 },
6786 { 0x07, HDA_INPUT, 1 },
6787 { 0x07, HDA_INPUT, 2 },
6788 { 0x07, HDA_INPUT, 3 },
6789 { 0x07, HDA_INPUT, 4 },
6801 static struct alc_pincfg alc260_hp_dc5750_pinfix[] = {
6802 { 0x11, 0x90130110 }, /* speaker */
6806 static const struct alc_fixup alc260_fixups[] = {
6807 [PINFIX_HP_DC5750] = {
6808 .pins = alc260_hp_dc5750_pinfix
6812 static struct snd_pci_quirk alc260_fixup_tbl[] = {
6813 SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", PINFIX_HP_DC5750),
6818 * ALC260 configurations
6820 static const char *alc260_models[ALC260_MODEL_LAST] = {
6821 [ALC260_BASIC] = "basic",
6823 [ALC260_HP_3013] = "hp-3013",
6824 [ALC260_HP_DC7600] = "hp-dc7600",
6825 [ALC260_FUJITSU_S702X] = "fujitsu",
6826 [ALC260_ACER] = "acer",
6827 [ALC260_WILL] = "will",
6828 [ALC260_REPLACER_672V] = "replacer",
6829 [ALC260_FAVORIT100] = "favorit100",
6830 #ifdef CONFIG_SND_DEBUG
6831 [ALC260_TEST] = "test",
6833 [ALC260_AUTO] = "auto",
6836 static struct snd_pci_quirk alc260_cfg_tbl[] = {
6837 SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_ACER),
6838 SND_PCI_QUIRK(0x1025, 0x007f, "Acer", ALC260_WILL),
6839 SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_ACER),
6840 SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FAVORIT100),
6841 SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013),
6842 SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_AUTO), /* no quirk */
6843 SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013),
6844 SND_PCI_QUIRK(0x103c, 0x3011, "HP", ALC260_HP_3013),
6845 SND_PCI_QUIRK(0x103c, 0x3012, "HP", ALC260_HP_DC7600),
6846 SND_PCI_QUIRK(0x103c, 0x3013, "HP", ALC260_HP_3013),
6847 SND_PCI_QUIRK(0x103c, 0x3014, "HP", ALC260_HP),
6848 SND_PCI_QUIRK(0x103c, 0x3015, "HP", ALC260_HP),
6849 SND_PCI_QUIRK(0x103c, 0x3016, "HP", ALC260_HP),
6850 SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_BASIC),
6851 SND_PCI_QUIRK(0x104d, 0x81cc, "Sony VAIO", ALC260_BASIC),
6852 SND_PCI_QUIRK(0x104d, 0x81cd, "Sony VAIO", ALC260_BASIC),
6853 SND_PCI_QUIRK(0x10cf, 0x1326, "Fujitsu S702X", ALC260_FUJITSU_S702X),
6854 SND_PCI_QUIRK(0x152d, 0x0729, "CTL U553W", ALC260_BASIC),
6855 SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_REPLACER_672V),
6856 SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_WILL),
6860 static struct alc_config_preset alc260_presets[] = {
6862 .mixers = { alc260_base_output_mixer,
6863 alc260_input_mixer },
6864 .init_verbs = { alc260_init_verbs },
6865 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6866 .dac_nids = alc260_dac_nids,
6867 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6868 .adc_nids = alc260_dual_adc_nids,
6869 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6870 .channel_mode = alc260_modes,
6871 .input_mux = &alc260_capture_source,
6874 .mixers = { alc260_hp_output_mixer,
6875 alc260_input_mixer },
6876 .init_verbs = { alc260_init_verbs,
6877 alc260_hp_unsol_verbs },
6878 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6879 .dac_nids = alc260_dac_nids,
6880 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6881 .adc_nids = alc260_adc_nids_alt,
6882 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6883 .channel_mode = alc260_modes,
6884 .input_mux = &alc260_capture_source,
6885 .unsol_event = alc260_hp_unsol_event,
6886 .init_hook = alc260_hp_automute,
6888 [ALC260_HP_DC7600] = {
6889 .mixers = { alc260_hp_dc7600_mixer,
6890 alc260_input_mixer },
6891 .init_verbs = { alc260_init_verbs,
6892 alc260_hp_dc7600_verbs },
6893 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6894 .dac_nids = alc260_dac_nids,
6895 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6896 .adc_nids = alc260_adc_nids_alt,
6897 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6898 .channel_mode = alc260_modes,
6899 .input_mux = &alc260_capture_source,
6900 .unsol_event = alc260_hp_3012_unsol_event,
6901 .init_hook = alc260_hp_3012_automute,
6903 [ALC260_HP_3013] = {
6904 .mixers = { alc260_hp_3013_mixer,
6905 alc260_input_mixer },
6906 .init_verbs = { alc260_hp_3013_init_verbs,
6907 alc260_hp_3013_unsol_verbs },
6908 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6909 .dac_nids = alc260_dac_nids,
6910 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt),
6911 .adc_nids = alc260_adc_nids_alt,
6912 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6913 .channel_mode = alc260_modes,
6914 .input_mux = &alc260_capture_source,
6915 .unsol_event = alc260_hp_3013_unsol_event,
6916 .init_hook = alc260_hp_3013_automute,
6918 [ALC260_FUJITSU_S702X] = {
6919 .mixers = { alc260_fujitsu_mixer },
6920 .init_verbs = { alc260_fujitsu_init_verbs },
6921 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6922 .dac_nids = alc260_dac_nids,
6923 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6924 .adc_nids = alc260_dual_adc_nids,
6925 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6926 .channel_mode = alc260_modes,
6927 .num_mux_defs = ARRAY_SIZE(alc260_fujitsu_capture_sources),
6928 .input_mux = alc260_fujitsu_capture_sources,
6931 .mixers = { alc260_acer_mixer },
6932 .init_verbs = { alc260_acer_init_verbs },
6933 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6934 .dac_nids = alc260_dac_nids,
6935 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6936 .adc_nids = alc260_dual_adc_nids,
6937 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6938 .channel_mode = alc260_modes,
6939 .num_mux_defs = ARRAY_SIZE(alc260_acer_capture_sources),
6940 .input_mux = alc260_acer_capture_sources,
6942 [ALC260_FAVORIT100] = {
6943 .mixers = { alc260_favorit100_mixer },
6944 .init_verbs = { alc260_favorit100_init_verbs },
6945 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6946 .dac_nids = alc260_dac_nids,
6947 .num_adc_nids = ARRAY_SIZE(alc260_dual_adc_nids),
6948 .adc_nids = alc260_dual_adc_nids,
6949 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6950 .channel_mode = alc260_modes,
6951 .num_mux_defs = ARRAY_SIZE(alc260_favorit100_capture_sources),
6952 .input_mux = alc260_favorit100_capture_sources,
6955 .mixers = { alc260_will_mixer },
6956 .init_verbs = { alc260_init_verbs, alc260_will_verbs },
6957 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6958 .dac_nids = alc260_dac_nids,
6959 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6960 .adc_nids = alc260_adc_nids,
6961 .dig_out_nid = ALC260_DIGOUT_NID,
6962 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6963 .channel_mode = alc260_modes,
6964 .input_mux = &alc260_capture_source,
6966 [ALC260_REPLACER_672V] = {
6967 .mixers = { alc260_replacer_672v_mixer },
6968 .init_verbs = { alc260_init_verbs, alc260_replacer_672v_verbs },
6969 .num_dacs = ARRAY_SIZE(alc260_dac_nids),
6970 .dac_nids = alc260_dac_nids,
6971 .num_adc_nids = ARRAY_SIZE(alc260_adc_nids),
6972 .adc_nids = alc260_adc_nids,
6973 .dig_out_nid = ALC260_DIGOUT_NID,
6974 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6975 .channel_mode = alc260_modes,
6976 .input_mux = &alc260_capture_source,
6977 .unsol_event = alc260_replacer_672v_unsol_event,
6978 .init_hook = alc260_replacer_672v_automute,
6980 #ifdef CONFIG_SND_DEBUG
6982 .mixers = { alc260_test_mixer },
6983 .init_verbs = { alc260_test_init_verbs },
6984 .num_dacs = ARRAY_SIZE(alc260_test_dac_nids),
6985 .dac_nids = alc260_test_dac_nids,
6986 .num_adc_nids = ARRAY_SIZE(alc260_test_adc_nids),
6987 .adc_nids = alc260_test_adc_nids,
6988 .num_channel_mode = ARRAY_SIZE(alc260_modes),
6989 .channel_mode = alc260_modes,
6990 .num_mux_defs = ARRAY_SIZE(alc260_test_capture_sources),
6991 .input_mux = alc260_test_capture_sources,
6996 static int patch_alc260(struct hda_codec *codec)
6998 struct alc_spec *spec;
6999 int err, board_config;
7001 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
7007 board_config = snd_hda_check_board_config(codec, ALC260_MODEL_LAST,
7010 if (board_config < 0) {
7011 snd_printd(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
7013 board_config = ALC260_AUTO;
7016 if (board_config == ALC260_AUTO)
7017 alc_pick_fixup(codec, alc260_fixup_tbl, alc260_fixups, 1);
7019 if (board_config == ALC260_AUTO) {
7020 /* automatic parse from the BIOS config */
7021 err = alc260_parse_auto_config(codec);
7027 "hda_codec: Cannot set up configuration "
7028 "from BIOS. Using base mode...\n");
7029 board_config = ALC260_BASIC;
7033 err = snd_hda_attach_beep_device(codec, 0x1);
7039 if (board_config != ALC260_AUTO)
7040 setup_preset(codec, &alc260_presets[board_config]);
7042 spec->stream_analog_playback = &alc260_pcm_analog_playback;
7043 spec->stream_analog_capture = &alc260_pcm_analog_capture;
7045 spec->stream_digital_playback = &alc260_pcm_digital_playback;
7046 spec->stream_digital_capture = &alc260_pcm_digital_capture;
7048 if (!spec->adc_nids && spec->input_mux) {
7049 /* check whether NID 0x04 is valid */
7050 unsigned int wcap = get_wcaps(codec, 0x04);
7051 wcap = get_wcaps_type(wcap);
7053 if (wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
7054 spec->adc_nids = alc260_adc_nids_alt;
7055 spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids_alt);
7057 spec->adc_nids = alc260_adc_nids;
7058 spec->num_adc_nids = ARRAY_SIZE(alc260_adc_nids);
7061 set_capture_mixer(codec);
7062 set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
7064 if (board_config == ALC260_AUTO)
7065 alc_pick_fixup(codec, alc260_fixup_tbl, alc260_fixups, 0);
7067 spec->vmaster_nid = 0x08;
7069 codec->patch_ops = alc_patch_ops;
7070 if (board_config == ALC260_AUTO)
7071 spec->init_hook = alc260_auto_init;
7072 #ifdef CONFIG_SND_HDA_POWER_SAVE
7073 if (!spec->loopback.amplist)
7074 spec->loopback.amplist = alc260_loopbacks;
7082 * ALC882/883/885/888/889 support
7084 * ALC882 is almost identical with ALC880 but has cleaner and more flexible
7085 * configuration. Each pin widget can choose any input DACs and a mixer.
7086 * Each ADC is connected from a mixer of all inputs. This makes possible
7087 * 6-channel independent captures.
7089 * In addition, an independent DAC for the multi-playback (not used in this
7092 #define ALC882_DIGOUT_NID 0x06
7093 #define ALC882_DIGIN_NID 0x0a
7094 #define ALC883_DIGOUT_NID ALC882_DIGOUT_NID
7095 #define ALC883_DIGIN_NID ALC882_DIGIN_NID
7096 #define ALC1200_DIGOUT_NID 0x10
7099 static struct hda_channel_mode alc882_ch_modes[1] = {
7104 static hda_nid_t alc882_dac_nids[4] = {
7105 /* front, rear, clfe, rear_surr */
7106 0x02, 0x03, 0x04, 0x05
7108 #define alc883_dac_nids alc882_dac_nids
7111 #define alc882_adc_nids alc880_adc_nids
7112 #define alc882_adc_nids_alt alc880_adc_nids_alt
7113 #define alc883_adc_nids alc882_adc_nids_alt
7114 static hda_nid_t alc883_adc_nids_alt[1] = { 0x08 };
7115 static hda_nid_t alc883_adc_nids_rev[2] = { 0x09, 0x08 };
7116 #define alc889_adc_nids alc880_adc_nids
7118 static hda_nid_t alc882_capsrc_nids[3] = { 0x24, 0x23, 0x22 };
7119 static hda_nid_t alc882_capsrc_nids_alt[2] = { 0x23, 0x22 };
7120 #define alc883_capsrc_nids alc882_capsrc_nids_alt
7121 static hda_nid_t alc883_capsrc_nids_rev[2] = { 0x22, 0x23 };
7122 #define alc889_capsrc_nids alc882_capsrc_nids
7125 /* FIXME: should be a matrix-type input source selection */
7127 static struct hda_input_mux alc882_capture_source = {
7131 { "Front Mic", 0x1 },
7137 #define alc883_capture_source alc882_capture_source
7139 static struct hda_input_mux alc889_capture_source = {
7142 { "Front Mic", 0x0 },
7148 static struct hda_input_mux mb5_capture_source = {
7157 static struct hda_input_mux macmini3_capture_source = {
7165 static struct hda_input_mux alc883_3stack_6ch_intel = {
7169 { "Front Mic", 0x0 },
7175 static struct hda_input_mux alc883_lenovo_101e_capture_source = {
7183 static struct hda_input_mux alc883_lenovo_nb0763_capture_source = {
7193 static struct hda_input_mux alc883_fujitsu_pi2515_capture_source = {
7201 static struct hda_input_mux alc883_lenovo_sky_capture_source = {
7205 { "Front Mic", 0x1 },
7210 static struct hda_input_mux alc883_asus_eee1601_capture_source = {
7218 static struct hda_input_mux alc889A_mb31_capture_source = {
7222 /* Front Mic (0x01) unused */
7224 /* Line 2 (0x03) unused */
7225 /* CD (0x04) unused? */
7229 static struct hda_input_mux alc889A_imac91_capture_source = {
7233 { "Line", 0x2 }, /* Not sure! */
7240 static struct hda_channel_mode alc883_3ST_2ch_modes[1] = {
7247 static struct hda_verb alc882_3ST_ch2_init[] = {
7248 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7249 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7250 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7251 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7258 static struct hda_verb alc882_3ST_ch4_init[] = {
7259 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7260 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7261 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7262 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7263 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7270 static struct hda_verb alc882_3ST_ch6_init[] = {
7271 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7272 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7273 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7274 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7275 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7276 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7280 static struct hda_channel_mode alc882_3ST_6ch_modes[3] = {
7281 { 2, alc882_3ST_ch2_init },
7282 { 4, alc882_3ST_ch4_init },
7283 { 6, alc882_3ST_ch6_init },
7286 #define alc883_3ST_6ch_modes alc882_3ST_6ch_modes
7291 static struct hda_verb alc883_3ST_ch2_clevo_init[] = {
7292 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP },
7293 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7294 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7295 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7296 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7303 static struct hda_verb alc883_3ST_ch4_clevo_init[] = {
7304 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7305 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7306 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7307 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7308 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7309 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7316 static struct hda_verb alc883_3ST_ch6_clevo_init[] = {
7317 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7318 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7319 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7320 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7321 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7322 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7323 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7327 static struct hda_channel_mode alc883_3ST_6ch_clevo_modes[3] = {
7328 { 2, alc883_3ST_ch2_clevo_init },
7329 { 4, alc883_3ST_ch4_clevo_init },
7330 { 6, alc883_3ST_ch6_clevo_init },
7337 static struct hda_verb alc882_sixstack_ch6_init[] = {
7338 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7339 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7340 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7341 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7348 static struct hda_verb alc882_sixstack_ch8_init[] = {
7349 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7350 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7351 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7352 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7356 static struct hda_channel_mode alc882_sixstack_modes[2] = {
7357 { 6, alc882_sixstack_ch6_init },
7358 { 8, alc882_sixstack_ch8_init },
7362 /* Macbook Air 2,1 */
7364 static struct hda_channel_mode alc885_mba21_ch_modes[1] = {
7369 * macbook pro ALC885 can switch LineIn to LineOut without losing Mic
7375 static struct hda_verb alc885_mbp_ch2_init[] = {
7376 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7377 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7378 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7385 static struct hda_verb alc885_mbp_ch4_init[] = {
7386 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7387 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7388 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7389 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7390 { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7394 static struct hda_channel_mode alc885_mbp_4ch_modes[2] = {
7395 { 2, alc885_mbp_ch2_init },
7396 { 4, alc885_mbp_ch4_init },
7401 * Speakers/Woofer/HP = Front
7404 static struct hda_verb alc885_mb5_ch2_init[] = {
7405 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7406 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7412 * Speakers/HP = Front
7416 static struct hda_verb alc885_mb5_ch6_init[] = {
7417 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7418 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7419 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7423 static struct hda_channel_mode alc885_mb5_6ch_modes[2] = {
7424 { 2, alc885_mb5_ch2_init },
7425 { 6, alc885_mb5_ch6_init },
7428 #define alc885_macmini3_6ch_modes alc885_mb5_6ch_modes
7433 static struct hda_verb alc883_4ST_ch2_init[] = {
7434 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7435 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7436 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7437 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7438 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7439 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7446 static struct hda_verb alc883_4ST_ch4_init[] = {
7447 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7448 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7449 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7450 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7451 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7452 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7453 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7460 static struct hda_verb alc883_4ST_ch6_init[] = {
7461 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7462 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7463 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7464 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7465 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7466 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7467 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7468 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7475 static struct hda_verb alc883_4ST_ch8_init[] = {
7476 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7477 { 0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7478 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7479 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7480 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7481 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
7482 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7483 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7484 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7488 static struct hda_channel_mode alc883_4ST_8ch_modes[4] = {
7489 { 2, alc883_4ST_ch2_init },
7490 { 4, alc883_4ST_ch4_init },
7491 { 6, alc883_4ST_ch6_init },
7492 { 8, alc883_4ST_ch8_init },
7499 static struct hda_verb alc883_3ST_ch2_intel_init[] = {
7500 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7501 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7502 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7503 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7510 static struct hda_verb alc883_3ST_ch4_intel_init[] = {
7511 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
7512 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7513 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7514 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7515 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7522 static struct hda_verb alc883_3ST_ch6_intel_init[] = {
7523 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7524 { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7525 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 },
7526 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7527 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7528 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
7532 static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = {
7533 { 2, alc883_3ST_ch2_intel_init },
7534 { 4, alc883_3ST_ch4_intel_init },
7535 { 6, alc883_3ST_ch6_intel_init },
7541 static struct hda_verb alc889_ch2_intel_init[] = {
7542 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7543 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x00 },
7544 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x00 },
7545 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x00 },
7546 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7547 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7554 static struct hda_verb alc889_ch6_intel_init[] = {
7555 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7556 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7557 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7558 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7559 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
7560 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
7567 static struct hda_verb alc889_ch8_intel_init[] = {
7568 { 0x14, AC_VERB_SET_CONNECT_SEL, 0x00 },
7569 { 0x19, AC_VERB_SET_CONNECT_SEL, 0x01 },
7570 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x02 },
7571 { 0x17, AC_VERB_SET_CONNECT_SEL, 0x03 },
7572 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x03 },
7573 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7574 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
7578 static struct hda_channel_mode alc889_8ch_intel_modes[3] = {
7579 { 2, alc889_ch2_intel_init },
7580 { 6, alc889_ch6_intel_init },
7581 { 8, alc889_ch8_intel_init },
7587 static struct hda_verb alc883_sixstack_ch6_init[] = {
7588 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
7589 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7590 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7591 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7598 static struct hda_verb alc883_sixstack_ch8_init[] = {
7599 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7600 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7601 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7602 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
7606 static struct hda_channel_mode alc883_sixstack_modes[2] = {
7607 { 6, alc883_sixstack_ch6_init },
7608 { 8, alc883_sixstack_ch8_init },
7612 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
7613 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
7615 static struct snd_kcontrol_new alc882_base_mixer[] = {
7616 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7617 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7618 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
7619 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
7620 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
7621 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
7622 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
7623 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
7624 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
7625 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
7626 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7627 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7628 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7629 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7630 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7631 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7632 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7633 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7634 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7635 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7636 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7640 /* Macbook Air 2,1 same control for HP and internal Speaker */
7642 static struct snd_kcontrol_new alc885_mba21_mixer[] = {
7643 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7644 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_OUTPUT),
7649 static struct snd_kcontrol_new alc885_mbp3_mixer[] = {
7650 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7651 HDA_BIND_MUTE ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
7652 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7653 HDA_BIND_MUTE ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT),
7654 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7655 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7656 HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7657 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
7658 HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
7659 HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
7660 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
7664 static struct snd_kcontrol_new alc885_mb5_mixer[] = {
7665 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7666 HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7667 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7668 HDA_BIND_MUTE ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7669 HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7670 HDA_BIND_MUTE ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
7671 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7672 HDA_BIND_MUTE ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
7673 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
7674 HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
7675 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
7676 HDA_CODEC_MUTE ("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
7677 HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7678 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0x00, HDA_INPUT),
7682 static struct snd_kcontrol_new alc885_macmini3_mixer[] = {
7683 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7684 HDA_BIND_MUTE ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
7685 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
7686 HDA_BIND_MUTE ("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
7687 HDA_CODEC_VOLUME("LFE Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
7688 HDA_BIND_MUTE ("LFE Playback Switch", 0x0e, 0x02, HDA_INPUT),
7689 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0f, 0x00, HDA_OUTPUT),
7690 HDA_BIND_MUTE ("Headphone Playback Switch", 0x0f, 0x02, HDA_INPUT),
7691 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x07, HDA_INPUT),
7692 HDA_CODEC_MUTE ("Line Playback Switch", 0x0b, 0x07, HDA_INPUT),
7693 HDA_CODEC_VOLUME("Line Boost", 0x15, 0x00, HDA_INPUT),
7697 static struct snd_kcontrol_new alc885_imac91_mixer[] = {
7698 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
7699 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
7704 static struct snd_kcontrol_new alc882_w2jc_mixer[] = {
7705 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7706 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7707 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7708 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7709 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7710 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7711 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7712 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7713 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7717 static struct snd_kcontrol_new alc882_targa_mixer[] = {
7718 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7719 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7720 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
7721 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7722 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7723 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7724 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7725 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7726 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7727 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7728 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
7729 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
7730 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
7734 /* Pin assignment: Front=0x14, HP = 0x15, Front = 0x16, ???
7735 * Front Mic=0x18, Line In = 0x1a, Line In = 0x1b, CD = 0x1c
7737 static struct snd_kcontrol_new alc882_asus_a7j_mixer[] = {
7738 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7739 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
7740 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7741 HDA_CODEC_MUTE("Mobile Front Playback Switch", 0x16, 0x0, HDA_OUTPUT),
7742 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7743 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7744 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7745 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7746 HDA_CODEC_VOLUME("Mobile Line Playback Volume", 0x0b, 0x03, HDA_INPUT),
7747 HDA_CODEC_MUTE("Mobile Line Playback Switch", 0x0b, 0x03, HDA_INPUT),
7748 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7749 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7750 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7754 static struct snd_kcontrol_new alc882_asus_a7m_mixer[] = {
7755 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7756 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7757 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
7758 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
7759 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
7760 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
7761 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
7762 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
7763 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
7764 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
7768 static struct snd_kcontrol_new alc882_chmode_mixer[] = {
7770 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
7771 .name = "Channel Mode",
7772 .info = alc_ch_mode_info,
7773 .get = alc_ch_mode_get,
7774 .put = alc_ch_mode_put,
7779 static struct hda_verb alc882_base_init_verbs[] = {
7780 /* Front mixer: unmute input/output amp left and right (volume = 0) */
7781 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7782 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7784 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7785 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7787 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7788 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7790 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7791 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7793 /* Front Pin: output 0 (0x0c) */
7794 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7795 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7796 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7797 /* Rear Pin: output 1 (0x0d) */
7798 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7799 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7800 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
7801 /* CLFE Pin: output 2 (0x0e) */
7802 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7803 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7804 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7805 /* Side Pin: output 3 (0x0f) */
7806 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7807 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7808 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7809 /* Mic (rear) pin: input vref at 80% */
7810 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7811 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7812 /* Front Mic pin: input vref at 80% */
7813 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7814 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7815 /* Line In pin: input */
7816 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7817 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7818 /* Line-2 In: Headphone output (output 0 - 0x0c) */
7819 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7820 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7821 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
7822 /* CD pin widget for input */
7823 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7825 /* FIXME: use matrix-type input source selection */
7826 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7828 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7830 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7831 /* ADC2: mute amp left and right */
7832 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7833 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
7834 /* ADC3: mute amp left and right */
7835 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7836 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
7841 static struct hda_verb alc882_adc1_init_verbs[] = {
7842 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7843 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7844 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7845 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7846 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7847 /* ADC1: mute amp left and right */
7848 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7849 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
7853 static struct hda_verb alc882_eapd_verbs[] = {
7854 /* change to EAPD mode */
7855 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
7856 {0x20, AC_VERB_SET_PROC_COEF, 0x3060},
7860 static struct hda_verb alc889_eapd_verbs[] = {
7861 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
7862 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
7866 static struct hda_verb alc_hp15_unsol_verbs[] = {
7867 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
7868 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7872 static struct hda_verb alc885_init_verbs[] = {
7873 /* Front mixer: unmute input/output amp left and right (volume = 0) */
7874 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7875 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7877 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7878 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7880 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7881 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7883 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7884 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
7886 /* Front HP Pin: output 0 (0x0c) */
7887 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7888 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7889 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7890 /* Front Pin: output 0 (0x0c) */
7891 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7892 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7893 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
7894 /* Rear Pin: output 1 (0x0d) */
7895 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7896 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7897 {0x19, AC_VERB_SET_CONNECT_SEL, 0x01},
7898 /* CLFE Pin: output 2 (0x0e) */
7899 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7900 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7901 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
7902 /* Side Pin: output 3 (0x0f) */
7903 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7904 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7905 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
7906 /* Mic (rear) pin: input vref at 80% */
7907 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7908 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7909 /* Front Mic pin: input vref at 80% */
7910 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7911 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7912 /* Line In pin: input */
7913 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
7914 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7916 /* Mixer elements: 0x18, , 0x1a, 0x1b */
7918 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7920 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7922 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7923 /* ADC2: mute amp left and right */
7924 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7925 /* ADC3: mute amp left and right */
7926 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7931 static struct hda_verb alc885_init_input_verbs[] = {
7932 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7933 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
7934 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
7939 /* Unmute Selector 24h and set the default input to front mic */
7940 static struct hda_verb alc889_init_input_verbs[] = {
7941 {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
7942 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7947 #define alc883_init_verbs alc882_base_init_verbs
7950 static struct snd_kcontrol_new alc882_macpro_mixer[] = {
7951 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
7952 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
7953 HDA_CODEC_MUTE("Headphone Playback Switch", 0x18, 0x0, HDA_OUTPUT),
7954 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
7955 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
7956 /* FIXME: this looks suspicious...
7957 HDA_CODEC_VOLUME("Beep Playback Volume", 0x0b, 0x02, HDA_INPUT),
7958 HDA_CODEC_MUTE("Beep Playback Switch", 0x0b, 0x02, HDA_INPUT),
7963 static struct hda_verb alc882_macpro_init_verbs[] = {
7964 /* Front mixer: unmute input/output amp left and right (volume = 0) */
7965 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
7966 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
7967 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
7968 /* Front Pin: output 0 (0x0c) */
7969 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7970 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7971 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
7972 /* Front Mic pin: input vref at 80% */
7973 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
7974 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
7975 /* Speaker: output */
7976 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
7977 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7978 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x04},
7979 /* Headphone output (output 0 - 0x0c) */
7980 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
7981 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
7982 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
7984 /* FIXME: use matrix-type input source selection */
7985 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
7986 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
7987 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7988 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7989 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7990 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7992 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7993 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7994 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
7995 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
7997 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
7998 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
7999 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8000 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8001 /* ADC1: mute amp left and right */
8002 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8003 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
8004 /* ADC2: mute amp left and right */
8005 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8006 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8007 /* ADC3: mute amp left and right */
8008 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8009 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8015 static struct hda_verb alc885_mb5_init_verbs[] = {
8017 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8018 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8019 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8020 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8022 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8023 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8024 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8025 /* Surround mixer */
8026 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8027 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8028 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8030 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8031 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8032 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8034 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8035 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8036 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8037 /* Front Pin (0x0c) */
8038 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
8039 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8040 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8041 /* LFE Pin (0x0e) */
8042 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
8043 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8044 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
8046 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8047 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8048 {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
8049 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8050 /* Front Mic pin: input vref at 80% */
8051 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8052 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8054 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
8055 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8057 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0x1)},
8058 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0x7)},
8059 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0x4)},
8064 static struct hda_verb alc885_macmini3_init_verbs[] = {
8066 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8067 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8068 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8069 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8071 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8072 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8073 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8074 /* Surround mixer */
8075 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8076 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8077 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8079 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8080 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8081 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8083 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8084 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8085 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8086 /* Front Pin (0x0c) */
8087 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
8088 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8089 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8090 /* LFE Pin (0x0e) */
8091 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT | 0x01},
8092 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8093 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02},
8095 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8096 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8097 {0x14, AC_VERB_SET_CONNECT_SEL, 0x03},
8098 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8100 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
8101 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8103 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8104 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8105 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8106 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8111 static struct hda_verb alc885_mba21_init_verbs[] = {
8112 /*Internal and HP Speaker Mixer*/
8113 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8114 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8115 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8116 /*Internal Speaker Pin (0x0c)*/
8117 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
8118 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8119 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8120 /* HP Pin: output 0 (0x0e) */
8121 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
8122 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8123 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8124 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC880_HP_EVENT | AC_USRSP_EN)},
8125 /* Line in (is hp when jack connected)*/
8126 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
8127 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8133 /* Macbook Pro rev3 */
8134 static struct hda_verb alc885_mbp3_init_verbs[] = {
8135 /* Front mixer: unmute input/output amp left and right (volume = 0) */
8136 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8137 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8138 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8140 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8141 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8142 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8144 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8145 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8146 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8147 /* Front Pin: output 0 (0x0c) */
8148 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8149 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8150 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8151 /* HP Pin: output 0 (0x0e) */
8152 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
8153 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8154 {0x15, AC_VERB_SET_CONNECT_SEL, 0x02},
8155 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8156 /* Mic (rear) pin: input vref at 80% */
8157 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8158 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8159 /* Front Mic pin: input vref at 80% */
8160 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8161 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8162 /* Line In pin: use output 1 when in LineOut mode */
8163 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
8164 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8165 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
8167 /* FIXME: use matrix-type input source selection */
8168 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
8169 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
8170 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8171 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8172 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8173 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8175 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8176 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8177 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8178 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8180 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8181 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8182 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8183 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8184 /* ADC1: mute amp left and right */
8185 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8186 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
8187 /* ADC2: mute amp left and right */
8188 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8189 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8190 /* ADC3: mute amp left and right */
8191 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8192 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8198 static struct hda_verb alc885_imac91_init_verbs[] = {
8199 /* Internal Speaker Pin (0x0c) */
8200 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
8201 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8202 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8203 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, (PIN_OUT | AC_PINCTL_VREF_50) },
8204 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8205 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8207 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8208 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8209 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8210 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, (ALC880_HP_EVENT | AC_USRSP_EN)},
8212 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, AC_PINCTL_VREF_50},
8213 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8214 /* Front Mic pin: input vref at 80% */
8215 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8216 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8218 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8219 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8220 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8221 /* Line-Out mixer: unmute input/output amp left and right (volume = 0) */
8222 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8223 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8224 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
8225 /* 0x24 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
8226 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8227 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8228 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8229 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8230 /* 0x23 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
8231 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8232 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8233 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8234 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8235 /* 0x22 [Audio Mixer] wcaps 0x20010b: Stereo Amp-In */
8236 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8237 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
8238 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
8239 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
8240 /* 0x07 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
8241 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8242 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
8243 /* 0x08 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
8244 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8245 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8246 /* 0x09 [Audio Input] wcaps 0x10011b: Stereo Amp-In */
8247 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
8248 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8252 /* iMac 24 mixer. */
8253 static struct snd_kcontrol_new alc885_imac24_mixer[] = {
8254 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8255 HDA_CODEC_MUTE("Master Playback Switch", 0x0c, 0x00, HDA_INPUT),
8259 /* iMac 24 init verbs. */
8260 static struct hda_verb alc885_imac24_init_verbs[] = {
8261 /* Internal speakers: output 0 (0x0c) */
8262 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8263 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8264 {0x18, AC_VERB_SET_CONNECT_SEL, 0x00},
8265 /* Internal speakers: output 0 (0x0c) */
8266 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8267 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8268 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8269 /* Headphone: output 0 (0x0c) */
8270 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8271 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8272 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
8273 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8274 /* Front Mic: input vref at 80% */
8275 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
8276 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
8280 /* Toggle speaker-output according to the hp-jack state */
8281 static void alc885_imac24_setup(struct hda_codec *codec)
8283 struct alc_spec *spec = codec->spec;
8285 spec->autocfg.hp_pins[0] = 0x14;
8286 spec->autocfg.speaker_pins[0] = 0x18;
8287 spec->autocfg.speaker_pins[1] = 0x1a;
8290 #define alc885_mb5_setup alc885_imac24_setup
8291 #define alc885_macmini3_setup alc885_imac24_setup
8293 /* Macbook Air 2,1 */
8294 static void alc885_mba21_setup(struct hda_codec *codec)
8296 struct alc_spec *spec = codec->spec;
8298 spec->autocfg.hp_pins[0] = 0x14;
8299 spec->autocfg.speaker_pins[0] = 0x18;
8304 static void alc885_mbp3_setup(struct hda_codec *codec)
8306 struct alc_spec *spec = codec->spec;
8308 spec->autocfg.hp_pins[0] = 0x15;
8309 spec->autocfg.speaker_pins[0] = 0x14;
8312 static void alc885_imac91_setup(struct hda_codec *codec)
8314 struct alc_spec *spec = codec->spec;
8316 spec->autocfg.hp_pins[0] = 0x14;
8317 spec->autocfg.speaker_pins[0] = 0x18;
8318 spec->autocfg.speaker_pins[1] = 0x1a;
8321 static struct hda_verb alc882_targa_verbs[] = {
8322 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8323 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8325 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8326 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8328 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8329 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8330 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8332 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8336 /* toggle speaker-output according to the hp-jack state */
8337 static void alc882_targa_automute(struct hda_codec *codec)
8339 struct alc_spec *spec = codec->spec;
8340 alc_automute_amp(codec);
8341 snd_hda_codec_write_cache(codec, 1, 0, AC_VERB_SET_GPIO_DATA,
8342 spec->jack_present ? 1 : 3);
8345 static void alc882_targa_setup(struct hda_codec *codec)
8347 struct alc_spec *spec = codec->spec;
8349 spec->autocfg.hp_pins[0] = 0x14;
8350 spec->autocfg.speaker_pins[0] = 0x1b;
8353 static void alc882_targa_unsol_event(struct hda_codec *codec, unsigned int res)
8355 if ((res >> 26) == ALC880_HP_EVENT)
8356 alc882_targa_automute(codec);
8359 static struct hda_verb alc882_asus_a7j_verbs[] = {
8360 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8361 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8363 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8364 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8365 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8367 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8368 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8369 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8371 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8372 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8373 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8377 static struct hda_verb alc882_asus_a7m_verbs[] = {
8378 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8379 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8381 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8382 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8383 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8385 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8386 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8387 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front */
8389 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* mic/clfe */
8390 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01}, /* line/surround */
8391 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP */
8395 static void alc882_gpio_mute(struct hda_codec *codec, int pin, int muted)
8397 unsigned int gpiostate, gpiomask, gpiodir;
8399 gpiostate = snd_hda_codec_read(codec, codec->afg, 0,
8400 AC_VERB_GET_GPIO_DATA, 0);
8403 gpiostate |= (1 << pin);
8405 gpiostate &= ~(1 << pin);
8407 gpiomask = snd_hda_codec_read(codec, codec->afg, 0,
8408 AC_VERB_GET_GPIO_MASK, 0);
8409 gpiomask |= (1 << pin);
8411 gpiodir = snd_hda_codec_read(codec, codec->afg, 0,
8412 AC_VERB_GET_GPIO_DIRECTION, 0);
8413 gpiodir |= (1 << pin);
8416 snd_hda_codec_write(codec, codec->afg, 0,
8417 AC_VERB_SET_GPIO_MASK, gpiomask);
8418 snd_hda_codec_write(codec, codec->afg, 0,
8419 AC_VERB_SET_GPIO_DIRECTION, gpiodir);
8423 snd_hda_codec_write(codec, codec->afg, 0,
8424 AC_VERB_SET_GPIO_DATA, gpiostate);
8427 /* set up GPIO at initialization */
8428 static void alc885_macpro_init_hook(struct hda_codec *codec)
8430 alc882_gpio_mute(codec, 0, 0);
8431 alc882_gpio_mute(codec, 1, 0);
8434 /* set up GPIO and update auto-muting at initialization */
8435 static void alc885_imac24_init_hook(struct hda_codec *codec)
8437 alc885_macpro_init_hook(codec);
8438 alc_automute_amp(codec);
8442 * generic initialization of ADC, input mixers and output mixers
8444 static struct hda_verb alc883_auto_init_verbs[] = {
8446 * Unmute ADC0-2 and set the default input to mic-in
8448 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
8449 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8450 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
8451 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8454 * Set up output mixers (0x0c - 0x0f)
8456 /* set vol=0 to output mixers */
8457 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8458 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8459 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8460 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
8461 /* set up input amps for analog loopback */
8462 /* Amp Indices: DAC = 0, mixer = 1 */
8463 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8464 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8465 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8466 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8467 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8468 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8469 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8470 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8471 {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8472 {0x26, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8474 /* FIXME: use matrix-type input source selection */
8475 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
8477 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8479 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8483 /* 2ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:front) */
8484 static struct hda_verb alc889A_mb31_ch2_init[] = {
8485 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */
8486 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8487 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */
8488 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line off */
8492 /* 4ch mode (Speaker:front, Subwoofer:CLFE, Line:CLFE, Headphones:front) */
8493 static struct hda_verb alc889A_mb31_ch4_init[] = {
8494 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* HP as front */
8495 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8496 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */
8497 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
8501 /* 5ch mode (Speaker:front, Subwoofer:CLFE, Line:input, Headphones:rear) */
8502 static struct hda_verb alc889A_mb31_ch5_init[] = {
8503 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as rear */
8504 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Subwoofer on */
8505 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Line as input */
8506 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Line off */
8510 /* 6ch mode (Speaker:front, Subwoofer:off, Line:CLFE, Headphones:Rear) */
8511 static struct hda_verb alc889A_mb31_ch6_init[] = {
8512 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* HP as front */
8513 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Subwoofer off */
8514 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, /* Line as output */
8515 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, /* Line on */
8519 static struct hda_channel_mode alc889A_mb31_6ch_modes[4] = {
8520 { 2, alc889A_mb31_ch2_init },
8521 { 4, alc889A_mb31_ch4_init },
8522 { 5, alc889A_mb31_ch5_init },
8523 { 6, alc889A_mb31_ch6_init },
8526 static struct hda_verb alc883_medion_eapd_verbs[] = {
8527 /* eanable EAPD on medion laptop */
8528 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
8529 {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
8533 #define alc883_base_mixer alc882_base_mixer
8535 static struct snd_kcontrol_new alc883_mitac_mixer[] = {
8536 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8537 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8538 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8539 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8540 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8541 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8542 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8543 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8544 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8545 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8546 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8547 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8548 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8552 static struct snd_kcontrol_new alc883_clevo_m720_mixer[] = {
8553 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8554 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8555 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8556 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8557 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8558 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8559 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8560 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8561 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8562 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8566 static struct snd_kcontrol_new alc883_2ch_fujitsu_pi2515_mixer[] = {
8567 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8568 HDA_BIND_MUTE("Headphone Playback Switch", 0x0c, 2, HDA_INPUT),
8569 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8570 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8571 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8572 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8573 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8574 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8575 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8576 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8580 static struct snd_kcontrol_new alc883_3ST_2ch_mixer[] = {
8581 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8582 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8583 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8584 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8585 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8586 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8587 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8588 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8589 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8590 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8591 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8592 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8593 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8597 static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
8598 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8599 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8600 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8601 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8602 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8603 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8604 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8605 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8606 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8607 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8608 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8609 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8610 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8611 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8612 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8613 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8614 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8615 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8616 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8620 static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = {
8621 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8622 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8623 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8624 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8625 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8627 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8628 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8629 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8630 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8631 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8632 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8633 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8634 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8635 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8636 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8637 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8638 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8639 HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8640 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8644 static struct snd_kcontrol_new alc885_8ch_intel_mixer[] = {
8645 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8646 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8647 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8648 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8649 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
8651 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8652 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8653 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8654 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8655 HDA_BIND_MUTE("Speaker Playback Switch", 0x0f, 2, HDA_INPUT),
8656 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8657 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8658 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8659 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x3, HDA_INPUT),
8660 HDA_CODEC_VOLUME("Mic Boost", 0x1b, 0, HDA_INPUT),
8661 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x3, HDA_INPUT),
8662 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8663 HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
8664 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8668 static struct snd_kcontrol_new alc883_fivestack_mixer[] = {
8669 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8670 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8671 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8672 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8673 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8674 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8675 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8676 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8677 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8678 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8679 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8680 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8681 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8682 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8683 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8684 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8685 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8686 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8687 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8691 static struct snd_kcontrol_new alc883_targa_mixer[] = {
8692 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8693 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8694 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8695 HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8696 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8697 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
8698 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
8699 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
8700 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
8701 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
8702 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8703 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8704 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8705 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8706 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8707 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8708 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8712 static struct snd_kcontrol_new alc883_targa_2ch_mixer[] = {
8713 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8714 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8715 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8716 HDA_CODEC_MUTE("Speaker Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8717 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8718 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8719 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8720 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8721 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8722 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8723 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8724 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8728 static struct snd_kcontrol_new alc883_targa_8ch_mixer[] = {
8729 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8730 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8731 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8732 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
8733 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8737 static struct snd_kcontrol_new alc883_lenovo_101e_2ch_mixer[] = {
8738 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8739 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8740 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
8741 HDA_BIND_MUTE("Speaker Playback Switch", 0x0d, 2, HDA_INPUT),
8742 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
8743 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8744 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8745 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8749 static struct snd_kcontrol_new alc883_lenovo_nb0763_mixer[] = {
8750 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8751 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
8752 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8753 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8754 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8755 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8756 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8757 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8758 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8762 static struct snd_kcontrol_new alc883_medion_md2_mixer[] = {
8763 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8764 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8765 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8766 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8767 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8768 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8769 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8770 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8771 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8775 static struct snd_kcontrol_new alc883_medion_wim2160_mixer[] = {
8776 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8777 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8778 HDA_CODEC_MUTE("Speaker Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8779 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x0, HDA_OUTPUT),
8780 HDA_CODEC_VOLUME("Line Playback Volume", 0x08, 0x0, HDA_INPUT),
8781 HDA_CODEC_MUTE("Line Playback Switch", 0x08, 0x0, HDA_INPUT),
8785 static struct hda_verb alc883_medion_wim2160_verbs[] = {
8786 /* Unmute front mixer */
8787 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
8788 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
8790 /* Set speaker pin to front mixer */
8791 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8793 /* Init headphone pin */
8794 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8795 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
8796 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
8797 {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8802 /* toggle speaker-output according to the hp-jack state */
8803 static void alc883_medion_wim2160_setup(struct hda_codec *codec)
8805 struct alc_spec *spec = codec->spec;
8807 spec->autocfg.hp_pins[0] = 0x1a;
8808 spec->autocfg.speaker_pins[0] = 0x15;
8811 static struct snd_kcontrol_new alc883_acer_aspire_mixer[] = {
8812 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8813 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8814 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8815 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8816 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8817 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8818 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8819 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8823 static struct snd_kcontrol_new alc888_acer_aspire_6530_mixer[] = {
8824 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8825 HDA_CODEC_VOLUME("LFE Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8826 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8827 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8828 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8829 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8830 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8831 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8832 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8836 static struct snd_kcontrol_new alc888_lenovo_sky_mixer[] = {
8837 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8838 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8839 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
8840 HDA_BIND_MUTE("Surround Playback Switch", 0x0e, 2, HDA_INPUT),
8841 HDA_CODEC_VOLUME_MONO("Center Playback Volume",
8842 0x0d, 1, 0x0, HDA_OUTPUT),
8843 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0d, 2, 0x0, HDA_OUTPUT),
8844 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0d, 1, 2, HDA_INPUT),
8845 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0d, 2, 2, HDA_INPUT),
8846 HDA_CODEC_VOLUME("Side Playback Volume", 0x0f, 0x0, HDA_OUTPUT),
8847 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
8848 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
8849 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
8850 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8851 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8852 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8853 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8854 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8855 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8856 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
8857 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8861 static struct snd_kcontrol_new alc889A_mb31_mixer[] = {
8863 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
8864 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
8865 HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
8866 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 0x02, HDA_INPUT),
8867 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x00,
8869 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x02, HDA_INPUT),
8870 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x00, HDA_OUTPUT),
8871 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x02, HDA_INPUT),
8872 /* Output switches */
8873 HDA_CODEC_MUTE("Enable Speaker", 0x14, 0x00, HDA_OUTPUT),
8874 HDA_CODEC_MUTE("Enable Headphones", 0x15, 0x00, HDA_OUTPUT),
8875 HDA_CODEC_MUTE_MONO("Enable LFE", 0x16, 2, 0x00, HDA_OUTPUT),
8877 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0x00, HDA_INPUT),
8878 HDA_CODEC_VOLUME("Line Boost", 0x1a, 0x00, HDA_INPUT),
8880 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
8881 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x00, HDA_INPUT),
8882 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8883 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8887 static struct snd_kcontrol_new alc883_vaiott_mixer[] = {
8888 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8889 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8890 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
8891 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
8892 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
8893 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
8897 static struct hda_bind_ctls alc883_bind_cap_vol = {
8898 .ops = &snd_hda_bind_vol,
8900 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8901 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8906 static struct hda_bind_ctls alc883_bind_cap_switch = {
8907 .ops = &snd_hda_bind_sw,
8909 HDA_COMPOSE_AMP_VAL(0x08, 3, 0, HDA_INPUT),
8910 HDA_COMPOSE_AMP_VAL(0x09, 3, 0, HDA_INPUT),
8915 static struct snd_kcontrol_new alc883_asus_eee1601_mixer[] = {
8916 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
8917 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
8918 HDA_CODEC_MUTE("Headphone Playback Switch", 0x14, 0x0, HDA_OUTPUT),
8919 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
8920 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
8921 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
8922 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
8923 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
8927 static struct snd_kcontrol_new alc883_asus_eee1601_cap_mixer[] = {
8928 HDA_BIND_VOL("Capture Volume", &alc883_bind_cap_vol),
8929 HDA_BIND_SW("Capture Switch", &alc883_bind_cap_switch),
8931 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8932 /* .name = "Capture Source", */
8933 .name = "Input Source",
8935 .info = alc_mux_enum_info,
8936 .get = alc_mux_enum_get,
8937 .put = alc_mux_enum_put,
8942 static struct snd_kcontrol_new alc883_chmode_mixer[] = {
8944 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
8945 .name = "Channel Mode",
8946 .info = alc_ch_mode_info,
8947 .get = alc_ch_mode_get,
8948 .put = alc_ch_mode_put,
8953 /* toggle speaker-output according to the hp-jack state */
8954 static void alc883_mitac_setup(struct hda_codec *codec)
8956 struct alc_spec *spec = codec->spec;
8958 spec->autocfg.hp_pins[0] = 0x15;
8959 spec->autocfg.speaker_pins[0] = 0x14;
8960 spec->autocfg.speaker_pins[1] = 0x17;
8963 /* auto-toggle front mic */
8965 static void alc883_mitac_mic_automute(struct hda_codec *codec)
8967 unsigned char bits = snd_hda_jack_detect(codec, 0x18) ? HDA_AMP_MUTE : 0;
8969 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1, HDA_AMP_MUTE, bits);
8973 static struct hda_verb alc883_mitac_verbs[] = {
8975 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8976 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8978 {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
8979 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
8981 /* enable unsolicited event */
8982 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8983 /* {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN}, */
8988 static struct hda_verb alc883_clevo_m540r_verbs[] = {
8990 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
8991 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
8993 /*{0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},*/
8995 /* enable unsolicited event */
8997 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
8998 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
9004 static struct hda_verb alc883_clevo_m720_verbs[] = {
9006 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9007 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9009 {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
9010 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9012 /* enable unsolicited event */
9013 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9014 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
9019 static struct hda_verb alc883_2ch_fujitsu_pi2515_verbs[] = {
9021 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
9022 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9024 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
9025 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9027 /* enable unsolicited event */
9028 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9033 static struct hda_verb alc883_targa_verbs[] = {
9034 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9035 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9037 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9038 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9040 /* Connect Line-Out side jack (SPDIF) to Side */
9041 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9042 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
9043 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
9044 /* Connect Mic jack to CLFE */
9045 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9046 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
9047 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02},
9048 /* Connect Line-in jack to Surround */
9049 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9050 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
9051 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
9052 /* Connect HP out jack to Front */
9053 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9054 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
9055 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
9057 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9062 static struct hda_verb alc883_lenovo_101e_verbs[] = {
9063 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9064 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT|AC_USRSP_EN},
9065 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT|AC_USRSP_EN},
9069 static struct hda_verb alc883_lenovo_nb0763_verbs[] = {
9070 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9071 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9072 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9073 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9077 static struct hda_verb alc888_lenovo_ms7195_verbs[] = {
9078 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9079 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9080 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9081 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_FRONT_EVENT | AC_USRSP_EN},
9082 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9086 static struct hda_verb alc883_haier_w66_verbs[] = {
9087 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9088 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9090 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9092 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
9093 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9094 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9095 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9099 static struct hda_verb alc888_lenovo_sky_verbs[] = {
9100 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9101 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9102 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9103 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9104 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9105 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9106 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x00},
9107 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9111 static struct hda_verb alc888_6st_dell_verbs[] = {
9112 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9116 static struct hda_verb alc883_vaiott_verbs[] = {
9118 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9119 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9121 /* enable unsolicited event */
9122 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9127 static void alc888_3st_hp_setup(struct hda_codec *codec)
9129 struct alc_spec *spec = codec->spec;
9131 spec->autocfg.hp_pins[0] = 0x1b;
9132 spec->autocfg.speaker_pins[0] = 0x14;
9133 spec->autocfg.speaker_pins[1] = 0x16;
9134 spec->autocfg.speaker_pins[2] = 0x18;
9137 static struct hda_verb alc888_3st_hp_verbs[] = {
9138 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front: output 0 (0x0c) */
9139 {0x16, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Rear : output 1 (0x0d) */
9140 {0x18, AC_VERB_SET_CONNECT_SEL, 0x02}, /* CLFE : output 2 (0x0e) */
9141 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9148 static struct hda_verb alc888_3st_hp_2ch_init[] = {
9149 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
9150 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
9151 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
9152 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
9159 static struct hda_verb alc888_3st_hp_4ch_init[] = {
9160 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
9161 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
9162 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
9163 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
9164 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
9171 static struct hda_verb alc888_3st_hp_6ch_init[] = {
9172 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
9173 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
9174 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
9175 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
9176 { 0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
9177 { 0x16, AC_VERB_SET_CONNECT_SEL, 0x01 },
9181 static struct hda_channel_mode alc888_3st_hp_modes[3] = {
9182 { 2, alc888_3st_hp_2ch_init },
9183 { 4, alc888_3st_hp_4ch_init },
9184 { 6, alc888_3st_hp_6ch_init },
9187 /* toggle front-jack and RCA according to the hp-jack state */
9188 static void alc888_lenovo_ms7195_front_automute(struct hda_codec *codec)
9190 unsigned int present = snd_hda_jack_detect(codec, 0x1b);
9192 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
9193 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9194 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9195 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9198 /* toggle RCA according to the front-jack state */
9199 static void alc888_lenovo_ms7195_rca_automute(struct hda_codec *codec)
9201 unsigned int present = snd_hda_jack_detect(codec, 0x14);
9203 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9204 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9207 static void alc883_lenovo_ms7195_unsol_event(struct hda_codec *codec,
9210 if ((res >> 26) == ALC880_HP_EVENT)
9211 alc888_lenovo_ms7195_front_automute(codec);
9212 if ((res >> 26) == ALC880_FRONT_EVENT)
9213 alc888_lenovo_ms7195_rca_automute(codec);
9216 static struct hda_verb alc883_medion_md2_verbs[] = {
9217 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9218 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9220 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9222 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9226 /* toggle speaker-output according to the hp-jack state */
9227 static void alc883_medion_md2_setup(struct hda_codec *codec)
9229 struct alc_spec *spec = codec->spec;
9231 spec->autocfg.hp_pins[0] = 0x14;
9232 spec->autocfg.speaker_pins[0] = 0x15;
9235 /* toggle speaker-output according to the hp-jack state */
9236 #define alc883_targa_init_hook alc882_targa_init_hook
9237 #define alc883_targa_unsol_event alc882_targa_unsol_event
9239 static void alc883_clevo_m720_mic_automute(struct hda_codec *codec)
9241 unsigned int present;
9243 present = snd_hda_jack_detect(codec, 0x18);
9244 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
9245 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9248 static void alc883_clevo_m720_setup(struct hda_codec *codec)
9250 struct alc_spec *spec = codec->spec;
9252 spec->autocfg.hp_pins[0] = 0x15;
9253 spec->autocfg.speaker_pins[0] = 0x14;
9256 static void alc883_clevo_m720_init_hook(struct hda_codec *codec)
9258 alc_automute_amp(codec);
9259 alc883_clevo_m720_mic_automute(codec);
9262 static void alc883_clevo_m720_unsol_event(struct hda_codec *codec,
9265 switch (res >> 26) {
9266 case ALC880_MIC_EVENT:
9267 alc883_clevo_m720_mic_automute(codec);
9270 alc_automute_amp_unsol_event(codec, res);
9275 /* toggle speaker-output according to the hp-jack state */
9276 static void alc883_2ch_fujitsu_pi2515_setup(struct hda_codec *codec)
9278 struct alc_spec *spec = codec->spec;
9280 spec->autocfg.hp_pins[0] = 0x14;
9281 spec->autocfg.speaker_pins[0] = 0x15;
9284 static void alc883_haier_w66_setup(struct hda_codec *codec)
9286 struct alc_spec *spec = codec->spec;
9288 spec->autocfg.hp_pins[0] = 0x1b;
9289 spec->autocfg.speaker_pins[0] = 0x14;
9292 static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
9294 int bits = snd_hda_jack_detect(codec, 0x14) ? HDA_AMP_MUTE : 0;
9296 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9297 HDA_AMP_MUTE, bits);
9300 static void alc883_lenovo_101e_all_automute(struct hda_codec *codec)
9302 int bits = snd_hda_jack_detect(codec, 0x1b) ? HDA_AMP_MUTE : 0;
9304 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
9305 HDA_AMP_MUTE, bits);
9306 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
9307 HDA_AMP_MUTE, bits);
9310 static void alc883_lenovo_101e_unsol_event(struct hda_codec *codec,
9313 if ((res >> 26) == ALC880_HP_EVENT)
9314 alc883_lenovo_101e_all_automute(codec);
9315 if ((res >> 26) == ALC880_FRONT_EVENT)
9316 alc883_lenovo_101e_ispeaker_automute(codec);
9319 /* toggle speaker-output according to the hp-jack state */
9320 static void alc883_acer_aspire_setup(struct hda_codec *codec)
9322 struct alc_spec *spec = codec->spec;
9324 spec->autocfg.hp_pins[0] = 0x14;
9325 spec->autocfg.speaker_pins[0] = 0x15;
9326 spec->autocfg.speaker_pins[1] = 0x16;
9329 static struct hda_verb alc883_acer_eapd_verbs[] = {
9330 /* HP Pin: output 0 (0x0c) */
9331 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9332 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
9333 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
9334 /* Front Pin: output 0 (0x0c) */
9335 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9336 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9337 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9338 {0x16, AC_VERB_SET_CONNECT_SEL, 0x00},
9339 /* eanable EAPD on medion laptop */
9340 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
9341 {0x20, AC_VERB_SET_PROC_COEF, 0x3050},
9342 /* enable unsolicited event */
9343 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9347 static struct hda_verb alc888_acer_aspire_7730G_verbs[] = {
9348 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
9349 {0x17, AC_VERB_SET_CONNECT_SEL, 0x02},
9350 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9354 static void alc888_6st_dell_setup(struct hda_codec *codec)
9356 struct alc_spec *spec = codec->spec;
9358 spec->autocfg.hp_pins[0] = 0x1b;
9359 spec->autocfg.speaker_pins[0] = 0x14;
9360 spec->autocfg.speaker_pins[1] = 0x15;
9361 spec->autocfg.speaker_pins[2] = 0x16;
9362 spec->autocfg.speaker_pins[3] = 0x17;
9365 static void alc888_lenovo_sky_setup(struct hda_codec *codec)
9367 struct alc_spec *spec = codec->spec;
9369 spec->autocfg.hp_pins[0] = 0x1b;
9370 spec->autocfg.speaker_pins[0] = 0x14;
9371 spec->autocfg.speaker_pins[1] = 0x15;
9372 spec->autocfg.speaker_pins[2] = 0x16;
9373 spec->autocfg.speaker_pins[3] = 0x17;
9374 spec->autocfg.speaker_pins[4] = 0x1a;
9377 static void alc883_vaiott_setup(struct hda_codec *codec)
9379 struct alc_spec *spec = codec->spec;
9381 spec->autocfg.hp_pins[0] = 0x15;
9382 spec->autocfg.speaker_pins[0] = 0x14;
9383 spec->autocfg.speaker_pins[1] = 0x17;
9386 static struct hda_verb alc888_asus_m90v_verbs[] = {
9387 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9388 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9389 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
9390 /* enable unsolicited event */
9391 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9392 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
9396 static void alc883_mode2_setup(struct hda_codec *codec)
9398 struct alc_spec *spec = codec->spec;
9400 spec->autocfg.hp_pins[0] = 0x1b;
9401 spec->autocfg.speaker_pins[0] = 0x14;
9402 spec->autocfg.speaker_pins[1] = 0x15;
9403 spec->autocfg.speaker_pins[2] = 0x16;
9404 spec->ext_mic.pin = 0x18;
9405 spec->int_mic.pin = 0x19;
9406 spec->ext_mic.mux_idx = 0;
9407 spec->int_mic.mux_idx = 1;
9411 static struct hda_verb alc888_asus_eee1601_verbs[] = {
9412 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
9413 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
9414 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
9415 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
9416 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
9417 {0x20, AC_VERB_SET_COEF_INDEX, 0x0b},
9418 {0x20, AC_VERB_SET_PROC_COEF, 0x0838},
9419 /* enable unsolicited event */
9420 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9424 static void alc883_eee1601_inithook(struct hda_codec *codec)
9426 struct alc_spec *spec = codec->spec;
9428 spec->autocfg.hp_pins[0] = 0x14;
9429 spec->autocfg.speaker_pins[0] = 0x1b;
9430 alc_automute_pin(codec);
9433 static struct hda_verb alc889A_mb31_verbs[] = {
9434 /* Init rear pin (used as headphone output) */
9435 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4}, /* Apple Headphones */
9436 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Connect to front */
9437 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
9438 /* Init line pin (used as output in 4ch and 6ch mode) */
9439 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x02}, /* Connect to CLFE */
9440 /* Init line 2 pin (used as headphone out by default) */
9441 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* Use as input */
9442 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE}, /* Mute output */
9446 /* Mute speakers according to the headphone jack state */
9447 static void alc889A_mb31_automute(struct hda_codec *codec)
9449 unsigned int present;
9451 /* Mute only in 2ch or 4ch mode */
9452 if (snd_hda_codec_read(codec, 0x15, 0, AC_VERB_GET_CONNECT_SEL, 0)
9454 present = snd_hda_jack_detect(codec, 0x15);
9455 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
9456 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9457 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
9458 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
9462 static void alc889A_mb31_unsol_event(struct hda_codec *codec, unsigned int res)
9464 if ((res >> 26) == ALC880_HP_EVENT)
9465 alc889A_mb31_automute(codec);
9469 #ifdef CONFIG_SND_HDA_POWER_SAVE
9470 #define alc882_loopbacks alc880_loopbacks
9473 /* pcm configuration: identical with ALC880 */
9474 #define alc882_pcm_analog_playback alc880_pcm_analog_playback
9475 #define alc882_pcm_analog_capture alc880_pcm_analog_capture
9476 #define alc882_pcm_digital_playback alc880_pcm_digital_playback
9477 #define alc882_pcm_digital_capture alc880_pcm_digital_capture
9479 static hda_nid_t alc883_slave_dig_outs[] = {
9480 ALC1200_DIGOUT_NID, 0,
9483 static hda_nid_t alc1200_slave_dig_outs[] = {
9484 ALC883_DIGOUT_NID, 0,
9488 * configuration and preset
9490 static const char *alc882_models[ALC882_MODEL_LAST] = {
9491 [ALC882_3ST_DIG] = "3stack-dig",
9492 [ALC882_6ST_DIG] = "6stack-dig",
9493 [ALC882_ARIMA] = "arima",
9494 [ALC882_W2JC] = "w2jc",
9495 [ALC882_TARGA] = "targa",
9496 [ALC882_ASUS_A7J] = "asus-a7j",
9497 [ALC882_ASUS_A7M] = "asus-a7m",
9498 [ALC885_MACPRO] = "macpro",
9499 [ALC885_MB5] = "mb5",
9500 [ALC885_MACMINI3] = "macmini3",
9501 [ALC885_MBA21] = "mba21",
9502 [ALC885_MBP3] = "mbp3",
9503 [ALC885_IMAC24] = "imac24",
9504 [ALC885_IMAC91] = "imac91",
9505 [ALC883_3ST_2ch_DIG] = "3stack-2ch-dig",
9506 [ALC883_3ST_6ch_DIG] = "3stack-6ch-dig",
9507 [ALC883_3ST_6ch] = "3stack-6ch",
9508 [ALC883_6ST_DIG] = "alc883-6stack-dig",
9509 [ALC883_TARGA_DIG] = "targa-dig",
9510 [ALC883_TARGA_2ch_DIG] = "targa-2ch-dig",
9511 [ALC883_TARGA_8ch_DIG] = "targa-8ch-dig",
9512 [ALC883_ACER] = "acer",
9513 [ALC883_ACER_ASPIRE] = "acer-aspire",
9514 [ALC888_ACER_ASPIRE_4930G] = "acer-aspire-4930g",
9515 [ALC888_ACER_ASPIRE_6530G] = "acer-aspire-6530g",
9516 [ALC888_ACER_ASPIRE_8930G] = "acer-aspire-8930g",
9517 [ALC888_ACER_ASPIRE_7730G] = "acer-aspire-7730g",
9518 [ALC883_MEDION] = "medion",
9519 [ALC883_MEDION_MD2] = "medion-md2",
9520 [ALC883_MEDION_WIM2160] = "medion-wim2160",
9521 [ALC883_LAPTOP_EAPD] = "laptop-eapd",
9522 [ALC883_LENOVO_101E_2ch] = "lenovo-101e",
9523 [ALC883_LENOVO_NB0763] = "lenovo-nb0763",
9524 [ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig",
9525 [ALC888_LENOVO_SKY] = "lenovo-sky",
9526 [ALC883_HAIER_W66] = "haier-w66",
9527 [ALC888_3ST_HP] = "3stack-hp",
9528 [ALC888_6ST_DELL] = "6stack-dell",
9529 [ALC883_MITAC] = "mitac",
9530 [ALC883_CLEVO_M540R] = "clevo-m540r",
9531 [ALC883_CLEVO_M720] = "clevo-m720",
9532 [ALC883_FUJITSU_PI2515] = "fujitsu-pi2515",
9533 [ALC888_FUJITSU_XA3530] = "fujitsu-xa3530",
9534 [ALC883_3ST_6ch_INTEL] = "3stack-6ch-intel",
9535 [ALC889A_INTEL] = "intel-alc889a",
9536 [ALC889_INTEL] = "intel-x58",
9537 [ALC1200_ASUS_P5Q] = "asus-p5q",
9538 [ALC889A_MB31] = "mb31",
9539 [ALC883_SONY_VAIO_TT] = "sony-vaio-tt",
9540 [ALC882_AUTO] = "auto",
9543 static struct snd_pci_quirk alc882_cfg_tbl[] = {
9544 SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC882_6ST_DIG),
9546 SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
9547 SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
9548 SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_ACER_ASPIRE),
9549 SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
9550 SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
9551 SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE),
9552 SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
9553 ALC888_ACER_ASPIRE_4930G),
9554 SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
9555 ALC888_ACER_ASPIRE_4930G),
9556 SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
9557 ALC888_ACER_ASPIRE_8930G),
9558 SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
9559 ALC888_ACER_ASPIRE_8930G),
9560 SND_PCI_QUIRK(0x1025, 0x0157, "Acer X3200", ALC882_AUTO),
9561 SND_PCI_QUIRK(0x1025, 0x0158, "Acer AX1700-U3700A", ALC882_AUTO),
9562 SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
9563 ALC888_ACER_ASPIRE_6530G),
9564 SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
9565 ALC888_ACER_ASPIRE_6530G),
9566 SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
9567 ALC888_ACER_ASPIRE_7730G),
9568 /* default Acer -- disabled as it causes more problems.
9569 * model=auto should work fine now
9571 /* SND_PCI_QUIRK_VENDOR(0x1025, "Acer laptop", ALC883_ACER), */
9573 SND_PCI_QUIRK(0x1028, 0x020d, "Dell Inspiron 530", ALC888_6ST_DELL),
9575 SND_PCI_QUIRK(0x103c, 0x2a3d, "HP Pavillion", ALC883_6ST_DIG),
9576 SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP),
9577 SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP),
9578 SND_PCI_QUIRK(0x103c, 0x2a61, "HP Nettle", ALC883_6ST_DIG),
9579 SND_PCI_QUIRK(0x103c, 0x2a66, "HP Acacia", ALC888_3ST_HP),
9580 SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP),
9582 SND_PCI_QUIRK(0x1043, 0x060d, "Asus A7J", ALC882_ASUS_A7J),
9583 SND_PCI_QUIRK(0x1043, 0x1243, "Asus A7J", ALC882_ASUS_A7J),
9584 SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_ASUS_A7M),
9585 SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),
9586 SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_W2JC),
9587 SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),
9588 SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),
9589 SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG),
9590 SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),
9591 SND_PCI_QUIRK(0x1043, 0x82fe, "Asus P5Q-EM HDMI", ALC1200_ASUS_P5Q),
9592 SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601),
9594 SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC883_SONY_VAIO_TT),
9595 SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG),
9596 SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG),
9597 SND_PCI_QUIRK(0x1071, 0x8227, "Mitac 82801H", ALC883_MITAC),
9598 SND_PCI_QUIRK(0x1071, 0x8253, "Mitac 8252d", ALC883_MITAC),
9599 SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC883_LAPTOP_EAPD),
9600 SND_PCI_QUIRK(0x10f1, 0x2350, "TYAN-S2350", ALC888_6ST_DELL),
9601 SND_PCI_QUIRK(0x108e, 0x534d, NULL, ALC883_3ST_6ch),
9602 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG),
9604 SND_PCI_QUIRK(0x1462, 0x0349, "MSI", ALC883_TARGA_2ch_DIG),
9605 SND_PCI_QUIRK(0x1462, 0x040d, "MSI", ALC883_TARGA_2ch_DIG),
9606 SND_PCI_QUIRK(0x1462, 0x0579, "MSI", ALC883_TARGA_2ch_DIG),
9607 SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8 */
9608 SND_PCI_QUIRK(0x1462, 0x2fb3, "MSI", ALC882_AUTO),
9609 SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG),
9610 SND_PCI_QUIRK(0x1462, 0x3729, "MSI S420", ALC883_TARGA_DIG),
9611 SND_PCI_QUIRK(0x1462, 0x3783, "NEC S970", ALC883_TARGA_DIG),
9612 SND_PCI_QUIRK(0x1462, 0x3b7f, "MSI", ALC883_TARGA_2ch_DIG),
9613 SND_PCI_QUIRK(0x1462, 0x3ef9, "MSI", ALC883_TARGA_DIG),
9614 SND_PCI_QUIRK(0x1462, 0x3fc1, "MSI", ALC883_TARGA_DIG),
9615 SND_PCI_QUIRK(0x1462, 0x3fc3, "MSI", ALC883_TARGA_DIG),
9616 SND_PCI_QUIRK(0x1462, 0x3fcc, "MSI", ALC883_TARGA_DIG),
9617 SND_PCI_QUIRK(0x1462, 0x3fdf, "MSI", ALC883_TARGA_DIG),
9618 SND_PCI_QUIRK(0x1462, 0x42cd, "MSI", ALC883_TARGA_DIG),
9619 SND_PCI_QUIRK(0x1462, 0x4314, "MSI", ALC883_TARGA_DIG),
9620 SND_PCI_QUIRK(0x1462, 0x4319, "MSI", ALC883_TARGA_DIG),
9621 SND_PCI_QUIRK(0x1462, 0x4324, "MSI", ALC883_TARGA_DIG),
9622 SND_PCI_QUIRK(0x1462, 0x4570, "MSI Wind Top AE2220", ALC883_TARGA_DIG),
9623 SND_PCI_QUIRK(0x1462, 0x6510, "MSI GX620", ALC883_TARGA_8ch_DIG),
9624 SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC883_6ST_DIG),
9625 SND_PCI_QUIRK(0x1462, 0x7187, "MSI", ALC883_6ST_DIG),
9626 SND_PCI_QUIRK(0x1462, 0x7250, "MSI", ALC883_6ST_DIG),
9627 SND_PCI_QUIRK(0x1462, 0x7260, "MSI 7260", ALC883_TARGA_DIG),
9628 SND_PCI_QUIRK(0x1462, 0x7267, "MSI", ALC883_3ST_6ch_DIG),
9629 SND_PCI_QUIRK(0x1462, 0x7280, "MSI", ALC883_6ST_DIG),
9630 SND_PCI_QUIRK(0x1462, 0x7327, "MSI", ALC883_6ST_DIG),
9631 SND_PCI_QUIRK(0x1462, 0x7350, "MSI", ALC883_6ST_DIG),
9632 SND_PCI_QUIRK(0x1462, 0x7437, "MSI NetOn AP1900", ALC883_TARGA_DIG),
9633 SND_PCI_QUIRK(0x1462, 0xa422, "MSI", ALC883_TARGA_2ch_DIG),
9634 SND_PCI_QUIRK(0x1462, 0xaa08, "MSI", ALC883_TARGA_2ch_DIG),
9636 SND_PCI_QUIRK(0x147b, 0x1083, "Abit IP35-PRO", ALC883_6ST_DIG),
9637 SND_PCI_QUIRK(0x1558, 0x0571, "Clevo laptop M570U", ALC883_3ST_6ch_DIG),
9638 SND_PCI_QUIRK(0x1558, 0x0721, "Clevo laptop M720R", ALC883_CLEVO_M720),
9639 SND_PCI_QUIRK(0x1558, 0x0722, "Clevo laptop M720SR", ALC883_CLEVO_M720),
9640 SND_PCI_QUIRK(0x1558, 0x5409, "Clevo laptop M540R", ALC883_CLEVO_M540R),
9641 SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC883_LAPTOP_EAPD),
9642 SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
9643 /* SND_PCI_QUIRK(0x161f, 0x2054, "Arima W820", ALC882_ARIMA), */
9644 SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
9645 SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1100, "FSC AMILO Xi/Pi25xx",
9646 ALC883_FUJITSU_PI2515),
9647 SND_PCI_QUIRK_MASK(0x1734, 0xfff0, 0x1130, "Fujitsu AMILO Xa35xx",
9648 ALC888_FUJITSU_XA3530),
9649 SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch),
9650 SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9651 SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9652 SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
9653 SND_PCI_QUIRK(0x17aa, 0x101d, "Lenovo Sky", ALC888_LENOVO_SKY),
9654 SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2),
9655 SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
9656 SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
9657 SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
9659 SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
9660 SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL),
9661 SND_PCI_QUIRK(0x8086, 0x2503, "82801H", ALC883_MITAC),
9662 SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_INTEL),
9663 SND_PCI_QUIRK(0x8086, 0x0021, "Intel IbexPeak", ALC889A_INTEL),
9664 SND_PCI_QUIRK(0x8086, 0x3b56, "Intel IbexPeak", ALC889A_INTEL),
9665 SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC882_6ST_DIG),
9670 /* codec SSID table for Intel Mac */
9671 static struct snd_pci_quirk alc882_ssid_cfg_tbl[] = {
9672 SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC885_MBP3),
9673 SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC885_MBP3),
9674 SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC885_MBP3),
9675 SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC885_MACPRO),
9676 SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_IMAC24),
9677 SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_IMAC24),
9678 SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC885_MBP3),
9679 SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889A_MB31),
9680 SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_ASUS_A7M),
9681 SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC885_MBP3),
9682 SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC885_MBA21),
9683 SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889A_MB31),
9684 SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC885_MBP3),
9685 SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_IMAC24),
9686 SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC885_IMAC91),
9687 SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC885_MB5),
9688 SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC885_MB5),
9689 /* FIXME: HP jack sense seems not working for MBP 5,1 or 5,2,
9690 * so apparently no perfect solution yet
9692 SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC885_MB5),
9693 SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC885_MB5),
9694 SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC885_MACMINI3),
9698 static struct alc_config_preset alc882_presets[] = {
9699 [ALC882_3ST_DIG] = {
9700 .mixers = { alc882_base_mixer },
9701 .init_verbs = { alc882_base_init_verbs,
9702 alc882_adc1_init_verbs },
9703 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9704 .dac_nids = alc882_dac_nids,
9705 .dig_out_nid = ALC882_DIGOUT_NID,
9706 .dig_in_nid = ALC882_DIGIN_NID,
9707 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9708 .channel_mode = alc882_ch_modes,
9710 .input_mux = &alc882_capture_source,
9712 [ALC882_6ST_DIG] = {
9713 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
9714 .init_verbs = { alc882_base_init_verbs,
9715 alc882_adc1_init_verbs },
9716 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9717 .dac_nids = alc882_dac_nids,
9718 .dig_out_nid = ALC882_DIGOUT_NID,
9719 .dig_in_nid = ALC882_DIGIN_NID,
9720 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9721 .channel_mode = alc882_sixstack_modes,
9722 .input_mux = &alc882_capture_source,
9725 .mixers = { alc882_base_mixer, alc882_chmode_mixer },
9726 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9727 alc882_eapd_verbs },
9728 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9729 .dac_nids = alc882_dac_nids,
9730 .num_channel_mode = ARRAY_SIZE(alc882_sixstack_modes),
9731 .channel_mode = alc882_sixstack_modes,
9732 .input_mux = &alc882_capture_source,
9735 .mixers = { alc882_w2jc_mixer, alc882_chmode_mixer },
9736 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9737 alc882_eapd_verbs, alc880_gpio1_init_verbs },
9738 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9739 .dac_nids = alc882_dac_nids,
9740 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9741 .channel_mode = alc880_threestack_modes,
9743 .input_mux = &alc882_capture_source,
9744 .dig_out_nid = ALC882_DIGOUT_NID,
9747 .mixers = { alc885_mba21_mixer },
9748 .init_verbs = { alc885_mba21_init_verbs, alc880_gpio1_init_verbs },
9750 .dac_nids = alc882_dac_nids,
9751 .channel_mode = alc885_mba21_ch_modes,
9752 .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
9753 .input_mux = &alc882_capture_source,
9754 .unsol_event = alc_automute_amp_unsol_event,
9755 .setup = alc885_mba21_setup,
9756 .init_hook = alc_automute_amp,
9759 .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer },
9760 .init_verbs = { alc885_mbp3_init_verbs,
9761 alc880_gpio1_init_verbs },
9763 .dac_nids = alc882_dac_nids,
9765 .channel_mode = alc885_mbp_4ch_modes,
9766 .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
9767 .input_mux = &alc882_capture_source,
9768 .dig_out_nid = ALC882_DIGOUT_NID,
9769 .dig_in_nid = ALC882_DIGIN_NID,
9770 .unsol_event = alc_automute_amp_unsol_event,
9771 .setup = alc885_mbp3_setup,
9772 .init_hook = alc_automute_amp,
9775 .mixers = { alc885_mb5_mixer, alc882_chmode_mixer },
9776 .init_verbs = { alc885_mb5_init_verbs,
9777 alc880_gpio1_init_verbs },
9778 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9779 .dac_nids = alc882_dac_nids,
9780 .channel_mode = alc885_mb5_6ch_modes,
9781 .num_channel_mode = ARRAY_SIZE(alc885_mb5_6ch_modes),
9782 .input_mux = &mb5_capture_source,
9783 .dig_out_nid = ALC882_DIGOUT_NID,
9784 .dig_in_nid = ALC882_DIGIN_NID,
9785 .unsol_event = alc_automute_amp_unsol_event,
9786 .setup = alc885_mb5_setup,
9787 .init_hook = alc_automute_amp,
9789 [ALC885_MACMINI3] = {
9790 .mixers = { alc885_macmini3_mixer, alc882_chmode_mixer },
9791 .init_verbs = { alc885_macmini3_init_verbs,
9792 alc880_gpio1_init_verbs },
9793 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9794 .dac_nids = alc882_dac_nids,
9795 .channel_mode = alc885_macmini3_6ch_modes,
9796 .num_channel_mode = ARRAY_SIZE(alc885_macmini3_6ch_modes),
9797 .input_mux = &macmini3_capture_source,
9798 .dig_out_nid = ALC882_DIGOUT_NID,
9799 .dig_in_nid = ALC882_DIGIN_NID,
9800 .unsol_event = alc_automute_amp_unsol_event,
9801 .setup = alc885_macmini3_setup,
9802 .init_hook = alc_automute_amp,
9805 .mixers = { alc882_macpro_mixer },
9806 .init_verbs = { alc882_macpro_init_verbs },
9807 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9808 .dac_nids = alc882_dac_nids,
9809 .dig_out_nid = ALC882_DIGOUT_NID,
9810 .dig_in_nid = ALC882_DIGIN_NID,
9811 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9812 .channel_mode = alc882_ch_modes,
9813 .input_mux = &alc882_capture_source,
9814 .init_hook = alc885_macpro_init_hook,
9817 .mixers = { alc885_imac24_mixer },
9818 .init_verbs = { alc885_imac24_init_verbs },
9819 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9820 .dac_nids = alc882_dac_nids,
9821 .dig_out_nid = ALC882_DIGOUT_NID,
9822 .dig_in_nid = ALC882_DIGIN_NID,
9823 .num_channel_mode = ARRAY_SIZE(alc882_ch_modes),
9824 .channel_mode = alc882_ch_modes,
9825 .input_mux = &alc882_capture_source,
9826 .unsol_event = alc_automute_amp_unsol_event,
9827 .setup = alc885_imac24_setup,
9828 .init_hook = alc885_imac24_init_hook,
9831 .mixers = {alc885_imac91_mixer},
9832 .init_verbs = { alc885_imac91_init_verbs,
9833 alc880_gpio1_init_verbs },
9834 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9835 .dac_nids = alc882_dac_nids,
9836 .channel_mode = alc885_mba21_ch_modes,
9837 .num_channel_mode = ARRAY_SIZE(alc885_mba21_ch_modes),
9838 .input_mux = &alc889A_imac91_capture_source,
9839 .dig_out_nid = ALC882_DIGOUT_NID,
9840 .dig_in_nid = ALC882_DIGIN_NID,
9841 .unsol_event = alc_automute_amp_unsol_event,
9842 .setup = alc885_imac91_setup,
9843 .init_hook = alc_automute_amp,
9846 .mixers = { alc882_targa_mixer, alc882_chmode_mixer },
9847 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9848 alc880_gpio3_init_verbs, alc882_targa_verbs},
9849 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9850 .dac_nids = alc882_dac_nids,
9851 .dig_out_nid = ALC882_DIGOUT_NID,
9852 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9853 .adc_nids = alc882_adc_nids,
9854 .capsrc_nids = alc882_capsrc_nids,
9855 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9856 .channel_mode = alc882_3ST_6ch_modes,
9858 .input_mux = &alc882_capture_source,
9859 .unsol_event = alc882_targa_unsol_event,
9860 .setup = alc882_targa_setup,
9861 .init_hook = alc882_targa_automute,
9863 [ALC882_ASUS_A7J] = {
9864 .mixers = { alc882_asus_a7j_mixer, alc882_chmode_mixer },
9865 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9866 alc882_asus_a7j_verbs},
9867 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9868 .dac_nids = alc882_dac_nids,
9869 .dig_out_nid = ALC882_DIGOUT_NID,
9870 .num_adc_nids = ARRAY_SIZE(alc882_adc_nids),
9871 .adc_nids = alc882_adc_nids,
9872 .capsrc_nids = alc882_capsrc_nids,
9873 .num_channel_mode = ARRAY_SIZE(alc882_3ST_6ch_modes),
9874 .channel_mode = alc882_3ST_6ch_modes,
9876 .input_mux = &alc882_capture_source,
9878 [ALC882_ASUS_A7M] = {
9879 .mixers = { alc882_asus_a7m_mixer, alc882_chmode_mixer },
9880 .init_verbs = { alc882_base_init_verbs, alc882_adc1_init_verbs,
9881 alc882_eapd_verbs, alc880_gpio1_init_verbs,
9882 alc882_asus_a7m_verbs },
9883 .num_dacs = ARRAY_SIZE(alc882_dac_nids),
9884 .dac_nids = alc882_dac_nids,
9885 .dig_out_nid = ALC882_DIGOUT_NID,
9886 .num_channel_mode = ARRAY_SIZE(alc880_threestack_modes),
9887 .channel_mode = alc880_threestack_modes,
9889 .input_mux = &alc882_capture_source,
9891 [ALC883_3ST_2ch_DIG] = {
9892 .mixers = { alc883_3ST_2ch_mixer },
9893 .init_verbs = { alc883_init_verbs },
9894 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9895 .dac_nids = alc883_dac_nids,
9896 .dig_out_nid = ALC883_DIGOUT_NID,
9897 .dig_in_nid = ALC883_DIGIN_NID,
9898 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
9899 .channel_mode = alc883_3ST_2ch_modes,
9900 .input_mux = &alc883_capture_source,
9902 [ALC883_3ST_6ch_DIG] = {
9903 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9904 .init_verbs = { alc883_init_verbs },
9905 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9906 .dac_nids = alc883_dac_nids,
9907 .dig_out_nid = ALC883_DIGOUT_NID,
9908 .dig_in_nid = ALC883_DIGIN_NID,
9909 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9910 .channel_mode = alc883_3ST_6ch_modes,
9912 .input_mux = &alc883_capture_source,
9914 [ALC883_3ST_6ch] = {
9915 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
9916 .init_verbs = { alc883_init_verbs },
9917 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9918 .dac_nids = alc883_dac_nids,
9919 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9920 .channel_mode = alc883_3ST_6ch_modes,
9922 .input_mux = &alc883_capture_source,
9924 [ALC883_3ST_6ch_INTEL] = {
9925 .mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer },
9926 .init_verbs = { alc883_init_verbs },
9927 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9928 .dac_nids = alc883_dac_nids,
9929 .dig_out_nid = ALC883_DIGOUT_NID,
9930 .dig_in_nid = ALC883_DIGIN_NID,
9931 .slave_dig_outs = alc883_slave_dig_outs,
9932 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes),
9933 .channel_mode = alc883_3ST_6ch_intel_modes,
9935 .input_mux = &alc883_3stack_6ch_intel,
9938 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9939 .init_verbs = { alc885_init_verbs, alc885_init_input_verbs,
9940 alc_hp15_unsol_verbs },
9941 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9942 .dac_nids = alc883_dac_nids,
9943 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9944 .adc_nids = alc889_adc_nids,
9945 .dig_out_nid = ALC883_DIGOUT_NID,
9946 .dig_in_nid = ALC883_DIGIN_NID,
9947 .slave_dig_outs = alc883_slave_dig_outs,
9948 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9949 .channel_mode = alc889_8ch_intel_modes,
9950 .capsrc_nids = alc889_capsrc_nids,
9951 .input_mux = &alc889_capture_source,
9952 .setup = alc889_automute_setup,
9953 .init_hook = alc_automute_amp,
9954 .unsol_event = alc_automute_amp_unsol_event,
9958 .mixers = { alc885_8ch_intel_mixer, alc883_chmode_mixer },
9959 .init_verbs = { alc885_init_verbs, alc889_init_input_verbs,
9960 alc889_eapd_verbs, alc_hp15_unsol_verbs},
9961 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9962 .dac_nids = alc883_dac_nids,
9963 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
9964 .adc_nids = alc889_adc_nids,
9965 .dig_out_nid = ALC883_DIGOUT_NID,
9966 .dig_in_nid = ALC883_DIGIN_NID,
9967 .slave_dig_outs = alc883_slave_dig_outs,
9968 .num_channel_mode = ARRAY_SIZE(alc889_8ch_intel_modes),
9969 .channel_mode = alc889_8ch_intel_modes,
9970 .capsrc_nids = alc889_capsrc_nids,
9971 .input_mux = &alc889_capture_source,
9972 .setup = alc889_automute_setup,
9973 .init_hook = alc889_intel_init_hook,
9974 .unsol_event = alc_automute_amp_unsol_event,
9977 [ALC883_6ST_DIG] = {
9978 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
9979 .init_verbs = { alc883_init_verbs },
9980 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9981 .dac_nids = alc883_dac_nids,
9982 .dig_out_nid = ALC883_DIGOUT_NID,
9983 .dig_in_nid = ALC883_DIGIN_NID,
9984 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
9985 .channel_mode = alc883_sixstack_modes,
9986 .input_mux = &alc883_capture_source,
9988 [ALC883_TARGA_DIG] = {
9989 .mixers = { alc883_targa_mixer, alc883_chmode_mixer },
9990 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
9991 alc883_targa_verbs},
9992 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
9993 .dac_nids = alc883_dac_nids,
9994 .dig_out_nid = ALC883_DIGOUT_NID,
9995 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
9996 .channel_mode = alc883_3ST_6ch_modes,
9998 .input_mux = &alc883_capture_source,
9999 .unsol_event = alc883_targa_unsol_event,
10000 .setup = alc882_targa_setup,
10001 .init_hook = alc882_targa_automute,
10003 [ALC883_TARGA_2ch_DIG] = {
10004 .mixers = { alc883_targa_2ch_mixer},
10005 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
10006 alc883_targa_verbs},
10007 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10008 .dac_nids = alc883_dac_nids,
10009 .adc_nids = alc883_adc_nids_alt,
10010 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
10011 .capsrc_nids = alc883_capsrc_nids,
10012 .dig_out_nid = ALC883_DIGOUT_NID,
10013 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10014 .channel_mode = alc883_3ST_2ch_modes,
10015 .input_mux = &alc883_capture_source,
10016 .unsol_event = alc883_targa_unsol_event,
10017 .setup = alc882_targa_setup,
10018 .init_hook = alc882_targa_automute,
10020 [ALC883_TARGA_8ch_DIG] = {
10021 .mixers = { alc883_targa_mixer, alc883_targa_8ch_mixer,
10022 alc883_chmode_mixer },
10023 .init_verbs = { alc883_init_verbs, alc880_gpio3_init_verbs,
10024 alc883_targa_verbs },
10025 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10026 .dac_nids = alc883_dac_nids,
10027 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
10028 .adc_nids = alc883_adc_nids_rev,
10029 .capsrc_nids = alc883_capsrc_nids_rev,
10030 .dig_out_nid = ALC883_DIGOUT_NID,
10031 .dig_in_nid = ALC883_DIGIN_NID,
10032 .num_channel_mode = ARRAY_SIZE(alc883_4ST_8ch_modes),
10033 .channel_mode = alc883_4ST_8ch_modes,
10035 .input_mux = &alc883_capture_source,
10036 .unsol_event = alc883_targa_unsol_event,
10037 .setup = alc882_targa_setup,
10038 .init_hook = alc882_targa_automute,
10041 .mixers = { alc883_base_mixer },
10042 /* On TravelMate laptops, GPIO 0 enables the internal speaker
10043 * and the headphone jack. Turn this on and rely on the
10044 * standard mute methods whenever the user wants to turn
10045 * these outputs off.
10047 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs },
10048 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10049 .dac_nids = alc883_dac_nids,
10050 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10051 .channel_mode = alc883_3ST_2ch_modes,
10052 .input_mux = &alc883_capture_source,
10054 [ALC883_ACER_ASPIRE] = {
10055 .mixers = { alc883_acer_aspire_mixer },
10056 .init_verbs = { alc883_init_verbs, alc883_acer_eapd_verbs },
10057 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10058 .dac_nids = alc883_dac_nids,
10059 .dig_out_nid = ALC883_DIGOUT_NID,
10060 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10061 .channel_mode = alc883_3ST_2ch_modes,
10062 .input_mux = &alc883_capture_source,
10063 .unsol_event = alc_automute_amp_unsol_event,
10064 .setup = alc883_acer_aspire_setup,
10065 .init_hook = alc_automute_amp,
10067 [ALC888_ACER_ASPIRE_4930G] = {
10068 .mixers = { alc888_base_mixer,
10069 alc883_chmode_mixer },
10070 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
10071 alc888_acer_aspire_4930g_verbs },
10072 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10073 .dac_nids = alc883_dac_nids,
10074 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
10075 .adc_nids = alc883_adc_nids_rev,
10076 .capsrc_nids = alc883_capsrc_nids_rev,
10077 .dig_out_nid = ALC883_DIGOUT_NID,
10078 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10079 .channel_mode = alc883_3ST_6ch_modes,
10081 .const_channel_count = 6,
10083 ARRAY_SIZE(alc888_2_capture_sources),
10084 .input_mux = alc888_2_capture_sources,
10085 .unsol_event = alc_automute_amp_unsol_event,
10086 .setup = alc888_acer_aspire_4930g_setup,
10087 .init_hook = alc_automute_amp,
10089 [ALC888_ACER_ASPIRE_6530G] = {
10090 .mixers = { alc888_acer_aspire_6530_mixer },
10091 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
10092 alc888_acer_aspire_6530g_verbs },
10093 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10094 .dac_nids = alc883_dac_nids,
10095 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
10096 .adc_nids = alc883_adc_nids_rev,
10097 .capsrc_nids = alc883_capsrc_nids_rev,
10098 .dig_out_nid = ALC883_DIGOUT_NID,
10099 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10100 .channel_mode = alc883_3ST_2ch_modes,
10102 ARRAY_SIZE(alc888_2_capture_sources),
10103 .input_mux = alc888_acer_aspire_6530_sources,
10104 .unsol_event = alc_automute_amp_unsol_event,
10105 .setup = alc888_acer_aspire_6530g_setup,
10106 .init_hook = alc_automute_amp,
10108 [ALC888_ACER_ASPIRE_8930G] = {
10109 .mixers = { alc889_acer_aspire_8930g_mixer,
10110 alc883_chmode_mixer },
10111 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
10112 alc889_acer_aspire_8930g_verbs,
10113 alc889_eapd_verbs},
10114 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10115 .dac_nids = alc883_dac_nids,
10116 .num_adc_nids = ARRAY_SIZE(alc889_adc_nids),
10117 .adc_nids = alc889_adc_nids,
10118 .capsrc_nids = alc889_capsrc_nids,
10119 .dig_out_nid = ALC883_DIGOUT_NID,
10120 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10121 .channel_mode = alc883_3ST_6ch_modes,
10123 .const_channel_count = 6,
10125 ARRAY_SIZE(alc889_capture_sources),
10126 .input_mux = alc889_capture_sources,
10127 .unsol_event = alc_automute_amp_unsol_event,
10128 .setup = alc889_acer_aspire_8930g_setup,
10129 .init_hook = alc_automute_amp,
10130 #ifdef CONFIG_SND_HDA_POWER_SAVE
10131 .power_hook = alc_power_eapd,
10134 [ALC888_ACER_ASPIRE_7730G] = {
10135 .mixers = { alc883_3ST_6ch_mixer,
10136 alc883_chmode_mixer },
10137 .init_verbs = { alc883_init_verbs, alc880_gpio1_init_verbs,
10138 alc888_acer_aspire_7730G_verbs },
10139 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10140 .dac_nids = alc883_dac_nids,
10141 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
10142 .adc_nids = alc883_adc_nids_rev,
10143 .capsrc_nids = alc883_capsrc_nids_rev,
10144 .dig_out_nid = ALC883_DIGOUT_NID,
10145 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10146 .channel_mode = alc883_3ST_6ch_modes,
10148 .const_channel_count = 6,
10149 .input_mux = &alc883_capture_source,
10150 .unsol_event = alc_automute_amp_unsol_event,
10151 .setup = alc888_acer_aspire_6530g_setup,
10152 .init_hook = alc_automute_amp,
10154 [ALC883_MEDION] = {
10155 .mixers = { alc883_fivestack_mixer,
10156 alc883_chmode_mixer },
10157 .init_verbs = { alc883_init_verbs,
10158 alc883_medion_eapd_verbs },
10159 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10160 .dac_nids = alc883_dac_nids,
10161 .adc_nids = alc883_adc_nids_alt,
10162 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
10163 .capsrc_nids = alc883_capsrc_nids,
10164 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10165 .channel_mode = alc883_sixstack_modes,
10166 .input_mux = &alc883_capture_source,
10168 [ALC883_MEDION_MD2] = {
10169 .mixers = { alc883_medion_md2_mixer},
10170 .init_verbs = { alc883_init_verbs, alc883_medion_md2_verbs},
10171 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10172 .dac_nids = alc883_dac_nids,
10173 .dig_out_nid = ALC883_DIGOUT_NID,
10174 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10175 .channel_mode = alc883_3ST_2ch_modes,
10176 .input_mux = &alc883_capture_source,
10177 .unsol_event = alc_automute_amp_unsol_event,
10178 .setup = alc883_medion_md2_setup,
10179 .init_hook = alc_automute_amp,
10181 [ALC883_MEDION_WIM2160] = {
10182 .mixers = { alc883_medion_wim2160_mixer },
10183 .init_verbs = { alc883_init_verbs, alc883_medion_wim2160_verbs },
10184 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10185 .dac_nids = alc883_dac_nids,
10186 .dig_out_nid = ALC883_DIGOUT_NID,
10187 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
10188 .adc_nids = alc883_adc_nids,
10189 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10190 .channel_mode = alc883_3ST_2ch_modes,
10191 .input_mux = &alc883_capture_source,
10192 .unsol_event = alc_automute_amp_unsol_event,
10193 .setup = alc883_medion_wim2160_setup,
10194 .init_hook = alc_automute_amp,
10196 [ALC883_LAPTOP_EAPD] = {
10197 .mixers = { alc883_base_mixer },
10198 .init_verbs = { alc883_init_verbs, alc882_eapd_verbs },
10199 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10200 .dac_nids = alc883_dac_nids,
10201 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10202 .channel_mode = alc883_3ST_2ch_modes,
10203 .input_mux = &alc883_capture_source,
10205 [ALC883_CLEVO_M540R] = {
10206 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10207 .init_verbs = { alc883_init_verbs, alc883_clevo_m540r_verbs },
10208 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10209 .dac_nids = alc883_dac_nids,
10210 .dig_out_nid = ALC883_DIGOUT_NID,
10211 .dig_in_nid = ALC883_DIGIN_NID,
10212 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_clevo_modes),
10213 .channel_mode = alc883_3ST_6ch_clevo_modes,
10215 .input_mux = &alc883_capture_source,
10216 /* This machine has the hardware HP auto-muting, thus
10217 * we need no software mute via unsol event
10220 [ALC883_CLEVO_M720] = {
10221 .mixers = { alc883_clevo_m720_mixer },
10222 .init_verbs = { alc883_init_verbs, alc883_clevo_m720_verbs },
10223 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10224 .dac_nids = alc883_dac_nids,
10225 .dig_out_nid = ALC883_DIGOUT_NID,
10226 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10227 .channel_mode = alc883_3ST_2ch_modes,
10228 .input_mux = &alc883_capture_source,
10229 .unsol_event = alc883_clevo_m720_unsol_event,
10230 .setup = alc883_clevo_m720_setup,
10231 .init_hook = alc883_clevo_m720_init_hook,
10233 [ALC883_LENOVO_101E_2ch] = {
10234 .mixers = { alc883_lenovo_101e_2ch_mixer},
10235 .init_verbs = { alc883_init_verbs, alc883_lenovo_101e_verbs},
10236 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10237 .dac_nids = alc883_dac_nids,
10238 .adc_nids = alc883_adc_nids_alt,
10239 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_alt),
10240 .capsrc_nids = alc883_capsrc_nids,
10241 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10242 .channel_mode = alc883_3ST_2ch_modes,
10243 .input_mux = &alc883_lenovo_101e_capture_source,
10244 .unsol_event = alc883_lenovo_101e_unsol_event,
10245 .init_hook = alc883_lenovo_101e_all_automute,
10247 [ALC883_LENOVO_NB0763] = {
10248 .mixers = { alc883_lenovo_nb0763_mixer },
10249 .init_verbs = { alc883_init_verbs, alc883_lenovo_nb0763_verbs},
10250 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10251 .dac_nids = alc883_dac_nids,
10252 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10253 .channel_mode = alc883_3ST_2ch_modes,
10255 .input_mux = &alc883_lenovo_nb0763_capture_source,
10256 .unsol_event = alc_automute_amp_unsol_event,
10257 .setup = alc883_medion_md2_setup,
10258 .init_hook = alc_automute_amp,
10260 [ALC888_LENOVO_MS7195_DIG] = {
10261 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10262 .init_verbs = { alc883_init_verbs, alc888_lenovo_ms7195_verbs},
10263 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10264 .dac_nids = alc883_dac_nids,
10265 .dig_out_nid = ALC883_DIGOUT_NID,
10266 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10267 .channel_mode = alc883_3ST_6ch_modes,
10269 .input_mux = &alc883_capture_source,
10270 .unsol_event = alc883_lenovo_ms7195_unsol_event,
10271 .init_hook = alc888_lenovo_ms7195_front_automute,
10273 [ALC883_HAIER_W66] = {
10274 .mixers = { alc883_targa_2ch_mixer},
10275 .init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs},
10276 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10277 .dac_nids = alc883_dac_nids,
10278 .dig_out_nid = ALC883_DIGOUT_NID,
10279 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10280 .channel_mode = alc883_3ST_2ch_modes,
10281 .input_mux = &alc883_capture_source,
10282 .unsol_event = alc_automute_amp_unsol_event,
10283 .setup = alc883_haier_w66_setup,
10284 .init_hook = alc_automute_amp,
10286 [ALC888_3ST_HP] = {
10287 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10288 .init_verbs = { alc883_init_verbs, alc888_3st_hp_verbs },
10289 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10290 .dac_nids = alc883_dac_nids,
10291 .num_channel_mode = ARRAY_SIZE(alc888_3st_hp_modes),
10292 .channel_mode = alc888_3st_hp_modes,
10294 .input_mux = &alc883_capture_source,
10295 .unsol_event = alc_automute_amp_unsol_event,
10296 .setup = alc888_3st_hp_setup,
10297 .init_hook = alc_automute_amp,
10299 [ALC888_6ST_DELL] = {
10300 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
10301 .init_verbs = { alc883_init_verbs, alc888_6st_dell_verbs },
10302 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10303 .dac_nids = alc883_dac_nids,
10304 .dig_out_nid = ALC883_DIGOUT_NID,
10305 .dig_in_nid = ALC883_DIGIN_NID,
10306 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10307 .channel_mode = alc883_sixstack_modes,
10308 .input_mux = &alc883_capture_source,
10309 .unsol_event = alc_automute_amp_unsol_event,
10310 .setup = alc888_6st_dell_setup,
10311 .init_hook = alc_automute_amp,
10314 .mixers = { alc883_mitac_mixer },
10315 .init_verbs = { alc883_init_verbs, alc883_mitac_verbs },
10316 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10317 .dac_nids = alc883_dac_nids,
10318 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10319 .channel_mode = alc883_3ST_2ch_modes,
10320 .input_mux = &alc883_capture_source,
10321 .unsol_event = alc_automute_amp_unsol_event,
10322 .setup = alc883_mitac_setup,
10323 .init_hook = alc_automute_amp,
10325 [ALC883_FUJITSU_PI2515] = {
10326 .mixers = { alc883_2ch_fujitsu_pi2515_mixer },
10327 .init_verbs = { alc883_init_verbs,
10328 alc883_2ch_fujitsu_pi2515_verbs},
10329 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10330 .dac_nids = alc883_dac_nids,
10331 .dig_out_nid = ALC883_DIGOUT_NID,
10332 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10333 .channel_mode = alc883_3ST_2ch_modes,
10334 .input_mux = &alc883_fujitsu_pi2515_capture_source,
10335 .unsol_event = alc_automute_amp_unsol_event,
10336 .setup = alc883_2ch_fujitsu_pi2515_setup,
10337 .init_hook = alc_automute_amp,
10339 [ALC888_FUJITSU_XA3530] = {
10340 .mixers = { alc888_base_mixer, alc883_chmode_mixer },
10341 .init_verbs = { alc883_init_verbs,
10342 alc888_fujitsu_xa3530_verbs },
10343 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10344 .dac_nids = alc883_dac_nids,
10345 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids_rev),
10346 .adc_nids = alc883_adc_nids_rev,
10347 .capsrc_nids = alc883_capsrc_nids_rev,
10348 .dig_out_nid = ALC883_DIGOUT_NID,
10349 .num_channel_mode = ARRAY_SIZE(alc888_4ST_8ch_intel_modes),
10350 .channel_mode = alc888_4ST_8ch_intel_modes,
10352 ARRAY_SIZE(alc888_2_capture_sources),
10353 .input_mux = alc888_2_capture_sources,
10354 .unsol_event = alc_automute_amp_unsol_event,
10355 .setup = alc888_fujitsu_xa3530_setup,
10356 .init_hook = alc_automute_amp,
10358 [ALC888_LENOVO_SKY] = {
10359 .mixers = { alc888_lenovo_sky_mixer, alc883_chmode_mixer },
10360 .init_verbs = { alc883_init_verbs, alc888_lenovo_sky_verbs},
10361 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10362 .dac_nids = alc883_dac_nids,
10363 .dig_out_nid = ALC883_DIGOUT_NID,
10364 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10365 .channel_mode = alc883_sixstack_modes,
10367 .input_mux = &alc883_lenovo_sky_capture_source,
10368 .unsol_event = alc_automute_amp_unsol_event,
10369 .setup = alc888_lenovo_sky_setup,
10370 .init_hook = alc_automute_amp,
10372 [ALC888_ASUS_M90V] = {
10373 .mixers = { alc883_3ST_6ch_mixer, alc883_chmode_mixer },
10374 .init_verbs = { alc883_init_verbs, alc888_asus_m90v_verbs },
10375 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10376 .dac_nids = alc883_dac_nids,
10377 .dig_out_nid = ALC883_DIGOUT_NID,
10378 .dig_in_nid = ALC883_DIGIN_NID,
10379 .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_modes),
10380 .channel_mode = alc883_3ST_6ch_modes,
10382 .input_mux = &alc883_fujitsu_pi2515_capture_source,
10383 .unsol_event = alc_sku_unsol_event,
10384 .setup = alc883_mode2_setup,
10385 .init_hook = alc_inithook,
10387 [ALC888_ASUS_EEE1601] = {
10388 .mixers = { alc883_asus_eee1601_mixer },
10389 .cap_mixer = alc883_asus_eee1601_cap_mixer,
10390 .init_verbs = { alc883_init_verbs, alc888_asus_eee1601_verbs },
10391 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10392 .dac_nids = alc883_dac_nids,
10393 .dig_out_nid = ALC883_DIGOUT_NID,
10394 .dig_in_nid = ALC883_DIGIN_NID,
10395 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10396 .channel_mode = alc883_3ST_2ch_modes,
10398 .input_mux = &alc883_asus_eee1601_capture_source,
10399 .unsol_event = alc_sku_unsol_event,
10400 .init_hook = alc883_eee1601_inithook,
10402 [ALC1200_ASUS_P5Q] = {
10403 .mixers = { alc883_base_mixer, alc883_chmode_mixer },
10404 .init_verbs = { alc883_init_verbs },
10405 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10406 .dac_nids = alc883_dac_nids,
10407 .dig_out_nid = ALC1200_DIGOUT_NID,
10408 .dig_in_nid = ALC883_DIGIN_NID,
10409 .slave_dig_outs = alc1200_slave_dig_outs,
10410 .num_channel_mode = ARRAY_SIZE(alc883_sixstack_modes),
10411 .channel_mode = alc883_sixstack_modes,
10412 .input_mux = &alc883_capture_source,
10415 .mixers = { alc889A_mb31_mixer, alc883_chmode_mixer},
10416 .init_verbs = { alc883_init_verbs, alc889A_mb31_verbs,
10417 alc880_gpio1_init_verbs },
10418 .adc_nids = alc883_adc_nids,
10419 .num_adc_nids = ARRAY_SIZE(alc883_adc_nids),
10420 .capsrc_nids = alc883_capsrc_nids,
10421 .dac_nids = alc883_dac_nids,
10422 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10423 .channel_mode = alc889A_mb31_6ch_modes,
10424 .num_channel_mode = ARRAY_SIZE(alc889A_mb31_6ch_modes),
10425 .input_mux = &alc889A_mb31_capture_source,
10426 .dig_out_nid = ALC883_DIGOUT_NID,
10427 .unsol_event = alc889A_mb31_unsol_event,
10428 .init_hook = alc889A_mb31_automute,
10430 [ALC883_SONY_VAIO_TT] = {
10431 .mixers = { alc883_vaiott_mixer },
10432 .init_verbs = { alc883_init_verbs, alc883_vaiott_verbs },
10433 .num_dacs = ARRAY_SIZE(alc883_dac_nids),
10434 .dac_nids = alc883_dac_nids,
10435 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
10436 .channel_mode = alc883_3ST_2ch_modes,
10437 .input_mux = &alc883_capture_source,
10438 .unsol_event = alc_automute_amp_unsol_event,
10439 .setup = alc883_vaiott_setup,
10440 .init_hook = alc_automute_amp,
10449 PINFIX_ABIT_AW9D_MAX,
10453 static struct alc_pincfg alc882_abit_aw9d_pinfix[] = {
10454 { 0x15, 0x01080104 }, /* side */
10455 { 0x16, 0x01011012 }, /* rear */
10456 { 0x17, 0x01016011 }, /* clfe */
10460 static const struct hda_verb pb_m5210_verbs[] = {
10461 { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50 },
10465 static const struct alc_fixup alc882_fixups[] = {
10466 [PINFIX_ABIT_AW9D_MAX] = {
10467 .pins = alc882_abit_aw9d_pinfix
10469 [PINFIX_PB_M5210] = {
10470 .verbs = pb_m5210_verbs
10474 static struct snd_pci_quirk alc882_fixup_tbl[] = {
10475 SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", PINFIX_PB_M5210),
10476 SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", PINFIX_ABIT_AW9D_MAX),
10481 * BIOS auto configuration
10483 static int alc882_auto_create_input_ctls(struct hda_codec *codec,
10484 const struct auto_pin_cfg *cfg)
10486 return alc_auto_create_input_ctls(codec, cfg, 0x0b, 0x23, 0x22);
10489 static void alc882_auto_set_output_and_unmute(struct hda_codec *codec,
10490 hda_nid_t nid, int pin_type,
10495 /* set as output */
10496 alc_set_pin_output(codec, nid, pin_type);
10500 else if (dac >= 0x02 && dac <= 0x05)
10504 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
10507 static void alc882_auto_init_multi_out(struct hda_codec *codec)
10509 struct alc_spec *spec = codec->spec;
10512 for (i = 0; i <= HDA_SIDE; i++) {
10513 hda_nid_t nid = spec->autocfg.line_out_pins[i];
10514 int pin_type = get_pin_type(spec->autocfg.line_out_type);
10516 alc882_auto_set_output_and_unmute(codec, nid, pin_type,
10517 spec->multiout.dac_nids[i]);
10521 static void alc882_auto_init_hp_out(struct hda_codec *codec)
10523 struct alc_spec *spec = codec->spec;
10524 hda_nid_t pin, dac;
10526 pin = spec->autocfg.hp_pins[0];
10528 dac = spec->multiout.hp_nid;
10530 dac = spec->multiout.dac_nids[0]; /* to front */
10531 alc882_auto_set_output_and_unmute(codec, pin, PIN_HP, dac);
10533 pin = spec->autocfg.speaker_pins[0];
10535 dac = spec->multiout.extra_out_nid[0];
10537 dac = spec->multiout.dac_nids[0]; /* to front */
10538 alc882_auto_set_output_and_unmute(codec, pin, PIN_OUT, dac);
10542 static void alc882_auto_init_analog_input(struct hda_codec *codec)
10544 struct alc_spec *spec = codec->spec;
10547 for (i = 0; i < AUTO_PIN_LAST; i++) {
10548 hda_nid_t nid = spec->autocfg.input_pins[i];
10551 alc_set_input_pin(codec, nid, i);
10552 if (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP)
10553 snd_hda_codec_write(codec, nid, 0,
10554 AC_VERB_SET_AMP_GAIN_MUTE,
10559 static void alc882_auto_init_input_src(struct hda_codec *codec)
10561 struct alc_spec *spec = codec->spec;
10564 for (c = 0; c < spec->num_adc_nids; c++) {
10565 hda_nid_t conn_list[HDA_MAX_NUM_INPUTS];
10566 hda_nid_t nid = spec->capsrc_nids[c];
10567 unsigned int mux_idx;
10568 const struct hda_input_mux *imux;
10569 int conns, mute, idx, item;
10571 conns = snd_hda_get_connections(codec, nid, conn_list,
10572 ARRAY_SIZE(conn_list));
10575 mux_idx = c >= spec->num_mux_defs ? 0 : c;
10576 imux = &spec->input_mux[mux_idx];
10577 if (!imux->num_items && mux_idx > 0)
10578 imux = &spec->input_mux[0];
10579 for (idx = 0; idx < conns; idx++) {
10580 /* if the current connection is the selected one,
10581 * unmute it as default - otherwise mute it
10583 mute = AMP_IN_MUTE(idx);
10584 for (item = 0; item < imux->num_items; item++) {
10585 if (imux->items[item].index == idx) {
10586 if (spec->cur_mux[c] == item)
10587 mute = AMP_IN_UNMUTE(idx);
10591 /* check if we have a selector or mixer
10592 * we could check for the widget type instead, but
10593 * just check for Amp-In presence (in case of mixer
10594 * without amp-in there is something wrong, this
10595 * function shouldn't be used or capsrc nid is wrong)
10597 if (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)
10598 snd_hda_codec_write(codec, nid, 0,
10599 AC_VERB_SET_AMP_GAIN_MUTE,
10601 else if (mute != AMP_IN_MUTE(idx))
10602 snd_hda_codec_write(codec, nid, 0,
10603 AC_VERB_SET_CONNECT_SEL,
10609 /* add mic boosts if needed */
10610 static int alc_auto_add_mic_boost(struct hda_codec *codec)
10612 struct alc_spec *spec = codec->spec;
10616 nid = spec->autocfg.input_pins[AUTO_PIN_MIC];
10617 if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
10618 err = add_control(spec, ALC_CTL_WIDGET_VOL,
10620 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
10624 nid = spec->autocfg.input_pins[AUTO_PIN_FRONT_MIC];
10625 if (nid && (get_wcaps(codec, nid) & AC_WCAP_IN_AMP)) {
10626 err = add_control(spec, ALC_CTL_WIDGET_VOL,
10628 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
10635 /* almost identical with ALC880 parser... */
10636 static int alc882_parse_auto_config(struct hda_codec *codec)
10638 struct alc_spec *spec = codec->spec;
10639 static hda_nid_t alc882_ignore[] = { 0x1d, 0 };
10642 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
10646 if (!spec->autocfg.line_outs)
10647 return 0; /* can't find valid BIOS pin config */
10649 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
10652 err = alc880_auto_create_multi_out_ctls(spec, &spec->autocfg);
10655 err = alc880_auto_create_extra_out(spec, spec->autocfg.hp_pins[0],
10659 err = alc880_auto_create_extra_out(spec,
10660 spec->autocfg.speaker_pins[0],
10664 err = alc882_auto_create_input_ctls(codec, &spec->autocfg);
10668 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
10670 alc_auto_parse_digital(codec);
10672 if (spec->kctls.list)
10673 add_mixer(spec, spec->kctls.list);
10675 add_verb(spec, alc883_auto_init_verbs);
10676 /* if ADC 0x07 is available, initialize it, too */
10677 if (get_wcaps_type(get_wcaps(codec, 0x07)) == AC_WID_AUD_IN)
10678 add_verb(spec, alc882_adc1_init_verbs);
10680 spec->num_mux_defs = 1;
10681 spec->input_mux = &spec->private_imux[0];
10683 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
10685 err = alc_auto_add_mic_boost(codec);
10689 return 1; /* config found */
10692 /* additional initialization for auto-configuration model */
10693 static void alc882_auto_init(struct hda_codec *codec)
10695 struct alc_spec *spec = codec->spec;
10696 alc882_auto_init_multi_out(codec);
10697 alc882_auto_init_hp_out(codec);
10698 alc882_auto_init_analog_input(codec);
10699 alc882_auto_init_input_src(codec);
10700 alc_auto_init_digital(codec);
10701 if (spec->unsol_event)
10702 alc_inithook(codec);
10705 static int patch_alc882(struct hda_codec *codec)
10707 struct alc_spec *spec;
10708 int err, board_config;
10710 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
10714 codec->spec = spec;
10716 alc_auto_parse_customize_define(codec);
10718 switch (codec->vendor_id) {
10723 /* ALC883 and variants */
10724 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
10728 board_config = snd_hda_check_board_config(codec, ALC882_MODEL_LAST,
10732 if (board_config < 0 || board_config >= ALC882_MODEL_LAST)
10733 board_config = snd_hda_check_board_codec_sid_config(codec,
10734 ALC882_MODEL_LAST, alc882_models, alc882_ssid_cfg_tbl);
10736 if (board_config < 0 || board_config >= ALC882_MODEL_LAST) {
10737 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
10739 board_config = ALC882_AUTO;
10742 if (board_config == ALC882_AUTO)
10743 alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 1);
10745 if (board_config == ALC882_AUTO) {
10746 /* automatic parse from the BIOS config */
10747 err = alc882_parse_auto_config(codec);
10753 "hda_codec: Cannot set up configuration "
10754 "from BIOS. Using base mode...\n");
10755 board_config = ALC882_3ST_DIG;
10759 if (has_cdefine_beep(codec)) {
10760 err = snd_hda_attach_beep_device(codec, 0x1);
10767 if (board_config != ALC882_AUTO)
10768 setup_preset(codec, &alc882_presets[board_config]);
10770 spec->stream_analog_playback = &alc882_pcm_analog_playback;
10771 spec->stream_analog_capture = &alc882_pcm_analog_capture;
10772 /* FIXME: setup DAC5 */
10773 /*spec->stream_analog_alt_playback = &alc880_pcm_analog_alt_playback;*/
10774 spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
10776 spec->stream_digital_playback = &alc882_pcm_digital_playback;
10777 spec->stream_digital_capture = &alc882_pcm_digital_capture;
10779 if (!spec->adc_nids && spec->input_mux) {
10781 spec->num_adc_nids = 0;
10782 for (i = 0; i < ARRAY_SIZE(alc882_adc_nids); i++) {
10783 const struct hda_input_mux *imux = spec->input_mux;
10785 hda_nid_t items[16];
10786 hda_nid_t nid = alc882_adc_nids[i];
10787 unsigned int wcap = get_wcaps(codec, nid);
10789 wcap = get_wcaps_type(wcap);
10790 if (wcap != AC_WID_AUD_IN)
10792 spec->private_adc_nids[spec->num_adc_nids] = nid;
10793 err = snd_hda_get_connections(codec, nid, &cap, 1);
10796 err = snd_hda_get_connections(codec, cap, items,
10797 ARRAY_SIZE(items));
10800 for (j = 0; j < imux->num_items; j++)
10801 if (imux->items[j].index >= err)
10803 if (j < imux->num_items)
10805 spec->private_capsrc_nids[spec->num_adc_nids] = cap;
10806 spec->num_adc_nids++;
10808 spec->adc_nids = spec->private_adc_nids;
10809 spec->capsrc_nids = spec->private_capsrc_nids;
10812 set_capture_mixer(codec);
10814 if (has_cdefine_beep(codec))
10815 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
10817 if (board_config == ALC882_AUTO)
10818 alc_pick_fixup(codec, alc882_fixup_tbl, alc882_fixups, 0);
10820 spec->vmaster_nid = 0x0c;
10822 codec->patch_ops = alc_patch_ops;
10823 if (board_config == ALC882_AUTO)
10824 spec->init_hook = alc882_auto_init;
10825 #ifdef CONFIG_SND_HDA_POWER_SAVE
10826 if (!spec->loopback.amplist)
10827 spec->loopback.amplist = alc882_loopbacks;
10838 #define ALC262_DIGOUT_NID ALC880_DIGOUT_NID
10839 #define ALC262_DIGIN_NID ALC880_DIGIN_NID
10841 #define alc262_dac_nids alc260_dac_nids
10842 #define alc262_adc_nids alc882_adc_nids
10843 #define alc262_adc_nids_alt alc882_adc_nids_alt
10844 #define alc262_capsrc_nids alc882_capsrc_nids
10845 #define alc262_capsrc_nids_alt alc882_capsrc_nids_alt
10847 #define alc262_modes alc260_modes
10848 #define alc262_capture_source alc882_capture_source
10850 static hda_nid_t alc262_dmic_adc_nids[1] = {
10855 static hda_nid_t alc262_dmic_capsrc_nids[1] = { 0x22 };
10857 static struct snd_kcontrol_new alc262_base_mixer[] = {
10858 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10859 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
10860 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10861 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10862 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10863 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10864 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
10865 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
10866 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
10867 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10868 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10869 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10870 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0D, 0x0, HDA_OUTPUT),
10871 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10872 HDA_CODEC_VOLUME_MONO("Mono Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
10873 HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
10877 /* update HP, line and mono-out pins according to the master switch */
10878 static void alc262_hp_master_update(struct hda_codec *codec)
10880 struct alc_spec *spec = codec->spec;
10881 int val = spec->master_sw;
10883 /* HP & line-out */
10884 snd_hda_codec_write_cache(codec, 0x1b, 0,
10885 AC_VERB_SET_PIN_WIDGET_CONTROL,
10887 snd_hda_codec_write_cache(codec, 0x15, 0,
10888 AC_VERB_SET_PIN_WIDGET_CONTROL,
10890 /* mono (speaker) depending on the HP jack sense */
10891 val = val && !spec->jack_present;
10892 snd_hda_codec_write_cache(codec, 0x16, 0,
10893 AC_VERB_SET_PIN_WIDGET_CONTROL,
10894 val ? PIN_OUT : 0);
10897 static void alc262_hp_bpc_automute(struct hda_codec *codec)
10899 struct alc_spec *spec = codec->spec;
10901 spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
10902 alc262_hp_master_update(codec);
10905 static void alc262_hp_bpc_unsol_event(struct hda_codec *codec, unsigned int res)
10907 if ((res >> 26) != ALC880_HP_EVENT)
10909 alc262_hp_bpc_automute(codec);
10912 static void alc262_hp_wildwest_automute(struct hda_codec *codec)
10914 struct alc_spec *spec = codec->spec;
10916 spec->jack_present = snd_hda_jack_detect(codec, 0x15);
10917 alc262_hp_master_update(codec);
10920 static void alc262_hp_wildwest_unsol_event(struct hda_codec *codec,
10923 if ((res >> 26) != ALC880_HP_EVENT)
10925 alc262_hp_wildwest_automute(codec);
10928 #define alc262_hp_master_sw_get alc260_hp_master_sw_get
10930 static int alc262_hp_master_sw_put(struct snd_kcontrol *kcontrol,
10931 struct snd_ctl_elem_value *ucontrol)
10933 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
10934 struct alc_spec *spec = codec->spec;
10935 int val = !!*ucontrol->value.integer.value;
10937 if (val == spec->master_sw)
10939 spec->master_sw = val;
10940 alc262_hp_master_update(codec);
10944 #define ALC262_HP_MASTER_SWITCH \
10946 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
10947 .name = "Master Playback Switch", \
10948 .info = snd_ctl_boolean_mono_info, \
10949 .get = alc262_hp_master_sw_get, \
10950 .put = alc262_hp_master_sw_put, \
10953 .iface = NID_MAPPING, \
10954 .name = "Master Playback Switch", \
10955 .private_value = 0x15 | (0x16 << 8) | (0x1b << 16), \
10959 static struct snd_kcontrol_new alc262_HP_BPC_mixer[] = {
10960 ALC262_HP_MASTER_SWITCH,
10961 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10962 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10963 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10964 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10966 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
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("Mic Boost", 0x18, 0, HDA_INPUT),
10971 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
10972 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
10973 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
10974 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
10975 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
10976 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10977 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
10978 HDA_CODEC_VOLUME("AUX IN Playback Volume", 0x0b, 0x06, HDA_INPUT),
10979 HDA_CODEC_MUTE("AUX IN Playback Switch", 0x0b, 0x06, HDA_INPUT),
10983 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_mixer[] = {
10984 ALC262_HP_MASTER_SWITCH,
10985 HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
10986 HDA_CODEC_MUTE("Front Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
10987 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
10988 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
10989 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 2, 0x0,
10991 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 2, 0x0,
10993 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x02, HDA_INPUT),
10994 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x02, HDA_INPUT),
10995 HDA_CODEC_VOLUME("Front Mic Boost", 0x1a, 0, HDA_INPUT),
10996 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
10997 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
10998 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
10999 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11003 static struct snd_kcontrol_new alc262_HP_BPC_WildWest_option_mixer[] = {
11004 HDA_CODEC_VOLUME("Rear Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11005 HDA_CODEC_MUTE("Rear Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11006 HDA_CODEC_VOLUME("Rear Mic Boost", 0x18, 0, HDA_INPUT),
11010 /* mute/unmute internal speaker according to the hp jack and mute state */
11011 static void alc262_hp_t5735_setup(struct hda_codec *codec)
11013 struct alc_spec *spec = codec->spec;
11015 spec->autocfg.hp_pins[0] = 0x15;
11016 spec->autocfg.speaker_pins[0] = 0x14;
11019 static struct snd_kcontrol_new alc262_hp_t5735_mixer[] = {
11020 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11021 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
11022 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
11023 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11024 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11025 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11026 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11030 static struct hda_verb alc262_hp_t5735_verbs[] = {
11031 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11032 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11034 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
11038 static struct snd_kcontrol_new alc262_hp_rp5700_mixer[] = {
11039 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11040 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
11041 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0e, 0x0, HDA_OUTPUT),
11042 HDA_CODEC_MUTE("Speaker Playback Switch", 0x16, 0x0, HDA_OUTPUT),
11043 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x01, HDA_INPUT),
11044 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x01, HDA_INPUT),
11048 static struct hda_verb alc262_hp_rp5700_verbs[] = {
11049 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
11050 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
11051 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11052 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11053 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
11054 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11055 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11056 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
11057 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
11058 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x00 << 8))},
11062 static struct hda_input_mux alc262_hp_rp5700_capture_source = {
11069 /* bind hp and internal speaker mute (with plug check) as master switch */
11070 static void alc262_hippo_master_update(struct hda_codec *codec)
11072 struct alc_spec *spec = codec->spec;
11073 hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
11074 hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
11075 hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
11079 mute = spec->master_sw ? 0 : HDA_AMP_MUTE;
11080 snd_hda_codec_amp_stereo(codec, hp_nid, HDA_OUTPUT, 0,
11081 HDA_AMP_MUTE, mute);
11082 /* mute internal speaker per jack sense */
11083 if (spec->jack_present)
11084 mute = HDA_AMP_MUTE;
11086 snd_hda_codec_amp_stereo(codec, line_nid, HDA_OUTPUT, 0,
11087 HDA_AMP_MUTE, mute);
11088 if (speaker_nid && speaker_nid != line_nid)
11089 snd_hda_codec_amp_stereo(codec, speaker_nid, HDA_OUTPUT, 0,
11090 HDA_AMP_MUTE, mute);
11093 #define alc262_hippo_master_sw_get alc262_hp_master_sw_get
11095 static int alc262_hippo_master_sw_put(struct snd_kcontrol *kcontrol,
11096 struct snd_ctl_elem_value *ucontrol)
11098 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11099 struct alc_spec *spec = codec->spec;
11100 int val = !!*ucontrol->value.integer.value;
11102 if (val == spec->master_sw)
11104 spec->master_sw = val;
11105 alc262_hippo_master_update(codec);
11109 #define ALC262_HIPPO_MASTER_SWITCH \
11111 .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
11112 .name = "Master Playback Switch", \
11113 .info = snd_ctl_boolean_mono_info, \
11114 .get = alc262_hippo_master_sw_get, \
11115 .put = alc262_hippo_master_sw_put, \
11118 .iface = NID_MAPPING, \
11119 .name = "Master Playback Switch", \
11120 .subdevice = SUBDEV_HP(0) | (SUBDEV_LINE(0) << 8) | \
11121 (SUBDEV_SPEAKER(0) << 16), \
11124 static struct snd_kcontrol_new alc262_hippo_mixer[] = {
11125 ALC262_HIPPO_MASTER_SWITCH,
11126 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11127 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11128 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11129 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
11130 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
11131 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11132 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11133 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11134 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11135 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11136 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11137 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
11141 static struct snd_kcontrol_new alc262_hippo1_mixer[] = {
11142 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11143 ALC262_HIPPO_MASTER_SWITCH,
11144 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11145 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11146 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
11147 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
11148 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11149 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11150 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11151 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11152 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11153 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11157 /* mute/unmute internal speaker according to the hp jack and mute state */
11158 static void alc262_hippo_automute(struct hda_codec *codec)
11160 struct alc_spec *spec = codec->spec;
11161 hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
11163 spec->jack_present = snd_hda_jack_detect(codec, hp_nid);
11164 alc262_hippo_master_update(codec);
11167 static void alc262_hippo_unsol_event(struct hda_codec *codec, unsigned int res)
11169 if ((res >> 26) != ALC880_HP_EVENT)
11171 alc262_hippo_automute(codec);
11174 static void alc262_hippo_setup(struct hda_codec *codec)
11176 struct alc_spec *spec = codec->spec;
11178 spec->autocfg.hp_pins[0] = 0x15;
11179 spec->autocfg.speaker_pins[0] = 0x14;
11182 static void alc262_hippo1_setup(struct hda_codec *codec)
11184 struct alc_spec *spec = codec->spec;
11186 spec->autocfg.hp_pins[0] = 0x1b;
11187 spec->autocfg.speaker_pins[0] = 0x14;
11191 static struct snd_kcontrol_new alc262_sony_mixer[] = {
11192 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11193 ALC262_HIPPO_MASTER_SWITCH,
11194 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11195 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11196 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11197 HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11201 static struct snd_kcontrol_new alc262_benq_t31_mixer[] = {
11202 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11203 ALC262_HIPPO_MASTER_SWITCH,
11204 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11205 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11206 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11207 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11208 HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11212 static struct snd_kcontrol_new alc262_tyan_mixer[] = {
11213 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11214 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
11215 HDA_CODEC_VOLUME("Aux Playback Volume", 0x0b, 0x06, HDA_INPUT),
11216 HDA_CODEC_MUTE("Aux Playback Switch", 0x0b, 0x06, HDA_INPUT),
11217 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
11218 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
11219 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11220 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11221 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11222 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11223 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11224 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11228 static struct hda_verb alc262_tyan_verbs[] = {
11229 /* Headphone automute */
11230 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11231 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11232 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11234 /* P11 AUX_IN, white 4-pin connector */
11235 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
11236 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_1, 0xe1},
11237 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_2, 0x93},
11238 {0x14, AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0x19},
11243 /* unsolicited event for HP jack sensing */
11244 static void alc262_tyan_setup(struct hda_codec *codec)
11246 struct alc_spec *spec = codec->spec;
11248 spec->autocfg.hp_pins[0] = 0x1b;
11249 spec->autocfg.speaker_pins[0] = 0x15;
11253 #define alc262_capture_mixer alc882_capture_mixer
11254 #define alc262_capture_alt_mixer alc882_capture_alt_mixer
11257 * generic initialization of ADC, input mixers and output mixers
11259 static struct hda_verb alc262_init_verbs[] = {
11261 * Unmute ADC0-2 and set the default input to mic-in
11263 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11264 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11265 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11266 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11267 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11268 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11270 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11272 * Note: PASD motherboards uses the Line In 2 as the input for
11273 * front panel mic (mic 2)
11275 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11276 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11277 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11278 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11279 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11280 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11283 * Set up output mixers (0x0c - 0x0e)
11285 /* set vol=0 to output mixers */
11286 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11287 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11288 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11289 /* set up input amps for analog loopback */
11290 /* Amp Indices: DAC = 0, mixer = 1 */
11291 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11292 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11293 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11294 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11295 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11296 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11298 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
11299 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11300 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
11301 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11302 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11303 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
11305 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11306 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11307 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11308 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11309 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11311 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
11312 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
11314 /* FIXME: use matrix-type input source selection */
11315 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11316 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11317 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11318 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11319 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11320 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11322 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11323 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11324 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11325 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11327 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11328 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11329 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11330 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11335 static struct hda_verb alc262_eapd_verbs[] = {
11336 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
11337 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
11341 static struct hda_verb alc262_hippo1_unsol_verbs[] = {
11342 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11343 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
11344 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0x0000},
11346 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11347 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11351 static struct hda_verb alc262_sony_unsol_verbs[] = {
11352 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
11353 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11354 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24}, // Front Mic
11356 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11357 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11361 static struct snd_kcontrol_new alc262_toshiba_s06_mixer[] = {
11362 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11363 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
11364 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11365 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11366 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11370 static struct hda_verb alc262_toshiba_s06_verbs[] = {
11371 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
11372 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11373 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11374 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11375 {0x22, AC_VERB_SET_CONNECT_SEL, 0x09},
11376 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11377 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
11378 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11382 static void alc262_toshiba_s06_setup(struct hda_codec *codec)
11384 struct alc_spec *spec = codec->spec;
11386 spec->autocfg.hp_pins[0] = 0x15;
11387 spec->autocfg.speaker_pins[0] = 0x14;
11388 spec->ext_mic.pin = 0x18;
11389 spec->ext_mic.mux_idx = 0;
11390 spec->int_mic.pin = 0x12;
11391 spec->int_mic.mux_idx = 9;
11392 spec->auto_mic = 1;
11398 * 0x16 = internal speaker
11399 * 0x18 = external mic
11402 static struct snd_kcontrol_new alc262_nec_mixer[] = {
11403 HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
11404 HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
11406 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11407 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11408 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11410 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
11411 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
11415 static struct hda_verb alc262_nec_verbs[] = {
11416 /* Unmute Speaker */
11417 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
11420 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11421 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11423 /* External mic to headphone */
11424 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11425 /* External mic to speaker */
11426 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11432 * 0x14 = headphone/spdif-out, 0x15 = internal speaker,
11433 * 0x1b = port replicator headphone out
11436 #define ALC_HP_EVENT 0x37
11438 static struct hda_verb alc262_fujitsu_unsol_verbs[] = {
11439 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11440 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11441 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11442 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11446 static struct hda_verb alc262_lenovo_3000_unsol_verbs[] = {
11447 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC_HP_EVENT},
11448 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11452 static struct hda_verb alc262_lenovo_3000_init_verbs[] = {
11453 /* Front Mic pin: input vref at 50% */
11454 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
11455 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11459 static struct hda_input_mux alc262_fujitsu_capture_source = {
11463 { "Int Mic", 0x1 },
11468 static struct hda_input_mux alc262_HP_capture_source = {
11472 { "Front Mic", 0x1 },
11479 static struct hda_input_mux alc262_HP_D7000_capture_source = {
11483 { "Front Mic", 0x2 },
11489 /* mute/unmute internal speaker according to the hp jacks and mute state */
11490 static void alc262_fujitsu_automute(struct hda_codec *codec, int force)
11492 struct alc_spec *spec = codec->spec;
11495 if (force || !spec->sense_updated) {
11496 spec->jack_present = snd_hda_jack_detect(codec, 0x14) ||
11497 snd_hda_jack_detect(codec, 0x1b);
11498 spec->sense_updated = 1;
11500 /* unmute internal speaker only if both HPs are unplugged and
11501 * master switch is on
11503 if (spec->jack_present)
11504 mute = HDA_AMP_MUTE;
11506 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
11507 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11508 HDA_AMP_MUTE, mute);
11511 /* unsolicited event for HP jack sensing */
11512 static void alc262_fujitsu_unsol_event(struct hda_codec *codec,
11515 if ((res >> 26) != ALC_HP_EVENT)
11517 alc262_fujitsu_automute(codec, 1);
11520 static void alc262_fujitsu_init_hook(struct hda_codec *codec)
11522 alc262_fujitsu_automute(codec, 1);
11525 /* bind volumes of both NID 0x0c and 0x0d */
11526 static struct hda_bind_ctls alc262_fujitsu_bind_master_vol = {
11527 .ops = &snd_hda_bind_vol,
11529 HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT),
11530 HDA_COMPOSE_AMP_VAL(0x0d, 3, 0, HDA_OUTPUT),
11535 /* mute/unmute internal speaker according to the hp jack and mute state */
11536 static void alc262_lenovo_3000_automute(struct hda_codec *codec, int force)
11538 struct alc_spec *spec = codec->spec;
11541 if (force || !spec->sense_updated) {
11542 spec->jack_present = snd_hda_jack_detect(codec, 0x1b);
11543 spec->sense_updated = 1;
11545 if (spec->jack_present) {
11546 /* mute internal speaker */
11547 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11548 HDA_AMP_MUTE, HDA_AMP_MUTE);
11549 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
11550 HDA_AMP_MUTE, HDA_AMP_MUTE);
11552 /* unmute internal speaker if necessary */
11553 mute = snd_hda_codec_amp_read(codec, 0x1b, 0, HDA_OUTPUT, 0);
11554 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11555 HDA_AMP_MUTE, mute);
11556 snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
11557 HDA_AMP_MUTE, mute);
11561 /* unsolicited event for HP jack sensing */
11562 static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec,
11565 if ((res >> 26) != ALC_HP_EVENT)
11567 alc262_lenovo_3000_automute(codec, 1);
11570 static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid,
11571 int dir, int idx, long *valp)
11575 for (i = 0; i < 2; i++, valp++)
11576 change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx,
11578 *valp ? 0 : HDA_AMP_MUTE);
11582 /* bind hp and internal speaker mute (with plug check) */
11583 static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
11584 struct snd_ctl_elem_value *ucontrol)
11586 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11587 long *valp = ucontrol->value.integer.value;
11590 change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
11591 change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
11593 alc262_fujitsu_automute(codec, 0);
11597 static struct snd_kcontrol_new alc262_fujitsu_mixer[] = {
11598 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11600 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11601 .name = "Master Playback Switch",
11602 .subdevice = HDA_SUBDEV_AMP_FLAG,
11603 .info = snd_hda_mixer_amp_switch_info,
11604 .get = snd_hda_mixer_amp_switch_get,
11605 .put = alc262_fujitsu_master_sw_put,
11606 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
11609 .iface = NID_MAPPING,
11610 .name = "Master Playback Switch",
11611 .private_value = 0x1b,
11613 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11614 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11615 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11616 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11617 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11618 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
11619 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11620 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
11624 /* bind hp and internal speaker mute (with plug check) */
11625 static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol,
11626 struct snd_ctl_elem_value *ucontrol)
11628 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11629 long *valp = ucontrol->value.integer.value;
11632 change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
11634 alc262_lenovo_3000_automute(codec, 0);
11638 static struct snd_kcontrol_new alc262_lenovo_3000_mixer[] = {
11639 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11641 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11642 .name = "Master Playback Switch",
11643 .subdevice = HDA_SUBDEV_AMP_FLAG,
11644 .info = snd_hda_mixer_amp_switch_info,
11645 .get = snd_hda_mixer_amp_switch_get,
11646 .put = alc262_lenovo_3000_master_sw_put,
11647 .private_value = HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
11649 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
11650 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
11651 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11652 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11653 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11654 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
11655 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
11656 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
11660 static struct snd_kcontrol_new alc262_toshiba_rx1_mixer[] = {
11661 HDA_BIND_VOL("Master Playback Volume", &alc262_fujitsu_bind_master_vol),
11662 ALC262_HIPPO_MASTER_SWITCH,
11663 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
11664 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
11665 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
11666 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11667 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11668 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
11672 /* additional init verbs for Benq laptops */
11673 static struct hda_verb alc262_EAPD_verbs[] = {
11674 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11675 {0x20, AC_VERB_SET_PROC_COEF, 0x3070},
11679 static struct hda_verb alc262_benq_t31_EAPD_verbs[] = {
11680 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11681 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11683 {0x20, AC_VERB_SET_COEF_INDEX, 0x07},
11684 {0x20, AC_VERB_SET_PROC_COEF, 0x3050},
11688 /* Samsung Q1 Ultra Vista model setup */
11689 static struct snd_kcontrol_new alc262_ultra_mixer[] = {
11690 HDA_CODEC_VOLUME("Master Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
11691 HDA_BIND_MUTE("Master Playback Switch", 0x0c, 2, HDA_INPUT),
11692 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
11693 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
11694 HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
11695 HDA_CODEC_VOLUME("Headphone Mic Boost", 0x15, 0, HDA_INPUT),
11699 static struct hda_verb alc262_ultra_verbs[] = {
11701 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11702 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11703 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11705 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
11706 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11707 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11708 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
11710 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
11711 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
11712 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11713 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
11714 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
11716 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
11717 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11718 /* ADC, choose mic */
11719 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11720 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11721 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11722 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11723 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11724 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11725 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11726 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11727 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
11728 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(8)},
11732 /* mute/unmute internal speaker according to the hp jack and mute state */
11733 static void alc262_ultra_automute(struct hda_codec *codec)
11735 struct alc_spec *spec = codec->spec;
11739 /* auto-mute only when HP is used as HP */
11740 if (!spec->cur_mux[0]) {
11741 spec->jack_present = snd_hda_jack_detect(codec, 0x15);
11742 if (spec->jack_present)
11743 mute = HDA_AMP_MUTE;
11745 /* mute/unmute internal speaker */
11746 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
11747 HDA_AMP_MUTE, mute);
11748 /* mute/unmute HP */
11749 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
11750 HDA_AMP_MUTE, mute ? 0 : HDA_AMP_MUTE);
11753 /* unsolicited event for HP jack sensing */
11754 static void alc262_ultra_unsol_event(struct hda_codec *codec,
11757 if ((res >> 26) != ALC880_HP_EVENT)
11759 alc262_ultra_automute(codec);
11762 static struct hda_input_mux alc262_ultra_capture_source = {
11766 { "Headphone", 0x7 },
11770 static int alc262_ultra_mux_enum_put(struct snd_kcontrol *kcontrol,
11771 struct snd_ctl_elem_value *ucontrol)
11773 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
11774 struct alc_spec *spec = codec->spec;
11777 ret = alc_mux_enum_put(kcontrol, ucontrol);
11780 /* reprogram the HP pin as mic or HP according to the input source */
11781 snd_hda_codec_write_cache(codec, 0x15, 0,
11782 AC_VERB_SET_PIN_WIDGET_CONTROL,
11783 spec->cur_mux[0] ? PIN_VREF80 : PIN_HP);
11784 alc262_ultra_automute(codec); /* mute/unmute HP */
11788 static struct snd_kcontrol_new alc262_ultra_capture_mixer[] = {
11789 HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
11790 HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
11792 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
11793 .name = "Capture Source",
11794 .info = alc_mux_enum_info,
11795 .get = alc_mux_enum_get,
11796 .put = alc262_ultra_mux_enum_put,
11799 .iface = NID_MAPPING,
11800 .name = "Capture Source",
11801 .private_value = 0x15,
11806 /* We use two mixers depending on the output pin; 0x16 is a mono output
11807 * and thus it's bound with a different mixer.
11808 * This function returns which mixer amp should be used.
11810 static int alc262_check_volbit(hda_nid_t nid)
11814 else if (nid == 0x16)
11820 static int alc262_add_out_vol_ctl(struct alc_spec *spec, hda_nid_t nid,
11821 const char *pfx, int *vbits)
11826 vbit = alc262_check_volbit(nid);
11829 if (*vbits & vbit) /* a volume control for this mixer already there */
11833 val = HDA_COMPOSE_AMP_VAL(0x0e, 2, 0, HDA_OUTPUT);
11835 val = HDA_COMPOSE_AMP_VAL(0x0c, 3, 0, HDA_OUTPUT);
11836 return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx, val);
11839 static int alc262_add_out_sw_ctl(struct alc_spec *spec, hda_nid_t nid,
11847 val = HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT);
11849 val = HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_OUTPUT);
11850 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx, val);
11853 /* add playback controls from the parsed DAC table */
11854 static int alc262_auto_create_multi_out_ctls(struct alc_spec *spec,
11855 const struct auto_pin_cfg *cfg)
11861 spec->multiout.num_dacs = 1; /* only use one dac */
11862 spec->multiout.dac_nids = spec->private_dac_nids;
11863 spec->multiout.dac_nids[0] = 2;
11865 if (!cfg->speaker_pins[0] && !cfg->hp_pins[0])
11867 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11871 err = alc262_add_out_sw_ctl(spec, cfg->line_out_pins[0], pfx);
11874 err = alc262_add_out_sw_ctl(spec, cfg->speaker_pins[0], "Speaker");
11877 err = alc262_add_out_sw_ctl(spec, cfg->hp_pins[0], "Headphone");
11881 vbits = alc262_check_volbit(cfg->line_out_pins[0]) |
11882 alc262_check_volbit(cfg->speaker_pins[0]) |
11883 alc262_check_volbit(cfg->hp_pins[0]);
11884 if (vbits == 1 || vbits == 2)
11885 pfx = "Master"; /* only one mixer is used */
11886 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
11891 err = alc262_add_out_vol_ctl(spec, cfg->line_out_pins[0], pfx, &vbits);
11894 err = alc262_add_out_vol_ctl(spec, cfg->speaker_pins[0], "Speaker",
11898 err = alc262_add_out_vol_ctl(spec, cfg->hp_pins[0], "Headphone",
11905 #define alc262_auto_create_input_ctls \
11906 alc882_auto_create_input_ctls
11909 * generic initialization of ADC, input mixers and output mixers
11911 static struct hda_verb alc262_volume_init_verbs[] = {
11913 * Unmute ADC0-2 and set the default input to mic-in
11915 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11916 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11917 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11918 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11919 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11920 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11922 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11924 * Note: PASD motherboards uses the Line In 2 as the input for
11925 * front panel mic (mic 2)
11927 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11928 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11929 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11930 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11931 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11932 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11935 * Set up output mixers (0x0c - 0x0f)
11937 /* set vol=0 to output mixers */
11938 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11939 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11940 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
11942 /* set up input amps for analog loopback */
11943 /* Amp Indices: DAC = 0, mixer = 1 */
11944 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11945 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11946 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11947 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11948 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11949 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
11951 /* FIXME: use matrix-type input source selection */
11952 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
11953 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
11954 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11955 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11956 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11957 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11959 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11960 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11961 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11962 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11964 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
11965 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
11966 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
11967 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
11972 static struct hda_verb alc262_HP_BPC_init_verbs[] = {
11974 * Unmute ADC0-2 and set the default input to mic-in
11976 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
11977 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11978 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
11979 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11980 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
11981 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
11983 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
11985 * Note: PASD motherboards uses the Line In 2 as the input for
11986 * front panel mic (mic 2)
11988 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
11989 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
11990 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
11991 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
11992 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
11993 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
11994 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
11995 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
11998 * Set up output mixers (0x0c - 0x0e)
12000 /* set vol=0 to output mixers */
12001 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12002 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12003 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12005 /* set up input amps for analog loopback */
12006 /* Amp Indices: DAC = 0, mixer = 1 */
12007 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12008 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12009 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12010 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12011 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12012 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12014 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12015 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
12016 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
12018 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
12019 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
12021 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
12022 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
12024 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12025 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12026 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
12027 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12028 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
12030 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12031 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12032 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12033 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12034 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12035 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12038 /* FIXME: use matrix-type input source selection */
12039 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 0b, 12 */
12040 /* Input mixer1: only unmute Mic */
12041 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
12042 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
12043 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
12044 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
12045 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
12046 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
12047 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
12048 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
12049 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
12051 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
12052 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
12053 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
12054 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
12055 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
12056 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
12057 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
12058 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
12059 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
12061 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
12062 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8))},
12063 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8))},
12064 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x03 << 8))},
12065 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x04 << 8))},
12066 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x05 << 8))},
12067 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x06 << 8))},
12068 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x07 << 8))},
12069 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x08 << 8))},
12071 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12076 static struct hda_verb alc262_HP_BPC_WildWest_init_verbs[] = {
12078 * Unmute ADC0-2 and set the default input to mic-in
12080 {0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
12081 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12082 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
12083 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12084 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
12085 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12087 /* Mute input amps (CD, Line In, Mic 1 & Mic 2) of the analog-loopback
12089 * Note: PASD motherboards uses the Line In 2 as the input for front
12090 * panel mic (mic 2)
12092 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
12093 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
12094 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
12095 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
12096 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
12097 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
12098 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
12099 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(6)},
12100 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(7)},
12102 * Set up output mixers (0x0c - 0x0e)
12104 /* set vol=0 to output mixers */
12105 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12106 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12107 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
12109 /* set up input amps for analog loopback */
12110 /* Amp Indices: DAC = 0, mixer = 1 */
12111 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12112 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12113 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12114 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12115 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
12116 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
12119 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP */
12120 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Mono */
12121 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* rear MIC */
12122 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* Line in */
12123 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Front MIC */
12124 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Line out */
12125 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN }, /* CD in */
12127 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
12128 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
12130 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
12131 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
12133 /* {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 }, */
12134 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12135 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12136 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, 0x7023 },
12137 {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12138 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000 },
12140 /* FIXME: use matrix-type input source selection */
12141 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
12142 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
12143 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))}, /*rear MIC*/
12144 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))}, /*Line in*/
12145 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))}, /*F MIC*/
12146 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))}, /*Front*/
12147 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))}, /*CD*/
12148 /* {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
12149 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))}, /*HP*/
12151 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
12152 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
12153 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
12154 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
12155 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
12156 /* {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
12157 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
12159 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x00 << 8))},
12160 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8))},
12161 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8))},
12162 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x03 << 8))},
12163 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x04 << 8))},
12164 /* {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x06 << 8))}, */
12165 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x07 << 8))},
12167 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12172 static struct hda_verb alc262_toshiba_rx1_unsol_verbs[] = {
12174 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT }, /* Front Speaker */
12175 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
12176 {0x14, AC_VERB_SET_CONNECT_SEL, 0x01},
12178 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* MIC jack */
12179 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 }, /* Front MIC */
12180 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
12181 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0) },
12183 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP }, /* HP jack */
12184 {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
12185 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
12190 #ifdef CONFIG_SND_HDA_POWER_SAVE
12191 #define alc262_loopbacks alc880_loopbacks
12194 /* pcm configuration: identical with ALC880 */
12195 #define alc262_pcm_analog_playback alc880_pcm_analog_playback
12196 #define alc262_pcm_analog_capture alc880_pcm_analog_capture
12197 #define alc262_pcm_digital_playback alc880_pcm_digital_playback
12198 #define alc262_pcm_digital_capture alc880_pcm_digital_capture
12201 * BIOS auto configuration
12203 static int alc262_parse_auto_config(struct hda_codec *codec)
12205 struct alc_spec *spec = codec->spec;
12207 static hda_nid_t alc262_ignore[] = { 0x1d, 0 };
12209 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
12213 if (!spec->autocfg.line_outs) {
12214 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
12215 spec->multiout.max_channels = 2;
12216 spec->no_analog = 1;
12219 return 0; /* can't find valid BIOS pin config */
12221 err = alc262_auto_create_multi_out_ctls(spec, &spec->autocfg);
12224 err = alc262_auto_create_input_ctls(codec, &spec->autocfg);
12228 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
12231 alc_auto_parse_digital(codec);
12233 if (spec->kctls.list)
12234 add_mixer(spec, spec->kctls.list);
12236 add_verb(spec, alc262_volume_init_verbs);
12237 spec->num_mux_defs = 1;
12238 spec->input_mux = &spec->private_imux[0];
12240 err = alc_auto_add_mic_boost(codec);
12244 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
12249 #define alc262_auto_init_multi_out alc882_auto_init_multi_out
12250 #define alc262_auto_init_hp_out alc882_auto_init_hp_out
12251 #define alc262_auto_init_analog_input alc882_auto_init_analog_input
12252 #define alc262_auto_init_input_src alc882_auto_init_input_src
12255 /* init callback for auto-configuration model -- overriding the default init */
12256 static void alc262_auto_init(struct hda_codec *codec)
12258 struct alc_spec *spec = codec->spec;
12259 alc262_auto_init_multi_out(codec);
12260 alc262_auto_init_hp_out(codec);
12261 alc262_auto_init_analog_input(codec);
12262 alc262_auto_init_input_src(codec);
12263 alc_auto_init_digital(codec);
12264 if (spec->unsol_event)
12265 alc_inithook(codec);
12269 * configuration and preset
12271 static const char *alc262_models[ALC262_MODEL_LAST] = {
12272 [ALC262_BASIC] = "basic",
12273 [ALC262_HIPPO] = "hippo",
12274 [ALC262_HIPPO_1] = "hippo_1",
12275 [ALC262_FUJITSU] = "fujitsu",
12276 [ALC262_HP_BPC] = "hp-bpc",
12277 [ALC262_HP_BPC_D7000_WL]= "hp-bpc-d7000",
12278 [ALC262_HP_TC_T5735] = "hp-tc-t5735",
12279 [ALC262_HP_RP5700] = "hp-rp5700",
12280 [ALC262_BENQ_ED8] = "benq",
12281 [ALC262_BENQ_T31] = "benq-t31",
12282 [ALC262_SONY_ASSAMD] = "sony-assamd",
12283 [ALC262_TOSHIBA_S06] = "toshiba-s06",
12284 [ALC262_TOSHIBA_RX1] = "toshiba-rx1",
12285 [ALC262_ULTRA] = "ultra",
12286 [ALC262_LENOVO_3000] = "lenovo-3000",
12287 [ALC262_NEC] = "nec",
12288 [ALC262_TYAN] = "tyan",
12289 [ALC262_AUTO] = "auto",
12292 static struct snd_pci_quirk alc262_cfg_tbl[] = {
12293 SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
12294 SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
12295 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1200, "HP xw series",
12297 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1300, "HP xw series",
12299 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x1700, "HP xw series",
12301 SND_PCI_QUIRK(0x103c, 0x2800, "HP D7000", ALC262_HP_BPC_D7000_WL),
12302 SND_PCI_QUIRK(0x103c, 0x2801, "HP D7000", ALC262_HP_BPC_D7000_WF),
12303 SND_PCI_QUIRK(0x103c, 0x2802, "HP D7000", ALC262_HP_BPC_D7000_WL),
12304 SND_PCI_QUIRK(0x103c, 0x2803, "HP D7000", ALC262_HP_BPC_D7000_WF),
12305 SND_PCI_QUIRK(0x103c, 0x2804, "HP D7000", ALC262_HP_BPC_D7000_WL),
12306 SND_PCI_QUIRK(0x103c, 0x2805, "HP D7000", ALC262_HP_BPC_D7000_WF),
12307 SND_PCI_QUIRK(0x103c, 0x2806, "HP D7000", ALC262_HP_BPC_D7000_WL),
12308 SND_PCI_QUIRK(0x103c, 0x2807, "HP D7000", ALC262_HP_BPC_D7000_WF),
12309 SND_PCI_QUIRK(0x103c, 0x280c, "HP xw4400", ALC262_HP_BPC),
12310 SND_PCI_QUIRK(0x103c, 0x3014, "HP xw6400", ALC262_HP_BPC),
12311 SND_PCI_QUIRK(0x103c, 0x3015, "HP xw8400", ALC262_HP_BPC),
12312 SND_PCI_QUIRK(0x103c, 0x302f, "HP Thin Client T5735",
12313 ALC262_HP_TC_T5735),
12314 SND_PCI_QUIRK(0x103c, 0x2817, "HP RP5700", ALC262_HP_RP5700),
12315 SND_PCI_QUIRK(0x104d, 0x1f00, "Sony ASSAMD", ALC262_SONY_ASSAMD),
12316 SND_PCI_QUIRK(0x104d, 0x8203, "Sony UX-90", ALC262_HIPPO),
12317 SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
12318 SND_PCI_QUIRK(0x104d, 0x9016, "Sony VAIO", ALC262_AUTO), /* dig-only */
12319 SND_PCI_QUIRK(0x104d, 0x9025, "Sony VAIO Z21MN", ALC262_TOSHIBA_S06),
12320 SND_PCI_QUIRK(0x104d, 0x9035, "Sony VAIO VGN-FW170J", ALC262_AUTO),
12321 SND_PCI_QUIRK(0x104d, 0x9047, "Sony VAIO Type G", ALC262_AUTO),
12322 #if 0 /* disable the quirk since model=auto works better in recent versions */
12323 SND_PCI_QUIRK_MASK(0x104d, 0xff00, 0x9000, "Sony VAIO",
12324 ALC262_SONY_ASSAMD),
12326 SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
12327 ALC262_TOSHIBA_RX1),
12328 SND_PCI_QUIRK(0x1179, 0xff7b, "Toshiba S06", ALC262_TOSHIBA_S06),
12329 SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU),
12330 SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
12331 SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_TYAN),
12332 SND_PCI_QUIRK_MASK(0x144d, 0xff00, 0xc032, "Samsung Q1",
12334 SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
12335 SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000),
12336 SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8),
12337 SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
12338 SND_PCI_QUIRK(0x17ff, 0x058f, "Benq Hippo", ALC262_HIPPO_1),
12342 static struct alc_config_preset alc262_presets[] = {
12344 .mixers = { alc262_base_mixer },
12345 .init_verbs = { alc262_init_verbs },
12346 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12347 .dac_nids = alc262_dac_nids,
12349 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12350 .channel_mode = alc262_modes,
12351 .input_mux = &alc262_capture_source,
12354 .mixers = { alc262_hippo_mixer },
12355 .init_verbs = { alc262_init_verbs, alc_hp15_unsol_verbs},
12356 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12357 .dac_nids = alc262_dac_nids,
12359 .dig_out_nid = ALC262_DIGOUT_NID,
12360 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12361 .channel_mode = alc262_modes,
12362 .input_mux = &alc262_capture_source,
12363 .unsol_event = alc262_hippo_unsol_event,
12364 .setup = alc262_hippo_setup,
12365 .init_hook = alc262_hippo_automute,
12367 [ALC262_HIPPO_1] = {
12368 .mixers = { alc262_hippo1_mixer },
12369 .init_verbs = { alc262_init_verbs, alc262_hippo1_unsol_verbs},
12370 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12371 .dac_nids = alc262_dac_nids,
12373 .dig_out_nid = ALC262_DIGOUT_NID,
12374 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12375 .channel_mode = alc262_modes,
12376 .input_mux = &alc262_capture_source,
12377 .unsol_event = alc262_hippo_unsol_event,
12378 .setup = alc262_hippo1_setup,
12379 .init_hook = alc262_hippo_automute,
12381 [ALC262_FUJITSU] = {
12382 .mixers = { alc262_fujitsu_mixer },
12383 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
12384 alc262_fujitsu_unsol_verbs },
12385 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12386 .dac_nids = alc262_dac_nids,
12388 .dig_out_nid = ALC262_DIGOUT_NID,
12389 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12390 .channel_mode = alc262_modes,
12391 .input_mux = &alc262_fujitsu_capture_source,
12392 .unsol_event = alc262_fujitsu_unsol_event,
12393 .init_hook = alc262_fujitsu_init_hook,
12395 [ALC262_HP_BPC] = {
12396 .mixers = { alc262_HP_BPC_mixer },
12397 .init_verbs = { alc262_HP_BPC_init_verbs },
12398 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12399 .dac_nids = alc262_dac_nids,
12401 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12402 .channel_mode = alc262_modes,
12403 .input_mux = &alc262_HP_capture_source,
12404 .unsol_event = alc262_hp_bpc_unsol_event,
12405 .init_hook = alc262_hp_bpc_automute,
12407 [ALC262_HP_BPC_D7000_WF] = {
12408 .mixers = { alc262_HP_BPC_WildWest_mixer },
12409 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
12410 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12411 .dac_nids = alc262_dac_nids,
12413 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12414 .channel_mode = alc262_modes,
12415 .input_mux = &alc262_HP_D7000_capture_source,
12416 .unsol_event = alc262_hp_wildwest_unsol_event,
12417 .init_hook = alc262_hp_wildwest_automute,
12419 [ALC262_HP_BPC_D7000_WL] = {
12420 .mixers = { alc262_HP_BPC_WildWest_mixer,
12421 alc262_HP_BPC_WildWest_option_mixer },
12422 .init_verbs = { alc262_HP_BPC_WildWest_init_verbs },
12423 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12424 .dac_nids = alc262_dac_nids,
12426 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12427 .channel_mode = alc262_modes,
12428 .input_mux = &alc262_HP_D7000_capture_source,
12429 .unsol_event = alc262_hp_wildwest_unsol_event,
12430 .init_hook = alc262_hp_wildwest_automute,
12432 [ALC262_HP_TC_T5735] = {
12433 .mixers = { alc262_hp_t5735_mixer },
12434 .init_verbs = { alc262_init_verbs, alc262_hp_t5735_verbs },
12435 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12436 .dac_nids = alc262_dac_nids,
12438 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12439 .channel_mode = alc262_modes,
12440 .input_mux = &alc262_capture_source,
12441 .unsol_event = alc_sku_unsol_event,
12442 .setup = alc262_hp_t5735_setup,
12443 .init_hook = alc_inithook,
12445 [ALC262_HP_RP5700] = {
12446 .mixers = { alc262_hp_rp5700_mixer },
12447 .init_verbs = { alc262_init_verbs, alc262_hp_rp5700_verbs },
12448 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12449 .dac_nids = alc262_dac_nids,
12450 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12451 .channel_mode = alc262_modes,
12452 .input_mux = &alc262_hp_rp5700_capture_source,
12454 [ALC262_BENQ_ED8] = {
12455 .mixers = { alc262_base_mixer },
12456 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs },
12457 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12458 .dac_nids = alc262_dac_nids,
12460 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12461 .channel_mode = alc262_modes,
12462 .input_mux = &alc262_capture_source,
12464 [ALC262_SONY_ASSAMD] = {
12465 .mixers = { alc262_sony_mixer },
12466 .init_verbs = { alc262_init_verbs, alc262_sony_unsol_verbs},
12467 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12468 .dac_nids = alc262_dac_nids,
12470 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12471 .channel_mode = alc262_modes,
12472 .input_mux = &alc262_capture_source,
12473 .unsol_event = alc262_hippo_unsol_event,
12474 .setup = alc262_hippo_setup,
12475 .init_hook = alc262_hippo_automute,
12477 [ALC262_BENQ_T31] = {
12478 .mixers = { alc262_benq_t31_mixer },
12479 .init_verbs = { alc262_init_verbs, alc262_benq_t31_EAPD_verbs,
12480 alc_hp15_unsol_verbs },
12481 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12482 .dac_nids = alc262_dac_nids,
12484 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12485 .channel_mode = alc262_modes,
12486 .input_mux = &alc262_capture_source,
12487 .unsol_event = alc262_hippo_unsol_event,
12488 .setup = alc262_hippo_setup,
12489 .init_hook = alc262_hippo_automute,
12492 .mixers = { alc262_ultra_mixer },
12493 .cap_mixer = alc262_ultra_capture_mixer,
12494 .init_verbs = { alc262_ultra_verbs },
12495 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12496 .dac_nids = alc262_dac_nids,
12497 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12498 .channel_mode = alc262_modes,
12499 .input_mux = &alc262_ultra_capture_source,
12500 .adc_nids = alc262_adc_nids, /* ADC0 */
12501 .capsrc_nids = alc262_capsrc_nids,
12502 .num_adc_nids = 1, /* single ADC */
12503 .unsol_event = alc262_ultra_unsol_event,
12504 .init_hook = alc262_ultra_automute,
12506 [ALC262_LENOVO_3000] = {
12507 .mixers = { alc262_lenovo_3000_mixer },
12508 .init_verbs = { alc262_init_verbs, alc262_EAPD_verbs,
12509 alc262_lenovo_3000_unsol_verbs,
12510 alc262_lenovo_3000_init_verbs },
12511 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12512 .dac_nids = alc262_dac_nids,
12514 .dig_out_nid = ALC262_DIGOUT_NID,
12515 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12516 .channel_mode = alc262_modes,
12517 .input_mux = &alc262_fujitsu_capture_source,
12518 .unsol_event = alc262_lenovo_3000_unsol_event,
12521 .mixers = { alc262_nec_mixer },
12522 .init_verbs = { alc262_nec_verbs },
12523 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12524 .dac_nids = alc262_dac_nids,
12526 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12527 .channel_mode = alc262_modes,
12528 .input_mux = &alc262_capture_source,
12530 [ALC262_TOSHIBA_S06] = {
12531 .mixers = { alc262_toshiba_s06_mixer },
12532 .init_verbs = { alc262_init_verbs, alc262_toshiba_s06_verbs,
12533 alc262_eapd_verbs },
12534 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12535 .capsrc_nids = alc262_dmic_capsrc_nids,
12536 .dac_nids = alc262_dac_nids,
12537 .adc_nids = alc262_dmic_adc_nids, /* ADC0 */
12538 .num_adc_nids = 1, /* single ADC */
12539 .dig_out_nid = ALC262_DIGOUT_NID,
12540 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12541 .channel_mode = alc262_modes,
12542 .unsol_event = alc_sku_unsol_event,
12543 .setup = alc262_toshiba_s06_setup,
12544 .init_hook = alc_inithook,
12546 [ALC262_TOSHIBA_RX1] = {
12547 .mixers = { alc262_toshiba_rx1_mixer },
12548 .init_verbs = { alc262_init_verbs, alc262_toshiba_rx1_unsol_verbs },
12549 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12550 .dac_nids = alc262_dac_nids,
12552 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12553 .channel_mode = alc262_modes,
12554 .input_mux = &alc262_capture_source,
12555 .unsol_event = alc262_hippo_unsol_event,
12556 .setup = alc262_hippo_setup,
12557 .init_hook = alc262_hippo_automute,
12560 .mixers = { alc262_tyan_mixer },
12561 .init_verbs = { alc262_init_verbs, alc262_tyan_verbs},
12562 .num_dacs = ARRAY_SIZE(alc262_dac_nids),
12563 .dac_nids = alc262_dac_nids,
12565 .dig_out_nid = ALC262_DIGOUT_NID,
12566 .num_channel_mode = ARRAY_SIZE(alc262_modes),
12567 .channel_mode = alc262_modes,
12568 .input_mux = &alc262_capture_source,
12569 .unsol_event = alc_automute_amp_unsol_event,
12570 .setup = alc262_tyan_setup,
12571 .init_hook = alc_automute_amp,
12575 static int patch_alc262(struct hda_codec *codec)
12577 struct alc_spec *spec;
12581 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
12585 codec->spec = spec;
12587 /* pshou 07/11/05 set a zero PCM sample to DAC when FIFO is
12592 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
12593 tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
12594 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_COEF_INDEX, 7);
12595 snd_hda_codec_write(codec, 0x1a, 0, AC_VERB_SET_PROC_COEF, tmp | 0x80);
12598 alc_auto_parse_customize_define(codec);
12600 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
12602 board_config = snd_hda_check_board_config(codec, ALC262_MODEL_LAST,
12606 if (board_config < 0) {
12607 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
12609 board_config = ALC262_AUTO;
12612 if (board_config == ALC262_AUTO) {
12613 /* automatic parse from the BIOS config */
12614 err = alc262_parse_auto_config(codec);
12620 "hda_codec: Cannot set up configuration "
12621 "from BIOS. Using base mode...\n");
12622 board_config = ALC262_BASIC;
12626 if (!spec->no_analog && has_cdefine_beep(codec)) {
12627 err = snd_hda_attach_beep_device(codec, 0x1);
12634 if (board_config != ALC262_AUTO)
12635 setup_preset(codec, &alc262_presets[board_config]);
12637 spec->stream_analog_playback = &alc262_pcm_analog_playback;
12638 spec->stream_analog_capture = &alc262_pcm_analog_capture;
12640 spec->stream_digital_playback = &alc262_pcm_digital_playback;
12641 spec->stream_digital_capture = &alc262_pcm_digital_capture;
12643 if (!spec->adc_nids && spec->input_mux) {
12645 /* check whether the digital-mic has to be supported */
12646 for (i = 0; i < spec->input_mux->num_items; i++) {
12647 if (spec->input_mux->items[i].index >= 9)
12650 if (i < spec->input_mux->num_items) {
12651 /* use only ADC0 */
12652 spec->adc_nids = alc262_dmic_adc_nids;
12653 spec->num_adc_nids = 1;
12654 spec->capsrc_nids = alc262_dmic_capsrc_nids;
12656 /* all analog inputs */
12657 /* check whether NID 0x07 is valid */
12658 unsigned int wcap = get_wcaps(codec, 0x07);
12661 wcap = get_wcaps_type(wcap);
12662 if (wcap != AC_WID_AUD_IN) {
12663 spec->adc_nids = alc262_adc_nids_alt;
12664 spec->num_adc_nids =
12665 ARRAY_SIZE(alc262_adc_nids_alt);
12666 spec->capsrc_nids = alc262_capsrc_nids_alt;
12668 spec->adc_nids = alc262_adc_nids;
12669 spec->num_adc_nids =
12670 ARRAY_SIZE(alc262_adc_nids);
12671 spec->capsrc_nids = alc262_capsrc_nids;
12675 if (!spec->cap_mixer && !spec->no_analog)
12676 set_capture_mixer(codec);
12677 if (!spec->no_analog && has_cdefine_beep(codec))
12678 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
12680 spec->vmaster_nid = 0x0c;
12682 codec->patch_ops = alc_patch_ops;
12683 if (board_config == ALC262_AUTO)
12684 spec->init_hook = alc262_auto_init;
12685 #ifdef CONFIG_SND_HDA_POWER_SAVE
12686 if (!spec->loopback.amplist)
12687 spec->loopback.amplist = alc262_loopbacks;
12694 * ALC268 channel source setting (2 channel)
12696 #define ALC268_DIGOUT_NID ALC880_DIGOUT_NID
12697 #define alc268_modes alc260_modes
12699 static hda_nid_t alc268_dac_nids[2] = {
12704 static hda_nid_t alc268_adc_nids[2] = {
12709 static hda_nid_t alc268_adc_nids_alt[1] = {
12714 static hda_nid_t alc268_capsrc_nids[2] = { 0x23, 0x24 };
12716 static struct snd_kcontrol_new alc268_base_mixer[] = {
12717 /* output mixer control */
12718 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12719 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12720 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12721 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12722 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12723 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12724 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12728 static struct snd_kcontrol_new alc268_toshiba_mixer[] = {
12729 /* output mixer control */
12730 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12731 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12732 ALC262_HIPPO_MASTER_SWITCH,
12733 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12734 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
12735 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12739 /* bind Beep switches of both NID 0x0f and 0x10 */
12740 static struct hda_bind_ctls alc268_bind_beep_sw = {
12741 .ops = &snd_hda_bind_sw,
12743 HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT),
12744 HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT),
12749 static struct snd_kcontrol_new alc268_beep_mixer[] = {
12750 HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
12751 HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw),
12755 static struct hda_verb alc268_eapd_verbs[] = {
12756 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
12757 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
12761 /* Toshiba specific */
12762 static struct hda_verb alc268_toshiba_verbs[] = {
12763 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12767 /* Acer specific */
12768 /* bind volumes of both NID 0x02 and 0x03 */
12769 static struct hda_bind_ctls alc268_acer_bind_master_vol = {
12770 .ops = &snd_hda_bind_vol,
12772 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
12773 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
12778 /* mute/unmute internal speaker according to the hp jack and mute state */
12779 static void alc268_acer_automute(struct hda_codec *codec, int force)
12781 struct alc_spec *spec = codec->spec;
12784 if (force || !spec->sense_updated) {
12785 spec->jack_present = snd_hda_jack_detect(codec, 0x14);
12786 spec->sense_updated = 1;
12788 if (spec->jack_present)
12789 mute = HDA_AMP_MUTE; /* mute internal speaker */
12790 else /* unmute internal speaker if necessary */
12791 mute = snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0);
12792 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
12793 HDA_AMP_MUTE, mute);
12797 /* bind hp and internal speaker mute (with plug check) */
12798 static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol,
12799 struct snd_ctl_elem_value *ucontrol)
12801 struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
12802 long *valp = ucontrol->value.integer.value;
12805 change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
12807 alc268_acer_automute(codec, 0);
12811 static struct snd_kcontrol_new alc268_acer_aspire_one_mixer[] = {
12812 /* output mixer control */
12813 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12815 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12816 .name = "Master Playback Switch",
12817 .subdevice = HDA_SUBDEV_AMP_FLAG,
12818 .info = snd_hda_mixer_amp_switch_info,
12819 .get = snd_hda_mixer_amp_switch_get,
12820 .put = alc268_acer_master_sw_put,
12821 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12823 HDA_CODEC_VOLUME("Mic Boost Capture Volume", 0x18, 0, HDA_INPUT),
12827 static struct snd_kcontrol_new alc268_acer_mixer[] = {
12828 /* output mixer control */
12829 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12831 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12832 .name = "Master Playback Switch",
12833 .subdevice = HDA_SUBDEV_AMP_FLAG,
12834 .info = snd_hda_mixer_amp_switch_info,
12835 .get = snd_hda_mixer_amp_switch_get,
12836 .put = alc268_acer_master_sw_put,
12837 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12839 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12840 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12841 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12845 static struct snd_kcontrol_new alc268_acer_dmic_mixer[] = {
12846 /* output mixer control */
12847 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
12849 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
12850 .name = "Master Playback Switch",
12851 .subdevice = HDA_SUBDEV_AMP_FLAG,
12852 .info = snd_hda_mixer_amp_switch_info,
12853 .get = snd_hda_mixer_amp_switch_get,
12854 .put = alc268_acer_master_sw_put,
12855 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
12857 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12858 HDA_CODEC_VOLUME("Line In Boost", 0x1a, 0, HDA_INPUT),
12862 static struct hda_verb alc268_acer_aspire_one_verbs[] = {
12863 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12864 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12865 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12866 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
12867 {0x23, AC_VERB_SET_CONNECT_SEL, 0x06},
12868 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, 0xa017},
12872 static struct hda_verb alc268_acer_verbs[] = {
12873 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN}, /* internal dmic? */
12874 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
12875 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12876 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
12877 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12878 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
12879 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12883 /* unsolicited event for HP jack sensing */
12884 #define alc268_toshiba_unsol_event alc262_hippo_unsol_event
12885 #define alc268_toshiba_setup alc262_hippo_setup
12886 #define alc268_toshiba_automute alc262_hippo_automute
12888 static void alc268_acer_unsol_event(struct hda_codec *codec,
12891 if ((res >> 26) != ALC880_HP_EVENT)
12893 alc268_acer_automute(codec, 1);
12896 static void alc268_acer_init_hook(struct hda_codec *codec)
12898 alc268_acer_automute(codec, 1);
12901 /* toggle speaker-output according to the hp-jack state */
12902 static void alc268_aspire_one_speaker_automute(struct hda_codec *codec)
12904 unsigned int present;
12905 unsigned char bits;
12907 present = snd_hda_jack_detect(codec, 0x15);
12908 bits = present ? HDA_AMP_MUTE : 0;
12909 snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 0,
12910 HDA_AMP_MUTE, bits);
12911 snd_hda_codec_amp_stereo(codec, 0x0f, HDA_INPUT, 1,
12912 HDA_AMP_MUTE, bits);
12915 static void alc268_acer_lc_unsol_event(struct hda_codec *codec,
12918 switch (res >> 26) {
12919 case ALC880_HP_EVENT:
12920 alc268_aspire_one_speaker_automute(codec);
12922 case ALC880_MIC_EVENT:
12923 alc_mic_automute(codec);
12928 static void alc268_acer_lc_setup(struct hda_codec *codec)
12930 struct alc_spec *spec = codec->spec;
12931 spec->ext_mic.pin = 0x18;
12932 spec->ext_mic.mux_idx = 0;
12933 spec->int_mic.pin = 0x12;
12934 spec->int_mic.mux_idx = 6;
12935 spec->auto_mic = 1;
12938 static void alc268_acer_lc_init_hook(struct hda_codec *codec)
12940 alc268_aspire_one_speaker_automute(codec);
12941 alc_mic_automute(codec);
12944 static struct snd_kcontrol_new alc268_dell_mixer[] = {
12945 /* output mixer control */
12946 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
12947 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12948 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
12949 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12950 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
12951 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
12955 static struct hda_verb alc268_dell_verbs[] = {
12956 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12957 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
12958 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12959 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12963 /* mute/unmute internal speaker according to the hp jack and mute state */
12964 static void alc268_dell_setup(struct hda_codec *codec)
12966 struct alc_spec *spec = codec->spec;
12968 spec->autocfg.hp_pins[0] = 0x15;
12969 spec->autocfg.speaker_pins[0] = 0x14;
12970 spec->ext_mic.pin = 0x18;
12971 spec->ext_mic.mux_idx = 0;
12972 spec->int_mic.pin = 0x19;
12973 spec->int_mic.mux_idx = 1;
12974 spec->auto_mic = 1;
12977 static struct snd_kcontrol_new alc267_quanta_il1_mixer[] = {
12978 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x2, 0x0, HDA_OUTPUT),
12979 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
12980 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x3, 0x0, HDA_OUTPUT),
12981 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
12982 HDA_CODEC_VOLUME("Mic Capture Volume", 0x23, 0x0, HDA_OUTPUT),
12983 HDA_BIND_MUTE("Mic Capture Switch", 0x23, 2, HDA_OUTPUT),
12984 HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
12985 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
12989 static struct hda_verb alc267_quanta_il1_verbs[] = {
12990 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
12991 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_MIC_EVENT | AC_USRSP_EN},
12995 static void alc267_quanta_il1_setup(struct hda_codec *codec)
12997 struct alc_spec *spec = codec->spec;
12998 spec->autocfg.hp_pins[0] = 0x15;
12999 spec->autocfg.speaker_pins[0] = 0x14;
13000 spec->ext_mic.pin = 0x18;
13001 spec->ext_mic.mux_idx = 0;
13002 spec->int_mic.pin = 0x19;
13003 spec->int_mic.mux_idx = 1;
13004 spec->auto_mic = 1;
13008 * generic initialization of ADC, input mixers and output mixers
13010 static struct hda_verb alc268_base_init_verbs[] = {
13011 /* Unmute DAC0-1 and set vol = 0 */
13012 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13013 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13016 * Set up output mixers (0x0c - 0x0e)
13018 /* set vol=0 to output mixers */
13019 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13020 {0x0e, AC_VERB_SET_CONNECT_SEL, 0x00},
13022 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13023 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13025 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
13026 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
13027 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
13028 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
13029 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
13030 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
13031 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
13032 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
13034 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13035 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13036 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13037 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13038 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13040 /* set PCBEEP vol = 0, mute connections */
13041 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13042 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
13043 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
13045 /* Unmute Selector 23h,24h and set the default input to mic-in */
13047 {0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
13048 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13049 {0x24, AC_VERB_SET_CONNECT_SEL, 0x00},
13050 {0x24, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13056 * generic initialization of ADC, input mixers and output mixers
13058 static struct hda_verb alc268_volume_init_verbs[] = {
13059 /* set output DAC */
13060 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13061 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
13063 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
13064 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
13065 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
13066 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
13067 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
13069 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13070 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13071 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13073 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13074 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
13076 /* set PCBEEP vol = 0, mute connections */
13077 {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
13078 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
13079 {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
13084 static struct snd_kcontrol_new alc268_capture_nosrc_mixer[] = {
13085 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
13086 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
13090 static struct snd_kcontrol_new alc268_capture_alt_mixer[] = {
13091 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
13092 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
13097 static struct snd_kcontrol_new alc268_capture_mixer[] = {
13098 HDA_CODEC_VOLUME("Capture Volume", 0x23, 0x0, HDA_OUTPUT),
13099 HDA_CODEC_MUTE("Capture Switch", 0x23, 0x0, HDA_OUTPUT),
13100 HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x24, 0x0, HDA_OUTPUT),
13101 HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x24, 0x0, HDA_OUTPUT),
13106 static struct hda_input_mux alc268_capture_source = {
13110 { "Front Mic", 0x1 },
13116 static struct hda_input_mux alc268_acer_capture_source = {
13120 { "Internal Mic", 0x1 },
13125 static struct hda_input_mux alc268_acer_dmic_capture_source = {
13129 { "Internal Mic", 0x6 },
13134 #ifdef CONFIG_SND_DEBUG
13135 static struct snd_kcontrol_new alc268_test_mixer[] = {
13136 /* Volume widgets */
13137 HDA_CODEC_VOLUME("LOUT1 Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13138 HDA_CODEC_VOLUME("LOUT2 Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13139 HDA_BIND_MUTE_MONO("Mono sum Playback Switch", 0x0e, 1, 2, HDA_INPUT),
13140 HDA_BIND_MUTE("LINE-OUT sum Playback Switch", 0x0f, 2, HDA_INPUT),
13141 HDA_BIND_MUTE("HP-OUT sum Playback Switch", 0x10, 2, HDA_INPUT),
13142 HDA_BIND_MUTE("LINE-OUT Playback Switch", 0x14, 2, HDA_OUTPUT),
13143 HDA_BIND_MUTE("HP-OUT Playback Switch", 0x15, 2, HDA_OUTPUT),
13144 HDA_BIND_MUTE("Mono Playback Switch", 0x16, 2, HDA_OUTPUT),
13145 HDA_CODEC_VOLUME("MIC1 Capture Volume", 0x18, 0x0, HDA_INPUT),
13146 HDA_BIND_MUTE("MIC1 Capture Switch", 0x18, 2, HDA_OUTPUT),
13147 HDA_CODEC_VOLUME("MIC2 Capture Volume", 0x19, 0x0, HDA_INPUT),
13148 HDA_CODEC_VOLUME("LINE1 Capture Volume", 0x1a, 0x0, HDA_INPUT),
13149 HDA_BIND_MUTE("LINE1 Capture Switch", 0x1a, 2, HDA_OUTPUT),
13150 /* The below appears problematic on some hardwares */
13151 /*HDA_CODEC_VOLUME("PCBEEP Playback Volume", 0x1d, 0x0, HDA_INPUT),*/
13152 HDA_CODEC_VOLUME("PCM-IN1 Capture Volume", 0x23, 0x0, HDA_OUTPUT),
13153 HDA_BIND_MUTE("PCM-IN1 Capture Switch", 0x23, 2, HDA_OUTPUT),
13154 HDA_CODEC_VOLUME("PCM-IN2 Capture Volume", 0x24, 0x0, HDA_OUTPUT),
13155 HDA_BIND_MUTE("PCM-IN2 Capture Switch", 0x24, 2, HDA_OUTPUT),
13157 /* Modes for retasking pin widgets */
13158 ALC_PIN_MODE("LINE-OUT pin mode", 0x14, ALC_PIN_DIR_INOUT),
13159 ALC_PIN_MODE("HP-OUT pin mode", 0x15, ALC_PIN_DIR_INOUT),
13160 ALC_PIN_MODE("MIC1 pin mode", 0x18, ALC_PIN_DIR_INOUT),
13161 ALC_PIN_MODE("LINE1 pin mode", 0x1a, ALC_PIN_DIR_INOUT),
13163 /* Controls for GPIO pins, assuming they are configured as outputs */
13164 ALC_GPIO_DATA_SWITCH("GPIO pin 0", 0x01, 0x01),
13165 ALC_GPIO_DATA_SWITCH("GPIO pin 1", 0x01, 0x02),
13166 ALC_GPIO_DATA_SWITCH("GPIO pin 2", 0x01, 0x04),
13167 ALC_GPIO_DATA_SWITCH("GPIO pin 3", 0x01, 0x08),
13169 /* Switches to allow the digital SPDIF output pin to be enabled.
13170 * The ALC268 does not have an SPDIF input.
13172 ALC_SPDIF_CTRL_SWITCH("SPDIF Playback Switch", 0x06, 0x01),
13174 /* A switch allowing EAPD to be enabled. Some laptops seem to use
13175 * this output to turn on an external amplifier.
13177 ALC_EAPD_CTRL_SWITCH("LINE-OUT EAPD Enable Switch", 0x0f, 0x02),
13178 ALC_EAPD_CTRL_SWITCH("HP-OUT EAPD Enable Switch", 0x10, 0x02),
13184 /* create input playback/capture controls for the given pin */
13185 static int alc268_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
13186 const char *ctlname, int idx)
13197 case 0x1a: /* ALC259/269 only */
13198 case 0x1b: /* ALC259/269 only */
13199 case 0x21: /* ALC269vb has this pin, too */
13203 snd_printd(KERN_WARNING "hda_codec: "
13204 "ignoring pin 0x%x as unknown\n", nid);
13207 if (spec->multiout.dac_nids[0] != dac &&
13208 spec->multiout.dac_nids[1] != dac) {
13209 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
13210 HDA_COMPOSE_AMP_VAL(dac, 3, idx,
13214 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
13218 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
13219 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
13221 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
13222 HDA_COMPOSE_AMP_VAL(nid, 2, idx, HDA_OUTPUT));
13228 /* add playback controls from the parsed DAC table */
13229 static int alc268_auto_create_multi_out_ctls(struct alc_spec *spec,
13230 const struct auto_pin_cfg *cfg)
13235 spec->multiout.dac_nids = spec->private_dac_nids;
13237 nid = cfg->line_out_pins[0];
13240 if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
13244 err = alc268_new_analog_output(spec, nid, name, 0);
13249 nid = cfg->speaker_pins[0];
13251 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, "Speaker",
13252 HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
13256 err = alc268_new_analog_output(spec, nid, "Speaker", 0);
13260 nid = cfg->hp_pins[0];
13262 err = alc268_new_analog_output(spec, nid, "Headphone", 0);
13267 nid = cfg->line_out_pins[1] | cfg->line_out_pins[2];
13269 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, "Mono",
13270 HDA_COMPOSE_AMP_VAL(nid, 2, 0, HDA_OUTPUT));
13277 /* create playback/capture controls for input pins */
13278 static int alc268_auto_create_input_ctls(struct hda_codec *codec,
13279 const struct auto_pin_cfg *cfg)
13281 return alc_auto_create_input_ctls(codec, cfg, 0, 0x23, 0x24);
13284 static void alc268_auto_set_output_and_unmute(struct hda_codec *codec,
13285 hda_nid_t nid, int pin_type)
13289 alc_set_pin_output(codec, nid, pin_type);
13290 if (nid == 0x14 || nid == 0x16)
13294 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, idx);
13297 static void alc268_auto_init_multi_out(struct hda_codec *codec)
13299 struct alc_spec *spec = codec->spec;
13300 hda_nid_t nid = spec->autocfg.line_out_pins[0];
13302 int pin_type = get_pin_type(spec->autocfg.line_out_type);
13303 alc268_auto_set_output_and_unmute(codec, nid, pin_type);
13307 static void alc268_auto_init_hp_out(struct hda_codec *codec)
13309 struct alc_spec *spec = codec->spec;
13312 pin = spec->autocfg.hp_pins[0];
13314 alc268_auto_set_output_and_unmute(codec, pin, PIN_HP);
13315 pin = spec->autocfg.speaker_pins[0];
13317 alc268_auto_set_output_and_unmute(codec, pin, PIN_OUT);
13320 static void alc268_auto_init_mono_speaker_out(struct hda_codec *codec)
13322 struct alc_spec *spec = codec->spec;
13323 hda_nid_t speaker_nid = spec->autocfg.speaker_pins[0];
13324 hda_nid_t hp_nid = spec->autocfg.hp_pins[0];
13325 hda_nid_t line_nid = spec->autocfg.line_out_pins[0];
13326 unsigned int dac_vol1, dac_vol2;
13328 if (line_nid == 0x1d || speaker_nid == 0x1d) {
13329 snd_hda_codec_write(codec, speaker_nid, 0,
13330 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
13331 /* mute mixer inputs from 0x1d */
13332 snd_hda_codec_write(codec, 0x0f, 0,
13333 AC_VERB_SET_AMP_GAIN_MUTE,
13335 snd_hda_codec_write(codec, 0x10, 0,
13336 AC_VERB_SET_AMP_GAIN_MUTE,
13339 /* unmute mixer inputs from 0x1d */
13340 snd_hda_codec_write(codec, 0x0f, 0,
13341 AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
13342 snd_hda_codec_write(codec, 0x10, 0,
13343 AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1));
13346 dac_vol1 = dac_vol2 = 0xb000 | 0x40; /* set max volume */
13347 if (line_nid == 0x14)
13348 dac_vol2 = AMP_OUT_ZERO;
13349 else if (line_nid == 0x15)
13350 dac_vol1 = AMP_OUT_ZERO;
13351 if (hp_nid == 0x14)
13352 dac_vol2 = AMP_OUT_ZERO;
13353 else if (hp_nid == 0x15)
13354 dac_vol1 = AMP_OUT_ZERO;
13355 if (line_nid != 0x16 || hp_nid != 0x16 ||
13356 spec->autocfg.line_out_pins[1] != 0x16 ||
13357 spec->autocfg.line_out_pins[2] != 0x16)
13358 dac_vol1 = dac_vol2 = AMP_OUT_ZERO;
13360 snd_hda_codec_write(codec, 0x02, 0,
13361 AC_VERB_SET_AMP_GAIN_MUTE, dac_vol1);
13362 snd_hda_codec_write(codec, 0x03, 0,
13363 AC_VERB_SET_AMP_GAIN_MUTE, dac_vol2);
13366 /* pcm configuration: identical with ALC880 */
13367 #define alc268_pcm_analog_playback alc880_pcm_analog_playback
13368 #define alc268_pcm_analog_capture alc880_pcm_analog_capture
13369 #define alc268_pcm_analog_alt_capture alc880_pcm_analog_alt_capture
13370 #define alc268_pcm_digital_playback alc880_pcm_digital_playback
13373 * BIOS auto configuration
13375 static int alc268_parse_auto_config(struct hda_codec *codec)
13377 struct alc_spec *spec = codec->spec;
13379 static hda_nid_t alc268_ignore[] = { 0 };
13381 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
13385 if (!spec->autocfg.line_outs) {
13386 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
13387 spec->multiout.max_channels = 2;
13388 spec->no_analog = 1;
13391 return 0; /* can't find valid BIOS pin config */
13393 err = alc268_auto_create_multi_out_ctls(spec, &spec->autocfg);
13396 err = alc268_auto_create_input_ctls(codec, &spec->autocfg);
13400 spec->multiout.max_channels = 2;
13403 /* digital only support output */
13404 alc_auto_parse_digital(codec);
13405 if (spec->kctls.list)
13406 add_mixer(spec, spec->kctls.list);
13408 if (!spec->no_analog && spec->autocfg.speaker_pins[0] != 0x1d)
13409 add_mixer(spec, alc268_beep_mixer);
13411 add_verb(spec, alc268_volume_init_verbs);
13412 spec->num_mux_defs = 2;
13413 spec->input_mux = &spec->private_imux[0];
13415 err = alc_auto_add_mic_boost(codec);
13419 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
13424 #define alc268_auto_init_analog_input alc882_auto_init_analog_input
13426 /* init callback for auto-configuration model -- overriding the default init */
13427 static void alc268_auto_init(struct hda_codec *codec)
13429 struct alc_spec *spec = codec->spec;
13430 alc268_auto_init_multi_out(codec);
13431 alc268_auto_init_hp_out(codec);
13432 alc268_auto_init_mono_speaker_out(codec);
13433 alc268_auto_init_analog_input(codec);
13434 alc_auto_init_digital(codec);
13435 if (spec->unsol_event)
13436 alc_inithook(codec);
13440 * configuration and preset
13442 static const char *alc268_models[ALC268_MODEL_LAST] = {
13443 [ALC267_QUANTA_IL1] = "quanta-il1",
13444 [ALC268_3ST] = "3stack",
13445 [ALC268_TOSHIBA] = "toshiba",
13446 [ALC268_ACER] = "acer",
13447 [ALC268_ACER_DMIC] = "acer-dmic",
13448 [ALC268_ACER_ASPIRE_ONE] = "acer-aspire",
13449 [ALC268_DELL] = "dell",
13450 [ALC268_ZEPTO] = "zepto",
13451 #ifdef CONFIG_SND_DEBUG
13452 [ALC268_TEST] = "test",
13454 [ALC268_AUTO] = "auto",
13457 static struct snd_pci_quirk alc268_cfg_tbl[] = {
13458 SND_PCI_QUIRK(0x1025, 0x011e, "Acer Aspire 5720z", ALC268_ACER),
13459 SND_PCI_QUIRK(0x1025, 0x0126, "Acer", ALC268_ACER),
13460 SND_PCI_QUIRK(0x1025, 0x012e, "Acer Aspire 5310", ALC268_ACER),
13461 SND_PCI_QUIRK(0x1025, 0x0130, "Acer Extensa 5210", ALC268_ACER),
13462 SND_PCI_QUIRK(0x1025, 0x0136, "Acer Aspire 5315", ALC268_ACER),
13463 SND_PCI_QUIRK(0x1025, 0x015b, "Acer Aspire One",
13464 ALC268_ACER_ASPIRE_ONE),
13465 SND_PCI_QUIRK(0x1028, 0x0253, "Dell OEM", ALC268_DELL),
13466 SND_PCI_QUIRK_MASK(0x1028, 0xfff0, 0x02b0,
13467 "Dell Inspiron Mini9/Vostro A90", ALC268_DELL),
13468 /* almost compatible with toshiba but with optional digital outs;
13469 * auto-probing seems working fine
13471 SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3000, "HP TX25xx series",
13473 SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
13474 SND_PCI_QUIRK(0x1170, 0x0040, "ZEPTO", ALC268_ZEPTO),
13475 SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
13476 SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
13477 SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
13478 SND_PCI_QUIRK(0x1854, 0x1775, "LG R510", ALC268_DELL),
13482 /* Toshiba laptops have no unique PCI SSID but only codec SSID */
13483 static struct snd_pci_quirk alc268_ssid_cfg_tbl[] = {
13484 SND_PCI_QUIRK(0x1179, 0xff0a, "TOSHIBA X-200", ALC268_AUTO),
13485 SND_PCI_QUIRK(0x1179, 0xff0e, "TOSHIBA X-200 HDMI", ALC268_AUTO),
13486 SND_PCI_QUIRK_MASK(0x1179, 0xff00, 0xff00, "TOSHIBA A/Lx05",
13491 static struct alc_config_preset alc268_presets[] = {
13492 [ALC267_QUANTA_IL1] = {
13493 .mixers = { alc267_quanta_il1_mixer, alc268_beep_mixer,
13494 alc268_capture_nosrc_mixer },
13495 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13496 alc267_quanta_il1_verbs },
13497 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13498 .dac_nids = alc268_dac_nids,
13499 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13500 .adc_nids = alc268_adc_nids_alt,
13502 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13503 .channel_mode = alc268_modes,
13504 .unsol_event = alc_sku_unsol_event,
13505 .setup = alc267_quanta_il1_setup,
13506 .init_hook = alc_inithook,
13509 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
13510 alc268_beep_mixer },
13511 .init_verbs = { alc268_base_init_verbs },
13512 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13513 .dac_nids = alc268_dac_nids,
13514 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13515 .adc_nids = alc268_adc_nids_alt,
13516 .capsrc_nids = alc268_capsrc_nids,
13518 .dig_out_nid = ALC268_DIGOUT_NID,
13519 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13520 .channel_mode = alc268_modes,
13521 .input_mux = &alc268_capture_source,
13523 [ALC268_TOSHIBA] = {
13524 .mixers = { alc268_toshiba_mixer, alc268_capture_alt_mixer,
13525 alc268_beep_mixer },
13526 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13527 alc268_toshiba_verbs },
13528 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13529 .dac_nids = alc268_dac_nids,
13530 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13531 .adc_nids = alc268_adc_nids_alt,
13532 .capsrc_nids = alc268_capsrc_nids,
13534 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13535 .channel_mode = alc268_modes,
13536 .input_mux = &alc268_capture_source,
13537 .unsol_event = alc268_toshiba_unsol_event,
13538 .setup = alc268_toshiba_setup,
13539 .init_hook = alc268_toshiba_automute,
13542 .mixers = { alc268_acer_mixer, alc268_capture_alt_mixer,
13543 alc268_beep_mixer },
13544 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13545 alc268_acer_verbs },
13546 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13547 .dac_nids = alc268_dac_nids,
13548 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13549 .adc_nids = alc268_adc_nids_alt,
13550 .capsrc_nids = alc268_capsrc_nids,
13552 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13553 .channel_mode = alc268_modes,
13554 .input_mux = &alc268_acer_capture_source,
13555 .unsol_event = alc268_acer_unsol_event,
13556 .init_hook = alc268_acer_init_hook,
13558 [ALC268_ACER_DMIC] = {
13559 .mixers = { alc268_acer_dmic_mixer, alc268_capture_alt_mixer,
13560 alc268_beep_mixer },
13561 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13562 alc268_acer_verbs },
13563 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13564 .dac_nids = alc268_dac_nids,
13565 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13566 .adc_nids = alc268_adc_nids_alt,
13567 .capsrc_nids = alc268_capsrc_nids,
13569 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13570 .channel_mode = alc268_modes,
13571 .input_mux = &alc268_acer_dmic_capture_source,
13572 .unsol_event = alc268_acer_unsol_event,
13573 .init_hook = alc268_acer_init_hook,
13575 [ALC268_ACER_ASPIRE_ONE] = {
13576 .mixers = { alc268_acer_aspire_one_mixer,
13578 alc268_capture_nosrc_mixer },
13579 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13580 alc268_acer_aspire_one_verbs },
13581 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13582 .dac_nids = alc268_dac_nids,
13583 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13584 .adc_nids = alc268_adc_nids_alt,
13585 .capsrc_nids = alc268_capsrc_nids,
13587 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13588 .channel_mode = alc268_modes,
13589 .unsol_event = alc268_acer_lc_unsol_event,
13590 .setup = alc268_acer_lc_setup,
13591 .init_hook = alc268_acer_lc_init_hook,
13594 .mixers = { alc268_dell_mixer, alc268_beep_mixer,
13595 alc268_capture_nosrc_mixer },
13596 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13597 alc268_dell_verbs },
13598 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13599 .dac_nids = alc268_dac_nids,
13600 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13601 .adc_nids = alc268_adc_nids_alt,
13602 .capsrc_nids = alc268_capsrc_nids,
13604 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13605 .channel_mode = alc268_modes,
13606 .unsol_event = alc_sku_unsol_event,
13607 .setup = alc268_dell_setup,
13608 .init_hook = alc_inithook,
13611 .mixers = { alc268_base_mixer, alc268_capture_alt_mixer,
13612 alc268_beep_mixer },
13613 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13614 alc268_toshiba_verbs },
13615 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13616 .dac_nids = alc268_dac_nids,
13617 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13618 .adc_nids = alc268_adc_nids_alt,
13619 .capsrc_nids = alc268_capsrc_nids,
13621 .dig_out_nid = ALC268_DIGOUT_NID,
13622 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13623 .channel_mode = alc268_modes,
13624 .input_mux = &alc268_capture_source,
13625 .setup = alc268_toshiba_setup,
13626 .init_hook = alc268_toshiba_automute,
13628 #ifdef CONFIG_SND_DEBUG
13630 .mixers = { alc268_test_mixer, alc268_capture_mixer },
13631 .init_verbs = { alc268_base_init_verbs, alc268_eapd_verbs,
13632 alc268_volume_init_verbs },
13633 .num_dacs = ARRAY_SIZE(alc268_dac_nids),
13634 .dac_nids = alc268_dac_nids,
13635 .num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt),
13636 .adc_nids = alc268_adc_nids_alt,
13637 .capsrc_nids = alc268_capsrc_nids,
13639 .dig_out_nid = ALC268_DIGOUT_NID,
13640 .num_channel_mode = ARRAY_SIZE(alc268_modes),
13641 .channel_mode = alc268_modes,
13642 .input_mux = &alc268_capture_source,
13647 static int patch_alc268(struct hda_codec *codec)
13649 struct alc_spec *spec;
13651 int i, has_beep, err;
13653 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
13657 codec->spec = spec;
13659 board_config = snd_hda_check_board_config(codec, ALC268_MODEL_LAST,
13663 if (board_config < 0 || board_config >= ALC268_MODEL_LAST)
13664 board_config = snd_hda_check_board_codec_sid_config(codec,
13665 ALC268_MODEL_LAST, alc268_models, alc268_ssid_cfg_tbl);
13667 if (board_config < 0 || board_config >= ALC268_MODEL_LAST) {
13668 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
13670 board_config = ALC268_AUTO;
13673 if (board_config == ALC268_AUTO) {
13674 /* automatic parse from the BIOS config */
13675 err = alc268_parse_auto_config(codec);
13681 "hda_codec: Cannot set up configuration "
13682 "from BIOS. Using base mode...\n");
13683 board_config = ALC268_3ST;
13687 if (board_config != ALC268_AUTO)
13688 setup_preset(codec, &alc268_presets[board_config]);
13690 spec->stream_analog_playback = &alc268_pcm_analog_playback;
13691 spec->stream_analog_capture = &alc268_pcm_analog_capture;
13692 spec->stream_analog_alt_capture = &alc268_pcm_analog_alt_capture;
13694 spec->stream_digital_playback = &alc268_pcm_digital_playback;
13697 for (i = 0; i < spec->num_mixers; i++) {
13698 if (spec->mixers[i] == alc268_beep_mixer) {
13705 err = snd_hda_attach_beep_device(codec, 0x1);
13710 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
13711 /* override the amp caps for beep generator */
13712 snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
13713 (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
13714 (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
13715 (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
13716 (0 << AC_AMPCAP_MUTE_SHIFT));
13719 if (!spec->no_analog && !spec->adc_nids && spec->input_mux) {
13720 /* check whether NID 0x07 is valid */
13721 unsigned int wcap = get_wcaps(codec, 0x07);
13724 spec->capsrc_nids = alc268_capsrc_nids;
13726 wcap = get_wcaps_type(wcap);
13727 if (spec->auto_mic ||
13728 wcap != AC_WID_AUD_IN || spec->input_mux->num_items == 1) {
13729 spec->adc_nids = alc268_adc_nids_alt;
13730 spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids_alt);
13731 if (spec->auto_mic)
13732 fixup_automic_adc(codec);
13733 if (spec->auto_mic || spec->input_mux->num_items == 1)
13734 add_mixer(spec, alc268_capture_nosrc_mixer);
13736 add_mixer(spec, alc268_capture_alt_mixer);
13738 spec->adc_nids = alc268_adc_nids;
13739 spec->num_adc_nids = ARRAY_SIZE(alc268_adc_nids);
13740 add_mixer(spec, alc268_capture_mixer);
13742 /* set default input source */
13743 for (i = 0; i < spec->num_adc_nids; i++)
13744 snd_hda_codec_write_cache(codec, alc268_capsrc_nids[i],
13745 0, AC_VERB_SET_CONNECT_SEL,
13746 i < spec->num_mux_defs ?
13747 spec->input_mux[i].items[0].index :
13748 spec->input_mux->items[0].index);
13751 spec->vmaster_nid = 0x02;
13753 codec->patch_ops = alc_patch_ops;
13754 if (board_config == ALC268_AUTO)
13755 spec->init_hook = alc268_auto_init;
13761 * ALC269 channel source setting (2 channel)
13763 #define ALC269_DIGOUT_NID ALC880_DIGOUT_NID
13765 #define alc269_dac_nids alc260_dac_nids
13767 static hda_nid_t alc269_adc_nids[1] = {
13772 static hda_nid_t alc269_capsrc_nids[1] = {
13776 static hda_nid_t alc269vb_adc_nids[1] = {
13781 static hda_nid_t alc269vb_capsrc_nids[1] = {
13785 static hda_nid_t alc269_adc_candidates[] = {
13789 #define alc269_modes alc260_modes
13790 #define alc269_capture_source alc880_lg_lw_capture_source
13792 static struct snd_kcontrol_new alc269_base_mixer[] = {
13793 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13794 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13795 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
13796 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
13797 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13798 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13799 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13800 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13801 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13802 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
13803 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13804 HDA_CODEC_MUTE_MONO("Mono Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
13808 static struct snd_kcontrol_new alc269_quanta_fl1_mixer[] = {
13809 /* output mixer control */
13810 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13812 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13813 .name = "Master Playback Switch",
13814 .subdevice = HDA_SUBDEV_AMP_FLAG,
13815 .info = snd_hda_mixer_amp_switch_info,
13816 .get = snd_hda_mixer_amp_switch_get,
13817 .put = alc268_acer_master_sw_put,
13818 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13820 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13821 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13822 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13823 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13824 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13825 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13829 static struct snd_kcontrol_new alc269_lifebook_mixer[] = {
13830 /* output mixer control */
13831 HDA_BIND_VOL("Master Playback Volume", &alc268_acer_bind_master_vol),
13833 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
13834 .name = "Master Playback Switch",
13835 .subdevice = HDA_SUBDEV_AMP_FLAG,
13836 .info = snd_hda_mixer_amp_switch_info,
13837 .get = snd_hda_mixer_amp_switch_get,
13838 .put = alc268_acer_master_sw_put,
13839 .private_value = HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
13841 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
13842 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
13843 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13844 HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x0b, 0x01, HDA_INPUT),
13845 HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x0b, 0x01, HDA_INPUT),
13846 HDA_CODEC_VOLUME("Internal Mic Boost", 0x19, 0, HDA_INPUT),
13847 HDA_CODEC_VOLUME("Dock Mic Playback Volume", 0x0b, 0x03, HDA_INPUT),
13848 HDA_CODEC_MUTE("Dock Mic Playback Switch", 0x0b, 0x03, HDA_INPUT),
13849 HDA_CODEC_VOLUME("Dock Mic Boost", 0x1b, 0, HDA_INPUT),
13853 static struct snd_kcontrol_new alc269_laptop_mixer[] = {
13854 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13855 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13856 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
13857 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13861 static struct snd_kcontrol_new alc269vb_laptop_mixer[] = {
13862 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
13863 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
13864 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
13865 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
13869 /* capture mixer elements */
13870 static struct snd_kcontrol_new alc269_laptop_analog_capture_mixer[] = {
13871 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
13872 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
13873 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13874 HDA_CODEC_VOLUME("IntMic Boost", 0x19, 0, HDA_INPUT),
13878 static struct snd_kcontrol_new alc269_laptop_digital_capture_mixer[] = {
13879 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
13880 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
13881 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13885 static struct snd_kcontrol_new alc269vb_laptop_analog_capture_mixer[] = {
13886 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
13887 HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
13888 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13889 HDA_CODEC_VOLUME("IntMic Boost", 0x19, 0, HDA_INPUT),
13893 static struct snd_kcontrol_new alc269vb_laptop_digital_capture_mixer[] = {
13894 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
13895 HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
13896 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
13901 #define alc269_fujitsu_mixer alc269_laptop_mixer
13903 static struct hda_verb alc269_quanta_fl1_verbs[] = {
13904 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13905 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13906 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13907 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13908 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13909 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13913 static struct hda_verb alc269_lifebook_verbs[] = {
13914 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
13915 {0x1a, AC_VERB_SET_CONNECT_SEL, 0x01},
13916 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13917 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13918 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13919 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
13920 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
13921 {0x1a, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
13922 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
13923 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
13927 /* toggle speaker-output according to the hp-jack state */
13928 static void alc269_quanta_fl1_speaker_automute(struct hda_codec *codec)
13930 unsigned int present;
13931 unsigned char bits;
13933 present = snd_hda_jack_detect(codec, 0x15);
13934 bits = present ? HDA_AMP_MUTE : 0;
13935 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13936 HDA_AMP_MUTE, bits);
13937 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13938 HDA_AMP_MUTE, bits);
13940 snd_hda_codec_write(codec, 0x20, 0,
13941 AC_VERB_SET_COEF_INDEX, 0x0c);
13942 snd_hda_codec_write(codec, 0x20, 0,
13943 AC_VERB_SET_PROC_COEF, 0x680);
13945 snd_hda_codec_write(codec, 0x20, 0,
13946 AC_VERB_SET_COEF_INDEX, 0x0c);
13947 snd_hda_codec_write(codec, 0x20, 0,
13948 AC_VERB_SET_PROC_COEF, 0x480);
13951 /* toggle speaker-output according to the hp-jacks state */
13952 static void alc269_lifebook_speaker_automute(struct hda_codec *codec)
13954 unsigned int present;
13955 unsigned char bits;
13957 /* Check laptop headphone socket */
13958 present = snd_hda_jack_detect(codec, 0x15);
13960 /* Check port replicator headphone socket */
13961 present |= snd_hda_jack_detect(codec, 0x1a);
13963 bits = present ? HDA_AMP_MUTE : 0;
13964 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
13965 HDA_AMP_MUTE, bits);
13966 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
13967 HDA_AMP_MUTE, bits);
13969 snd_hda_codec_write(codec, 0x20, 0,
13970 AC_VERB_SET_COEF_INDEX, 0x0c);
13971 snd_hda_codec_write(codec, 0x20, 0,
13972 AC_VERB_SET_PROC_COEF, 0x680);
13974 snd_hda_codec_write(codec, 0x20, 0,
13975 AC_VERB_SET_COEF_INDEX, 0x0c);
13976 snd_hda_codec_write(codec, 0x20, 0,
13977 AC_VERB_SET_PROC_COEF, 0x480);
13980 static void alc269_lifebook_mic_autoswitch(struct hda_codec *codec)
13982 unsigned int present_laptop;
13983 unsigned int present_dock;
13985 present_laptop = snd_hda_jack_detect(codec, 0x18);
13986 present_dock = snd_hda_jack_detect(codec, 0x1b);
13988 /* Laptop mic port overrides dock mic port, design decision */
13990 snd_hda_codec_write(codec, 0x23, 0,
13991 AC_VERB_SET_CONNECT_SEL, 0x3);
13992 if (present_laptop)
13993 snd_hda_codec_write(codec, 0x23, 0,
13994 AC_VERB_SET_CONNECT_SEL, 0x0);
13995 if (!present_dock && !present_laptop)
13996 snd_hda_codec_write(codec, 0x23, 0,
13997 AC_VERB_SET_CONNECT_SEL, 0x1);
14000 static void alc269_quanta_fl1_unsol_event(struct hda_codec *codec,
14003 switch (res >> 26) {
14004 case ALC880_HP_EVENT:
14005 alc269_quanta_fl1_speaker_automute(codec);
14007 case ALC880_MIC_EVENT:
14008 alc_mic_automute(codec);
14013 static void alc269_lifebook_unsol_event(struct hda_codec *codec,
14016 if ((res >> 26) == ALC880_HP_EVENT)
14017 alc269_lifebook_speaker_automute(codec);
14018 if ((res >> 26) == ALC880_MIC_EVENT)
14019 alc269_lifebook_mic_autoswitch(codec);
14022 static void alc269_quanta_fl1_setup(struct hda_codec *codec)
14024 struct alc_spec *spec = codec->spec;
14025 spec->autocfg.hp_pins[0] = 0x15;
14026 spec->autocfg.speaker_pins[0] = 0x14;
14027 spec->ext_mic.pin = 0x18;
14028 spec->ext_mic.mux_idx = 0;
14029 spec->int_mic.pin = 0x19;
14030 spec->int_mic.mux_idx = 1;
14031 spec->auto_mic = 1;
14034 static void alc269_quanta_fl1_init_hook(struct hda_codec *codec)
14036 alc269_quanta_fl1_speaker_automute(codec);
14037 alc_mic_automute(codec);
14040 static void alc269_lifebook_init_hook(struct hda_codec *codec)
14042 alc269_lifebook_speaker_automute(codec);
14043 alc269_lifebook_mic_autoswitch(codec);
14046 static struct hda_verb alc269_laptop_dmic_init_verbs[] = {
14047 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
14048 {0x23, AC_VERB_SET_CONNECT_SEL, 0x05},
14049 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
14050 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
14051 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14052 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
14053 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
14057 static struct hda_verb alc269_laptop_amic_init_verbs[] = {
14058 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
14059 {0x23, AC_VERB_SET_CONNECT_SEL, 0x01},
14060 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
14061 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, (0x701b | (0x00 << 8))},
14062 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
14063 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
14067 static struct hda_verb alc269vb_laptop_dmic_init_verbs[] = {
14068 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
14069 {0x22, AC_VERB_SET_CONNECT_SEL, 0x06},
14070 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
14071 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
14072 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14073 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
14074 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
14078 static struct hda_verb alc269vb_laptop_amic_init_verbs[] = {
14079 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01},
14080 {0x22, AC_VERB_SET_CONNECT_SEL, 0x01},
14081 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, 0xb026 },
14082 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, (0x7019 | (0x00 << 8))},
14083 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14084 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
14085 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
14089 /* toggle speaker-output according to the hp-jack state */
14090 static void alc269_speaker_automute(struct hda_codec *codec)
14092 struct alc_spec *spec = codec->spec;
14093 unsigned int nid = spec->autocfg.hp_pins[0];
14094 unsigned int present;
14095 unsigned char bits;
14097 present = snd_hda_jack_detect(codec, nid);
14098 bits = present ? HDA_AMP_MUTE : 0;
14099 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
14100 HDA_AMP_MUTE, bits);
14101 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
14102 HDA_AMP_MUTE, bits);
14105 /* unsolicited event for HP jack sensing */
14106 static void alc269_laptop_unsol_event(struct hda_codec *codec,
14109 switch (res >> 26) {
14110 case ALC880_HP_EVENT:
14111 alc269_speaker_automute(codec);
14113 case ALC880_MIC_EVENT:
14114 alc_mic_automute(codec);
14119 static void alc269_laptop_amic_setup(struct hda_codec *codec)
14121 struct alc_spec *spec = codec->spec;
14122 spec->autocfg.hp_pins[0] = 0x15;
14123 spec->autocfg.speaker_pins[0] = 0x14;
14124 spec->ext_mic.pin = 0x18;
14125 spec->ext_mic.mux_idx = 0;
14126 spec->int_mic.pin = 0x19;
14127 spec->int_mic.mux_idx = 1;
14128 spec->auto_mic = 1;
14131 static void alc269_laptop_dmic_setup(struct hda_codec *codec)
14133 struct alc_spec *spec = codec->spec;
14134 spec->autocfg.hp_pins[0] = 0x15;
14135 spec->autocfg.speaker_pins[0] = 0x14;
14136 spec->ext_mic.pin = 0x18;
14137 spec->ext_mic.mux_idx = 0;
14138 spec->int_mic.pin = 0x12;
14139 spec->int_mic.mux_idx = 5;
14140 spec->auto_mic = 1;
14143 static void alc269vb_laptop_amic_setup(struct hda_codec *codec)
14145 struct alc_spec *spec = codec->spec;
14146 spec->autocfg.hp_pins[0] = 0x21;
14147 spec->autocfg.speaker_pins[0] = 0x14;
14148 spec->ext_mic.pin = 0x18;
14149 spec->ext_mic.mux_idx = 0;
14150 spec->int_mic.pin = 0x19;
14151 spec->int_mic.mux_idx = 1;
14152 spec->auto_mic = 1;
14155 static void alc269vb_laptop_dmic_setup(struct hda_codec *codec)
14157 struct alc_spec *spec = codec->spec;
14158 spec->autocfg.hp_pins[0] = 0x21;
14159 spec->autocfg.speaker_pins[0] = 0x14;
14160 spec->ext_mic.pin = 0x18;
14161 spec->ext_mic.mux_idx = 0;
14162 spec->int_mic.pin = 0x12;
14163 spec->int_mic.mux_idx = 6;
14164 spec->auto_mic = 1;
14167 static void alc269_laptop_inithook(struct hda_codec *codec)
14169 alc269_speaker_automute(codec);
14170 alc_mic_automute(codec);
14174 * generic initialization of ADC, input mixers and output mixers
14176 static struct hda_verb alc269_init_verbs[] = {
14178 * Unmute ADC0 and set the default input to mic-in
14180 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14183 * Set up output mixers (0x02 - 0x03)
14185 /* set vol=0 to output mixers */
14186 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14187 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14189 /* set up input amps for analog loopback */
14190 /* Amp Indices: DAC = 0, mixer = 1 */
14191 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14192 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14193 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14194 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14195 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14196 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14198 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14199 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14200 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14201 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14202 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14203 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14204 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14206 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14207 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14209 /* FIXME: use Mux-type input source selection */
14210 /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
14211 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
14212 {0x23, AC_VERB_SET_CONNECT_SEL, 0x00},
14215 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
14219 static struct hda_verb alc269vb_init_verbs[] = {
14221 * Unmute ADC0 and set the default input to mic-in
14223 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14226 * Set up output mixers (0x02 - 0x03)
14228 /* set vol=0 to output mixers */
14229 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14230 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
14232 /* set up input amps for analog loopback */
14233 /* Amp Indices: DAC = 0, mixer = 1 */
14234 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14235 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14236 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14237 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14238 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
14239 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
14241 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14242 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
14243 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
14244 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14245 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
14246 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14247 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
14249 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14250 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
14252 /* FIXME: use Mux-type input source selection */
14253 /* Mixer elements: 0x18, 19, 1a, 1b, 1d, 0b */
14254 /* Input mixer1: unmute Mic, F-Mic, Line, CD inputs */
14255 {0x22, AC_VERB_SET_CONNECT_SEL, 0x00},
14258 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
14262 #define alc269_auto_create_multi_out_ctls \
14263 alc268_auto_create_multi_out_ctls
14264 #define alc269_auto_create_input_ctls \
14265 alc268_auto_create_input_ctls
14267 #ifdef CONFIG_SND_HDA_POWER_SAVE
14268 #define alc269_loopbacks alc880_loopbacks
14271 /* pcm configuration: identical with ALC880 */
14272 #define alc269_pcm_analog_playback alc880_pcm_analog_playback
14273 #define alc269_pcm_analog_capture alc880_pcm_analog_capture
14274 #define alc269_pcm_digital_playback alc880_pcm_digital_playback
14275 #define alc269_pcm_digital_capture alc880_pcm_digital_capture
14277 static struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
14281 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
14282 /* NID is set in alc_build_pcms */
14284 .open = alc880_playback_pcm_open,
14285 .prepare = alc880_playback_pcm_prepare,
14286 .cleanup = alc880_playback_pcm_cleanup
14290 static struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
14294 .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
14295 /* NID is set in alc_build_pcms */
14298 #ifdef CONFIG_SND_HDA_POWER_SAVE
14299 static int alc269_mic2_for_mute_led(struct hda_codec *codec)
14301 switch (codec->subsystem_id) {
14308 static int alc269_mic2_mute_check_ps(struct hda_codec *codec, hda_nid_t nid)
14310 /* update mute-LED according to the speaker mute state */
14311 if (nid == 0x01 || nid == 0x14) {
14313 if (snd_hda_codec_amp_read(codec, 0x14, 0, HDA_OUTPUT, 0) &
14318 /* mic2 vref pin is used for mute LED control */
14319 snd_hda_codec_update_cache(codec, 0x19, 0,
14320 AC_VERB_SET_PIN_WIDGET_CONTROL,
14323 return alc_check_power_status(codec, nid);
14325 #endif /* CONFIG_SND_HDA_POWER_SAVE */
14327 static int alc275_setup_dual_adc(struct hda_codec *codec)
14329 struct alc_spec *spec = codec->spec;
14331 if (codec->vendor_id != 0x10ec0275 || !spec->auto_mic)
14333 if ((spec->ext_mic.pin >= 0x18 && spec->int_mic.pin <= 0x13) ||
14334 (spec->ext_mic.pin <= 0x12 && spec->int_mic.pin >= 0x18)) {
14335 if (spec->ext_mic.pin <= 0x12) {
14336 spec->private_adc_nids[0] = 0x08;
14337 spec->private_adc_nids[1] = 0x11;
14338 spec->private_capsrc_nids[0] = 0x23;
14339 spec->private_capsrc_nids[1] = 0x22;
14341 spec->private_adc_nids[0] = 0x11;
14342 spec->private_adc_nids[1] = 0x08;
14343 spec->private_capsrc_nids[0] = 0x22;
14344 spec->private_capsrc_nids[1] = 0x23;
14346 spec->adc_nids = spec->private_adc_nids;
14347 spec->capsrc_nids = spec->private_capsrc_nids;
14348 spec->num_adc_nids = 2;
14349 spec->dual_adc_switch = 1;
14350 snd_printdd("realtek: enabling dual ADC switchg (%02x:%02x)\n",
14351 spec->adc_nids[0], spec->adc_nids[1]);
14358 * BIOS auto configuration
14360 static int alc269_parse_auto_config(struct hda_codec *codec)
14362 struct alc_spec *spec = codec->spec;
14364 static hda_nid_t alc269_ignore[] = { 0x1d, 0 };
14366 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
14371 err = alc269_auto_create_multi_out_ctls(spec, &spec->autocfg);
14374 err = alc269_auto_create_input_ctls(codec, &spec->autocfg);
14378 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
14380 alc_auto_parse_digital(codec);
14382 if (spec->kctls.list)
14383 add_mixer(spec, spec->kctls.list);
14385 if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010) {
14386 add_verb(spec, alc269vb_init_verbs);
14387 alc_ssid_check(codec, 0, 0x1b, 0x14, 0x21);
14389 add_verb(spec, alc269_init_verbs);
14390 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
14393 spec->num_mux_defs = 1;
14394 spec->input_mux = &spec->private_imux[0];
14396 if (!alc275_setup_dual_adc(codec))
14397 fillup_priv_adc_nids(codec, alc269_adc_candidates,
14398 sizeof(alc269_adc_candidates));
14400 /* set default input source */
14401 if (!spec->dual_adc_switch)
14402 select_or_unmute_capsrc(codec, spec->capsrc_nids[0],
14403 spec->input_mux->items[0].index);
14405 err = alc_auto_add_mic_boost(codec);
14409 if (!spec->cap_mixer && !spec->no_analog)
14410 set_capture_mixer(codec);
14415 #define alc269_auto_init_multi_out alc268_auto_init_multi_out
14416 #define alc269_auto_init_hp_out alc268_auto_init_hp_out
14417 #define alc269_auto_init_analog_input alc882_auto_init_analog_input
14420 /* init callback for auto-configuration model -- overriding the default init */
14421 static void alc269_auto_init(struct hda_codec *codec)
14423 struct alc_spec *spec = codec->spec;
14424 alc269_auto_init_multi_out(codec);
14425 alc269_auto_init_hp_out(codec);
14426 alc269_auto_init_analog_input(codec);
14427 alc_auto_init_digital(codec);
14428 if (spec->unsol_event)
14429 alc_inithook(codec);
14433 ALC269_FIXUP_SONY_VAIO,
14436 static const struct hda_verb alc269_sony_vaio_fixup_verbs[] = {
14437 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREFGRD},
14441 static const struct alc_fixup alc269_fixups[] = {
14442 [ALC269_FIXUP_SONY_VAIO] = {
14443 .verbs = alc269_sony_vaio_fixup_verbs
14447 static struct snd_pci_quirk alc269_fixup_tbl[] = {
14448 SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
14454 * configuration and preset
14456 static const char *alc269_models[ALC269_MODEL_LAST] = {
14457 [ALC269_BASIC] = "basic",
14458 [ALC269_QUANTA_FL1] = "quanta",
14459 [ALC269_AMIC] = "laptop-amic",
14460 [ALC269_DMIC] = "laptop-dmic",
14461 [ALC269_FUJITSU] = "fujitsu",
14462 [ALC269_LIFEBOOK] = "lifebook",
14463 [ALC269_AUTO] = "auto",
14466 static struct snd_pci_quirk alc269_cfg_tbl[] = {
14467 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_QUANTA_FL1),
14468 SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
14470 SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269VB_AMIC),
14471 SND_PCI_QUIRK(0x1043, 0x1113, "ASUS N63Jn", ALC269VB_AMIC),
14472 SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269VB_AMIC),
14473 SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_AMIC),
14474 SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269VB_AMIC),
14475 SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269VB_AMIC),
14476 SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269VB_AMIC),
14477 SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269VB_AMIC),
14478 SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_AMIC),
14479 SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82Jv", ALC269_AMIC),
14480 SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_AMIC),
14481 SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_AMIC),
14482 SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_AMIC),
14483 SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_AMIC),
14484 SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_AMIC),
14485 SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_AMIC),
14486 SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_AMIC),
14487 SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_AMIC),
14488 SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_AMIC),
14489 SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_AMIC),
14490 SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_AMIC),
14491 SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_AMIC),
14492 SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_AMIC),
14493 SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_AMIC),
14494 SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_AMIC),
14495 SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_AMIC),
14496 SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_AMIC),
14497 SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_AMIC),
14498 SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_AMIC),
14499 SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_AMIC),
14500 SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_AMIC),
14501 SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_DMIC),
14502 SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_AMIC),
14503 SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_AMIC),
14504 SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_AMIC),
14505 SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_AMIC),
14506 SND_PCI_QUIRK(0x1043, 0x831a, "ASUS Eeepc P901",
14508 SND_PCI_QUIRK(0x1043, 0x834a, "ASUS Eeepc S101",
14510 SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005HA", ALC269_DMIC),
14511 SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005HA", ALC269_DMIC),
14512 SND_PCI_QUIRK(0x104d, 0x9071, "Sony VAIO", ALC269_AUTO),
14513 SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook ICH9M-based", ALC269_LIFEBOOK),
14514 SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_DMIC),
14515 SND_PCI_QUIRK(0x1734, 0x115d, "FSC Amilo", ALC269_FUJITSU),
14516 SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_AMIC),
14517 SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_AMIC),
14518 SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_DMIC),
14519 SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_DMIC),
14523 static struct alc_config_preset alc269_presets[] = {
14525 .mixers = { alc269_base_mixer },
14526 .init_verbs = { alc269_init_verbs },
14527 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14528 .dac_nids = alc269_dac_nids,
14530 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14531 .channel_mode = alc269_modes,
14532 .input_mux = &alc269_capture_source,
14534 [ALC269_QUANTA_FL1] = {
14535 .mixers = { alc269_quanta_fl1_mixer },
14536 .init_verbs = { alc269_init_verbs, alc269_quanta_fl1_verbs },
14537 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14538 .dac_nids = alc269_dac_nids,
14540 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14541 .channel_mode = alc269_modes,
14542 .input_mux = &alc269_capture_source,
14543 .unsol_event = alc269_quanta_fl1_unsol_event,
14544 .setup = alc269_quanta_fl1_setup,
14545 .init_hook = alc269_quanta_fl1_init_hook,
14548 .mixers = { alc269_laptop_mixer },
14549 .cap_mixer = alc269_laptop_analog_capture_mixer,
14550 .init_verbs = { alc269_init_verbs,
14551 alc269_laptop_amic_init_verbs },
14552 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14553 .dac_nids = alc269_dac_nids,
14555 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14556 .channel_mode = alc269_modes,
14557 .unsol_event = alc269_laptop_unsol_event,
14558 .setup = alc269_laptop_amic_setup,
14559 .init_hook = alc269_laptop_inithook,
14562 .mixers = { alc269_laptop_mixer },
14563 .cap_mixer = alc269_laptop_digital_capture_mixer,
14564 .init_verbs = { alc269_init_verbs,
14565 alc269_laptop_dmic_init_verbs },
14566 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14567 .dac_nids = alc269_dac_nids,
14569 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14570 .channel_mode = alc269_modes,
14571 .unsol_event = alc269_laptop_unsol_event,
14572 .setup = alc269_laptop_dmic_setup,
14573 .init_hook = alc269_laptop_inithook,
14575 [ALC269VB_AMIC] = {
14576 .mixers = { alc269vb_laptop_mixer },
14577 .cap_mixer = alc269vb_laptop_analog_capture_mixer,
14578 .init_verbs = { alc269vb_init_verbs,
14579 alc269vb_laptop_amic_init_verbs },
14580 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14581 .dac_nids = alc269_dac_nids,
14583 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14584 .channel_mode = alc269_modes,
14585 .unsol_event = alc269_laptop_unsol_event,
14586 .setup = alc269vb_laptop_amic_setup,
14587 .init_hook = alc269_laptop_inithook,
14589 [ALC269VB_DMIC] = {
14590 .mixers = { alc269vb_laptop_mixer },
14591 .cap_mixer = alc269vb_laptop_digital_capture_mixer,
14592 .init_verbs = { alc269vb_init_verbs,
14593 alc269vb_laptop_dmic_init_verbs },
14594 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14595 .dac_nids = alc269_dac_nids,
14597 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14598 .channel_mode = alc269_modes,
14599 .unsol_event = alc269_laptop_unsol_event,
14600 .setup = alc269vb_laptop_dmic_setup,
14601 .init_hook = alc269_laptop_inithook,
14603 [ALC269_FUJITSU] = {
14604 .mixers = { alc269_fujitsu_mixer },
14605 .cap_mixer = alc269_laptop_digital_capture_mixer,
14606 .init_verbs = { alc269_init_verbs,
14607 alc269_laptop_dmic_init_verbs },
14608 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14609 .dac_nids = alc269_dac_nids,
14611 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14612 .channel_mode = alc269_modes,
14613 .unsol_event = alc269_laptop_unsol_event,
14614 .setup = alc269_laptop_dmic_setup,
14615 .init_hook = alc269_laptop_inithook,
14617 [ALC269_LIFEBOOK] = {
14618 .mixers = { alc269_lifebook_mixer },
14619 .init_verbs = { alc269_init_verbs, alc269_lifebook_verbs },
14620 .num_dacs = ARRAY_SIZE(alc269_dac_nids),
14621 .dac_nids = alc269_dac_nids,
14623 .num_channel_mode = ARRAY_SIZE(alc269_modes),
14624 .channel_mode = alc269_modes,
14625 .input_mux = &alc269_capture_source,
14626 .unsol_event = alc269_lifebook_unsol_event,
14627 .init_hook = alc269_lifebook_init_hook,
14631 static int patch_alc269(struct hda_codec *codec)
14633 struct alc_spec *spec;
14636 int is_alc269vb = 0;
14638 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
14642 codec->spec = spec;
14644 alc_auto_parse_customize_define(codec);
14646 if ((alc_read_coef_idx(codec, 0) & 0x00f0) == 0x0010){
14647 if (codec->bus->pci->subsystem_vendor == 0x1025 &&
14648 spec->cdefine.platform_type == 1)
14649 alc_codec_rename(codec, "ALC271X");
14651 alc_codec_rename(codec, "ALC259");
14654 alc_fix_pll_init(codec, 0x20, 0x04, 15);
14656 board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST,
14660 if (board_config < 0) {
14661 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
14663 board_config = ALC269_AUTO;
14666 if (board_config == ALC269_AUTO)
14667 alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 1);
14669 if (board_config == ALC269_AUTO) {
14670 /* automatic parse from the BIOS config */
14671 err = alc269_parse_auto_config(codec);
14677 "hda_codec: Cannot set up configuration "
14678 "from BIOS. Using base mode...\n");
14679 board_config = ALC269_BASIC;
14683 if (has_cdefine_beep(codec)) {
14684 err = snd_hda_attach_beep_device(codec, 0x1);
14691 if (board_config != ALC269_AUTO)
14692 setup_preset(codec, &alc269_presets[board_config]);
14694 if (board_config == ALC269_QUANTA_FL1) {
14695 /* Due to a hardware problem on Lenovo Ideadpad, we need to
14696 * fix the sample rate of analog I/O to 44.1kHz
14698 spec->stream_analog_playback = &alc269_44k_pcm_analog_playback;
14699 spec->stream_analog_capture = &alc269_44k_pcm_analog_capture;
14700 } else if (spec->dual_adc_switch) {
14701 spec->stream_analog_playback = &alc269_pcm_analog_playback;
14702 /* switch ADC dynamically */
14703 spec->stream_analog_capture = &dualmic_pcm_analog_capture;
14705 spec->stream_analog_playback = &alc269_pcm_analog_playback;
14706 spec->stream_analog_capture = &alc269_pcm_analog_capture;
14708 spec->stream_digital_playback = &alc269_pcm_digital_playback;
14709 spec->stream_digital_capture = &alc269_pcm_digital_capture;
14711 if (!spec->adc_nids) { /* wasn't filled automatically? use default */
14712 if (!is_alc269vb) {
14713 spec->adc_nids = alc269_adc_nids;
14714 spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids);
14715 spec->capsrc_nids = alc269_capsrc_nids;
14717 spec->adc_nids = alc269vb_adc_nids;
14718 spec->num_adc_nids = ARRAY_SIZE(alc269vb_adc_nids);
14719 spec->capsrc_nids = alc269vb_capsrc_nids;
14723 if (!spec->cap_mixer)
14724 set_capture_mixer(codec);
14725 if (has_cdefine_beep(codec))
14726 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
14728 if (board_config == ALC269_AUTO)
14729 alc_pick_fixup(codec, alc269_fixup_tbl, alc269_fixups, 0);
14731 spec->vmaster_nid = 0x02;
14733 codec->patch_ops = alc_patch_ops;
14734 if (board_config == ALC269_AUTO)
14735 spec->init_hook = alc269_auto_init;
14736 #ifdef CONFIG_SND_HDA_POWER_SAVE
14737 if (!spec->loopback.amplist)
14738 spec->loopback.amplist = alc269_loopbacks;
14739 if (alc269_mic2_for_mute_led(codec))
14740 codec->patch_ops.check_power_status = alc269_mic2_mute_check_ps;
14747 * ALC861 channel source setting (2/6 channel selection for 3-stack)
14751 * set the path ways for 2 channel output
14752 * need to set the codec line out and mic 1 pin widgets to inputs
14754 static struct hda_verb alc861_threestack_ch2_init[] = {
14755 /* set pin widget 1Ah (line in) for input */
14756 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14757 /* set pin widget 18h (mic1/2) for input, for mic also enable
14760 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14762 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
14764 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14765 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
14771 * need to set the codec line out and mic 1 pin widgets to outputs
14773 static struct hda_verb alc861_threestack_ch6_init[] = {
14774 /* set pin widget 1Ah (line in) for output (Back Surround)*/
14775 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14776 /* set pin widget 18h (mic1) for output (CLFE)*/
14777 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14779 { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
14780 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
14782 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
14784 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14785 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
14790 static struct hda_channel_mode alc861_threestack_modes[2] = {
14791 { 2, alc861_threestack_ch2_init },
14792 { 6, alc861_threestack_ch6_init },
14794 /* Set mic1 as input and unmute the mixer */
14795 static struct hda_verb alc861_uniwill_m31_ch2_init[] = {
14796 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14797 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14800 /* Set mic1 as output and mute mixer */
14801 static struct hda_verb alc861_uniwill_m31_ch4_init[] = {
14802 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14803 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14807 static struct hda_channel_mode alc861_uniwill_m31_modes[2] = {
14808 { 2, alc861_uniwill_m31_ch2_init },
14809 { 4, alc861_uniwill_m31_ch4_init },
14812 /* Set mic1 and line-in as input and unmute the mixer */
14813 static struct hda_verb alc861_asus_ch2_init[] = {
14814 /* set pin widget 1Ah (line in) for input */
14815 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
14816 /* set pin widget 18h (mic1/2) for input, for mic also enable
14819 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14821 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c },
14823 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x01 << 8)) }, /*mic*/
14824 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7000 | (0x02 << 8)) }, /*line-in*/
14828 /* Set mic1 nad line-in as output and mute mixer */
14829 static struct hda_verb alc861_asus_ch6_init[] = {
14830 /* set pin widget 1Ah (line in) for output (Back Surround)*/
14831 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14832 /* { 0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
14833 /* set pin widget 18h (mic1) for output (CLFE)*/
14834 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14835 /* { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE }, */
14836 { 0x0c, AC_VERB_SET_CONNECT_SEL, 0x00 },
14837 { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00 },
14839 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080 },
14841 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x01 << 8)) }, /*mic*/
14842 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, (0x7080 | (0x02 << 8)) }, /*line in*/
14847 static struct hda_channel_mode alc861_asus_modes[2] = {
14848 { 2, alc861_asus_ch2_init },
14849 { 6, alc861_asus_ch6_init },
14854 static struct snd_kcontrol_new alc861_base_mixer[] = {
14855 /* output mixer control */
14856 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14857 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14858 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14859 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14860 HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
14862 /*Input mixer control */
14863 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14864 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14865 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14866 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14867 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14868 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14869 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14870 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14871 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14872 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14877 static struct snd_kcontrol_new alc861_3ST_mixer[] = {
14878 /* output mixer control */
14879 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14880 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14881 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14882 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14883 /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
14885 /* Input mixer control */
14886 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14887 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14888 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14889 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14890 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14891 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14892 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14893 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14894 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14895 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14898 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14899 .name = "Channel Mode",
14900 .info = alc_ch_mode_info,
14901 .get = alc_ch_mode_get,
14902 .put = alc_ch_mode_put,
14903 .private_value = ARRAY_SIZE(alc861_threestack_modes),
14908 static struct snd_kcontrol_new alc861_toshiba_mixer[] = {
14909 /* output mixer control */
14910 HDA_CODEC_MUTE("Master Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14911 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14912 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14917 static struct snd_kcontrol_new alc861_uniwill_m31_mixer[] = {
14918 /* output mixer control */
14919 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14920 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14921 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14922 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14923 /*HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT), */
14925 /* Input mixer control */
14926 /* HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14927 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT), */
14928 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14929 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14930 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14931 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14932 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14933 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14934 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14935 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_INPUT),
14938 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14939 .name = "Channel Mode",
14940 .info = alc_ch_mode_info,
14941 .get = alc_ch_mode_get,
14942 .put = alc_ch_mode_put,
14943 .private_value = ARRAY_SIZE(alc861_uniwill_m31_modes),
14948 static struct snd_kcontrol_new alc861_asus_mixer[] = {
14949 /* output mixer control */
14950 HDA_CODEC_MUTE("Front Playback Switch", 0x03, 0x0, HDA_OUTPUT),
14951 HDA_CODEC_MUTE("Surround Playback Switch", 0x06, 0x0, HDA_OUTPUT),
14952 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x05, 1, 0x0, HDA_OUTPUT),
14953 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x05, 2, 0x0, HDA_OUTPUT),
14954 HDA_CODEC_MUTE("Side Playback Switch", 0x04, 0x0, HDA_OUTPUT),
14956 /* Input mixer control */
14957 HDA_CODEC_VOLUME("Input Playback Volume", 0x15, 0x0, HDA_OUTPUT),
14958 HDA_CODEC_MUTE("Input Playback Switch", 0x15, 0x0, HDA_OUTPUT),
14959 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14960 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14961 HDA_CODEC_VOLUME("Line Playback Volume", 0x15, 0x02, HDA_INPUT),
14962 HDA_CODEC_MUTE("Line Playback Switch", 0x15, 0x02, HDA_INPUT),
14963 HDA_CODEC_VOLUME("Mic Playback Volume", 0x15, 0x01, HDA_INPUT),
14964 HDA_CODEC_MUTE("Mic Playback Switch", 0x15, 0x01, HDA_INPUT),
14965 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x10, 0x01, HDA_OUTPUT),
14966 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1a, 0x03, HDA_OUTPUT),
14969 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
14970 .name = "Channel Mode",
14971 .info = alc_ch_mode_info,
14972 .get = alc_ch_mode_get,
14973 .put = alc_ch_mode_put,
14974 .private_value = ARRAY_SIZE(alc861_asus_modes),
14979 /* additional mixer */
14980 static struct snd_kcontrol_new alc861_asus_laptop_mixer[] = {
14981 HDA_CODEC_VOLUME("CD Playback Volume", 0x15, 0x0, HDA_INPUT),
14982 HDA_CODEC_MUTE("CD Playback Switch", 0x15, 0x0, HDA_INPUT),
14987 * generic initialization of ADC, input mixers and output mixers
14989 static struct hda_verb alc861_base_init_verbs[] = {
14991 * Unmute ADC0 and set the default input to mic-in
14993 /* port-A for surround (rear panel) */
14994 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
14995 { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x00 },
14996 /* port-B for mic-in (rear panel) with vref */
14997 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
14998 /* port-C for line-in (rear panel) */
14999 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15000 /* port-D for Front */
15001 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15002 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
15003 /* port-E for HP out (front panel) */
15004 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
15005 /* route front PCM to HP */
15006 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
15007 /* port-F for mic-in (front panel) with vref */
15008 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15009 /* port-G for CLFE (rear panel) */
15010 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15011 { 0x1f, AC_VERB_SET_CONNECT_SEL, 0x00 },
15012 /* port-H for side (rear panel) */
15013 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15014 { 0x20, AC_VERB_SET_CONNECT_SEL, 0x00 },
15016 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15017 /* route front mic to ADC1*/
15018 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
15019 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15021 /* Unmute DAC0~3 & spdif out*/
15022 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15023 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15024 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15025 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15026 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15028 /* Unmute Mixer 14 (mic) 1c (Line in)*/
15029 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15030 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15031 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15032 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15034 /* Unmute Stereo Mixer 15 */
15035 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15036 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15037 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15038 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
15040 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15041 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15042 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15043 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15044 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15045 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15046 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15047 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15048 /* hp used DAC 3 (Front) */
15049 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
15050 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15055 static struct hda_verb alc861_threestack_init_verbs[] = {
15057 * Unmute ADC0 and set the default input to mic-in
15059 /* port-A for surround (rear panel) */
15060 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15061 /* port-B for mic-in (rear panel) with vref */
15062 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15063 /* port-C for line-in (rear panel) */
15064 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15065 /* port-D for Front */
15066 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15067 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
15068 /* port-E for HP out (front panel) */
15069 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
15070 /* route front PCM to HP */
15071 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
15072 /* port-F for mic-in (front panel) with vref */
15073 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15074 /* port-G for CLFE (rear panel) */
15075 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15076 /* port-H for side (rear panel) */
15077 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15079 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15080 /* route front mic to ADC1*/
15081 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
15082 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15083 /* Unmute DAC0~3 & spdif out*/
15084 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15085 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15086 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15087 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15088 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15090 /* Unmute Mixer 14 (mic) 1c (Line in)*/
15091 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15092 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15093 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15094 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15096 /* Unmute Stereo Mixer 15 */
15097 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15098 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15099 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15100 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
15102 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15103 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15104 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15105 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15106 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15107 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15108 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15109 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15110 /* hp used DAC 3 (Front) */
15111 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
15112 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15116 static struct hda_verb alc861_uniwill_m31_init_verbs[] = {
15118 * Unmute ADC0 and set the default input to mic-in
15120 /* port-A for surround (rear panel) */
15121 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15122 /* port-B for mic-in (rear panel) with vref */
15123 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15124 /* port-C for line-in (rear panel) */
15125 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15126 /* port-D for Front */
15127 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15128 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
15129 /* port-E for HP out (front panel) */
15130 /* this has to be set to VREF80 */
15131 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15132 /* route front PCM to HP */
15133 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
15134 /* port-F for mic-in (front panel) with vref */
15135 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15136 /* port-G for CLFE (rear panel) */
15137 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15138 /* port-H for side (rear panel) */
15139 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15141 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15142 /* route front mic to ADC1*/
15143 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
15144 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15145 /* Unmute DAC0~3 & spdif out*/
15146 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15147 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15148 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15149 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15150 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15152 /* Unmute Mixer 14 (mic) 1c (Line in)*/
15153 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15154 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15155 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15156 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15158 /* Unmute Stereo Mixer 15 */
15159 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15160 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15161 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15162 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
15164 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15165 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15166 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15167 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15168 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15169 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15170 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15171 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15172 /* hp used DAC 3 (Front) */
15173 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
15174 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15178 static struct hda_verb alc861_asus_init_verbs[] = {
15180 * Unmute ADC0 and set the default input to mic-in
15182 /* port-A for surround (rear panel)
15183 * according to codec#0 this is the HP jack
15185 { 0x0e, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 }, /* was 0x00 */
15186 /* route front PCM to HP */
15187 { 0x0e, AC_VERB_SET_CONNECT_SEL, 0x01 },
15188 /* port-B for mic-in (rear panel) with vref */
15189 { 0x0d, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15190 /* port-C for line-in (rear panel) */
15191 { 0x0c, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15192 /* port-D for Front */
15193 { 0x0b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15194 { 0x0b, AC_VERB_SET_CONNECT_SEL, 0x00 },
15195 /* port-E for HP out (front panel) */
15196 /* this has to be set to VREF80 */
15197 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15198 /* route front PCM to HP */
15199 { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x00 },
15200 /* port-F for mic-in (front panel) with vref */
15201 { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
15202 /* port-G for CLFE (rear panel) */
15203 { 0x1f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15204 /* port-H for side (rear panel) */
15205 { 0x20, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40 },
15207 { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20 },
15208 /* route front mic to ADC1*/
15209 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00},
15210 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15211 /* Unmute DAC0~3 & spdif out*/
15212 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15213 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15214 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15215 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15216 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15217 /* Unmute Mixer 14 (mic) 1c (Line in)*/
15218 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15219 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15220 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15221 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15223 /* Unmute Stereo Mixer 15 */
15224 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15225 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15226 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15227 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c}, /* Output 0~12 step */
15229 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15230 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15231 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15232 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15233 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15234 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15235 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15236 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15237 /* hp used DAC 3 (Front) */
15238 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(3)},
15239 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15243 /* additional init verbs for ASUS laptops */
15244 static struct hda_verb alc861_asus_laptop_init_verbs[] = {
15245 { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x45 }, /* HP-out */
15246 { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2) }, /* mute line-in */
15251 * generic initialization of ADC, input mixers and output mixers
15253 static struct hda_verb alc861_auto_init_verbs[] = {
15255 * Unmute ADC0 and set the default input to mic-in
15257 /* {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, */
15258 {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15260 /* Unmute DAC0~3 & spdif out*/
15261 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15262 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15263 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15264 {0x06, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
15265 {0x07, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
15267 /* Unmute Mixer 14 (mic) 1c (Line in)*/
15268 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15269 {0x014, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15270 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15271 {0x01c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15273 /* Unmute Stereo Mixer 15 */
15274 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
15275 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
15276 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
15277 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb00c},
15279 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15280 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15281 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15282 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15283 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15284 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15285 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15286 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15288 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15289 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15290 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15291 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15292 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
15293 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
15294 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
15295 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
15297 {0x08, AC_VERB_SET_CONNECT_SEL, 0x00}, /* set Mic 1 */
15302 static struct hda_verb alc861_toshiba_init_verbs[] = {
15303 {0x0f, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
15308 /* toggle speaker-output according to the hp-jack state */
15309 static void alc861_toshiba_automute(struct hda_codec *codec)
15311 unsigned int present = snd_hda_jack_detect(codec, 0x0f);
15313 snd_hda_codec_amp_stereo(codec, 0x16, HDA_INPUT, 0,
15314 HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
15315 snd_hda_codec_amp_stereo(codec, 0x1a, HDA_INPUT, 3,
15316 HDA_AMP_MUTE, present ? 0 : HDA_AMP_MUTE);
15319 static void alc861_toshiba_unsol_event(struct hda_codec *codec,
15322 if ((res >> 26) == ALC880_HP_EVENT)
15323 alc861_toshiba_automute(codec);
15326 /* pcm configuration: identical with ALC880 */
15327 #define alc861_pcm_analog_playback alc880_pcm_analog_playback
15328 #define alc861_pcm_analog_capture alc880_pcm_analog_capture
15329 #define alc861_pcm_digital_playback alc880_pcm_digital_playback
15330 #define alc861_pcm_digital_capture alc880_pcm_digital_capture
15333 #define ALC861_DIGOUT_NID 0x07
15335 static struct hda_channel_mode alc861_8ch_modes[1] = {
15339 static hda_nid_t alc861_dac_nids[4] = {
15340 /* front, surround, clfe, side */
15341 0x03, 0x06, 0x05, 0x04
15344 static hda_nid_t alc660_dac_nids[3] = {
15345 /* front, clfe, surround */
15349 static hda_nid_t alc861_adc_nids[1] = {
15354 static struct hda_input_mux alc861_capture_source = {
15358 { "Front Mic", 0x3 },
15365 static hda_nid_t alc861_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
15367 struct alc_spec *spec = codec->spec;
15368 hda_nid_t mix, srcs[5];
15371 if (snd_hda_get_connections(codec, pin, &mix, 1) != 1)
15373 num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
15376 for (i = 0; i < num; i++) {
15378 type = get_wcaps_type(get_wcaps(codec, srcs[i]));
15379 if (type != AC_WID_AUD_OUT)
15381 for (j = 0; j < spec->multiout.num_dacs; j++)
15382 if (spec->multiout.dac_nids[j] == srcs[i])
15384 if (j >= spec->multiout.num_dacs)
15390 /* fill in the dac_nids table from the parsed pin configuration */
15391 static int alc861_auto_fill_dac_nids(struct hda_codec *codec,
15392 const struct auto_pin_cfg *cfg)
15394 struct alc_spec *spec = codec->spec;
15396 hda_nid_t nid, dac;
15398 spec->multiout.dac_nids = spec->private_dac_nids;
15399 for (i = 0; i < cfg->line_outs; i++) {
15400 nid = cfg->line_out_pins[i];
15401 dac = alc861_look_for_dac(codec, nid);
15404 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
15409 static int alc861_create_out_sw(struct hda_codec *codec, const char *pfx,
15410 hda_nid_t nid, unsigned int chs)
15412 return add_pb_sw_ctrl(codec->spec, ALC_CTL_WIDGET_MUTE, pfx,
15413 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
15416 /* add playback controls from the parsed DAC table */
15417 static int alc861_auto_create_multi_out_ctls(struct hda_codec *codec,
15418 const struct auto_pin_cfg *cfg)
15420 struct alc_spec *spec = codec->spec;
15421 static const char *chname[4] = {
15422 "Front", "Surround", NULL /*CLFE*/, "Side"
15427 if (cfg->line_outs == 1) {
15428 const char *pfx = NULL;
15431 else if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
15434 nid = spec->multiout.dac_nids[0];
15435 return alc861_create_out_sw(codec, pfx, nid, 3);
15439 for (i = 0; i < cfg->line_outs; i++) {
15440 nid = spec->multiout.dac_nids[i];
15445 err = alc861_create_out_sw(codec, "Center", nid, 1);
15448 err = alc861_create_out_sw(codec, "LFE", nid, 2);
15452 err = alc861_create_out_sw(codec, chname[i], nid, 3);
15460 static int alc861_auto_create_hp_ctls(struct hda_codec *codec, hda_nid_t pin)
15462 struct alc_spec *spec = codec->spec;
15469 if ((pin >= 0x0b && pin <= 0x10) || pin == 0x1f || pin == 0x20) {
15470 nid = alc861_look_for_dac(codec, pin);
15472 err = alc861_create_out_sw(codec, "Headphone", nid, 3);
15475 spec->multiout.hp_nid = nid;
15481 /* create playback/capture controls for input pins */
15482 static int alc861_auto_create_input_ctls(struct hda_codec *codec,
15483 const struct auto_pin_cfg *cfg)
15485 return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x08, 0);
15488 static void alc861_auto_set_output_and_unmute(struct hda_codec *codec,
15490 int pin_type, hda_nid_t dac)
15492 hda_nid_t mix, srcs[5];
15495 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
15497 snd_hda_codec_write(codec, dac, 0, AC_VERB_SET_AMP_GAIN_MUTE,
15499 if (snd_hda_get_connections(codec, nid, &mix, 1) != 1)
15501 num = snd_hda_get_connections(codec, mix, srcs, ARRAY_SIZE(srcs));
15504 for (i = 0; i < num; i++) {
15506 if (srcs[i] == dac || srcs[i] == 0x15)
15507 mute = AMP_IN_UNMUTE(i);
15509 mute = AMP_IN_MUTE(i);
15510 snd_hda_codec_write(codec, mix, 0, AC_VERB_SET_AMP_GAIN_MUTE,
15515 static void alc861_auto_init_multi_out(struct hda_codec *codec)
15517 struct alc_spec *spec = codec->spec;
15520 for (i = 0; i < spec->autocfg.line_outs; i++) {
15521 hda_nid_t nid = spec->autocfg.line_out_pins[i];
15522 int pin_type = get_pin_type(spec->autocfg.line_out_type);
15524 alc861_auto_set_output_and_unmute(codec, nid, pin_type,
15525 spec->multiout.dac_nids[i]);
15529 static void alc861_auto_init_hp_out(struct hda_codec *codec)
15531 struct alc_spec *spec = codec->spec;
15533 if (spec->autocfg.hp_outs)
15534 alc861_auto_set_output_and_unmute(codec,
15535 spec->autocfg.hp_pins[0],
15537 spec->multiout.hp_nid);
15538 if (spec->autocfg.speaker_outs)
15539 alc861_auto_set_output_and_unmute(codec,
15540 spec->autocfg.speaker_pins[0],
15542 spec->multiout.dac_nids[0]);
15545 static void alc861_auto_init_analog_input(struct hda_codec *codec)
15547 struct alc_spec *spec = codec->spec;
15550 for (i = 0; i < AUTO_PIN_LAST; i++) {
15551 hda_nid_t nid = spec->autocfg.input_pins[i];
15552 if (nid >= 0x0c && nid <= 0x11)
15553 alc_set_input_pin(codec, nid, i);
15557 /* parse the BIOS configuration and set up the alc_spec */
15558 /* return 1 if successful, 0 if the proper config is not found,
15559 * or a negative error code
15561 static int alc861_parse_auto_config(struct hda_codec *codec)
15563 struct alc_spec *spec = codec->spec;
15565 static hda_nid_t alc861_ignore[] = { 0x1d, 0 };
15567 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
15571 if (!spec->autocfg.line_outs)
15572 return 0; /* can't find valid BIOS pin config */
15574 err = alc861_auto_fill_dac_nids(codec, &spec->autocfg);
15577 err = alc861_auto_create_multi_out_ctls(codec, &spec->autocfg);
15580 err = alc861_auto_create_hp_ctls(codec, spec->autocfg.hp_pins[0]);
15583 err = alc861_auto_create_input_ctls(codec, &spec->autocfg);
15587 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
15589 alc_auto_parse_digital(codec);
15591 if (spec->kctls.list)
15592 add_mixer(spec, spec->kctls.list);
15594 add_verb(spec, alc861_auto_init_verbs);
15596 spec->num_mux_defs = 1;
15597 spec->input_mux = &spec->private_imux[0];
15599 spec->adc_nids = alc861_adc_nids;
15600 spec->num_adc_nids = ARRAY_SIZE(alc861_adc_nids);
15601 set_capture_mixer(codec);
15603 alc_ssid_check(codec, 0x0e, 0x0f, 0x0b, 0);
15608 /* additional initialization for auto-configuration model */
15609 static void alc861_auto_init(struct hda_codec *codec)
15611 struct alc_spec *spec = codec->spec;
15612 alc861_auto_init_multi_out(codec);
15613 alc861_auto_init_hp_out(codec);
15614 alc861_auto_init_analog_input(codec);
15615 alc_auto_init_digital(codec);
15616 if (spec->unsol_event)
15617 alc_inithook(codec);
15620 #ifdef CONFIG_SND_HDA_POWER_SAVE
15621 static struct hda_amp_list alc861_loopbacks[] = {
15622 { 0x15, HDA_INPUT, 0 },
15623 { 0x15, HDA_INPUT, 1 },
15624 { 0x15, HDA_INPUT, 2 },
15625 { 0x15, HDA_INPUT, 3 },
15632 * configuration and preset
15634 static const char *alc861_models[ALC861_MODEL_LAST] = {
15635 [ALC861_3ST] = "3stack",
15636 [ALC660_3ST] = "3stack-660",
15637 [ALC861_3ST_DIG] = "3stack-dig",
15638 [ALC861_6ST_DIG] = "6stack-dig",
15639 [ALC861_UNIWILL_M31] = "uniwill-m31",
15640 [ALC861_TOSHIBA] = "toshiba",
15641 [ALC861_ASUS] = "asus",
15642 [ALC861_ASUS_LAPTOP] = "asus-laptop",
15643 [ALC861_AUTO] = "auto",
15646 static struct snd_pci_quirk alc861_cfg_tbl[] = {
15647 SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC861_3ST),
15648 SND_PCI_QUIRK(0x1043, 0x1335, "ASUS F2/3", ALC861_ASUS_LAPTOP),
15649 SND_PCI_QUIRK(0x1043, 0x1338, "ASUS F2/3", ALC861_ASUS_LAPTOP),
15650 SND_PCI_QUIRK(0x1043, 0x1393, "ASUS", ALC861_ASUS),
15651 SND_PCI_QUIRK(0x1043, 0x13d7, "ASUS A9rp", ALC861_ASUS_LAPTOP),
15652 SND_PCI_QUIRK(0x1043, 0x81cb, "ASUS P1-AH2", ALC861_3ST_DIG),
15653 SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba", ALC861_TOSHIBA),
15654 /* FIXME: the entry below breaks Toshiba A100 (model=auto works!)
15655 * Any other models that need this preset?
15657 /* SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba", ALC861_TOSHIBA), */
15658 SND_PCI_QUIRK(0x1462, 0x7254, "HP dx2200 (MSI MS-7254)", ALC861_3ST),
15659 SND_PCI_QUIRK(0x1462, 0x7297, "HP dx2250 (MSI MS-7297)", ALC861_3ST),
15660 SND_PCI_QUIRK(0x1584, 0x2b01, "Uniwill X40AIx", ALC861_UNIWILL_M31),
15661 SND_PCI_QUIRK(0x1584, 0x9072, "Uniwill m31", ALC861_UNIWILL_M31),
15662 SND_PCI_QUIRK(0x1584, 0x9075, "Airis Praxis N1212", ALC861_ASUS_LAPTOP),
15663 /* FIXME: the below seems conflict */
15664 /* SND_PCI_QUIRK(0x1584, 0x9075, "Uniwill", ALC861_UNIWILL_M31), */
15665 SND_PCI_QUIRK(0x1849, 0x0660, "Asrock 939SLI32", ALC660_3ST),
15666 SND_PCI_QUIRK(0x8086, 0xd600, "Intel", ALC861_3ST),
15670 static struct alc_config_preset alc861_presets[] = {
15672 .mixers = { alc861_3ST_mixer },
15673 .init_verbs = { alc861_threestack_init_verbs },
15674 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15675 .dac_nids = alc861_dac_nids,
15676 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15677 .channel_mode = alc861_threestack_modes,
15679 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15680 .adc_nids = alc861_adc_nids,
15681 .input_mux = &alc861_capture_source,
15683 [ALC861_3ST_DIG] = {
15684 .mixers = { alc861_base_mixer },
15685 .init_verbs = { alc861_threestack_init_verbs },
15686 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15687 .dac_nids = alc861_dac_nids,
15688 .dig_out_nid = ALC861_DIGOUT_NID,
15689 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15690 .channel_mode = alc861_threestack_modes,
15692 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15693 .adc_nids = alc861_adc_nids,
15694 .input_mux = &alc861_capture_source,
15696 [ALC861_6ST_DIG] = {
15697 .mixers = { alc861_base_mixer },
15698 .init_verbs = { alc861_base_init_verbs },
15699 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15700 .dac_nids = alc861_dac_nids,
15701 .dig_out_nid = ALC861_DIGOUT_NID,
15702 .num_channel_mode = ARRAY_SIZE(alc861_8ch_modes),
15703 .channel_mode = alc861_8ch_modes,
15704 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15705 .adc_nids = alc861_adc_nids,
15706 .input_mux = &alc861_capture_source,
15709 .mixers = { alc861_3ST_mixer },
15710 .init_verbs = { alc861_threestack_init_verbs },
15711 .num_dacs = ARRAY_SIZE(alc660_dac_nids),
15712 .dac_nids = alc660_dac_nids,
15713 .num_channel_mode = ARRAY_SIZE(alc861_threestack_modes),
15714 .channel_mode = alc861_threestack_modes,
15716 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15717 .adc_nids = alc861_adc_nids,
15718 .input_mux = &alc861_capture_source,
15720 [ALC861_UNIWILL_M31] = {
15721 .mixers = { alc861_uniwill_m31_mixer },
15722 .init_verbs = { alc861_uniwill_m31_init_verbs },
15723 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15724 .dac_nids = alc861_dac_nids,
15725 .dig_out_nid = ALC861_DIGOUT_NID,
15726 .num_channel_mode = ARRAY_SIZE(alc861_uniwill_m31_modes),
15727 .channel_mode = alc861_uniwill_m31_modes,
15729 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15730 .adc_nids = alc861_adc_nids,
15731 .input_mux = &alc861_capture_source,
15733 [ALC861_TOSHIBA] = {
15734 .mixers = { alc861_toshiba_mixer },
15735 .init_verbs = { alc861_base_init_verbs,
15736 alc861_toshiba_init_verbs },
15737 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15738 .dac_nids = alc861_dac_nids,
15739 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
15740 .channel_mode = alc883_3ST_2ch_modes,
15741 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15742 .adc_nids = alc861_adc_nids,
15743 .input_mux = &alc861_capture_source,
15744 .unsol_event = alc861_toshiba_unsol_event,
15745 .init_hook = alc861_toshiba_automute,
15748 .mixers = { alc861_asus_mixer },
15749 .init_verbs = { alc861_asus_init_verbs },
15750 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15751 .dac_nids = alc861_dac_nids,
15752 .dig_out_nid = ALC861_DIGOUT_NID,
15753 .num_channel_mode = ARRAY_SIZE(alc861_asus_modes),
15754 .channel_mode = alc861_asus_modes,
15757 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15758 .adc_nids = alc861_adc_nids,
15759 .input_mux = &alc861_capture_source,
15761 [ALC861_ASUS_LAPTOP] = {
15762 .mixers = { alc861_toshiba_mixer, alc861_asus_laptop_mixer },
15763 .init_verbs = { alc861_asus_init_verbs,
15764 alc861_asus_laptop_init_verbs },
15765 .num_dacs = ARRAY_SIZE(alc861_dac_nids),
15766 .dac_nids = alc861_dac_nids,
15767 .dig_out_nid = ALC861_DIGOUT_NID,
15768 .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes),
15769 .channel_mode = alc883_3ST_2ch_modes,
15771 .num_adc_nids = ARRAY_SIZE(alc861_adc_nids),
15772 .adc_nids = alc861_adc_nids,
15773 .input_mux = &alc861_capture_source,
15777 /* Pin config fixes */
15779 PINFIX_FSC_AMILO_PI1505,
15782 static struct alc_pincfg alc861_fsc_amilo_pi1505_pinfix[] = {
15783 { 0x0b, 0x0221101f }, /* HP */
15784 { 0x0f, 0x90170310 }, /* speaker */
15788 static const struct alc_fixup alc861_fixups[] = {
15789 [PINFIX_FSC_AMILO_PI1505] = {
15790 .pins = alc861_fsc_amilo_pi1505_pinfix
15794 static struct snd_pci_quirk alc861_fixup_tbl[] = {
15795 SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", PINFIX_FSC_AMILO_PI1505),
15799 static int patch_alc861(struct hda_codec *codec)
15801 struct alc_spec *spec;
15805 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
15809 codec->spec = spec;
15811 board_config = snd_hda_check_board_config(codec, ALC861_MODEL_LAST,
15815 if (board_config < 0) {
15816 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
15818 board_config = ALC861_AUTO;
15821 if (board_config == ALC861_AUTO)
15822 alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 1);
15824 if (board_config == ALC861_AUTO) {
15825 /* automatic parse from the BIOS config */
15826 err = alc861_parse_auto_config(codec);
15832 "hda_codec: Cannot set up configuration "
15833 "from BIOS. Using base mode...\n");
15834 board_config = ALC861_3ST_DIG;
15838 err = snd_hda_attach_beep_device(codec, 0x23);
15844 if (board_config != ALC861_AUTO)
15845 setup_preset(codec, &alc861_presets[board_config]);
15847 spec->stream_analog_playback = &alc861_pcm_analog_playback;
15848 spec->stream_analog_capture = &alc861_pcm_analog_capture;
15850 spec->stream_digital_playback = &alc861_pcm_digital_playback;
15851 spec->stream_digital_capture = &alc861_pcm_digital_capture;
15853 if (!spec->cap_mixer)
15854 set_capture_mixer(codec);
15855 set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
15857 spec->vmaster_nid = 0x03;
15859 if (board_config == ALC861_AUTO)
15860 alc_pick_fixup(codec, alc861_fixup_tbl, alc861_fixups, 0);
15862 codec->patch_ops = alc_patch_ops;
15863 if (board_config == ALC861_AUTO) {
15864 spec->init_hook = alc861_auto_init;
15865 #ifdef CONFIG_SND_HDA_POWER_SAVE
15866 spec->power_hook = alc_power_eapd;
15869 #ifdef CONFIG_SND_HDA_POWER_SAVE
15870 if (!spec->loopback.amplist)
15871 spec->loopback.amplist = alc861_loopbacks;
15878 * ALC861-VD support
15882 * In addition, an independent DAC
15884 #define ALC861VD_DIGOUT_NID 0x06
15886 static hda_nid_t alc861vd_dac_nids[4] = {
15887 /* front, surr, clfe, side surr */
15888 0x02, 0x03, 0x04, 0x05
15891 /* dac_nids for ALC660vd are in a different order - according to
15892 * Realtek's driver.
15893 * This should probably result in a different mixer for 6stack models
15894 * of ALC660vd codecs, but for now there is only 3stack mixer
15895 * - and it is the same as in 861vd.
15896 * adc_nids in ALC660vd are (is) the same as in 861vd
15898 static hda_nid_t alc660vd_dac_nids[3] = {
15899 /* front, rear, clfe, rear_surr */
15903 static hda_nid_t alc861vd_adc_nids[1] = {
15908 static hda_nid_t alc861vd_capsrc_nids[1] = { 0x22 };
15911 /* FIXME: should be a matrix-type input source selection */
15912 static struct hda_input_mux alc861vd_capture_source = {
15916 { "Front Mic", 0x1 },
15922 static struct hda_input_mux alc861vd_dallas_capture_source = {
15925 { "Ext Mic", 0x0 },
15926 { "Int Mic", 0x1 },
15930 static struct hda_input_mux alc861vd_hp_capture_source = {
15933 { "Front Mic", 0x0 },
15934 { "ATAPI Mic", 0x1 },
15941 static struct hda_channel_mode alc861vd_3stack_2ch_modes[1] = {
15948 static struct hda_verb alc861vd_6stack_ch6_init[] = {
15949 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
15950 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15951 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15952 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15959 static struct hda_verb alc861vd_6stack_ch8_init[] = {
15960 { 0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15961 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15962 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15963 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
15967 static struct hda_channel_mode alc861vd_6stack_modes[2] = {
15968 { 6, alc861vd_6stack_ch6_init },
15969 { 8, alc861vd_6stack_ch8_init },
15972 static struct snd_kcontrol_new alc861vd_chmode_mixer[] = {
15974 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
15975 .name = "Channel Mode",
15976 .info = alc_ch_mode_info,
15977 .get = alc_ch_mode_get,
15978 .put = alc_ch_mode_put,
15983 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
15984 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
15986 static struct snd_kcontrol_new alc861vd_6st_mixer[] = {
15987 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
15988 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
15990 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
15991 HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
15993 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0,
15995 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0,
15997 HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
15998 HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
16000 HDA_CODEC_VOLUME("Side Playback Volume", 0x05, 0x0, HDA_OUTPUT),
16001 HDA_BIND_MUTE("Side Playback Switch", 0x0f, 2, HDA_INPUT),
16003 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16005 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
16006 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16007 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16009 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
16010 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16011 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16013 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16014 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16016 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16017 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16022 static struct snd_kcontrol_new alc861vd_3st_mixer[] = {
16023 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16024 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
16026 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16028 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
16029 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16030 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16032 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
16033 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16034 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16036 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
16037 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
16039 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16040 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16045 static struct snd_kcontrol_new alc861vd_lenovo_mixer[] = {
16046 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16047 /*HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),*/
16048 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
16050 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
16052 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
16053 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16054 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16056 HDA_CODEC_VOLUME("Front Mic Boost", 0x19, 0, HDA_INPUT),
16057 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16058 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16060 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
16061 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
16066 /* Pin assignment: Speaker=0x14, HP = 0x15,
16067 * Ext Mic=0x18, Int Mic = 0x19, CD = 0x1c, PC Beep = 0x1d
16069 static struct snd_kcontrol_new alc861vd_dallas_mixer[] = {
16070 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16071 HDA_BIND_MUTE("Speaker Playback Switch", 0x0c, 2, HDA_INPUT),
16072 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16073 HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
16074 HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
16075 HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16076 HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16077 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
16078 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16079 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16083 /* Pin assignment: Speaker=0x14, Line-out = 0x15,
16084 * Front Mic=0x18, ATAPI Mic = 0x19,
16086 static struct snd_kcontrol_new alc861vd_hp_mixer[] = {
16087 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
16088 HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
16089 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
16090 HDA_BIND_MUTE("Headphone Playback Switch", 0x0d, 2, HDA_INPUT),
16091 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
16092 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
16093 HDA_CODEC_VOLUME("ATAPI Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
16094 HDA_CODEC_MUTE("ATAPI Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
16100 * generic initialization of ADC, input mixers and output mixers
16102 static struct hda_verb alc861vd_volume_init_verbs[] = {
16104 * Unmute ADC0 and set the default input to mic-in
16106 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
16107 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16109 /* Unmute input amps (CD, Line In, Mic 1 & Mic 2) of
16110 * the analog-loopback mixer widget
16112 /* Amp Indices: Mic1 = 0, Mic2 = 1, Line1 = 2, Line2 = 3, CD = 4 */
16113 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16114 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16115 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
16116 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
16117 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
16119 /* Capture mixer: unmute Mic, F-Mic, Line, CD inputs */
16120 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16121 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16122 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
16123 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},
16126 * Set up output mixers (0x02 - 0x05)
16128 /* set vol=0 to output mixers */
16129 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16130 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16131 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16132 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16134 /* set up input amps for analog loopback */
16135 /* Amp Indices: DAC = 0, mixer = 1 */
16136 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16137 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16138 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16139 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16140 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16141 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16142 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16143 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16149 * 3-stack pin configuration:
16150 * front = 0x14, mic/clfe = 0x18, HP = 0x19, line/surr = 0x1a, f-mic = 0x1b
16152 static struct hda_verb alc861vd_3stack_init_verbs[] = {
16154 * Set pin mode and muting
16156 /* set front pin widgets 0x14 for output */
16157 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16158 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16159 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
16161 /* Mic (rear) pin: input vref at 80% */
16162 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16163 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16164 /* Front Mic pin: input vref at 80% */
16165 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16166 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16167 /* Line In pin: input */
16168 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16169 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16170 /* Line-2 In: Headphone output (output 0 - 0x0c) */
16171 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16172 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16173 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
16174 /* CD pin widget for input */
16175 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16181 * 6-stack pin configuration:
16183 static struct hda_verb alc861vd_6stack_init_verbs[] = {
16185 * Set pin mode and muting
16187 /* set front pin widgets 0x14 for output */
16188 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16189 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16190 {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
16192 /* Rear Pin: output 1 (0x0d) */
16193 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16194 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16195 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
16196 /* CLFE Pin: output 2 (0x0e) */
16197 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16198 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16199 {0x16, AC_VERB_SET_CONNECT_SEL, 0x02},
16200 /* Side Pin: output 3 (0x0f) */
16201 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16202 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16203 {0x17, AC_VERB_SET_CONNECT_SEL, 0x03},
16205 /* Mic (rear) pin: input vref at 80% */
16206 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16207 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16208 /* Front Mic pin: input vref at 80% */
16209 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
16210 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16211 /* Line In pin: input */
16212 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16213 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16214 /* Line-2 In: Headphone output (output 0 - 0x0c) */
16215 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
16216 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16217 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
16218 /* CD pin widget for input */
16219 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16224 static struct hda_verb alc861vd_eapd_verbs[] = {
16225 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
16229 static struct hda_verb alc660vd_eapd_verbs[] = {
16230 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
16231 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
16235 static struct hda_verb alc861vd_lenovo_unsol_verbs[] = {
16236 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16237 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16238 {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(5)},
16239 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16240 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
16244 static void alc861vd_lenovo_mic_automute(struct hda_codec *codec)
16246 unsigned int present;
16247 unsigned char bits;
16249 present = snd_hda_jack_detect(codec, 0x18);
16250 bits = present ? HDA_AMP_MUTE : 0;
16252 snd_hda_codec_amp_stereo(codec, 0x0b, HDA_INPUT, 1,
16253 HDA_AMP_MUTE, bits);
16256 static void alc861vd_lenovo_setup(struct hda_codec *codec)
16258 struct alc_spec *spec = codec->spec;
16259 spec->autocfg.hp_pins[0] = 0x1b;
16260 spec->autocfg.speaker_pins[0] = 0x14;
16263 static void alc861vd_lenovo_init_hook(struct hda_codec *codec)
16265 alc_automute_amp(codec);
16266 alc861vd_lenovo_mic_automute(codec);
16269 static void alc861vd_lenovo_unsol_event(struct hda_codec *codec,
16272 switch (res >> 26) {
16273 case ALC880_MIC_EVENT:
16274 alc861vd_lenovo_mic_automute(codec);
16277 alc_automute_amp_unsol_event(codec, res);
16282 static struct hda_verb alc861vd_dallas_verbs[] = {
16283 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16284 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16285 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16286 {0x05, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
16288 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16289 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
16290 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16291 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16292 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16293 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16294 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16295 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
16297 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16298 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16299 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16300 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16301 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16302 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16303 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
16304 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
16306 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
16307 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16308 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF50},
16309 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
16310 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16311 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16312 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16313 {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
16315 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
16316 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(3)},
16317 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(2)},
16318 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
16320 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
16321 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
16322 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
16327 /* toggle speaker-output according to the hp-jack state */
16328 static void alc861vd_dallas_setup(struct hda_codec *codec)
16330 struct alc_spec *spec = codec->spec;
16332 spec->autocfg.hp_pins[0] = 0x15;
16333 spec->autocfg.speaker_pins[0] = 0x14;
16336 #ifdef CONFIG_SND_HDA_POWER_SAVE
16337 #define alc861vd_loopbacks alc880_loopbacks
16340 /* pcm configuration: identical with ALC880 */
16341 #define alc861vd_pcm_analog_playback alc880_pcm_analog_playback
16342 #define alc861vd_pcm_analog_capture alc880_pcm_analog_capture
16343 #define alc861vd_pcm_digital_playback alc880_pcm_digital_playback
16344 #define alc861vd_pcm_digital_capture alc880_pcm_digital_capture
16347 * configuration and preset
16349 static const char *alc861vd_models[ALC861VD_MODEL_LAST] = {
16350 [ALC660VD_3ST] = "3stack-660",
16351 [ALC660VD_3ST_DIG] = "3stack-660-digout",
16352 [ALC660VD_ASUS_V1S] = "asus-v1s",
16353 [ALC861VD_3ST] = "3stack",
16354 [ALC861VD_3ST_DIG] = "3stack-digout",
16355 [ALC861VD_6ST_DIG] = "6stack-digout",
16356 [ALC861VD_LENOVO] = "lenovo",
16357 [ALC861VD_DALLAS] = "dallas",
16358 [ALC861VD_HP] = "hp",
16359 [ALC861VD_AUTO] = "auto",
16362 static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
16363 SND_PCI_QUIRK(0x1019, 0xa88d, "Realtek ALC660 demo", ALC660VD_3ST),
16364 SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_HP),
16365 SND_PCI_QUIRK(0x1043, 0x12e2, "Asus z35m", ALC660VD_3ST),
16366 /*SND_PCI_QUIRK(0x1043, 0x1339, "Asus G1", ALC660VD_3ST),*/ /* auto */
16367 SND_PCI_QUIRK(0x1043, 0x1633, "Asus V1Sn", ALC660VD_ASUS_V1S),
16368 SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS", ALC660VD_3ST_DIG),
16369 SND_PCI_QUIRK(0x10de, 0x03f0, "Realtek ALC660 demo", ALC660VD_3ST),
16370 SND_PCI_QUIRK(0x1179, 0xff00, "Toshiba A135", ALC861VD_LENOVO),
16371 /*SND_PCI_QUIRK(0x1179, 0xff00, "DALLAS", ALC861VD_DALLAS),*/ /*lenovo*/
16372 SND_PCI_QUIRK(0x1179, 0xff01, "Toshiba A135", ALC861VD_LENOVO),
16373 SND_PCI_QUIRK(0x1179, 0xff03, "Toshiba P205", ALC861VD_LENOVO),
16374 SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_DALLAS),
16375 SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG),
16376 SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo", ALC861VD_LENOVO),
16377 SND_PCI_QUIRK(0x1849, 0x0862, "ASRock K8NF6G-VSTA", ALC861VD_6ST_DIG),
16381 static struct alc_config_preset alc861vd_presets[] = {
16383 .mixers = { alc861vd_3st_mixer },
16384 .init_verbs = { alc861vd_volume_init_verbs,
16385 alc861vd_3stack_init_verbs },
16386 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16387 .dac_nids = alc660vd_dac_nids,
16388 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16389 .channel_mode = alc861vd_3stack_2ch_modes,
16390 .input_mux = &alc861vd_capture_source,
16392 [ALC660VD_3ST_DIG] = {
16393 .mixers = { alc861vd_3st_mixer },
16394 .init_verbs = { alc861vd_volume_init_verbs,
16395 alc861vd_3stack_init_verbs },
16396 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16397 .dac_nids = alc660vd_dac_nids,
16398 .dig_out_nid = ALC861VD_DIGOUT_NID,
16399 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16400 .channel_mode = alc861vd_3stack_2ch_modes,
16401 .input_mux = &alc861vd_capture_source,
16404 .mixers = { alc861vd_3st_mixer },
16405 .init_verbs = { alc861vd_volume_init_verbs,
16406 alc861vd_3stack_init_verbs },
16407 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16408 .dac_nids = alc861vd_dac_nids,
16409 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16410 .channel_mode = alc861vd_3stack_2ch_modes,
16411 .input_mux = &alc861vd_capture_source,
16413 [ALC861VD_3ST_DIG] = {
16414 .mixers = { alc861vd_3st_mixer },
16415 .init_verbs = { alc861vd_volume_init_verbs,
16416 alc861vd_3stack_init_verbs },
16417 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16418 .dac_nids = alc861vd_dac_nids,
16419 .dig_out_nid = ALC861VD_DIGOUT_NID,
16420 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16421 .channel_mode = alc861vd_3stack_2ch_modes,
16422 .input_mux = &alc861vd_capture_source,
16424 [ALC861VD_6ST_DIG] = {
16425 .mixers = { alc861vd_6st_mixer, alc861vd_chmode_mixer },
16426 .init_verbs = { alc861vd_volume_init_verbs,
16427 alc861vd_6stack_init_verbs },
16428 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16429 .dac_nids = alc861vd_dac_nids,
16430 .dig_out_nid = ALC861VD_DIGOUT_NID,
16431 .num_channel_mode = ARRAY_SIZE(alc861vd_6stack_modes),
16432 .channel_mode = alc861vd_6stack_modes,
16433 .input_mux = &alc861vd_capture_source,
16435 [ALC861VD_LENOVO] = {
16436 .mixers = { alc861vd_lenovo_mixer },
16437 .init_verbs = { alc861vd_volume_init_verbs,
16438 alc861vd_3stack_init_verbs,
16439 alc861vd_eapd_verbs,
16440 alc861vd_lenovo_unsol_verbs },
16441 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16442 .dac_nids = alc660vd_dac_nids,
16443 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16444 .channel_mode = alc861vd_3stack_2ch_modes,
16445 .input_mux = &alc861vd_capture_source,
16446 .unsol_event = alc861vd_lenovo_unsol_event,
16447 .setup = alc861vd_lenovo_setup,
16448 .init_hook = alc861vd_lenovo_init_hook,
16450 [ALC861VD_DALLAS] = {
16451 .mixers = { alc861vd_dallas_mixer },
16452 .init_verbs = { alc861vd_dallas_verbs },
16453 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16454 .dac_nids = alc861vd_dac_nids,
16455 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16456 .channel_mode = alc861vd_3stack_2ch_modes,
16457 .input_mux = &alc861vd_dallas_capture_source,
16458 .unsol_event = alc_automute_amp_unsol_event,
16459 .setup = alc861vd_dallas_setup,
16460 .init_hook = alc_automute_amp,
16463 .mixers = { alc861vd_hp_mixer },
16464 .init_verbs = { alc861vd_dallas_verbs, alc861vd_eapd_verbs },
16465 .num_dacs = ARRAY_SIZE(alc861vd_dac_nids),
16466 .dac_nids = alc861vd_dac_nids,
16467 .dig_out_nid = ALC861VD_DIGOUT_NID,
16468 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16469 .channel_mode = alc861vd_3stack_2ch_modes,
16470 .input_mux = &alc861vd_hp_capture_source,
16471 .unsol_event = alc_automute_amp_unsol_event,
16472 .setup = alc861vd_dallas_setup,
16473 .init_hook = alc_automute_amp,
16475 [ALC660VD_ASUS_V1S] = {
16476 .mixers = { alc861vd_lenovo_mixer },
16477 .init_verbs = { alc861vd_volume_init_verbs,
16478 alc861vd_3stack_init_verbs,
16479 alc861vd_eapd_verbs,
16480 alc861vd_lenovo_unsol_verbs },
16481 .num_dacs = ARRAY_SIZE(alc660vd_dac_nids),
16482 .dac_nids = alc660vd_dac_nids,
16483 .dig_out_nid = ALC861VD_DIGOUT_NID,
16484 .num_channel_mode = ARRAY_SIZE(alc861vd_3stack_2ch_modes),
16485 .channel_mode = alc861vd_3stack_2ch_modes,
16486 .input_mux = &alc861vd_capture_source,
16487 .unsol_event = alc861vd_lenovo_unsol_event,
16488 .setup = alc861vd_lenovo_setup,
16489 .init_hook = alc861vd_lenovo_init_hook,
16494 * BIOS auto configuration
16496 static int alc861vd_auto_create_input_ctls(struct hda_codec *codec,
16497 const struct auto_pin_cfg *cfg)
16499 return alc_auto_create_input_ctls(codec, cfg, 0x15, 0x09, 0);
16503 static void alc861vd_auto_set_output_and_unmute(struct hda_codec *codec,
16504 hda_nid_t nid, int pin_type, int dac_idx)
16506 alc_set_pin_output(codec, nid, pin_type);
16509 static void alc861vd_auto_init_multi_out(struct hda_codec *codec)
16511 struct alc_spec *spec = codec->spec;
16514 for (i = 0; i <= HDA_SIDE; i++) {
16515 hda_nid_t nid = spec->autocfg.line_out_pins[i];
16516 int pin_type = get_pin_type(spec->autocfg.line_out_type);
16518 alc861vd_auto_set_output_and_unmute(codec, nid,
16524 static void alc861vd_auto_init_hp_out(struct hda_codec *codec)
16526 struct alc_spec *spec = codec->spec;
16529 pin = spec->autocfg.hp_pins[0];
16530 if (pin) /* connect to front and use dac 0 */
16531 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_HP, 0);
16532 pin = spec->autocfg.speaker_pins[0];
16534 alc861vd_auto_set_output_and_unmute(codec, pin, PIN_OUT, 0);
16537 #define ALC861VD_PIN_CD_NID ALC880_PIN_CD_NID
16539 static void alc861vd_auto_init_analog_input(struct hda_codec *codec)
16541 struct alc_spec *spec = codec->spec;
16544 for (i = 0; i < AUTO_PIN_LAST; i++) {
16545 hda_nid_t nid = spec->autocfg.input_pins[i];
16546 if (alc_is_input_pin(codec, nid)) {
16547 alc_set_input_pin(codec, nid, i);
16548 if (nid != ALC861VD_PIN_CD_NID &&
16549 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
16550 snd_hda_codec_write(codec, nid, 0,
16551 AC_VERB_SET_AMP_GAIN_MUTE,
16557 #define alc861vd_auto_init_input_src alc882_auto_init_input_src
16559 #define alc861vd_idx_to_mixer_vol(nid) ((nid) + 0x02)
16560 #define alc861vd_idx_to_mixer_switch(nid) ((nid) + 0x0c)
16562 /* add playback controls from the parsed DAC table */
16563 /* Based on ALC880 version. But ALC861VD has separate,
16564 * different NIDs for mute/unmute switch and volume control */
16565 static int alc861vd_auto_create_multi_out_ctls(struct alc_spec *spec,
16566 const struct auto_pin_cfg *cfg)
16568 static const char *chname[4] = {"Front", "Surround", "CLFE", "Side"};
16569 hda_nid_t nid_v, nid_s;
16572 for (i = 0; i < cfg->line_outs; i++) {
16573 if (!spec->multiout.dac_nids[i])
16575 nid_v = alc861vd_idx_to_mixer_vol(
16577 spec->multiout.dac_nids[i]));
16578 nid_s = alc861vd_idx_to_mixer_switch(
16580 spec->multiout.dac_nids[i]));
16584 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
16586 HDA_COMPOSE_AMP_VAL(nid_v, 1, 0,
16590 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL,
16592 HDA_COMPOSE_AMP_VAL(nid_v, 2, 0,
16596 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
16598 HDA_COMPOSE_AMP_VAL(nid_s, 1, 2,
16602 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE,
16604 HDA_COMPOSE_AMP_VAL(nid_s, 2, 2,
16610 if (cfg->line_outs == 1 &&
16611 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
16618 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
16619 HDA_COMPOSE_AMP_VAL(nid_v, 3, 0,
16623 if (cfg->line_outs == 1 &&
16624 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
16626 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
16627 HDA_COMPOSE_AMP_VAL(nid_s, 3, 2,
16636 /* add playback controls for speaker and HP outputs */
16637 /* Based on ALC880 version. But ALC861VD has separate,
16638 * different NIDs for mute/unmute switch and volume control */
16639 static int alc861vd_auto_create_extra_out(struct alc_spec *spec,
16640 hda_nid_t pin, const char *pfx)
16642 hda_nid_t nid_v, nid_s;
16648 if (alc880_is_fixed_pin(pin)) {
16649 nid_v = alc880_idx_to_dac(alc880_fixed_pin_idx(pin));
16650 /* specify the DAC as the extra output */
16651 if (!spec->multiout.hp_nid)
16652 spec->multiout.hp_nid = nid_v;
16654 spec->multiout.extra_out_nid[0] = nid_v;
16655 /* control HP volume/switch on the output mixer amp */
16656 nid_v = alc861vd_idx_to_mixer_vol(
16657 alc880_fixed_pin_idx(pin));
16658 nid_s = alc861vd_idx_to_mixer_switch(
16659 alc880_fixed_pin_idx(pin));
16661 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
16662 HDA_COMPOSE_AMP_VAL(nid_v, 3, 0, HDA_OUTPUT));
16665 err = add_pb_sw_ctrl(spec, ALC_CTL_BIND_MUTE, pfx,
16666 HDA_COMPOSE_AMP_VAL(nid_s, 3, 2, HDA_INPUT));
16669 } else if (alc880_is_multi_pin(pin)) {
16670 /* set manual connection */
16671 /* we have only a switch on HP-out PIN */
16672 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
16673 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
16680 /* parse the BIOS configuration and set up the alc_spec
16681 * return 1 if successful, 0 if the proper config is not found,
16682 * or a negative error code
16683 * Based on ALC880 version - had to change it to override
16684 * alc880_auto_create_extra_out and alc880_auto_create_multi_out_ctls */
16685 static int alc861vd_parse_auto_config(struct hda_codec *codec)
16687 struct alc_spec *spec = codec->spec;
16689 static hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
16691 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
16695 if (!spec->autocfg.line_outs)
16696 return 0; /* can't find valid BIOS pin config */
16698 err = alc880_auto_fill_dac_nids(spec, &spec->autocfg);
16701 err = alc861vd_auto_create_multi_out_ctls(spec, &spec->autocfg);
16704 err = alc861vd_auto_create_extra_out(spec,
16705 spec->autocfg.speaker_pins[0],
16709 err = alc861vd_auto_create_extra_out(spec,
16710 spec->autocfg.hp_pins[0],
16714 err = alc861vd_auto_create_input_ctls(codec, &spec->autocfg);
16718 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
16720 alc_auto_parse_digital(codec);
16722 if (spec->kctls.list)
16723 add_mixer(spec, spec->kctls.list);
16725 add_verb(spec, alc861vd_volume_init_verbs);
16727 spec->num_mux_defs = 1;
16728 spec->input_mux = &spec->private_imux[0];
16730 err = alc_auto_add_mic_boost(codec);
16734 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
16739 /* additional initialization for auto-configuration model */
16740 static void alc861vd_auto_init(struct hda_codec *codec)
16742 struct alc_spec *spec = codec->spec;
16743 alc861vd_auto_init_multi_out(codec);
16744 alc861vd_auto_init_hp_out(codec);
16745 alc861vd_auto_init_analog_input(codec);
16746 alc861vd_auto_init_input_src(codec);
16747 alc_auto_init_digital(codec);
16748 if (spec->unsol_event)
16749 alc_inithook(codec);
16753 ALC660VD_FIX_ASUS_GPIO1
16757 static const struct hda_verb alc660vd_fix_asus_gpio1_verbs[] = {
16758 {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
16759 {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
16760 {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
16764 static const struct alc_fixup alc861vd_fixups[] = {
16765 [ALC660VD_FIX_ASUS_GPIO1] = {
16766 .verbs = alc660vd_fix_asus_gpio1_verbs,
16770 static struct snd_pci_quirk alc861vd_fixup_tbl[] = {
16771 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
16775 static int patch_alc861vd(struct hda_codec *codec)
16777 struct alc_spec *spec;
16778 int err, board_config;
16780 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
16784 codec->spec = spec;
16786 board_config = snd_hda_check_board_config(codec, ALC861VD_MODEL_LAST,
16790 if (board_config < 0 || board_config >= ALC861VD_MODEL_LAST) {
16791 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
16793 board_config = ALC861VD_AUTO;
16796 if (board_config == ALC861VD_AUTO)
16797 alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 1);
16799 if (board_config == ALC861VD_AUTO) {
16800 /* automatic parse from the BIOS config */
16801 err = alc861vd_parse_auto_config(codec);
16807 "hda_codec: Cannot set up configuration "
16808 "from BIOS. Using base mode...\n");
16809 board_config = ALC861VD_3ST;
16813 err = snd_hda_attach_beep_device(codec, 0x23);
16819 if (board_config != ALC861VD_AUTO)
16820 setup_preset(codec, &alc861vd_presets[board_config]);
16822 if (codec->vendor_id == 0x10ec0660) {
16823 /* always turn on EAPD */
16824 add_verb(spec, alc660vd_eapd_verbs);
16827 spec->stream_analog_playback = &alc861vd_pcm_analog_playback;
16828 spec->stream_analog_capture = &alc861vd_pcm_analog_capture;
16830 spec->stream_digital_playback = &alc861vd_pcm_digital_playback;
16831 spec->stream_digital_capture = &alc861vd_pcm_digital_capture;
16833 if (!spec->adc_nids) {
16834 spec->adc_nids = alc861vd_adc_nids;
16835 spec->num_adc_nids = ARRAY_SIZE(alc861vd_adc_nids);
16837 if (!spec->capsrc_nids)
16838 spec->capsrc_nids = alc861vd_capsrc_nids;
16840 set_capture_mixer(codec);
16841 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
16843 spec->vmaster_nid = 0x02;
16845 if (board_config == ALC861VD_AUTO)
16846 alc_pick_fixup(codec, alc861vd_fixup_tbl, alc861vd_fixups, 0);
16848 codec->patch_ops = alc_patch_ops;
16850 if (board_config == ALC861VD_AUTO)
16851 spec->init_hook = alc861vd_auto_init;
16852 #ifdef CONFIG_SND_HDA_POWER_SAVE
16853 if (!spec->loopback.amplist)
16854 spec->loopback.amplist = alc861vd_loopbacks;
16863 * ALC662 is almost identical with ALC880 but has cleaner and more flexible
16864 * configuration. Each pin widget can choose any input DACs and a mixer.
16865 * Each ADC is connected from a mixer of all inputs. This makes possible
16866 * 6-channel independent captures.
16868 * In addition, an independent DAC for the multi-playback (not used in this
16871 #define ALC662_DIGOUT_NID 0x06
16872 #define ALC662_DIGIN_NID 0x0a
16874 static hda_nid_t alc662_dac_nids[4] = {
16875 /* front, rear, clfe, rear_surr */
16879 static hda_nid_t alc272_dac_nids[2] = {
16883 static hda_nid_t alc662_adc_nids[2] = {
16888 static hda_nid_t alc272_adc_nids[1] = {
16893 static hda_nid_t alc662_capsrc_nids[2] = { 0x22, 0x23 };
16894 static hda_nid_t alc272_capsrc_nids[1] = { 0x23 };
16898 /* FIXME: should be a matrix-type input source selection */
16899 static struct hda_input_mux alc662_capture_source = {
16903 { "Front Mic", 0x1 },
16909 static struct hda_input_mux alc662_lenovo_101e_capture_source = {
16917 static struct hda_input_mux alc663_capture_source = {
16921 { "Front Mic", 0x1 },
16926 #if 0 /* set to 1 for testing other input sources below */
16927 static struct hda_input_mux alc272_nc10_capture_source = {
16930 { "Autoselect Mic", 0x0 },
16931 { "Internal Mic", 0x1 },
16932 { "In-0x02", 0x2 },
16933 { "In-0x03", 0x3 },
16934 { "In-0x04", 0x4 },
16935 { "In-0x05", 0x5 },
16936 { "In-0x06", 0x6 },
16937 { "In-0x07", 0x7 },
16938 { "In-0x08", 0x8 },
16939 { "In-0x09", 0x9 },
16940 { "In-0x0a", 0x0a },
16941 { "In-0x0b", 0x0b },
16942 { "In-0x0c", 0x0c },
16943 { "In-0x0d", 0x0d },
16944 { "In-0x0e", 0x0e },
16945 { "In-0x0f", 0x0f },
16953 static struct hda_channel_mode alc662_3ST_2ch_modes[1] = {
16960 static struct hda_verb alc662_3ST_ch2_init[] = {
16961 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
16962 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
16963 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
16964 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
16971 static struct hda_verb alc662_3ST_ch6_init[] = {
16972 { 0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16973 { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
16974 { 0x18, AC_VERB_SET_CONNECT_SEL, 0x02 },
16975 { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16976 { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
16977 { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
16981 static struct hda_channel_mode alc662_3ST_6ch_modes[2] = {
16982 { 2, alc662_3ST_ch2_init },
16983 { 6, alc662_3ST_ch6_init },
16989 static struct hda_verb alc662_sixstack_ch6_init[] = {
16990 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16991 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x00 },
16992 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
16999 static struct hda_verb alc662_sixstack_ch8_init[] = {
17000 { 0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
17001 { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
17002 { 0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
17006 static struct hda_channel_mode alc662_5stack_modes[2] = {
17007 { 2, alc662_sixstack_ch6_init },
17008 { 6, alc662_sixstack_ch8_init },
17011 /* Pin assignment: Front=0x14, Rear=0x15, CLFE=0x16, Side=0x17
17012 * Mic=0x18, Front Mic=0x19, Line-In=0x1a, HP=0x1b
17015 static struct snd_kcontrol_new alc662_base_mixer[] = {
17016 /* output mixer control */
17017 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
17018 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
17019 HDA_CODEC_VOLUME("Surround Playback Volume", 0x3, 0x0, HDA_OUTPUT),
17020 HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
17021 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
17022 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
17023 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
17024 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
17025 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
17027 /*Input mixer control */
17028 HDA_CODEC_VOLUME("CD Playback Volume", 0xb, 0x4, HDA_INPUT),
17029 HDA_CODEC_MUTE("CD Playback Switch", 0xb, 0x4, HDA_INPUT),
17030 HDA_CODEC_VOLUME("Line Playback Volume", 0xb, 0x02, HDA_INPUT),
17031 HDA_CODEC_MUTE("Line Playback Switch", 0xb, 0x02, HDA_INPUT),
17032 HDA_CODEC_VOLUME("Mic Playback Volume", 0xb, 0x0, HDA_INPUT),
17033 HDA_CODEC_MUTE("Mic Playback Switch", 0xb, 0x0, HDA_INPUT),
17034 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0xb, 0x01, HDA_INPUT),
17035 HDA_CODEC_MUTE("Front Mic Playback Switch", 0xb, 0x01, HDA_INPUT),
17039 static struct snd_kcontrol_new alc662_3ST_2ch_mixer[] = {
17040 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17041 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
17042 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
17043 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
17044 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
17045 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
17046 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
17047 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17048 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17049 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17050 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17054 static struct snd_kcontrol_new alc662_3ST_6ch_mixer[] = {
17055 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17056 HDA_CODEC_MUTE("Front Playback Switch", 0x0c, 0x0, HDA_INPUT),
17057 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17058 HDA_CODEC_MUTE("Surround Playback Switch", 0x0d, 0x0, HDA_INPUT),
17059 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
17060 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
17061 HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x0e, 1, 0x0, HDA_INPUT),
17062 HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 0x0, HDA_INPUT),
17063 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
17064 HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
17065 HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
17066 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
17067 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
17068 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17069 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17070 HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17071 HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17075 static struct snd_kcontrol_new alc662_lenovo_101e_mixer[] = {
17076 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17077 HDA_BIND_MUTE("Front Playback Switch", 0x02, 2, HDA_INPUT),
17078 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17079 HDA_BIND_MUTE("Speaker Playback Switch", 0x03, 2, HDA_INPUT),
17080 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
17081 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
17082 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
17083 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17084 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17088 static struct snd_kcontrol_new alc662_eeepc_p701_mixer[] = {
17089 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17090 ALC262_HIPPO_MASTER_SWITCH,
17092 HDA_CODEC_VOLUME("e-Mic Boost", 0x18, 0, HDA_INPUT),
17093 HDA_CODEC_VOLUME("e-Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17094 HDA_CODEC_MUTE("e-Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17096 HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
17097 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17098 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17102 static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = {
17103 ALC262_HIPPO_MASTER_SWITCH,
17104 HDA_CODEC_VOLUME("Front Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17105 HDA_CODEC_VOLUME("Surround Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17106 HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x04, 1, 0x0, HDA_OUTPUT),
17107 HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x04, 2, 0x0, HDA_OUTPUT),
17108 HDA_BIND_MUTE("MuteCtrl Playback Switch", 0x0c, 2, HDA_INPUT),
17109 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
17110 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
17111 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17112 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17116 static struct hda_bind_ctls alc663_asus_bind_master_vol = {
17117 .ops = &snd_hda_bind_vol,
17119 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
17120 HDA_COMPOSE_AMP_VAL(0x03, 3, 0, HDA_OUTPUT),
17125 static struct hda_bind_ctls alc663_asus_one_bind_switch = {
17126 .ops = &snd_hda_bind_sw,
17128 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17129 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
17134 static struct snd_kcontrol_new alc663_m51va_mixer[] = {
17135 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
17136 HDA_BIND_SW("Master Playback Switch", &alc663_asus_one_bind_switch),
17137 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17138 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17142 static struct hda_bind_ctls alc663_asus_tree_bind_switch = {
17143 .ops = &snd_hda_bind_sw,
17145 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17146 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
17147 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
17152 static struct snd_kcontrol_new alc663_two_hp_m1_mixer[] = {
17153 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
17154 HDA_BIND_SW("Master Playback Switch", &alc663_asus_tree_bind_switch),
17155 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17156 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17157 HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17158 HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17163 static struct hda_bind_ctls alc663_asus_four_bind_switch = {
17164 .ops = &snd_hda_bind_sw,
17166 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17167 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
17168 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
17173 static struct snd_kcontrol_new alc663_two_hp_m2_mixer[] = {
17174 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
17175 HDA_BIND_SW("Master Playback Switch", &alc663_asus_four_bind_switch),
17176 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17177 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17178 HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17179 HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17183 static struct snd_kcontrol_new alc662_1bjd_mixer[] = {
17184 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17185 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17186 HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
17187 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17188 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17189 HDA_CODEC_VOLUME("F-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17190 HDA_CODEC_MUTE("F-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17194 static struct hda_bind_ctls alc663_asus_two_bind_master_vol = {
17195 .ops = &snd_hda_bind_vol,
17197 HDA_COMPOSE_AMP_VAL(0x02, 3, 0, HDA_OUTPUT),
17198 HDA_COMPOSE_AMP_VAL(0x04, 3, 0, HDA_OUTPUT),
17203 static struct hda_bind_ctls alc663_asus_two_bind_switch = {
17204 .ops = &snd_hda_bind_sw,
17206 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17207 HDA_COMPOSE_AMP_VAL(0x16, 3, 0, HDA_OUTPUT),
17212 static struct snd_kcontrol_new alc663_asus_21jd_clfe_mixer[] = {
17213 HDA_BIND_VOL("Master Playback Volume",
17214 &alc663_asus_two_bind_master_vol),
17215 HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
17216 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17217 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17218 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17219 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17223 static struct snd_kcontrol_new alc663_asus_15jd_clfe_mixer[] = {
17224 HDA_BIND_VOL("Master Playback Volume", &alc663_asus_bind_master_vol),
17225 HDA_BIND_SW("Master Playback Switch", &alc663_asus_two_bind_switch),
17226 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17227 HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
17228 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17229 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17233 static struct snd_kcontrol_new alc663_g71v_mixer[] = {
17234 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17235 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17236 HDA_CODEC_VOLUME("Front Playback Volume", 0x03, 0x0, HDA_OUTPUT),
17237 HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
17238 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17240 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17241 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17242 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17243 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17247 static struct snd_kcontrol_new alc663_g50v_mixer[] = {
17248 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
17249 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
17250 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17252 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17253 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17254 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17255 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17256 HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
17257 HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
17261 static struct hda_bind_ctls alc663_asus_mode7_8_all_bind_switch = {
17262 .ops = &snd_hda_bind_sw,
17264 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17265 HDA_COMPOSE_AMP_VAL(0x15, 3, 0, HDA_OUTPUT),
17266 HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
17267 HDA_COMPOSE_AMP_VAL(0x1b, 3, 0, HDA_OUTPUT),
17268 HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
17273 static struct hda_bind_ctls alc663_asus_mode7_8_sp_bind_switch = {
17274 .ops = &snd_hda_bind_sw,
17276 HDA_COMPOSE_AMP_VAL(0x14, 3, 0, HDA_OUTPUT),
17277 HDA_COMPOSE_AMP_VAL(0x17, 3, 0, HDA_OUTPUT),
17282 static struct snd_kcontrol_new alc663_mode7_mixer[] = {
17283 HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
17284 HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
17285 HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
17286 HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
17287 HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17288 HDA_CODEC_VOLUME("IntMic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17289 HDA_CODEC_MUTE("IntMic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17290 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
17291 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
17295 static struct snd_kcontrol_new alc663_mode8_mixer[] = {
17296 HDA_BIND_SW("Master Playback Switch", &alc663_asus_mode7_8_all_bind_switch),
17297 HDA_BIND_VOL("Speaker Playback Volume", &alc663_asus_bind_master_vol),
17298 HDA_BIND_SW("Speaker Playback Switch", &alc663_asus_mode7_8_sp_bind_switch),
17299 HDA_CODEC_MUTE("Headphone1 Playback Switch", 0x15, 0x0, HDA_OUTPUT),
17300 HDA_CODEC_MUTE("Headphone2 Playback Switch", 0x21, 0x0, HDA_OUTPUT),
17301 HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
17302 HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
17307 static struct snd_kcontrol_new alc662_chmode_mixer[] = {
17309 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
17310 .name = "Channel Mode",
17311 .info = alc_ch_mode_info,
17312 .get = alc_ch_mode_get,
17313 .put = alc_ch_mode_put,
17318 static struct hda_verb alc662_init_verbs[] = {
17319 /* ADC: mute amp left and right */
17320 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17321 {0x09, AC_VERB_SET_CONNECT_SEL, 0x00},
17323 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17324 {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17325 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17326 {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17327 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17328 {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17330 /* Front Pin: output 0 (0x0c) */
17331 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17332 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17334 /* Rear Pin: output 1 (0x0d) */
17335 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17336 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17338 /* CLFE Pin: output 2 (0x0e) */
17339 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17340 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17342 /* Mic (rear) pin: input vref at 80% */
17343 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
17344 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17345 /* Front Mic pin: input vref at 80% */
17346 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
17347 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17348 /* Line In pin: input */
17349 {0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17350 {0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17351 /* Line-2 In: Headphone output (output 0 - 0x0c) */
17352 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17353 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17354 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00},
17355 /* CD pin widget for input */
17356 {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17358 /* FIXME: use matrix-type input source selection */
17359 /* Mixer elements: 0x18, 19, 1a, 1b, 1c, 1d, 14, 15, 16, 17, 0b */
17361 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17362 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17364 /* always trun on EAPD */
17365 {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
17366 {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
17371 static struct hda_verb alc663_init_verbs[] = {
17372 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17373 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17374 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17375 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17376 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17377 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17381 static struct hda_verb alc272_init_verbs[] = {
17382 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17383 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
17384 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17385 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17386 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17387 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17388 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
17389 {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17393 static struct hda_verb alc662_sue_init_verbs[] = {
17394 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
17395 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
17399 static struct hda_verb alc662_eeepc_sue_init_verbs[] = {
17400 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17401 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17405 /* Set Unsolicited Event*/
17406 static struct hda_verb alc662_eeepc_ep20_sue_init_verbs[] = {
17407 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17408 {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17412 static struct hda_verb alc663_m51va_init_verbs[] = {
17413 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17414 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17415 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17416 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17417 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
17418 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17419 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17420 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17421 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17425 static struct hda_verb alc663_21jd_amic_init_verbs[] = {
17426 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17427 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17428 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
17429 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17430 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17431 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17432 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17436 static struct hda_verb alc662_1bjd_amic_init_verbs[] = {
17437 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17438 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17439 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17440 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
17441 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17442 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17443 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17444 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17448 static struct hda_verb alc663_15jd_amic_init_verbs[] = {
17449 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17450 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17451 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
17452 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17453 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17454 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17455 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17459 static struct hda_verb alc663_two_hp_amic_m1_init_verbs[] = {
17460 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17461 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17462 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17463 {0x21, AC_VERB_SET_CONNECT_SEL, 0x0}, /* Headphone */
17464 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17465 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17466 {0x15, AC_VERB_SET_CONNECT_SEL, 0x0}, /* Headphone */
17467 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17468 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17469 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17470 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17471 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17475 static struct hda_verb alc663_two_hp_amic_m2_init_verbs[] = {
17476 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17477 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17478 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17479 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
17480 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17481 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17482 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
17483 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17484 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
17485 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17486 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17487 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17491 static struct hda_verb alc663_g71v_init_verbs[] = {
17492 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17493 /* {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
17494 /* {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, */ /* Headphone */
17496 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17497 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17498 {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
17500 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
17501 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_MIC_EVENT},
17502 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
17506 static struct hda_verb alc663_g50v_init_verbs[] = {
17507 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17508 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17509 {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
17511 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17512 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17516 static struct hda_verb alc662_ecs_init_verbs[] = {
17517 {0x09, AC_VERB_SET_AMP_GAIN_MUTE, 0x701f},
17518 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17519 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17520 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17524 static struct hda_verb alc272_dell_zm1_init_verbs[] = {
17525 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17526 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17527 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17528 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17529 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17530 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17531 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
17532 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17533 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17534 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17535 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17539 static struct hda_verb alc272_dell_init_verbs[] = {
17540 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17541 {0x13, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17542 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17543 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17544 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17545 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17546 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
17547 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17548 {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17549 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17550 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17554 static struct hda_verb alc663_mode7_init_verbs[] = {
17555 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17556 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17557 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17558 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17559 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17560 {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17561 {0x1b, AC_VERB_SET_CONNECT_SEL, 0x01},
17562 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17563 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17564 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
17565 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17566 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17567 {0x19, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17568 {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17569 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17573 static struct hda_verb alc663_mode8_init_verbs[] = {
17574 {0x12, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17575 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17576 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17577 {0x15, AC_VERB_SET_CONNECT_SEL, 0x01},
17578 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17579 {0x17, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
17580 {0x17, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17581 {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
17582 {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
17583 {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
17584 {0x21, AC_VERB_SET_CONNECT_SEL, 0x01}, /* Headphone */
17585 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
17586 {0x22, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
17587 {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17588 {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
17589 {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
17593 static struct snd_kcontrol_new alc662_auto_capture_mixer[] = {
17594 HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
17595 HDA_CODEC_MUTE("Capture Switch", 0x09, 0x0, HDA_INPUT),
17599 static struct snd_kcontrol_new alc272_auto_capture_mixer[] = {
17600 HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
17601 HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
17605 static void alc662_lenovo_101e_ispeaker_automute(struct hda_codec *codec)
17607 unsigned int present;
17608 unsigned char bits;
17610 present = snd_hda_jack_detect(codec, 0x14);
17611 bits = present ? HDA_AMP_MUTE : 0;
17613 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17614 HDA_AMP_MUTE, bits);
17617 static void alc662_lenovo_101e_all_automute(struct hda_codec *codec)
17619 unsigned int present;
17620 unsigned char bits;
17622 present = snd_hda_jack_detect(codec, 0x1b);
17623 bits = present ? HDA_AMP_MUTE : 0;
17625 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
17626 HDA_AMP_MUTE, bits);
17627 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
17628 HDA_AMP_MUTE, bits);
17631 static void alc662_lenovo_101e_unsol_event(struct hda_codec *codec,
17634 if ((res >> 26) == ALC880_HP_EVENT)
17635 alc662_lenovo_101e_all_automute(codec);
17636 if ((res >> 26) == ALC880_FRONT_EVENT)
17637 alc662_lenovo_101e_ispeaker_automute(codec);
17640 /* unsolicited event for HP jack sensing */
17641 static void alc662_eeepc_unsol_event(struct hda_codec *codec,
17644 if ((res >> 26) == ALC880_MIC_EVENT)
17645 alc_mic_automute(codec);
17647 alc262_hippo_unsol_event(codec, res);
17650 static void alc662_eeepc_setup(struct hda_codec *codec)
17652 struct alc_spec *spec = codec->spec;
17654 alc262_hippo1_setup(codec);
17655 spec->ext_mic.pin = 0x18;
17656 spec->ext_mic.mux_idx = 0;
17657 spec->int_mic.pin = 0x19;
17658 spec->int_mic.mux_idx = 1;
17659 spec->auto_mic = 1;
17662 static void alc662_eeepc_inithook(struct hda_codec *codec)
17664 alc262_hippo_automute(codec);
17665 alc_mic_automute(codec);
17668 static void alc662_eeepc_ep20_setup(struct hda_codec *codec)
17670 struct alc_spec *spec = codec->spec;
17672 spec->autocfg.hp_pins[0] = 0x14;
17673 spec->autocfg.speaker_pins[0] = 0x1b;
17676 #define alc662_eeepc_ep20_inithook alc262_hippo_master_update
17678 static void alc663_m51va_speaker_automute(struct hda_codec *codec)
17680 unsigned int present;
17681 unsigned char bits;
17683 present = snd_hda_jack_detect(codec, 0x21);
17684 bits = present ? HDA_AMP_MUTE : 0;
17685 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17686 HDA_AMP_MUTE, bits);
17687 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17688 HDA_AMP_MUTE, bits);
17691 static void alc663_21jd_two_speaker_automute(struct hda_codec *codec)
17693 unsigned int present;
17694 unsigned char bits;
17696 present = snd_hda_jack_detect(codec, 0x21);
17697 bits = present ? HDA_AMP_MUTE : 0;
17698 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17699 HDA_AMP_MUTE, bits);
17700 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17701 HDA_AMP_MUTE, bits);
17702 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
17703 HDA_AMP_MUTE, bits);
17704 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
17705 HDA_AMP_MUTE, bits);
17708 static void alc663_15jd_two_speaker_automute(struct hda_codec *codec)
17710 unsigned int present;
17711 unsigned char bits;
17713 present = snd_hda_jack_detect(codec, 0x15);
17714 bits = present ? HDA_AMP_MUTE : 0;
17715 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17716 HDA_AMP_MUTE, bits);
17717 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17718 HDA_AMP_MUTE, bits);
17719 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 0,
17720 HDA_AMP_MUTE, bits);
17721 snd_hda_codec_amp_stereo(codec, 0x0e, HDA_INPUT, 1,
17722 HDA_AMP_MUTE, bits);
17725 static void alc662_f5z_speaker_automute(struct hda_codec *codec)
17727 unsigned int present;
17728 unsigned char bits;
17730 present = snd_hda_jack_detect(codec, 0x1b);
17731 bits = present ? 0 : PIN_OUT;
17732 snd_hda_codec_write(codec, 0x14, 0,
17733 AC_VERB_SET_PIN_WIDGET_CONTROL, bits);
17736 static void alc663_two_hp_m1_speaker_automute(struct hda_codec *codec)
17738 unsigned int present1, present2;
17740 present1 = snd_hda_jack_detect(codec, 0x21);
17741 present2 = snd_hda_jack_detect(codec, 0x15);
17743 if (present1 || present2) {
17744 snd_hda_codec_write_cache(codec, 0x14, 0,
17745 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17747 snd_hda_codec_write_cache(codec, 0x14, 0,
17748 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17752 static void alc663_two_hp_m2_speaker_automute(struct hda_codec *codec)
17754 unsigned int present1, present2;
17756 present1 = snd_hda_jack_detect(codec, 0x1b);
17757 present2 = snd_hda_jack_detect(codec, 0x15);
17759 if (present1 || present2) {
17760 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17761 HDA_AMP_MUTE, HDA_AMP_MUTE);
17762 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17763 HDA_AMP_MUTE, HDA_AMP_MUTE);
17765 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 0,
17767 snd_hda_codec_amp_stereo(codec, 0x0c, HDA_INPUT, 1,
17772 static void alc663_two_hp_m7_speaker_automute(struct hda_codec *codec)
17774 unsigned int present1, present2;
17776 present1 = snd_hda_codec_read(codec, 0x1b, 0,
17777 AC_VERB_GET_PIN_SENSE, 0)
17778 & AC_PINSENSE_PRESENCE;
17779 present2 = snd_hda_codec_read(codec, 0x21, 0,
17780 AC_VERB_GET_PIN_SENSE, 0)
17781 & AC_PINSENSE_PRESENCE;
17783 if (present1 || present2) {
17784 snd_hda_codec_write_cache(codec, 0x14, 0,
17785 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17786 snd_hda_codec_write_cache(codec, 0x17, 0,
17787 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17789 snd_hda_codec_write_cache(codec, 0x14, 0,
17790 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17791 snd_hda_codec_write_cache(codec, 0x17, 0,
17792 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17796 static void alc663_two_hp_m8_speaker_automute(struct hda_codec *codec)
17798 unsigned int present1, present2;
17800 present1 = snd_hda_codec_read(codec, 0x21, 0,
17801 AC_VERB_GET_PIN_SENSE, 0)
17802 & AC_PINSENSE_PRESENCE;
17803 present2 = snd_hda_codec_read(codec, 0x15, 0,
17804 AC_VERB_GET_PIN_SENSE, 0)
17805 & AC_PINSENSE_PRESENCE;
17807 if (present1 || present2) {
17808 snd_hda_codec_write_cache(codec, 0x14, 0,
17809 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17810 snd_hda_codec_write_cache(codec, 0x17, 0,
17811 AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
17813 snd_hda_codec_write_cache(codec, 0x14, 0,
17814 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17815 snd_hda_codec_write_cache(codec, 0x17, 0,
17816 AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
17820 static void alc663_m51va_unsol_event(struct hda_codec *codec,
17823 switch (res >> 26) {
17824 case ALC880_HP_EVENT:
17825 alc663_m51va_speaker_automute(codec);
17827 case ALC880_MIC_EVENT:
17828 alc_mic_automute(codec);
17833 static void alc663_m51va_setup(struct hda_codec *codec)
17835 struct alc_spec *spec = codec->spec;
17836 spec->ext_mic.pin = 0x18;
17837 spec->ext_mic.mux_idx = 0;
17838 spec->int_mic.pin = 0x12;
17839 spec->int_mic.mux_idx = 9;
17840 spec->auto_mic = 1;
17843 static void alc663_m51va_inithook(struct hda_codec *codec)
17845 alc663_m51va_speaker_automute(codec);
17846 alc_mic_automute(codec);
17849 /* ***************** Mode1 ******************************/
17850 #define alc663_mode1_unsol_event alc663_m51va_unsol_event
17852 static void alc663_mode1_setup(struct hda_codec *codec)
17854 struct alc_spec *spec = codec->spec;
17855 spec->ext_mic.pin = 0x18;
17856 spec->ext_mic.mux_idx = 0;
17857 spec->int_mic.pin = 0x19;
17858 spec->int_mic.mux_idx = 1;
17859 spec->auto_mic = 1;
17862 #define alc663_mode1_inithook alc663_m51va_inithook
17864 /* ***************** Mode2 ******************************/
17865 static void alc662_mode2_unsol_event(struct hda_codec *codec,
17868 switch (res >> 26) {
17869 case ALC880_HP_EVENT:
17870 alc662_f5z_speaker_automute(codec);
17872 case ALC880_MIC_EVENT:
17873 alc_mic_automute(codec);
17878 #define alc662_mode2_setup alc663_mode1_setup
17880 static void alc662_mode2_inithook(struct hda_codec *codec)
17882 alc662_f5z_speaker_automute(codec);
17883 alc_mic_automute(codec);
17885 /* ***************** Mode3 ******************************/
17886 static void alc663_mode3_unsol_event(struct hda_codec *codec,
17889 switch (res >> 26) {
17890 case ALC880_HP_EVENT:
17891 alc663_two_hp_m1_speaker_automute(codec);
17893 case ALC880_MIC_EVENT:
17894 alc_mic_automute(codec);
17899 #define alc663_mode3_setup alc663_mode1_setup
17901 static void alc663_mode3_inithook(struct hda_codec *codec)
17903 alc663_two_hp_m1_speaker_automute(codec);
17904 alc_mic_automute(codec);
17906 /* ***************** Mode4 ******************************/
17907 static void alc663_mode4_unsol_event(struct hda_codec *codec,
17910 switch (res >> 26) {
17911 case ALC880_HP_EVENT:
17912 alc663_21jd_two_speaker_automute(codec);
17914 case ALC880_MIC_EVENT:
17915 alc_mic_automute(codec);
17920 #define alc663_mode4_setup alc663_mode1_setup
17922 static void alc663_mode4_inithook(struct hda_codec *codec)
17924 alc663_21jd_two_speaker_automute(codec);
17925 alc_mic_automute(codec);
17927 /* ***************** Mode5 ******************************/
17928 static void alc663_mode5_unsol_event(struct hda_codec *codec,
17931 switch (res >> 26) {
17932 case ALC880_HP_EVENT:
17933 alc663_15jd_two_speaker_automute(codec);
17935 case ALC880_MIC_EVENT:
17936 alc_mic_automute(codec);
17941 #define alc663_mode5_setup alc663_mode1_setup
17943 static void alc663_mode5_inithook(struct hda_codec *codec)
17945 alc663_15jd_two_speaker_automute(codec);
17946 alc_mic_automute(codec);
17948 /* ***************** Mode6 ******************************/
17949 static void alc663_mode6_unsol_event(struct hda_codec *codec,
17952 switch (res >> 26) {
17953 case ALC880_HP_EVENT:
17954 alc663_two_hp_m2_speaker_automute(codec);
17956 case ALC880_MIC_EVENT:
17957 alc_mic_automute(codec);
17962 #define alc663_mode6_setup alc663_mode1_setup
17964 static void alc663_mode6_inithook(struct hda_codec *codec)
17966 alc663_two_hp_m2_speaker_automute(codec);
17967 alc_mic_automute(codec);
17970 /* ***************** Mode7 ******************************/
17971 static void alc663_mode7_unsol_event(struct hda_codec *codec,
17974 switch (res >> 26) {
17975 case ALC880_HP_EVENT:
17976 alc663_two_hp_m7_speaker_automute(codec);
17978 case ALC880_MIC_EVENT:
17979 alc_mic_automute(codec);
17984 #define alc663_mode7_setup alc663_mode1_setup
17986 static void alc663_mode7_inithook(struct hda_codec *codec)
17988 alc663_two_hp_m7_speaker_automute(codec);
17989 alc_mic_automute(codec);
17992 /* ***************** Mode8 ******************************/
17993 static void alc663_mode8_unsol_event(struct hda_codec *codec,
17996 switch (res >> 26) {
17997 case ALC880_HP_EVENT:
17998 alc663_two_hp_m8_speaker_automute(codec);
18000 case ALC880_MIC_EVENT:
18001 alc_mic_automute(codec);
18006 #define alc663_mode8_setup alc663_m51va_setup
18008 static void alc663_mode8_inithook(struct hda_codec *codec)
18010 alc663_two_hp_m8_speaker_automute(codec);
18011 alc_mic_automute(codec);
18014 static void alc663_g71v_hp_automute(struct hda_codec *codec)
18016 unsigned int present;
18017 unsigned char bits;
18019 present = snd_hda_jack_detect(codec, 0x21);
18020 bits = present ? HDA_AMP_MUTE : 0;
18021 snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
18022 HDA_AMP_MUTE, bits);
18023 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
18024 HDA_AMP_MUTE, bits);
18027 static void alc663_g71v_front_automute(struct hda_codec *codec)
18029 unsigned int present;
18030 unsigned char bits;
18032 present = snd_hda_jack_detect(codec, 0x15);
18033 bits = present ? HDA_AMP_MUTE : 0;
18034 snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
18035 HDA_AMP_MUTE, bits);
18038 static void alc663_g71v_unsol_event(struct hda_codec *codec,
18041 switch (res >> 26) {
18042 case ALC880_HP_EVENT:
18043 alc663_g71v_hp_automute(codec);
18045 case ALC880_FRONT_EVENT:
18046 alc663_g71v_front_automute(codec);
18048 case ALC880_MIC_EVENT:
18049 alc_mic_automute(codec);
18054 #define alc663_g71v_setup alc663_m51va_setup
18056 static void alc663_g71v_inithook(struct hda_codec *codec)
18058 alc663_g71v_front_automute(codec);
18059 alc663_g71v_hp_automute(codec);
18060 alc_mic_automute(codec);
18063 static void alc663_g50v_unsol_event(struct hda_codec *codec,
18066 switch (res >> 26) {
18067 case ALC880_HP_EVENT:
18068 alc663_m51va_speaker_automute(codec);
18070 case ALC880_MIC_EVENT:
18071 alc_mic_automute(codec);
18076 #define alc663_g50v_setup alc663_m51va_setup
18078 static void alc663_g50v_inithook(struct hda_codec *codec)
18080 alc663_m51va_speaker_automute(codec);
18081 alc_mic_automute(codec);
18084 static struct snd_kcontrol_new alc662_ecs_mixer[] = {
18085 HDA_CODEC_VOLUME("Master Playback Volume", 0x02, 0x0, HDA_OUTPUT),
18086 ALC262_HIPPO_MASTER_SWITCH,
18088 HDA_CODEC_VOLUME("e-Mic/LineIn Boost", 0x18, 0, HDA_INPUT),
18089 HDA_CODEC_VOLUME("e-Mic/LineIn Playback Volume", 0x0b, 0x0, HDA_INPUT),
18090 HDA_CODEC_MUTE("e-Mic/LineIn Playback Switch", 0x0b, 0x0, HDA_INPUT),
18092 HDA_CODEC_VOLUME("i-Mic Boost", 0x19, 0, HDA_INPUT),
18093 HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
18094 HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
18098 static struct snd_kcontrol_new alc272_nc10_mixer[] = {
18099 /* Master Playback automatically created from Speaker and Headphone */
18100 HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
18101 HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
18102 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x03, 0x0, HDA_OUTPUT),
18103 HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
18105 HDA_CODEC_VOLUME("Ext Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
18106 HDA_CODEC_MUTE("Ext Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
18107 HDA_CODEC_VOLUME("Ext Mic Boost", 0x18, 0, HDA_INPUT),
18109 HDA_CODEC_VOLUME("Int Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
18110 HDA_CODEC_MUTE("Int Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
18111 HDA_CODEC_VOLUME("Int Mic Boost", 0x19, 0, HDA_INPUT),
18115 #ifdef CONFIG_SND_HDA_POWER_SAVE
18116 #define alc662_loopbacks alc880_loopbacks
18120 /* pcm configuration: identical with ALC880 */
18121 #define alc662_pcm_analog_playback alc880_pcm_analog_playback
18122 #define alc662_pcm_analog_capture alc880_pcm_analog_capture
18123 #define alc662_pcm_digital_playback alc880_pcm_digital_playback
18124 #define alc662_pcm_digital_capture alc880_pcm_digital_capture
18127 * configuration and preset
18129 static const char *alc662_models[ALC662_MODEL_LAST] = {
18130 [ALC662_3ST_2ch_DIG] = "3stack-dig",
18131 [ALC662_3ST_6ch_DIG] = "3stack-6ch-dig",
18132 [ALC662_3ST_6ch] = "3stack-6ch",
18133 [ALC662_5ST_DIG] = "6stack-dig",
18134 [ALC662_LENOVO_101E] = "lenovo-101e",
18135 [ALC662_ASUS_EEEPC_P701] = "eeepc-p701",
18136 [ALC662_ASUS_EEEPC_EP20] = "eeepc-ep20",
18137 [ALC662_ECS] = "ecs",
18138 [ALC663_ASUS_M51VA] = "m51va",
18139 [ALC663_ASUS_G71V] = "g71v",
18140 [ALC663_ASUS_H13] = "h13",
18141 [ALC663_ASUS_G50V] = "g50v",
18142 [ALC663_ASUS_MODE1] = "asus-mode1",
18143 [ALC662_ASUS_MODE2] = "asus-mode2",
18144 [ALC663_ASUS_MODE3] = "asus-mode3",
18145 [ALC663_ASUS_MODE4] = "asus-mode4",
18146 [ALC663_ASUS_MODE5] = "asus-mode5",
18147 [ALC663_ASUS_MODE6] = "asus-mode6",
18148 [ALC663_ASUS_MODE7] = "asus-mode7",
18149 [ALC663_ASUS_MODE8] = "asus-mode8",
18150 [ALC272_DELL] = "dell",
18151 [ALC272_DELL_ZM1] = "dell-zm1",
18152 [ALC272_SAMSUNG_NC10] = "samsung-nc10",
18153 [ALC662_AUTO] = "auto",
18156 static struct snd_pci_quirk alc662_cfg_tbl[] = {
18157 SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_ECS),
18158 SND_PCI_QUIRK(0x1028, 0x02d6, "DELL", ALC272_DELL),
18159 SND_PCI_QUIRK(0x1028, 0x02f4, "DELL ZM1", ALC272_DELL_ZM1),
18160 SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC663_ASUS_MODE1),
18161 SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC663_ASUS_MODE3),
18162 SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC663_ASUS_MODE1),
18163 SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC663_ASUS_MODE3),
18164 SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC663_ASUS_MODE1),
18165 SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_ASUS_MODE2),
18166 SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC663_ASUS_MODE1),
18167 SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC663_ASUS_MODE1),
18168 SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC663_ASUS_MODE1),
18169 SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_ASUS_MODE2),
18170 SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC663_ASUS_MODE7),
18171 SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC663_ASUS_MODE7),
18172 SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC663_ASUS_MODE8),
18173 SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC663_ASUS_MODE3),
18174 SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC663_ASUS_MODE1),
18175 SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_ASUS_MODE2),
18176 SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_ASUS_MODE2),
18177 SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC663_ASUS_MODE1),
18178 SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_ASUS_MODE2),
18179 SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC663_ASUS_MODE6),
18180 SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC663_ASUS_MODE6),
18181 SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_ASUS_MODE2),
18182 SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC663_ASUS_MODE1),
18183 SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC663_ASUS_MODE3),
18184 SND_PCI_QUIRK(0x1043, 0x17c3, "ASUS UX20", ALC663_ASUS_M51VA),
18185 SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_ASUS_MODE2),
18186 SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_ASUS_MODE2),
18187 SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC663_ASUS_MODE5),
18188 SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC663_ASUS_MODE6),
18189 SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_ASUS_MODE2),
18190 SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC663_ASUS_MODE1),
18191 SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_ASUS_MODE2),
18192 SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_ASUS_MODE2),
18193 SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA),
18194 /*SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M50Vr", ALC663_ASUS_MODE1),*/
18195 SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC663_ASUS_MODE3),
18196 SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC663_ASUS_MODE3),
18197 SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC663_ASUS_MODE1),
18198 SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC663_ASUS_MODE1),
18199 SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC663_ASUS_MODE1),
18200 SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC663_ASUS_MODE1),
18201 SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC663_ASUS_MODE1),
18202 SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_ASUS_MODE2),
18203 SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_ASUS_MODE2),
18204 SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC663_ASUS_MODE1),
18205 SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC663_ASUS_MODE1),
18206 SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC663_ASUS_MODE3),
18207 SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC663_ASUS_MODE1),
18208 SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC663_ASUS_MODE1),
18209 SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS G50V", ALC663_ASUS_G50V),
18210 /*SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS NB", ALC663_ASUS_MODE1),*/
18211 SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC663_ASUS_MODE1),
18212 SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_ASUS_MODE2),
18213 SND_PCI_QUIRK(0x1043, 0x19d3, "ASUS NB", ALC663_ASUS_M51VA),
18214 SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC663_ASUS_MODE1),
18215 SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC663_ASUS_MODE4),
18216 SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG),
18217 SND_PCI_QUIRK(0x1043, 0x82a1, "ASUS Eeepc", ALC662_ASUS_EEEPC_P701),
18218 SND_PCI_QUIRK(0x1043, 0x82d1, "ASUS Eeepc EP20", ALC662_ASUS_EEEPC_EP20),
18219 SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_ECS),
18220 SND_PCI_QUIRK(0x105b, 0x0d47, "Foxconn 45CMX/45GMX/45CMX-K",
18221 ALC662_3ST_6ch_DIG),
18222 SND_PCI_QUIRK(0x1179, 0xff6e, "Toshiba NB20x", ALC662_AUTO),
18223 SND_PCI_QUIRK(0x144d, 0xca00, "Samsung NC10", ALC272_SAMSUNG_NC10),
18224 SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte 945GCM-S2L",
18225 ALC662_3ST_6ch_DIG),
18226 SND_PCI_QUIRK(0x152d, 0x2304, "Quanta WH1", ALC663_ASUS_H13),
18227 SND_PCI_QUIRK(0x1565, 0x820f, "Biostar TA780G M2+", ALC662_3ST_6ch_DIG),
18228 SND_PCI_QUIRK(0x1631, 0xc10c, "PB RS65", ALC663_ASUS_M51VA),
18229 SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E),
18230 SND_PCI_QUIRK(0x1849, 0x3662, "ASROCK K10N78FullHD-hSLI R3.0",
18231 ALC662_3ST_6ch_DIG),
18232 SND_PCI_QUIRK_MASK(0x1854, 0xf000, 0x2000, "ASUS H13-200x",
18237 static struct alc_config_preset alc662_presets[] = {
18238 [ALC662_3ST_2ch_DIG] = {
18239 .mixers = { alc662_3ST_2ch_mixer },
18240 .init_verbs = { alc662_init_verbs },
18241 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18242 .dac_nids = alc662_dac_nids,
18243 .dig_out_nid = ALC662_DIGOUT_NID,
18244 .dig_in_nid = ALC662_DIGIN_NID,
18245 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18246 .channel_mode = alc662_3ST_2ch_modes,
18247 .input_mux = &alc662_capture_source,
18249 [ALC662_3ST_6ch_DIG] = {
18250 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
18251 .init_verbs = { alc662_init_verbs },
18252 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18253 .dac_nids = alc662_dac_nids,
18254 .dig_out_nid = ALC662_DIGOUT_NID,
18255 .dig_in_nid = ALC662_DIGIN_NID,
18256 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18257 .channel_mode = alc662_3ST_6ch_modes,
18259 .input_mux = &alc662_capture_source,
18261 [ALC662_3ST_6ch] = {
18262 .mixers = { alc662_3ST_6ch_mixer, alc662_chmode_mixer },
18263 .init_verbs = { alc662_init_verbs },
18264 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18265 .dac_nids = alc662_dac_nids,
18266 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18267 .channel_mode = alc662_3ST_6ch_modes,
18269 .input_mux = &alc662_capture_source,
18271 [ALC662_5ST_DIG] = {
18272 .mixers = { alc662_base_mixer, alc662_chmode_mixer },
18273 .init_verbs = { alc662_init_verbs },
18274 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18275 .dac_nids = alc662_dac_nids,
18276 .dig_out_nid = ALC662_DIGOUT_NID,
18277 .dig_in_nid = ALC662_DIGIN_NID,
18278 .num_channel_mode = ARRAY_SIZE(alc662_5stack_modes),
18279 .channel_mode = alc662_5stack_modes,
18280 .input_mux = &alc662_capture_source,
18282 [ALC662_LENOVO_101E] = {
18283 .mixers = { alc662_lenovo_101e_mixer },
18284 .init_verbs = { alc662_init_verbs, alc662_sue_init_verbs },
18285 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18286 .dac_nids = alc662_dac_nids,
18287 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18288 .channel_mode = alc662_3ST_2ch_modes,
18289 .input_mux = &alc662_lenovo_101e_capture_source,
18290 .unsol_event = alc662_lenovo_101e_unsol_event,
18291 .init_hook = alc662_lenovo_101e_all_automute,
18293 [ALC662_ASUS_EEEPC_P701] = {
18294 .mixers = { alc662_eeepc_p701_mixer },
18295 .init_verbs = { alc662_init_verbs,
18296 alc662_eeepc_sue_init_verbs },
18297 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18298 .dac_nids = alc662_dac_nids,
18299 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18300 .channel_mode = alc662_3ST_2ch_modes,
18301 .unsol_event = alc662_eeepc_unsol_event,
18302 .setup = alc662_eeepc_setup,
18303 .init_hook = alc662_eeepc_inithook,
18305 [ALC662_ASUS_EEEPC_EP20] = {
18306 .mixers = { alc662_eeepc_ep20_mixer,
18307 alc662_chmode_mixer },
18308 .init_verbs = { alc662_init_verbs,
18309 alc662_eeepc_ep20_sue_init_verbs },
18310 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18311 .dac_nids = alc662_dac_nids,
18312 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18313 .channel_mode = alc662_3ST_6ch_modes,
18314 .input_mux = &alc662_lenovo_101e_capture_source,
18315 .unsol_event = alc662_eeepc_unsol_event,
18316 .setup = alc662_eeepc_ep20_setup,
18317 .init_hook = alc662_eeepc_ep20_inithook,
18320 .mixers = { alc662_ecs_mixer },
18321 .init_verbs = { alc662_init_verbs,
18322 alc662_ecs_init_verbs },
18323 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18324 .dac_nids = alc662_dac_nids,
18325 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18326 .channel_mode = alc662_3ST_2ch_modes,
18327 .unsol_event = alc662_eeepc_unsol_event,
18328 .setup = alc662_eeepc_setup,
18329 .init_hook = alc662_eeepc_inithook,
18331 [ALC663_ASUS_M51VA] = {
18332 .mixers = { alc663_m51va_mixer },
18333 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
18334 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18335 .dac_nids = alc662_dac_nids,
18336 .dig_out_nid = ALC662_DIGOUT_NID,
18337 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18338 .channel_mode = alc662_3ST_2ch_modes,
18339 .unsol_event = alc663_m51va_unsol_event,
18340 .setup = alc663_m51va_setup,
18341 .init_hook = alc663_m51va_inithook,
18343 [ALC663_ASUS_G71V] = {
18344 .mixers = { alc663_g71v_mixer },
18345 .init_verbs = { alc662_init_verbs, alc663_g71v_init_verbs },
18346 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18347 .dac_nids = alc662_dac_nids,
18348 .dig_out_nid = ALC662_DIGOUT_NID,
18349 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18350 .channel_mode = alc662_3ST_2ch_modes,
18351 .unsol_event = alc663_g71v_unsol_event,
18352 .setup = alc663_g71v_setup,
18353 .init_hook = alc663_g71v_inithook,
18355 [ALC663_ASUS_H13] = {
18356 .mixers = { alc663_m51va_mixer },
18357 .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
18358 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18359 .dac_nids = alc662_dac_nids,
18360 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18361 .channel_mode = alc662_3ST_2ch_modes,
18362 .unsol_event = alc663_m51va_unsol_event,
18363 .init_hook = alc663_m51va_inithook,
18365 [ALC663_ASUS_G50V] = {
18366 .mixers = { alc663_g50v_mixer },
18367 .init_verbs = { alc662_init_verbs, alc663_g50v_init_verbs },
18368 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18369 .dac_nids = alc662_dac_nids,
18370 .dig_out_nid = ALC662_DIGOUT_NID,
18371 .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
18372 .channel_mode = alc662_3ST_6ch_modes,
18373 .input_mux = &alc663_capture_source,
18374 .unsol_event = alc663_g50v_unsol_event,
18375 .setup = alc663_g50v_setup,
18376 .init_hook = alc663_g50v_inithook,
18378 [ALC663_ASUS_MODE1] = {
18379 .mixers = { alc663_m51va_mixer },
18380 .cap_mixer = alc662_auto_capture_mixer,
18381 .init_verbs = { alc662_init_verbs,
18382 alc663_21jd_amic_init_verbs },
18383 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18385 .dac_nids = alc662_dac_nids,
18386 .dig_out_nid = ALC662_DIGOUT_NID,
18387 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18388 .channel_mode = alc662_3ST_2ch_modes,
18389 .unsol_event = alc663_mode1_unsol_event,
18390 .setup = alc663_mode1_setup,
18391 .init_hook = alc663_mode1_inithook,
18393 [ALC662_ASUS_MODE2] = {
18394 .mixers = { alc662_1bjd_mixer },
18395 .cap_mixer = alc662_auto_capture_mixer,
18396 .init_verbs = { alc662_init_verbs,
18397 alc662_1bjd_amic_init_verbs },
18398 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18399 .dac_nids = alc662_dac_nids,
18400 .dig_out_nid = ALC662_DIGOUT_NID,
18401 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18402 .channel_mode = alc662_3ST_2ch_modes,
18403 .unsol_event = alc662_mode2_unsol_event,
18404 .setup = alc662_mode2_setup,
18405 .init_hook = alc662_mode2_inithook,
18407 [ALC663_ASUS_MODE3] = {
18408 .mixers = { alc663_two_hp_m1_mixer },
18409 .cap_mixer = alc662_auto_capture_mixer,
18410 .init_verbs = { alc662_init_verbs,
18411 alc663_two_hp_amic_m1_init_verbs },
18412 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18414 .dac_nids = alc662_dac_nids,
18415 .dig_out_nid = ALC662_DIGOUT_NID,
18416 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18417 .channel_mode = alc662_3ST_2ch_modes,
18418 .unsol_event = alc663_mode3_unsol_event,
18419 .setup = alc663_mode3_setup,
18420 .init_hook = alc663_mode3_inithook,
18422 [ALC663_ASUS_MODE4] = {
18423 .mixers = { alc663_asus_21jd_clfe_mixer },
18424 .cap_mixer = alc662_auto_capture_mixer,
18425 .init_verbs = { alc662_init_verbs,
18426 alc663_21jd_amic_init_verbs},
18427 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18429 .dac_nids = alc662_dac_nids,
18430 .dig_out_nid = ALC662_DIGOUT_NID,
18431 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18432 .channel_mode = alc662_3ST_2ch_modes,
18433 .unsol_event = alc663_mode4_unsol_event,
18434 .setup = alc663_mode4_setup,
18435 .init_hook = alc663_mode4_inithook,
18437 [ALC663_ASUS_MODE5] = {
18438 .mixers = { alc663_asus_15jd_clfe_mixer },
18439 .cap_mixer = alc662_auto_capture_mixer,
18440 .init_verbs = { alc662_init_verbs,
18441 alc663_15jd_amic_init_verbs },
18442 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18444 .dac_nids = alc662_dac_nids,
18445 .dig_out_nid = ALC662_DIGOUT_NID,
18446 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18447 .channel_mode = alc662_3ST_2ch_modes,
18448 .unsol_event = alc663_mode5_unsol_event,
18449 .setup = alc663_mode5_setup,
18450 .init_hook = alc663_mode5_inithook,
18452 [ALC663_ASUS_MODE6] = {
18453 .mixers = { alc663_two_hp_m2_mixer },
18454 .cap_mixer = alc662_auto_capture_mixer,
18455 .init_verbs = { alc662_init_verbs,
18456 alc663_two_hp_amic_m2_init_verbs },
18457 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18459 .dac_nids = alc662_dac_nids,
18460 .dig_out_nid = ALC662_DIGOUT_NID,
18461 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18462 .channel_mode = alc662_3ST_2ch_modes,
18463 .unsol_event = alc663_mode6_unsol_event,
18464 .setup = alc663_mode6_setup,
18465 .init_hook = alc663_mode6_inithook,
18467 [ALC663_ASUS_MODE7] = {
18468 .mixers = { alc663_mode7_mixer },
18469 .cap_mixer = alc662_auto_capture_mixer,
18470 .init_verbs = { alc662_init_verbs,
18471 alc663_mode7_init_verbs },
18472 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18474 .dac_nids = alc662_dac_nids,
18475 .dig_out_nid = ALC662_DIGOUT_NID,
18476 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18477 .channel_mode = alc662_3ST_2ch_modes,
18478 .unsol_event = alc663_mode7_unsol_event,
18479 .setup = alc663_mode7_setup,
18480 .init_hook = alc663_mode7_inithook,
18482 [ALC663_ASUS_MODE8] = {
18483 .mixers = { alc663_mode8_mixer },
18484 .cap_mixer = alc662_auto_capture_mixer,
18485 .init_verbs = { alc662_init_verbs,
18486 alc663_mode8_init_verbs },
18487 .num_dacs = ARRAY_SIZE(alc662_dac_nids),
18489 .dac_nids = alc662_dac_nids,
18490 .dig_out_nid = ALC662_DIGOUT_NID,
18491 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18492 .channel_mode = alc662_3ST_2ch_modes,
18493 .unsol_event = alc663_mode8_unsol_event,
18494 .setup = alc663_mode8_setup,
18495 .init_hook = alc663_mode8_inithook,
18498 .mixers = { alc663_m51va_mixer },
18499 .cap_mixer = alc272_auto_capture_mixer,
18500 .init_verbs = { alc662_init_verbs, alc272_dell_init_verbs },
18501 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
18502 .dac_nids = alc662_dac_nids,
18503 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18504 .adc_nids = alc272_adc_nids,
18505 .num_adc_nids = ARRAY_SIZE(alc272_adc_nids),
18506 .capsrc_nids = alc272_capsrc_nids,
18507 .channel_mode = alc662_3ST_2ch_modes,
18508 .unsol_event = alc663_m51va_unsol_event,
18509 .setup = alc663_m51va_setup,
18510 .init_hook = alc663_m51va_inithook,
18512 [ALC272_DELL_ZM1] = {
18513 .mixers = { alc663_m51va_mixer },
18514 .cap_mixer = alc662_auto_capture_mixer,
18515 .init_verbs = { alc662_init_verbs, alc272_dell_zm1_init_verbs },
18516 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
18517 .dac_nids = alc662_dac_nids,
18518 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18519 .adc_nids = alc662_adc_nids,
18521 .capsrc_nids = alc662_capsrc_nids,
18522 .channel_mode = alc662_3ST_2ch_modes,
18523 .unsol_event = alc663_m51va_unsol_event,
18524 .setup = alc663_m51va_setup,
18525 .init_hook = alc663_m51va_inithook,
18527 [ALC272_SAMSUNG_NC10] = {
18528 .mixers = { alc272_nc10_mixer },
18529 .init_verbs = { alc662_init_verbs,
18530 alc663_21jd_amic_init_verbs },
18531 .num_dacs = ARRAY_SIZE(alc272_dac_nids),
18532 .dac_nids = alc272_dac_nids,
18533 .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
18534 .channel_mode = alc662_3ST_2ch_modes,
18535 /*.input_mux = &alc272_nc10_capture_source,*/
18536 .unsol_event = alc663_mode4_unsol_event,
18537 .setup = alc663_mode4_setup,
18538 .init_hook = alc663_mode4_inithook,
18544 * BIOS auto configuration
18547 /* convert from MIX nid to DAC */
18548 static inline hda_nid_t alc662_mix_to_dac(hda_nid_t nid)
18552 else if (nid >= 0x0c && nid <= 0x0e)
18553 return nid - 0x0c + 0x02;
18558 /* get MIX nid connected to the given pin targeted to DAC */
18559 static hda_nid_t alc662_dac_to_mix(struct hda_codec *codec, hda_nid_t pin,
18565 num = snd_hda_get_connections(codec, pin, mix, ARRAY_SIZE(mix));
18566 for (i = 0; i < num; i++) {
18567 if (alc662_mix_to_dac(mix[i]) == dac)
18573 /* look for an empty DAC slot */
18574 static hda_nid_t alc662_look_for_dac(struct hda_codec *codec, hda_nid_t pin)
18576 struct alc_spec *spec = codec->spec;
18580 num = snd_hda_get_connections(codec, pin, srcs, ARRAY_SIZE(srcs));
18583 for (i = 0; i < num; i++) {
18584 hda_nid_t nid = alc662_mix_to_dac(srcs[i]);
18587 for (j = 0; j < spec->multiout.num_dacs; j++)
18588 if (spec->multiout.dac_nids[j] == nid)
18590 if (j >= spec->multiout.num_dacs)
18596 /* fill in the dac_nids table from the parsed pin configuration */
18597 static int alc662_auto_fill_dac_nids(struct hda_codec *codec,
18598 const struct auto_pin_cfg *cfg)
18600 struct alc_spec *spec = codec->spec;
18604 spec->multiout.dac_nids = spec->private_dac_nids;
18605 for (i = 0; i < cfg->line_outs; i++) {
18606 dac = alc662_look_for_dac(codec, cfg->line_out_pins[i]);
18609 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
18614 static inline int alc662_add_vol_ctl(struct alc_spec *spec, const char *pfx,
18615 hda_nid_t nid, unsigned int chs)
18617 return add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, pfx,
18618 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_OUTPUT));
18621 static inline int alc662_add_sw_ctl(struct alc_spec *spec, const char *pfx,
18622 hda_nid_t nid, unsigned int chs)
18624 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
18625 HDA_COMPOSE_AMP_VAL(nid, chs, 0, HDA_INPUT));
18628 #define alc662_add_stereo_vol(spec, pfx, nid) \
18629 alc662_add_vol_ctl(spec, pfx, nid, 3)
18630 #define alc662_add_stereo_sw(spec, pfx, nid) \
18631 alc662_add_sw_ctl(spec, pfx, nid, 3)
18633 /* add playback controls from the parsed DAC table */
18634 static int alc662_auto_create_multi_out_ctls(struct hda_codec *codec,
18635 const struct auto_pin_cfg *cfg)
18637 struct alc_spec *spec = codec->spec;
18638 static const char *chname[4] = {
18639 "Front", "Surround", NULL /*CLFE*/, "Side"
18641 hda_nid_t nid, mix;
18644 for (i = 0; i < cfg->line_outs; i++) {
18645 nid = spec->multiout.dac_nids[i];
18648 mix = alc662_dac_to_mix(codec, cfg->line_out_pins[i], nid);
18653 err = alc662_add_vol_ctl(spec, "Center", nid, 1);
18656 err = alc662_add_vol_ctl(spec, "LFE", nid, 2);
18659 err = alc662_add_sw_ctl(spec, "Center", mix, 1);
18662 err = alc662_add_sw_ctl(spec, "LFE", mix, 2);
18667 if (cfg->line_outs == 1 &&
18668 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT) {
18675 err = alc662_add_vol_ctl(spec, pfx, nid, 3);
18678 if (cfg->line_outs == 1 &&
18679 cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
18681 err = alc662_add_sw_ctl(spec, pfx, mix, 3);
18689 /* add playback controls for speaker and HP outputs */
18690 /* return DAC nid if any new DAC is assigned */
18691 static int alc662_auto_create_extra_out(struct hda_codec *codec, hda_nid_t pin,
18694 struct alc_spec *spec = codec->spec;
18695 hda_nid_t nid, mix;
18700 nid = alc662_look_for_dac(codec, pin);
18702 /* the corresponding DAC is already occupied */
18703 if (!(get_wcaps(codec, pin) & AC_WCAP_OUT_AMP))
18704 return 0; /* no way */
18705 /* create a switch only */
18706 return add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, pfx,
18707 HDA_COMPOSE_AMP_VAL(pin, 3, 0, HDA_OUTPUT));
18710 mix = alc662_dac_to_mix(codec, pin, nid);
18713 err = alc662_add_vol_ctl(spec, pfx, nid, 3);
18716 err = alc662_add_sw_ctl(spec, pfx, mix, 3);
18722 /* create playback/capture controls for input pins */
18723 #define alc662_auto_create_input_ctls \
18724 alc882_auto_create_input_ctls
18726 static void alc662_auto_set_output_and_unmute(struct hda_codec *codec,
18727 hda_nid_t nid, int pin_type,
18731 hda_nid_t srcs[HDA_MAX_CONNECTIONS];
18733 alc_set_pin_output(codec, nid, pin_type);
18734 /* need the manual connection? */
18735 num = snd_hda_get_connections(codec, nid, srcs, ARRAY_SIZE(srcs));
18738 for (i = 0; i < num; i++) {
18739 if (alc662_mix_to_dac(srcs[i]) != dac)
18741 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_CONNECT_SEL, i);
18746 static void alc662_auto_init_multi_out(struct hda_codec *codec)
18748 struct alc_spec *spec = codec->spec;
18749 int pin_type = get_pin_type(spec->autocfg.line_out_type);
18752 for (i = 0; i <= HDA_SIDE; i++) {
18753 hda_nid_t nid = spec->autocfg.line_out_pins[i];
18755 alc662_auto_set_output_and_unmute(codec, nid, pin_type,
18756 spec->multiout.dac_nids[i]);
18760 static void alc662_auto_init_hp_out(struct hda_codec *codec)
18762 struct alc_spec *spec = codec->spec;
18765 pin = spec->autocfg.hp_pins[0];
18767 alc662_auto_set_output_and_unmute(codec, pin, PIN_HP,
18768 spec->multiout.hp_nid);
18769 pin = spec->autocfg.speaker_pins[0];
18771 alc662_auto_set_output_and_unmute(codec, pin, PIN_OUT,
18772 spec->multiout.extra_out_nid[0]);
18775 #define ALC662_PIN_CD_NID ALC880_PIN_CD_NID
18777 static void alc662_auto_init_analog_input(struct hda_codec *codec)
18779 struct alc_spec *spec = codec->spec;
18782 for (i = 0; i < AUTO_PIN_LAST; i++) {
18783 hda_nid_t nid = spec->autocfg.input_pins[i];
18784 if (alc_is_input_pin(codec, nid)) {
18785 alc_set_input_pin(codec, nid, i);
18786 if (nid != ALC662_PIN_CD_NID &&
18787 (get_wcaps(codec, nid) & AC_WCAP_OUT_AMP))
18788 snd_hda_codec_write(codec, nid, 0,
18789 AC_VERB_SET_AMP_GAIN_MUTE,
18795 #define alc662_auto_init_input_src alc882_auto_init_input_src
18797 static int alc662_parse_auto_config(struct hda_codec *codec)
18799 struct alc_spec *spec = codec->spec;
18801 static hda_nid_t alc662_ignore[] = { 0x1d, 0 };
18803 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
18807 if (!spec->autocfg.line_outs)
18808 return 0; /* can't find valid BIOS pin config */
18810 err = alc662_auto_fill_dac_nids(codec, &spec->autocfg);
18813 err = alc662_auto_create_multi_out_ctls(codec, &spec->autocfg);
18816 err = alc662_auto_create_extra_out(codec,
18817 spec->autocfg.speaker_pins[0],
18822 spec->multiout.extra_out_nid[0] = err;
18823 err = alc662_auto_create_extra_out(codec, spec->autocfg.hp_pins[0],
18828 spec->multiout.hp_nid = err;
18829 err = alc662_auto_create_input_ctls(codec, &spec->autocfg);
18833 spec->multiout.max_channels = spec->multiout.num_dacs * 2;
18835 alc_auto_parse_digital(codec);
18837 if (spec->kctls.list)
18838 add_mixer(spec, spec->kctls.list);
18840 spec->num_mux_defs = 1;
18841 spec->input_mux = &spec->private_imux[0];
18843 add_verb(spec, alc662_init_verbs);
18844 if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
18845 codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670)
18846 add_verb(spec, alc663_init_verbs);
18848 if (codec->vendor_id == 0x10ec0272)
18849 add_verb(spec, alc272_init_verbs);
18851 err = alc_auto_add_mic_boost(codec);
18855 if (codec->vendor_id == 0x10ec0272 || codec->vendor_id == 0x10ec0663 ||
18856 codec->vendor_id == 0x10ec0665 || codec->vendor_id == 0x10ec0670)
18857 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0x21);
18859 alc_ssid_check(codec, 0x15, 0x1b, 0x14, 0);
18864 /* additional initialization for auto-configuration model */
18865 static void alc662_auto_init(struct hda_codec *codec)
18867 struct alc_spec *spec = codec->spec;
18868 alc662_auto_init_multi_out(codec);
18869 alc662_auto_init_hp_out(codec);
18870 alc662_auto_init_analog_input(codec);
18871 alc662_auto_init_input_src(codec);
18872 alc_auto_init_digital(codec);
18873 if (spec->unsol_event)
18874 alc_inithook(codec);
18877 static int patch_alc662(struct hda_codec *codec)
18879 struct alc_spec *spec;
18880 int err, board_config;
18882 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
18886 codec->spec = spec;
18888 alc_auto_parse_customize_define(codec);
18890 alc_fix_pll_init(codec, 0x20, 0x04, 15);
18892 if (alc_read_coef_idx(codec, 0) == 0x8020)
18893 alc_codec_rename(codec, "ALC661");
18894 else if ((alc_read_coef_idx(codec, 0) & (1 << 14)) &&
18895 codec->bus->pci->subsystem_vendor == 0x1025 &&
18896 spec->cdefine.platform_type == 1)
18897 alc_codec_rename(codec, "ALC272X");
18899 board_config = snd_hda_check_board_config(codec, ALC662_MODEL_LAST,
18902 if (board_config < 0) {
18903 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
18905 board_config = ALC662_AUTO;
18908 if (board_config == ALC662_AUTO) {
18909 /* automatic parse from the BIOS config */
18910 err = alc662_parse_auto_config(codec);
18916 "hda_codec: Cannot set up configuration "
18917 "from BIOS. Using base mode...\n");
18918 board_config = ALC662_3ST_2ch_DIG;
18922 if (has_cdefine_beep(codec)) {
18923 err = snd_hda_attach_beep_device(codec, 0x1);
18930 if (board_config != ALC662_AUTO)
18931 setup_preset(codec, &alc662_presets[board_config]);
18933 spec->stream_analog_playback = &alc662_pcm_analog_playback;
18934 spec->stream_analog_capture = &alc662_pcm_analog_capture;
18936 spec->stream_digital_playback = &alc662_pcm_digital_playback;
18937 spec->stream_digital_capture = &alc662_pcm_digital_capture;
18939 if (!spec->adc_nids) {
18940 spec->adc_nids = alc662_adc_nids;
18941 spec->num_adc_nids = ARRAY_SIZE(alc662_adc_nids);
18943 if (!spec->capsrc_nids)
18944 spec->capsrc_nids = alc662_capsrc_nids;
18946 if (!spec->cap_mixer)
18947 set_capture_mixer(codec);
18949 if (has_cdefine_beep(codec)) {
18950 switch (codec->vendor_id) {
18952 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
18957 set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
18960 set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
18964 spec->vmaster_nid = 0x02;
18966 codec->patch_ops = alc_patch_ops;
18967 if (board_config == ALC662_AUTO)
18968 spec->init_hook = alc662_auto_init;
18969 #ifdef CONFIG_SND_HDA_POWER_SAVE
18970 if (!spec->loopback.amplist)
18971 spec->loopback.amplist = alc662_loopbacks;
18977 static int patch_alc888(struct hda_codec *codec)
18979 if ((alc_read_coef_idx(codec, 0) & 0x00f0)==0x0030){
18980 kfree(codec->chip_name);
18981 codec->chip_name = kstrdup("ALC888-VD", GFP_KERNEL);
18982 if (!codec->chip_name) {
18986 return patch_alc662(codec);
18988 return patch_alc882(codec);
18994 #define ALC680_DIGOUT_NID ALC880_DIGOUT_NID
18995 #define alc680_modes alc260_modes
18997 static hda_nid_t alc680_dac_nids[3] = {
18998 /* Lout1, Lout2, hp */
19002 static hda_nid_t alc680_adc_nids[3] = {
19004 /* DMIC, MIC, Line-in*/
19008 static struct snd_kcontrol_new alc680_base_mixer[] = {
19009 /* output mixer control */
19010 HDA_CODEC_VOLUME("Front Playback Volume", 0x2, 0x0, HDA_OUTPUT),
19011 HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
19012 HDA_CODEC_VOLUME("Headphone Playback Volume", 0x4, 0x0, HDA_OUTPUT),
19013 HDA_CODEC_MUTE("Headphone Playback Switch", 0x16, 0x0, HDA_OUTPUT),
19014 HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
19018 static struct snd_kcontrol_new alc680_capture_mixer[] = {
19019 HDA_CODEC_VOLUME("Capture Volume", 0x07, 0x0, HDA_INPUT),
19020 HDA_CODEC_MUTE("Capture Switch", 0x07, 0x0, HDA_INPUT),
19021 HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x08, 0x0, HDA_INPUT),
19022 HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x08, 0x0, HDA_INPUT),
19023 HDA_CODEC_VOLUME_IDX("Capture Volume", 2, 0x09, 0x0, HDA_INPUT),
19024 HDA_CODEC_MUTE_IDX("Capture Switch", 2, 0x09, 0x0, HDA_INPUT),
19029 * generic initialization of ADC, input mixers and output mixers
19031 static struct hda_verb alc680_init_verbs[] = {
19032 /* Unmute DAC0-1 and set vol = 0 */
19033 {0x02, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
19034 {0x03, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
19035 {0x04, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
19037 {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
19038 {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x40},
19039 {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0},
19040 {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
19041 {0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x20},
19043 {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
19044 {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
19045 {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
19046 {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
19047 {0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
19051 /* create input playback/capture controls for the given pin */
19052 static int alc680_new_analog_output(struct alc_spec *spec, hda_nid_t nid,
19053 const char *ctlname, int idx)
19071 if (spec->multiout.dac_nids[0] != dac &&
19072 spec->multiout.dac_nids[1] != dac) {
19073 err = add_pb_vol_ctrl(spec, ALC_CTL_WIDGET_VOL, ctlname,
19074 HDA_COMPOSE_AMP_VAL(dac, 3, idx,
19079 err = add_pb_sw_ctrl(spec, ALC_CTL_WIDGET_MUTE, ctlname,
19080 HDA_COMPOSE_AMP_VAL(nid, 3, idx, HDA_OUTPUT));
19084 spec->multiout.dac_nids[spec->multiout.num_dacs++] = dac;
19090 /* add playback controls from the parsed DAC table */
19091 static int alc680_auto_create_multi_out_ctls(struct alc_spec *spec,
19092 const struct auto_pin_cfg *cfg)
19097 spec->multiout.dac_nids = spec->private_dac_nids;
19099 nid = cfg->line_out_pins[0];
19102 if (cfg->line_out_type == AUTO_PIN_SPEAKER_OUT)
19106 err = alc680_new_analog_output(spec, nid, name, 0);
19111 nid = cfg->speaker_pins[0];
19113 err = alc680_new_analog_output(spec, nid, "Speaker", 0);
19117 nid = cfg->hp_pins[0];
19119 err = alc680_new_analog_output(spec, nid, "Headphone", 0);
19127 static void alc680_auto_set_output_and_unmute(struct hda_codec *codec,
19128 hda_nid_t nid, int pin_type)
19130 alc_set_pin_output(codec, nid, pin_type);
19133 static void alc680_auto_init_multi_out(struct hda_codec *codec)
19135 struct alc_spec *spec = codec->spec;
19136 hda_nid_t nid = spec->autocfg.line_out_pins[0];
19138 int pin_type = get_pin_type(spec->autocfg.line_out_type);
19139 alc680_auto_set_output_and_unmute(codec, nid, pin_type);
19143 static void alc680_auto_init_hp_out(struct hda_codec *codec)
19145 struct alc_spec *spec = codec->spec;
19148 pin = spec->autocfg.hp_pins[0];
19150 alc680_auto_set_output_and_unmute(codec, pin, PIN_HP);
19151 pin = spec->autocfg.speaker_pins[0];
19153 alc680_auto_set_output_and_unmute(codec, pin, PIN_OUT);
19156 /* pcm configuration: identical with ALC880 */
19157 #define alc680_pcm_analog_playback alc880_pcm_analog_playback
19158 #define alc680_pcm_analog_capture alc880_pcm_analog_capture
19159 #define alc680_pcm_analog_alt_capture alc880_pcm_analog_alt_capture
19160 #define alc680_pcm_digital_playback alc880_pcm_digital_playback
19162 static struct hda_input_mux alc680_capture_source = {
19170 * BIOS auto configuration
19172 static int alc680_parse_auto_config(struct hda_codec *codec)
19174 struct alc_spec *spec = codec->spec;
19176 static hda_nid_t alc680_ignore[] = { 0 };
19178 err = snd_hda_parse_pin_def_config(codec, &spec->autocfg,
19182 if (!spec->autocfg.line_outs) {
19183 if (spec->autocfg.dig_outs || spec->autocfg.dig_in_pin) {
19184 spec->multiout.max_channels = 2;
19185 spec->no_analog = 1;
19188 return 0; /* can't find valid BIOS pin config */
19190 err = alc680_auto_create_multi_out_ctls(spec, &spec->autocfg);
19194 spec->multiout.max_channels = 2;
19197 /* digital only support output */
19198 alc_auto_parse_digital(codec);
19199 if (spec->kctls.list)
19200 add_mixer(spec, spec->kctls.list);
19202 add_verb(spec, alc680_init_verbs);
19203 spec->num_mux_defs = 1;
19204 spec->input_mux = &alc680_capture_source;
19206 err = alc_auto_add_mic_boost(codec);
19213 #define alc680_auto_init_analog_input alc882_auto_init_analog_input
19215 /* init callback for auto-configuration model -- overriding the default init */
19216 static void alc680_auto_init(struct hda_codec *codec)
19218 struct alc_spec *spec = codec->spec;
19219 alc680_auto_init_multi_out(codec);
19220 alc680_auto_init_hp_out(codec);
19221 alc680_auto_init_analog_input(codec);
19222 alc_auto_init_digital(codec);
19223 if (spec->unsol_event)
19224 alc_inithook(codec);
19228 * configuration and preset
19230 static const char *alc680_models[ALC680_MODEL_LAST] = {
19231 [ALC680_BASE] = "base",
19232 [ALC680_AUTO] = "auto",
19235 static struct snd_pci_quirk alc680_cfg_tbl[] = {
19236 SND_PCI_QUIRK(0x1043, 0x12f3, "ASUS NX90", ALC680_BASE),
19240 static struct alc_config_preset alc680_presets[] = {
19242 .mixers = { alc680_base_mixer },
19243 .cap_mixer = alc680_capture_mixer,
19244 .init_verbs = { alc680_init_verbs },
19245 .num_dacs = ARRAY_SIZE(alc680_dac_nids),
19246 .dac_nids = alc680_dac_nids,
19247 .num_adc_nids = ARRAY_SIZE(alc680_adc_nids),
19248 .adc_nids = alc680_adc_nids,
19250 .dig_out_nid = ALC680_DIGOUT_NID,
19251 .num_channel_mode = ARRAY_SIZE(alc680_modes),
19252 .channel_mode = alc680_modes,
19253 .input_mux = &alc680_capture_source,
19257 static int patch_alc680(struct hda_codec *codec)
19259 struct alc_spec *spec;
19263 spec = kzalloc(sizeof(*spec), GFP_KERNEL);
19267 codec->spec = spec;
19269 board_config = snd_hda_check_board_config(codec, ALC680_MODEL_LAST,
19273 if (board_config < 0 || board_config >= ALC680_MODEL_LAST) {
19274 printk(KERN_INFO "hda_codec: %s: BIOS auto-probing.\n",
19276 board_config = ALC680_AUTO;
19279 if (board_config == ALC680_AUTO) {
19280 /* automatic parse from the BIOS config */
19281 err = alc680_parse_auto_config(codec);
19287 "hda_codec: Cannot set up configuration "
19288 "from BIOS. Using base mode...\n");
19289 board_config = ALC680_BASE;
19293 if (board_config != ALC680_AUTO)
19294 setup_preset(codec, &alc680_presets[board_config]);
19296 spec->stream_analog_playback = &alc680_pcm_analog_playback;
19297 spec->stream_analog_capture = &alc680_pcm_analog_capture;
19298 spec->stream_analog_alt_capture = &alc680_pcm_analog_alt_capture;
19299 spec->stream_digital_playback = &alc680_pcm_digital_playback;
19301 if (!spec->adc_nids) {
19302 spec->adc_nids = alc680_adc_nids;
19303 spec->num_adc_nids = ARRAY_SIZE(alc680_adc_nids);
19306 if (!spec->cap_mixer)
19307 set_capture_mixer(codec);
19309 spec->vmaster_nid = 0x02;
19311 codec->patch_ops = alc_patch_ops;
19312 if (board_config == ALC680_AUTO)
19313 spec->init_hook = alc680_auto_init;
19321 static struct hda_codec_preset snd_hda_preset_realtek[] = {
19322 { .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
19323 { .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
19324 { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
19325 { .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
19326 { .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
19327 { .id = 0x10ec0270, .name = "ALC270", .patch = patch_alc269 },
19328 { .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
19329 { .id = 0x10ec0275, .name = "ALC275", .patch = patch_alc269 },
19330 { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
19331 .patch = patch_alc861 },
19332 { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
19333 { .id = 0x10ec0861, .name = "ALC861", .patch = patch_alc861 },
19334 { .id = 0x10ec0862, .name = "ALC861-VD", .patch = patch_alc861vd },
19335 { .id = 0x10ec0662, .rev = 0x100002, .name = "ALC662 rev2",
19336 .patch = patch_alc882 },
19337 { .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1",
19338 .patch = patch_alc662 },
19339 { .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
19340 { .id = 0x10ec0665, .name = "ALC665", .patch = patch_alc662 },
19341 { .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 },
19342 { .id = 0x10ec0680, .name = "ALC680", .patch = patch_alc680 },
19343 { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
19344 { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
19345 { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
19346 { .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
19347 .patch = patch_alc882 },
19348 { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
19349 .patch = patch_alc882 },
19350 { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
19351 { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc882 },
19352 { .id = 0x10ec0888, .rev = 0x100101, .name = "ALC1200",
19353 .patch = patch_alc882 },
19354 { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc888 },
19355 { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc882 },
19356 { .id = 0x10ec0892, .name = "ALC892", .patch = patch_alc662 },
19357 {} /* terminator */
19360 MODULE_ALIAS("snd-hda-codec-id:10ec*");
19362 MODULE_LICENSE("GPL");
19363 MODULE_DESCRIPTION("Realtek HD-audio codec");
19365 static struct hda_codec_preset_list realtek_list = {
19366 .preset = snd_hda_preset_realtek,
19367 .owner = THIS_MODULE,
19370 static int __init patch_realtek_init(void)
19372 return snd_hda_add_codec_preset(&realtek_list);
19375 static void __exit patch_realtek_exit(void)
19377 snd_hda_delete_codec_preset(&realtek_list);
19380 module_init(patch_realtek_init)
19381 module_exit(patch_realtek_exit)