|
@@ -163,6 +163,10 @@ enum {
|
|
|
ALC662_LENOVO_101E,
|
|
|
ALC662_ASUS_EEEPC_P701,
|
|
|
ALC662_ASUS_EEEPC_EP20,
|
|
|
+ ALC663_ASUS_M51VA,
|
|
|
+ ALC663_ASUS_G71V,
|
|
|
+ ALC663_ASUS_H13,
|
|
|
+ ALC663_ASUS_G50V,
|
|
|
ALC662_AUTO,
|
|
|
ALC662_MODEL_LAST,
|
|
|
};
|
|
@@ -205,6 +209,7 @@ enum {
|
|
|
ALC883_MITAC,
|
|
|
ALC883_CLEVO_M720,
|
|
|
ALC883_FUJITSU_PI2515,
|
|
|
+ ALC883_3ST_6ch_INTEL,
|
|
|
ALC883_AUTO,
|
|
|
ALC883_MODEL_LAST,
|
|
|
};
|
|
@@ -280,6 +285,10 @@ struct alc_spec {
|
|
|
#ifdef CONFIG_SND_HDA_POWER_SAVE
|
|
|
struct hda_loopback_check loopback;
|
|
|
#endif
|
|
|
+
|
|
|
+ /* for PLL fix */
|
|
|
+ hda_nid_t pll_nid;
|
|
|
+ unsigned int pll_coef_idx, pll_coef_bit;
|
|
|
};
|
|
|
|
|
|
/*
|
|
@@ -747,6 +756,38 @@ static struct hda_verb alc_gpio3_init_verbs[] = {
|
|
|
{ }
|
|
|
};
|
|
|
|
|
|
+/*
|
|
|
+ * Fix hardware PLL issue
|
|
|
+ * On some codecs, the analog PLL gating control must be off while
|
|
|
+ * the default value is 1.
|
|
|
+ */
|
|
|
+static void alc_fix_pll(struct hda_codec *codec)
|
|
|
+{
|
|
|
+ struct alc_spec *spec = codec->spec;
|
|
|
+ unsigned int val;
|
|
|
+
|
|
|
+ if (!spec->pll_nid)
|
|
|
+ return;
|
|
|
+ snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
|
|
|
+ spec->pll_coef_idx);
|
|
|
+ val = snd_hda_codec_read(codec, spec->pll_nid, 0,
|
|
|
+ AC_VERB_GET_PROC_COEF, 0);
|
|
|
+ snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
|
|
|
+ spec->pll_coef_idx);
|
|
|
+ snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF,
|
|
|
+ val & ~(1 << spec->pll_coef_bit));
|
|
|
+}
|
|
|
+
|
|
|
+static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
|
|
|
+ unsigned int coef_idx, unsigned int coef_bit)
|
|
|
+{
|
|
|
+ struct alc_spec *spec = codec->spec;
|
|
|
+ spec->pll_nid = nid;
|
|
|
+ spec->pll_coef_idx = coef_idx;
|
|
|
+ spec->pll_coef_bit = coef_bit;
|
|
|
+ alc_fix_pll(codec);
|
|
|
+}
|
|
|
+
|
|
|
static void alc_sku_automute(struct hda_codec *codec)
|
|
|
{
|
|
|
struct alc_spec *spec = codec->spec;
|
|
@@ -776,6 +817,24 @@ static void alc_sku_unsol_event(struct hda_codec *codec, unsigned int res)
|
|
|
alc_sku_automute(codec);
|
|
|
}
|
|
|
|
|
|
+/* additional initialization for ALC888 variants */
|
|
|
+static void alc888_coef_init(struct hda_codec *codec)
|
|
|
+{
|
|
|
+ unsigned int tmp;
|
|
|
+
|
|
|
+ snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0);
|
|
|
+ tmp = snd_hda_codec_read(codec, 0x20, 0, AC_VERB_GET_PROC_COEF, 0);
|
|
|
+ snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 7);
|
|
|
+ if ((tmp & 0xf0) == 2)
|
|
|
+ /* alc888S-VC */
|
|
|
+ snd_hda_codec_read(codec, 0x20, 0,
|
|
|
+ AC_VERB_SET_PROC_COEF, 0x830);
|
|
|
+ else
|
|
|
+ /* alc888-VB */
|
|
|
+ snd_hda_codec_read(codec, 0x20, 0,
|
|
|
+ AC_VERB_SET_PROC_COEF, 0x3030);
|
|
|
+}
|
|
|
+
|
|
|
/* 32-bit subsystem ID for BIOS loading in HD Audio codec.
|
|
|
* 31 ~ 16 : Manufacture ID
|
|
|
* 15 ~ 8 : SKU ID
|
|
@@ -851,8 +910,10 @@ do_sku:
|
|
|
case 0x10ec0267:
|
|
|
case 0x10ec0268:
|
|
|
case 0x10ec0269:
|
|
|
+ case 0x10ec0660:
|
|
|
+ case 0x10ec0662:
|
|
|
+ case 0x10ec0663:
|
|
|
case 0x10ec0862:
|
|
|
- case 0x10ec0662:
|
|
|
case 0x10ec0889:
|
|
|
snd_hda_codec_write(codec, 0x14, 0,
|
|
|
AC_VERB_SET_EAPD_BTLENABLE, 2);
|
|
@@ -877,7 +938,6 @@ do_sku:
|
|
|
case 0x10ec0882:
|
|
|
case 0x10ec0883:
|
|
|
case 0x10ec0885:
|
|
|
- case 0x10ec0888:
|
|
|
case 0x10ec0889:
|
|
|
snd_hda_codec_write(codec, 0x20, 0,
|
|
|
AC_VERB_SET_COEF_INDEX, 7);
|
|
@@ -889,6 +949,9 @@ do_sku:
|
|
|
AC_VERB_SET_PROC_COEF,
|
|
|
tmp | 0x2010);
|
|
|
break;
|
|
|
+ case 0x10ec0888:
|
|
|
+ alc888_coef_init(codec);
|
|
|
+ break;
|
|
|
case 0x10ec0267:
|
|
|
case 0x10ec0268:
|
|
|
snd_hda_codec_write(codec, 0x20, 0,
|
|
@@ -2373,6 +2436,8 @@ static int alc_init(struct hda_codec *codec)
|
|
|
struct alc_spec *spec = codec->spec;
|
|
|
unsigned int i;
|
|
|
|
|
|
+ alc_fix_pll(codec);
|
|
|
+
|
|
|
for (i = 0; i < spec->num_init_verbs; i++)
|
|
|
snd_hda_sequence_write(codec, spec->init_verbs[i]);
|
|
|
|
|
@@ -3009,6 +3074,7 @@ static struct snd_pci_quirk alc880_cfg_tbl[] = {
|
|
|
SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_5ST_DIG),
|
|
|
SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_5ST_DIG),
|
|
|
SND_PCI_QUIRK(0x1734, 0x107c, "FSC F1734", ALC880_F1734),
|
|
|
+ SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FUJITSU),
|
|
|
SND_PCI_QUIRK(0x1734, 0x10ac, "FSC", ALC880_UNIWILL),
|
|
|
SND_PCI_QUIRK(0x1734, 0x10b0, "Fujitsu", ALC880_FUJITSU),
|
|
|
SND_PCI_QUIRK(0x1854, 0x0018, "LG LW20", ALC880_LG_LW),
|
|
@@ -5101,7 +5167,7 @@ static struct snd_pci_quirk alc260_cfg_tbl[] = {
|
|
|
SND_PCI_QUIRK(0x103c, 0x2808, "HP d5700", ALC260_HP_3013),
|
|
|
SND_PCI_QUIRK(0x103c, 0x280a, "HP d5750", ALC260_HP_3013),
|
|
|
SND_PCI_QUIRK(0x103c, 0x3010, "HP", ALC260_HP_3013),
|
|
|
- SND_PCI_QUIRK(0x103c, 0x3011, "HP", ALC260_HP),
|
|
|
+ SND_PCI_QUIRK(0x103c, 0x3011, "HP", ALC260_HP_3013),
|
|
|
SND_PCI_QUIRK(0x103c, 0x3012, "HP", ALC260_HP_3013),
|
|
|
SND_PCI_QUIRK(0x103c, 0x3013, "HP", ALC260_HP_3013),
|
|
|
SND_PCI_QUIRK(0x103c, 0x3014, "HP", ALC260_HP),
|
|
@@ -6127,6 +6193,7 @@ static struct snd_pci_quirk alc882_cfg_tbl[] = {
|
|
|
SND_PCI_QUIRK(0x1043, 0x817f, "Asus P5LD2", ALC882_6ST_DIG),
|
|
|
SND_PCI_QUIRK(0x1043, 0x81d8, "Asus P5WD", ALC882_6ST_DIG),
|
|
|
SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC882_6ST_DIG),
|
|
|
+ SND_PCI_QUIRK(0x106b, 0x00a0, "Apple iMac 24''", ALC885_IMAC24),
|
|
|
SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte P35 DS3R", ALC882_6ST_DIG),
|
|
|
SND_PCI_QUIRK(0x1462, 0x28fb, "Targa T8", ALC882_TARGA), /* MSI-1049 T8 */
|
|
|
SND_PCI_QUIRK(0x1462, 0x6668, "MSI", ALC882_6ST_DIG),
|
|
@@ -6353,7 +6420,9 @@ static void alc882_auto_init_analog_input(struct hda_codec *codec)
|
|
|
continue;
|
|
|
vref = PIN_IN;
|
|
|
if (1 /*i <= AUTO_PIN_FRONT_MIC*/) {
|
|
|
- if (snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP) &
|
|
|
+ unsigned int pincap;
|
|
|
+ pincap = snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP);
|
|
|
+ if ((pincap >> AC_PINCAP_VREF_SHIFT) &
|
|
|
AC_PINCAP_VREF_80)
|
|
|
vref = PIN_VREF80;
|
|
|
}
|
|
@@ -6450,8 +6519,9 @@ static int patch_alc882(struct hda_codec *codec)
|
|
|
case 0x106b1000: /* iMac 24 */
|
|
|
board_config = ALC885_IMAC24;
|
|
|
break;
|
|
|
- case 0x106b00a1: /* Macbook */
|
|
|
+ case 0x106b00a1: /* Macbook (might be wrong - PCI SSID?) */
|
|
|
case 0x106b2c00: /* Macbook Pro rev3 */
|
|
|
+ case 0x106b3600: /* Macbook 3.1 */
|
|
|
board_config = ALC885_MBP3;
|
|
|
break;
|
|
|
default:
|
|
@@ -6485,14 +6555,20 @@ static int patch_alc882(struct hda_codec *codec)
|
|
|
if (board_config != ALC882_AUTO)
|
|
|
setup_preset(spec, &alc882_presets[board_config]);
|
|
|
|
|
|
- spec->stream_name_analog = "ALC882 Analog";
|
|
|
+ if (codec->vendor_id == 0x10ec0885) {
|
|
|
+ spec->stream_name_analog = "ALC885 Analog";
|
|
|
+ spec->stream_name_digital = "ALC885 Digital";
|
|
|
+ } else {
|
|
|
+ spec->stream_name_analog = "ALC882 Analog";
|
|
|
+ spec->stream_name_digital = "ALC882 Digital";
|
|
|
+ }
|
|
|
+
|
|
|
spec->stream_analog_playback = &alc882_pcm_analog_playback;
|
|
|
spec->stream_analog_capture = &alc882_pcm_analog_capture;
|
|
|
/* FIXME: setup DAC5 */
|
|
|
/*spec->stream_analog_alt_playback = &alc880_pcm_analog_alt_playback;*/
|
|
|
spec->stream_analog_alt_capture = &alc880_pcm_analog_alt_capture;
|
|
|
|
|
|
- spec->stream_name_digital = "ALC882 Digital";
|
|
|
spec->stream_digital_playback = &alc882_pcm_digital_playback;
|
|
|
spec->stream_digital_capture = &alc882_pcm_digital_capture;
|
|
|
|
|
@@ -6569,6 +6645,16 @@ static struct hda_input_mux alc883_capture_source = {
|
|
|
},
|
|
|
};
|
|
|
|
|
|
+static struct hda_input_mux alc883_3stack_6ch_intel = {
|
|
|
+ .num_items = 4,
|
|
|
+ .items = {
|
|
|
+ { "Mic", 0x1 },
|
|
|
+ { "Front Mic", 0x0 },
|
|
|
+ { "Line", 0x2 },
|
|
|
+ { "CD", 0x4 },
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
static struct hda_input_mux alc883_lenovo_101e_capture_source = {
|
|
|
.num_items = 2,
|
|
|
.items = {
|
|
@@ -6649,6 +6735,48 @@ static struct hda_channel_mode alc883_3ST_6ch_modes[3] = {
|
|
|
{ 6, alc883_3ST_ch6_init },
|
|
|
};
|
|
|
|
|
|
+/*
|
|
|
+ * 2ch mode
|
|
|
+ */
|
|
|
+static struct hda_verb alc883_3ST_ch2_intel_init[] = {
|
|
|
+ { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
|
|
|
+ { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
|
|
|
+ { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN },
|
|
|
+ { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
|
|
|
+ { } /* end */
|
|
|
+};
|
|
|
+
|
|
|
+/*
|
|
|
+ * 4ch mode
|
|
|
+ */
|
|
|
+static struct hda_verb alc883_3ST_ch4_intel_init[] = {
|
|
|
+ { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80 },
|
|
|
+ { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE },
|
|
|
+ { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
|
|
|
+ { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
|
|
|
+ { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
|
|
|
+ { } /* end */
|
|
|
+};
|
|
|
+
|
|
|
+/*
|
|
|
+ * 6ch mode
|
|
|
+ */
|
|
|
+static struct hda_verb alc883_3ST_ch6_intel_init[] = {
|
|
|
+ { 0x19, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
|
|
|
+ { 0x19, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
|
|
|
+ { 0x19, AC_VERB_SET_CONNECT_SEL, 0x02 },
|
|
|
+ { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
|
|
|
+ { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE },
|
|
|
+ { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
|
|
|
+ { } /* end */
|
|
|
+};
|
|
|
+
|
|
|
+static struct hda_channel_mode alc883_3ST_6ch_intel_modes[3] = {
|
|
|
+ { 2, alc883_3ST_ch2_intel_init },
|
|
|
+ { 4, alc883_3ST_ch4_intel_init },
|
|
|
+ { 6, alc883_3ST_ch6_intel_init },
|
|
|
+};
|
|
|
+
|
|
|
/*
|
|
|
* 6ch mode
|
|
|
*/
|
|
@@ -6881,15 +7009,54 @@ static struct snd_kcontrol_new alc883_3ST_6ch_mixer[] = {
|
|
|
{ } /* end */
|
|
|
};
|
|
|
|
|
|
+static struct snd_kcontrol_new alc883_3ST_6ch_intel_mixer[] = {
|
|
|
+ HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
|
|
|
+ HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
|
|
|
+ HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
|
|
|
+ HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
|
|
|
+ HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0,
|
|
|
+ HDA_OUTPUT),
|
|
|
+ HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
|
|
|
+ HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
|
|
|
+ HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
|
|
|
+ HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
|
|
|
+ HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
|
|
|
+ HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
|
|
|
+ HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
|
|
|
+ HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
|
|
|
+ HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
|
|
|
+ HDA_CODEC_VOLUME("Mic Boost", 0x19, 0, HDA_INPUT),
|
|
|
+ HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
|
|
|
+ HDA_CODEC_VOLUME("Front Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
|
|
|
+ HDA_CODEC_VOLUME("Front Mic Boost", 0x18, 0, HDA_INPUT),
|
|
|
+ HDA_CODEC_MUTE("Front Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
|
|
|
+ HDA_CODEC_VOLUME("PC Speaker Playback Volume", 0x0b, 0x05, HDA_INPUT),
|
|
|
+ HDA_CODEC_MUTE("PC Speaker Playback Switch", 0x0b, 0x05, HDA_INPUT),
|
|
|
+ HDA_CODEC_VOLUME("Capture Volume", 0x08, 0x0, HDA_INPUT),
|
|
|
+ HDA_CODEC_MUTE("Capture Switch", 0x08, 0x0, HDA_INPUT),
|
|
|
+ HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x09, 0x0, HDA_INPUT),
|
|
|
+ HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x09, 0x0, HDA_INPUT),
|
|
|
+ {
|
|
|
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
|
|
+ /* .name = "Capture Source", */
|
|
|
+ .name = "Input Source",
|
|
|
+ .count = 2,
|
|
|
+ .info = alc883_mux_enum_info,
|
|
|
+ .get = alc883_mux_enum_get,
|
|
|
+ .put = alc883_mux_enum_put,
|
|
|
+ },
|
|
|
+ { } /* end */
|
|
|
+};
|
|
|
+
|
|
|
static struct snd_kcontrol_new alc883_fivestack_mixer[] = {
|
|
|
HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x0, HDA_OUTPUT),
|
|
|
- HDA_CODEC_MUTE("Front Playback Switch", 0x14, 0x0, HDA_OUTPUT),
|
|
|
+ HDA_BIND_MUTE("Front Playback Switch", 0x0c, 2, HDA_INPUT),
|
|
|
HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
|
|
|
- HDA_CODEC_MUTE("Surround Playback Switch", 0x15, 0x0, HDA_OUTPUT),
|
|
|
+ HDA_BIND_MUTE("Surround Playback Switch", 0x0d, 2, HDA_INPUT),
|
|
|
HDA_CODEC_VOLUME_MONO("Center Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
|
|
|
HDA_CODEC_VOLUME_MONO("LFE Playback Volume", 0x0e, 2, 0x0, HDA_OUTPUT),
|
|
|
- HDA_CODEC_MUTE_MONO("Center Playback Switch", 0x16, 1, 0x0, HDA_OUTPUT),
|
|
|
- HDA_CODEC_MUTE_MONO("LFE Playback Switch", 0x16, 2, 0x0, HDA_OUTPUT),
|
|
|
+ HDA_BIND_MUTE_MONO("Center Playback Switch", 0x0e, 1, 2, HDA_INPUT),
|
|
|
+ HDA_BIND_MUTE_MONO("LFE Playback Switch", 0x0e, 2, 2, HDA_INPUT),
|
|
|
HDA_CODEC_MUTE("Headphone Playback Switch", 0x1b, 0x0, HDA_OUTPUT),
|
|
|
HDA_CODEC_VOLUME("CD Playback Volume", 0x0b, 0x04, HDA_INPUT),
|
|
|
HDA_CODEC_MUTE("CD Playback Switch", 0x0b, 0x04, HDA_INPUT),
|
|
@@ -7729,6 +7896,7 @@ static const char *alc883_models[ALC883_MODEL_LAST] = {
|
|
|
[ALC883_MITAC] = "mitac",
|
|
|
[ALC883_CLEVO_M720] = "clevo-m720",
|
|
|
[ALC883_FUJITSU_PI2515] = "fujitsu-pi2515",
|
|
|
+ [ALC883_3ST_6ch_INTEL] = "3stack-6ch-intel",
|
|
|
[ALC883_AUTO] = "auto",
|
|
|
};
|
|
|
|
|
@@ -7786,6 +7954,8 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = {
|
|
|
SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2),
|
|
|
SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
|
|
|
SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
|
|
|
+ SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
|
|
|
+ SND_PCI_QUIRK(0x8086, 0x0002, "DG33FBC", ALC883_3ST_6ch_INTEL),
|
|
|
SND_PCI_QUIRK(0x8086, 0xd601, "D102GGC", ALC883_3ST_6ch),
|
|
|
{}
|
|
|
};
|
|
@@ -7824,6 +7994,18 @@ static struct alc_config_preset alc883_presets[] = {
|
|
|
.need_dac_fix = 1,
|
|
|
.input_mux = &alc883_capture_source,
|
|
|
},
|
|
|
+ [ALC883_3ST_6ch_INTEL] = {
|
|
|
+ .mixers = { alc883_3ST_6ch_intel_mixer, alc883_chmode_mixer },
|
|
|
+ .init_verbs = { alc883_init_verbs },
|
|
|
+ .num_dacs = ARRAY_SIZE(alc883_dac_nids),
|
|
|
+ .dac_nids = alc883_dac_nids,
|
|
|
+ .dig_out_nid = ALC883_DIGOUT_NID,
|
|
|
+ .dig_in_nid = ALC883_DIGIN_NID,
|
|
|
+ .num_channel_mode = ARRAY_SIZE(alc883_3ST_6ch_intel_modes),
|
|
|
+ .channel_mode = alc883_3ST_6ch_intel_modes,
|
|
|
+ .need_dac_fix = 1,
|
|
|
+ .input_mux = &alc883_3stack_6ch_intel,
|
|
|
+ },
|
|
|
[ALC883_6ST_DIG] = {
|
|
|
.mixers = { alc883_base_mixer, alc883_chmode_mixer },
|
|
|
.init_verbs = { alc883_init_verbs },
|
|
@@ -8145,6 +8327,8 @@ static int patch_alc883(struct hda_codec *codec)
|
|
|
|
|
|
codec->spec = spec;
|
|
|
|
|
|
+ alc_fix_pll_init(codec, 0x20, 0x0a, 10);
|
|
|
+
|
|
|
board_config = snd_hda_check_board_config(codec, ALC883_MODEL_LAST,
|
|
|
alc883_models,
|
|
|
alc883_cfg_tbl);
|
|
@@ -8171,12 +8355,25 @@ static int patch_alc883(struct hda_codec *codec)
|
|
|
if (board_config != ALC883_AUTO)
|
|
|
setup_preset(spec, &alc883_presets[board_config]);
|
|
|
|
|
|
- spec->stream_name_analog = "ALC883 Analog";
|
|
|
+ switch (codec->vendor_id) {
|
|
|
+ case 0x10ec0888:
|
|
|
+ spec->stream_name_analog = "ALC888 Analog";
|
|
|
+ spec->stream_name_digital = "ALC888 Digital";
|
|
|
+ break;
|
|
|
+ case 0x10ec0889:
|
|
|
+ spec->stream_name_analog = "ALC889 Analog";
|
|
|
+ spec->stream_name_digital = "ALC889 Digital";
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ spec->stream_name_analog = "ALC883 Analog";
|
|
|
+ spec->stream_name_digital = "ALC883 Digital";
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
spec->stream_analog_playback = &alc883_pcm_analog_playback;
|
|
|
spec->stream_analog_capture = &alc883_pcm_analog_capture;
|
|
|
spec->stream_analog_alt_capture = &alc883_pcm_analog_alt_capture;
|
|
|
|
|
|
- spec->stream_name_digital = "ALC883 Digital";
|
|
|
spec->stream_digital_playback = &alc883_pcm_digital_playback;
|
|
|
spec->stream_digital_capture = &alc883_pcm_digital_capture;
|
|
|
|
|
@@ -8189,6 +8386,9 @@ static int patch_alc883(struct hda_codec *codec)
|
|
|
codec->patch_ops = alc_patch_ops;
|
|
|
if (board_config == ALC883_AUTO)
|
|
|
spec->init_hook = alc883_auto_init;
|
|
|
+ else if (codec->vendor_id == 0x10ec0888)
|
|
|
+ spec->init_hook = alc888_coef_init;
|
|
|
+
|
|
|
#ifdef CONFIG_SND_HDA_POWER_SAVE
|
|
|
if (!spec->loopback.amplist)
|
|
|
spec->loopback.amplist = alc883_loopbacks;
|
|
@@ -9522,6 +9722,8 @@ static struct snd_pci_quirk alc262_cfg_tbl[] = {
|
|
|
SND_PCI_QUIRK(0x104d, 0x820f, "Sony ASSAMD", ALC262_SONY_ASSAMD),
|
|
|
SND_PCI_QUIRK(0x104d, 0x900e, "Sony ASSAMD", ALC262_SONY_ASSAMD),
|
|
|
SND_PCI_QUIRK(0x104d, 0x9015, "Sony 0x9015", ALC262_SONY_ASSAMD),
|
|
|
+ SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba dynabook SS RX1",
|
|
|
+ ALC262_SONY_ASSAMD),
|
|
|
SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu", ALC262_FUJITSU),
|
|
|
SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
|
|
|
SND_PCI_QUIRK(0x144d, 0xc032, "Samsung Q1 Ultra", ALC262_ULTRA),
|
|
@@ -9729,6 +9931,8 @@ static int patch_alc262(struct hda_codec *codec)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+ alc_fix_pll_init(codec, 0x20, 0x0a, 10);
|
|
|
+
|
|
|
board_config = snd_hda_check_board_config(codec, ALC262_MODEL_LAST,
|
|
|
alc262_models,
|
|
|
alc262_cfg_tbl);
|
|
@@ -10674,12 +10878,18 @@ static int patch_alc268(struct hda_codec *codec)
|
|
|
if (board_config != ALC268_AUTO)
|
|
|
setup_preset(spec, &alc268_presets[board_config]);
|
|
|
|
|
|
- spec->stream_name_analog = "ALC268 Analog";
|
|
|
+ if (codec->vendor_id == 0x10ec0267) {
|
|
|
+ spec->stream_name_analog = "ALC267 Analog";
|
|
|
+ spec->stream_name_digital = "ALC267 Digital";
|
|
|
+ } else {
|
|
|
+ spec->stream_name_analog = "ALC268 Analog";
|
|
|
+ spec->stream_name_digital = "ALC268 Digital";
|
|
|
+ }
|
|
|
+
|
|
|
spec->stream_analog_playback = &alc268_pcm_analog_playback;
|
|
|
spec->stream_analog_capture = &alc268_pcm_analog_capture;
|
|
|
spec->stream_analog_alt_capture = &alc268_pcm_analog_alt_capture;
|
|
|
|
|
|
- spec->stream_name_digital = "ALC268 Digital";
|
|
|
spec->stream_digital_playback = &alc268_pcm_digital_playback;
|
|
|
|
|
|
if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
|
|
@@ -11033,6 +11243,8 @@ static int patch_alc269(struct hda_codec *codec)
|
|
|
|
|
|
codec->spec = spec;
|
|
|
|
|
|
+ alc_fix_pll_init(codec, 0x20, 0x04, 15);
|
|
|
+
|
|
|
board_config = snd_hda_check_board_config(codec, ALC269_MODEL_LAST,
|
|
|
alc269_models,
|
|
|
alc269_cfg_tbl);
|
|
@@ -12631,6 +12843,12 @@ static struct hda_verb alc861vd_eapd_verbs[] = {
|
|
|
{ }
|
|
|
};
|
|
|
|
|
|
+static struct hda_verb alc660vd_eapd_verbs[] = {
|
|
|
+ {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
|
|
|
+ {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
|
|
|
+ { }
|
|
|
+};
|
|
|
+
|
|
|
static struct hda_verb alc861vd_lenovo_unsol_verbs[] = {
|
|
|
{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
|
|
|
{0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
|
|
@@ -12786,6 +13004,7 @@ static struct snd_pci_quirk alc861vd_cfg_tbl[] = {
|
|
|
SND_PCI_QUIRK(0x1565, 0x820d, "Biostar NF61S SE", ALC861VD_6ST_DIG),
|
|
|
SND_PCI_QUIRK(0x17aa, 0x2066, "Lenovo", ALC861VD_LENOVO),
|
|
|
SND_PCI_QUIRK(0x17aa, 0x3802, "Lenovo 3000 C200", ALC861VD_LENOVO),
|
|
|
+ SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 N200", ALC861VD_LENOVO),
|
|
|
SND_PCI_QUIRK(0x1849, 0x0862, "ASRock K8NF6G-VSTA", ALC861VD_6ST_DIG),
|
|
|
{}
|
|
|
};
|
|
@@ -13168,11 +13387,19 @@ static int patch_alc861vd(struct hda_codec *codec)
|
|
|
if (board_config != ALC861VD_AUTO)
|
|
|
setup_preset(spec, &alc861vd_presets[board_config]);
|
|
|
|
|
|
- spec->stream_name_analog = "ALC861VD Analog";
|
|
|
+ if (codec->vendor_id == 0x10ec0660) {
|
|
|
+ spec->stream_name_analog = "ALC660-VD Analog";
|
|
|
+ spec->stream_name_digital = "ALC660-VD Digital";
|
|
|
+ /* always turn on EAPD */
|
|
|
+ spec->init_verbs[spec->num_init_verbs++] = alc660vd_eapd_verbs;
|
|
|
+ } else {
|
|
|
+ spec->stream_name_analog = "ALC861VD Analog";
|
|
|
+ spec->stream_name_digital = "ALC861VD Digital";
|
|
|
+ }
|
|
|
+
|
|
|
spec->stream_analog_playback = &alc861vd_pcm_analog_playback;
|
|
|
spec->stream_analog_capture = &alc861vd_pcm_analog_capture;
|
|
|
|
|
|
- spec->stream_name_digital = "ALC861VD Digital";
|
|
|
spec->stream_digital_playback = &alc861vd_pcm_digital_playback;
|
|
|
spec->stream_digital_capture = &alc861vd_pcm_digital_capture;
|
|
|
|
|
@@ -13251,6 +13478,23 @@ static struct hda_input_mux alc662_eeepc_capture_source = {
|
|
|
},
|
|
|
};
|
|
|
|
|
|
+static struct hda_input_mux alc663_capture_source = {
|
|
|
+ .num_items = 3,
|
|
|
+ .items = {
|
|
|
+ { "Mic", 0x0 },
|
|
|
+ { "Front Mic", 0x1 },
|
|
|
+ { "Line", 0x2 },
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct hda_input_mux alc663_m51va_capture_source = {
|
|
|
+ .num_items = 2,
|
|
|
+ .items = {
|
|
|
+ { "Ext-Mic", 0x0 },
|
|
|
+ { "D-Mic", 0x9 },
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
#define alc662_mux_enum_info alc_mux_enum_info
|
|
|
#define alc662_mux_enum_get alc_mux_enum_get
|
|
|
#define alc662_mux_enum_put alc882_mux_enum_put
|
|
@@ -13431,6 +13675,44 @@ static struct snd_kcontrol_new alc662_eeepc_ep20_mixer[] = {
|
|
|
{ } /* end */
|
|
|
};
|
|
|
|
|
|
+static struct snd_kcontrol_new alc663_m51va_mixer[] = {
|
|
|
+ HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
|
|
|
+ HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
|
|
|
+ HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
|
|
|
+ HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
|
|
|
+ HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
|
|
|
+ HDA_CODEC_MUTE("DMic Playback Switch", 0x23, 0x9, HDA_INPUT),
|
|
|
+ { } /* end */
|
|
|
+};
|
|
|
+
|
|
|
+static struct snd_kcontrol_new alc663_g71v_mixer[] = {
|
|
|
+ HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
|
|
|
+ HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
|
|
|
+ HDA_CODEC_VOLUME("Front Playback Volume", 0x03, 0x0, HDA_OUTPUT),
|
|
|
+ HDA_CODEC_MUTE("Front Playback Switch", 0x15, 0x0, HDA_OUTPUT),
|
|
|
+ HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
|
|
|
+
|
|
|
+ HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
|
|
|
+ HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
|
|
|
+ HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
|
|
|
+ HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
|
|
|
+ { } /* end */
|
|
|
+};
|
|
|
+
|
|
|
+static struct snd_kcontrol_new alc663_g50v_mixer[] = {
|
|
|
+ HDA_CODEC_VOLUME("Speaker Playback Volume", 0x02, 0x0, HDA_OUTPUT),
|
|
|
+ HDA_CODEC_MUTE("Speaker Playback Switch", 0x14, 0x0, HDA_OUTPUT),
|
|
|
+ HDA_CODEC_MUTE("Headphone Playback Switch", 0x21, 0x0, HDA_OUTPUT),
|
|
|
+
|
|
|
+ HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
|
|
|
+ HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
|
|
|
+ HDA_CODEC_VOLUME("i-Mic Playback Volume", 0x0b, 0x1, HDA_INPUT),
|
|
|
+ HDA_CODEC_MUTE("i-Mic Playback Switch", 0x0b, 0x1, HDA_INPUT),
|
|
|
+ HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
|
|
|
+ HDA_CODEC_MUTE("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
|
|
|
+ { } /* end */
|
|
|
+};
|
|
|
+
|
|
|
static struct snd_kcontrol_new alc662_chmode_mixer[] = {
|
|
|
{
|
|
|
.iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
|
@@ -13501,6 +13783,11 @@ static struct hda_verb alc662_init_verbs[] = {
|
|
|
{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
|
|
|
{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(2)},
|
|
|
{0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(4)},
|
|
|
+
|
|
|
+ /* always trun on EAPD */
|
|
|
+ {0x14, AC_VERB_SET_EAPD_BTLENABLE, 2},
|
|
|
+ {0x15, AC_VERB_SET_EAPD_BTLENABLE, 2},
|
|
|
+
|
|
|
{ }
|
|
|
};
|
|
|
|
|
@@ -13571,6 +13858,43 @@ static struct hda_verb alc662_auto_init_verbs[] = {
|
|
|
{ }
|
|
|
};
|
|
|
|
|
|
+static struct hda_verb alc663_m51va_init_verbs[] = {
|
|
|
+ {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
|
|
|
+ {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
|
|
|
+ {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
|
|
|
+
|
|
|
+ {0x23, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(9)},
|
|
|
+
|
|
|
+ {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
|
|
|
+ {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
|
|
|
+ {}
|
|
|
+};
|
|
|
+
|
|
|
+static struct hda_verb alc663_g71v_init_verbs[] = {
|
|
|
+ {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
|
|
|
+ /* {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE}, */
|
|
|
+ /* {0x15, AC_VERB_SET_CONNECT_SEL, 0x01}, */ /* Headphone */
|
|
|
+
|
|
|
+ {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
|
|
|
+ {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
|
|
|
+ {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
|
|
|
+
|
|
|
+ {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_FRONT_EVENT},
|
|
|
+ {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_MIC_EVENT},
|
|
|
+ {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN|ALC880_HP_EVENT},
|
|
|
+ {}
|
|
|
+};
|
|
|
+
|
|
|
+static struct hda_verb alc663_g50v_init_verbs[] = {
|
|
|
+ {0x21, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
|
|
|
+ {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
|
|
|
+ {0x21, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Headphone */
|
|
|
+
|
|
|
+ {0x18, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_MIC_EVENT},
|
|
|
+ {0x21, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
|
|
|
+ {}
|
|
|
+};
|
|
|
+
|
|
|
/* capture mixer elements */
|
|
|
static struct snd_kcontrol_new alc662_capture_mixer[] = {
|
|
|
HDA_CODEC_VOLUME("Capture Volume", 0x09, 0x0, HDA_INPUT),
|
|
@@ -13692,6 +14016,125 @@ static void alc662_eeepc_ep20_inithook(struct hda_codec *codec)
|
|
|
alc662_eeepc_ep20_automute(codec);
|
|
|
}
|
|
|
|
|
|
+static void alc663_m51va_speaker_automute(struct hda_codec *codec)
|
|
|
+{
|
|
|
+ unsigned int present;
|
|
|
+ unsigned char bits;
|
|
|
+
|
|
|
+ present = snd_hda_codec_read(codec, 0x21, 0,
|
|
|
+ AC_VERB_GET_PIN_SENSE, 0)
|
|
|
+ & AC_PINSENSE_PRESENCE;
|
|
|
+ bits = present ? HDA_AMP_MUTE : 0;
|
|
|
+ snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
|
|
|
+ HDA_AMP_MUTE, bits);
|
|
|
+}
|
|
|
+
|
|
|
+static void alc663_m51va_mic_automute(struct hda_codec *codec)
|
|
|
+{
|
|
|
+ unsigned int present;
|
|
|
+
|
|
|
+ present = snd_hda_codec_read(codec, 0x18, 0,
|
|
|
+ AC_VERB_GET_PIN_SENSE, 0)
|
|
|
+ & AC_PINSENSE_PRESENCE;
|
|
|
+ snd_hda_codec_write_cache(codec, 0x22, 0, AC_VERB_SET_AMP_GAIN_MUTE,
|
|
|
+ 0x7000 | (0x00 << 8) | (present ? 0 : 0x80));
|
|
|
+ snd_hda_codec_write_cache(codec, 0x23, 0, AC_VERB_SET_AMP_GAIN_MUTE,
|
|
|
+ 0x7000 | (0x00 << 8) | (present ? 0 : 0x80));
|
|
|
+ snd_hda_codec_write_cache(codec, 0x22, 0, AC_VERB_SET_AMP_GAIN_MUTE,
|
|
|
+ 0x7000 | (0x09 << 8) | (present ? 0x80 : 0));
|
|
|
+ snd_hda_codec_write_cache(codec, 0x23, 0, AC_VERB_SET_AMP_GAIN_MUTE,
|
|
|
+ 0x7000 | (0x09 << 8) | (present ? 0x80 : 0));
|
|
|
+}
|
|
|
+
|
|
|
+static void alc663_m51va_unsol_event(struct hda_codec *codec,
|
|
|
+ unsigned int res)
|
|
|
+{
|
|
|
+ switch (res >> 26) {
|
|
|
+ case ALC880_HP_EVENT:
|
|
|
+ alc663_m51va_speaker_automute(codec);
|
|
|
+ break;
|
|
|
+ case ALC880_MIC_EVENT:
|
|
|
+ alc663_m51va_mic_automute(codec);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void alc663_m51va_inithook(struct hda_codec *codec)
|
|
|
+{
|
|
|
+ alc663_m51va_speaker_automute(codec);
|
|
|
+ alc663_m51va_mic_automute(codec);
|
|
|
+}
|
|
|
+
|
|
|
+static void alc663_g71v_hp_automute(struct hda_codec *codec)
|
|
|
+{
|
|
|
+ unsigned int present;
|
|
|
+ unsigned char bits;
|
|
|
+
|
|
|
+ present = snd_hda_codec_read(codec, 0x21, 0,
|
|
|
+ AC_VERB_GET_PIN_SENSE, 0)
|
|
|
+ & AC_PINSENSE_PRESENCE;
|
|
|
+ bits = present ? HDA_AMP_MUTE : 0;
|
|
|
+ snd_hda_codec_amp_stereo(codec, 0x15, HDA_OUTPUT, 0,
|
|
|
+ HDA_AMP_MUTE, bits);
|
|
|
+ snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
|
|
|
+ HDA_AMP_MUTE, bits);
|
|
|
+}
|
|
|
+
|
|
|
+static void alc663_g71v_front_automute(struct hda_codec *codec)
|
|
|
+{
|
|
|
+ unsigned int present;
|
|
|
+ unsigned char bits;
|
|
|
+
|
|
|
+ present = snd_hda_codec_read(codec, 0x15, 0,
|
|
|
+ AC_VERB_GET_PIN_SENSE, 0)
|
|
|
+ & AC_PINSENSE_PRESENCE;
|
|
|
+ bits = present ? HDA_AMP_MUTE : 0;
|
|
|
+ snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
|
|
|
+ HDA_AMP_MUTE, bits);
|
|
|
+}
|
|
|
+
|
|
|
+static void alc663_g71v_unsol_event(struct hda_codec *codec,
|
|
|
+ unsigned int res)
|
|
|
+{
|
|
|
+ switch (res >> 26) {
|
|
|
+ case ALC880_HP_EVENT:
|
|
|
+ alc663_g71v_hp_automute(codec);
|
|
|
+ break;
|
|
|
+ case ALC880_FRONT_EVENT:
|
|
|
+ alc663_g71v_front_automute(codec);
|
|
|
+ break;
|
|
|
+ case ALC880_MIC_EVENT:
|
|
|
+ alc662_eeepc_mic_automute(codec);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void alc663_g71v_inithook(struct hda_codec *codec)
|
|
|
+{
|
|
|
+ alc663_g71v_front_automute(codec);
|
|
|
+ alc663_g71v_hp_automute(codec);
|
|
|
+ alc662_eeepc_mic_automute(codec);
|
|
|
+}
|
|
|
+
|
|
|
+static void alc663_g50v_unsol_event(struct hda_codec *codec,
|
|
|
+ unsigned int res)
|
|
|
+{
|
|
|
+ switch (res >> 26) {
|
|
|
+ case ALC880_HP_EVENT:
|
|
|
+ alc663_m51va_speaker_automute(codec);
|
|
|
+ break;
|
|
|
+ case ALC880_MIC_EVENT:
|
|
|
+ alc662_eeepc_mic_automute(codec);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+static void alc663_g50v_inithook(struct hda_codec *codec)
|
|
|
+{
|
|
|
+ alc663_m51va_speaker_automute(codec);
|
|
|
+ alc662_eeepc_mic_automute(codec);
|
|
|
+}
|
|
|
+
|
|
|
#ifdef CONFIG_SND_HDA_POWER_SAVE
|
|
|
#define alc662_loopbacks alc880_loopbacks
|
|
|
#endif
|
|
@@ -13714,14 +14157,24 @@ static const char *alc662_models[ALC662_MODEL_LAST] = {
|
|
|
[ALC662_LENOVO_101E] = "lenovo-101e",
|
|
|
[ALC662_ASUS_EEEPC_P701] = "eeepc-p701",
|
|
|
[ALC662_ASUS_EEEPC_EP20] = "eeepc-ep20",
|
|
|
+ [ALC663_ASUS_M51VA] = "m51va",
|
|
|
+ [ALC663_ASUS_G71V] = "g71v",
|
|
|
+ [ALC663_ASUS_H13] = "h13",
|
|
|
+ [ALC663_ASUS_G50V] = "g50v",
|
|
|
[ALC662_AUTO] = "auto",
|
|
|
};
|
|
|
|
|
|
static struct snd_pci_quirk alc662_cfg_tbl[] = {
|
|
|
+ SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS G71V", ALC663_ASUS_G71V),
|
|
|
+ SND_PCI_QUIRK(0x1043, 0x1878, "ASUS M51VA", ALC663_ASUS_M51VA),
|
|
|
+ SND_PCI_QUIRK(0x1043, 0x19a3, "ASUS M51VA", ALC663_ASUS_G50V),
|
|
|
SND_PCI_QUIRK(0x1043, 0x8290, "ASUS P5GC-MX", ALC662_3ST_6ch_DIG),
|
|
|
SND_PCI_QUIRK(0x1043, 0x82a1, "ASUS Eeepc", ALC662_ASUS_EEEPC_P701),
|
|
|
SND_PCI_QUIRK(0x1043, 0x82d1, "ASUS Eeepc EP20", ALC662_ASUS_EEEPC_EP20),
|
|
|
SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo", ALC662_LENOVO_101E),
|
|
|
+ SND_PCI_QUIRK(0x1854, 0x2000, "ASUS H13-2000", ALC663_ASUS_H13),
|
|
|
+ SND_PCI_QUIRK(0x1854, 0x2001, "ASUS H13-2001", ALC663_ASUS_H13),
|
|
|
+ SND_PCI_QUIRK(0x1854, 0x2002, "ASUS H13-2002", ALC663_ASUS_H13),
|
|
|
{}
|
|
|
};
|
|
|
|
|
@@ -13809,7 +14262,53 @@ static struct alc_config_preset alc662_presets[] = {
|
|
|
.unsol_event = alc662_eeepc_ep20_unsol_event,
|
|
|
.init_hook = alc662_eeepc_ep20_inithook,
|
|
|
},
|
|
|
-
|
|
|
+ [ALC663_ASUS_M51VA] = {
|
|
|
+ .mixers = { alc663_m51va_mixer, alc662_capture_mixer},
|
|
|
+ .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
|
|
|
+ .num_dacs = ARRAY_SIZE(alc662_dac_nids),
|
|
|
+ .dac_nids = alc662_dac_nids,
|
|
|
+ .dig_out_nid = ALC662_DIGOUT_NID,
|
|
|
+ .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
|
|
|
+ .channel_mode = alc662_3ST_2ch_modes,
|
|
|
+ .input_mux = &alc663_m51va_capture_source,
|
|
|
+ .unsol_event = alc663_m51va_unsol_event,
|
|
|
+ .init_hook = alc663_m51va_inithook,
|
|
|
+ },
|
|
|
+ [ALC663_ASUS_G71V] = {
|
|
|
+ .mixers = { alc663_g71v_mixer, alc662_capture_mixer},
|
|
|
+ .init_verbs = { alc662_init_verbs, alc663_g71v_init_verbs },
|
|
|
+ .num_dacs = ARRAY_SIZE(alc662_dac_nids),
|
|
|
+ .dac_nids = alc662_dac_nids,
|
|
|
+ .dig_out_nid = ALC662_DIGOUT_NID,
|
|
|
+ .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
|
|
|
+ .channel_mode = alc662_3ST_2ch_modes,
|
|
|
+ .input_mux = &alc662_eeepc_capture_source,
|
|
|
+ .unsol_event = alc663_g71v_unsol_event,
|
|
|
+ .init_hook = alc663_g71v_inithook,
|
|
|
+ },
|
|
|
+ [ALC663_ASUS_H13] = {
|
|
|
+ .mixers = { alc663_m51va_mixer, alc662_capture_mixer},
|
|
|
+ .init_verbs = { alc662_init_verbs, alc663_m51va_init_verbs },
|
|
|
+ .num_dacs = ARRAY_SIZE(alc662_dac_nids),
|
|
|
+ .dac_nids = alc662_dac_nids,
|
|
|
+ .num_channel_mode = ARRAY_SIZE(alc662_3ST_2ch_modes),
|
|
|
+ .channel_mode = alc662_3ST_2ch_modes,
|
|
|
+ .input_mux = &alc663_m51va_capture_source,
|
|
|
+ .unsol_event = alc663_m51va_unsol_event,
|
|
|
+ .init_hook = alc663_m51va_inithook,
|
|
|
+ },
|
|
|
+ [ALC663_ASUS_G50V] = {
|
|
|
+ .mixers = { alc663_g50v_mixer, alc662_capture_mixer},
|
|
|
+ .init_verbs = { alc662_init_verbs, alc663_g50v_init_verbs },
|
|
|
+ .num_dacs = ARRAY_SIZE(alc662_dac_nids),
|
|
|
+ .dac_nids = alc662_dac_nids,
|
|
|
+ .dig_out_nid = ALC662_DIGOUT_NID,
|
|
|
+ .num_channel_mode = ARRAY_SIZE(alc662_3ST_6ch_modes),
|
|
|
+ .channel_mode = alc662_3ST_6ch_modes,
|
|
|
+ .input_mux = &alc663_capture_source,
|
|
|
+ .unsol_event = alc663_g50v_unsol_event,
|
|
|
+ .init_hook = alc663_g50v_inithook,
|
|
|
+ },
|
|
|
};
|
|
|
|
|
|
|
|
@@ -14082,6 +14581,8 @@ static int patch_alc662(struct hda_codec *codec)
|
|
|
|
|
|
codec->spec = spec;
|
|
|
|
|
|
+ alc_fix_pll_init(codec, 0x20, 0x04, 15);
|
|
|
+
|
|
|
board_config = snd_hda_check_board_config(codec, ALC662_MODEL_LAST,
|
|
|
alc662_models,
|
|
|
alc662_cfg_tbl);
|
|
@@ -14108,11 +14609,17 @@ static int patch_alc662(struct hda_codec *codec)
|
|
|
if (board_config != ALC662_AUTO)
|
|
|
setup_preset(spec, &alc662_presets[board_config]);
|
|
|
|
|
|
- spec->stream_name_analog = "ALC662 Analog";
|
|
|
+ if (codec->vendor_id == 0x10ec0663) {
|
|
|
+ spec->stream_name_analog = "ALC663 Analog";
|
|
|
+ spec->stream_name_digital = "ALC663 Digital";
|
|
|
+ } else {
|
|
|
+ spec->stream_name_analog = "ALC662 Analog";
|
|
|
+ spec->stream_name_digital = "ALC662 Digital";
|
|
|
+ }
|
|
|
+
|
|
|
spec->stream_analog_playback = &alc662_pcm_analog_playback;
|
|
|
spec->stream_analog_capture = &alc662_pcm_analog_capture;
|
|
|
|
|
|
- spec->stream_name_digital = "ALC662 Digital";
|
|
|
spec->stream_digital_playback = &alc662_pcm_digital_playback;
|
|
|
spec->stream_digital_capture = &alc662_pcm_digital_capture;
|
|
|
|
|
@@ -14151,6 +14658,7 @@ struct hda_codec_preset snd_hda_preset_realtek[] = {
|
|
|
.patch = patch_alc883 },
|
|
|
{ .id = 0x10ec0662, .rev = 0x100101, .name = "ALC662 rev1",
|
|
|
.patch = patch_alc662 },
|
|
|
+ { .id = 0x10ec0663, .name = "ALC663", .patch = patch_alc662 },
|
|
|
{ .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
|
|
|
{ .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
|
|
|
{ .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc883 },
|