diff options
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 52 |
1 files changed, 51 insertions, 1 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index 4a40a056a8c6..f558b801c82d 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -177,7 +177,8 @@ enum { | |||
177 | ALC883_LAPTOP_EAPD, | 177 | ALC883_LAPTOP_EAPD, |
178 | ALC883_LENOVO_101E_2ch, | 178 | ALC883_LENOVO_101E_2ch, |
179 | ALC883_LENOVO_NB0763, | 179 | ALC883_LENOVO_NB0763, |
180 | ALC888_LENOVO_MS7195_DIG, | 180 | ALC888_LENOVO_MS7195_DIG, |
181 | ALC883_HAIER_W66, | ||
181 | ALC888_6ST_HP, | 182 | ALC888_6ST_HP, |
182 | ALC888_3ST_HP, | 183 | ALC888_3ST_HP, |
183 | ALC883_AUTO, | 184 | ALC883_AUTO, |
@@ -6567,6 +6568,19 @@ static struct hda_verb alc888_lenovo_ms7195_verbs[] = { | |||
6567 | { } /* end */ | 6568 | { } /* end */ |
6568 | }; | 6569 | }; |
6569 | 6570 | ||
6571 | static struct hda_verb alc883_haier_w66_verbs[] = { | ||
6572 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)}, | ||
6573 | {0x0c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)}, | ||
6574 | |||
6575 | {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT}, | ||
6576 | |||
6577 | {0x1b, AC_VERB_SET_CONNECT_SEL, 0x00}, | ||
6578 | {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
6579 | {0x1b, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN}, | ||
6580 | {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP}, | ||
6581 | { } /* end */ | ||
6582 | }; | ||
6583 | |||
6570 | static struct hda_verb alc888_6st_hp_verbs[] = { | 6584 | static struct hda_verb alc888_6st_hp_verbs[] = { |
6571 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front: output 0 (0x0c) */ | 6585 | {0x14, AC_VERB_SET_CONNECT_SEL, 0x00}, /* Front: output 0 (0x0c) */ |
6572 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x02}, /* Rear : output 2 (0x0e) */ | 6586 | {0x15, AC_VERB_SET_CONNECT_SEL, 0x02}, /* Rear : output 2 (0x0e) */ |
@@ -6685,6 +6699,25 @@ static void alc883_tagra_unsol_event(struct hda_codec *codec, unsigned int res) | |||
6685 | alc883_tagra_automute(codec); | 6699 | alc883_tagra_automute(codec); |
6686 | } | 6700 | } |
6687 | 6701 | ||
6702 | static void alc883_haier_w66_automute(struct hda_codec *codec) | ||
6703 | { | ||
6704 | unsigned int present; | ||
6705 | unsigned char bits; | ||
6706 | |||
6707 | present = snd_hda_codec_read(codec, 0x1b, 0, | ||
6708 | AC_VERB_GET_PIN_SENSE, 0) & 0x80000000; | ||
6709 | bits = present ? 0x80 : 0; | ||
6710 | snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0, | ||
6711 | 0x80, bits); | ||
6712 | } | ||
6713 | |||
6714 | static void alc883_haier_w66_unsol_event(struct hda_codec *codec, | ||
6715 | unsigned int res) | ||
6716 | { | ||
6717 | if ((res >> 26) == ALC880_HP_EVENT) | ||
6718 | alc883_haier_w66_automute(codec); | ||
6719 | } | ||
6720 | |||
6688 | static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec) | 6721 | static void alc883_lenovo_101e_ispeaker_automute(struct hda_codec *codec) |
6689 | { | 6722 | { |
6690 | unsigned int present; | 6723 | unsigned int present; |
@@ -6871,6 +6904,7 @@ static const char *alc883_models[ALC883_MODEL_LAST] = { | |||
6871 | [ALC883_LENOVO_101E_2ch] = "lenovo-101e", | 6904 | [ALC883_LENOVO_101E_2ch] = "lenovo-101e", |
6872 | [ALC883_LENOVO_NB0763] = "lenovo-nb0763", | 6905 | [ALC883_LENOVO_NB0763] = "lenovo-nb0763", |
6873 | [ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig", | 6906 | [ALC888_LENOVO_MS7195_DIG] = "lenovo-ms7195-dig", |
6907 | [ALC883_HAIER_W66] = "haier-w66", | ||
6874 | [ALC888_6ST_HP] = "6stack-hp", | 6908 | [ALC888_6ST_HP] = "6stack-hp", |
6875 | [ALC888_3ST_HP] = "3stack-hp", | 6909 | [ALC888_3ST_HP] = "3stack-hp", |
6876 | [ALC883_AUTO] = "auto", | 6910 | [ALC883_AUTO] = "auto", |
@@ -6915,6 +6949,8 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = { | |||
6915 | SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP), | 6949 | SND_PCI_QUIRK(0x103c, 0x2a60, "HP Lucknow", ALC888_3ST_HP), |
6916 | SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP), | 6950 | SND_PCI_QUIRK(0x103c, 0x2a4f, "HP Samba", ALC888_3ST_HP), |
6917 | SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2), | 6951 | SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2), |
6952 | SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66), | ||
6953 | SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763), | ||
6918 | {} | 6954 | {} |
6919 | }; | 6955 | }; |
6920 | 6956 | ||
@@ -7109,6 +7145,20 @@ static struct alc_config_preset alc883_presets[] = { | |||
7109 | .input_mux = &alc883_capture_source, | 7145 | .input_mux = &alc883_capture_source, |
7110 | .unsol_event = alc883_lenovo_ms7195_unsol_event, | 7146 | .unsol_event = alc883_lenovo_ms7195_unsol_event, |
7111 | .init_hook = alc888_lenovo_ms7195_front_automute, | 7147 | .init_hook = alc888_lenovo_ms7195_front_automute, |
7148 | }, | ||
7149 | [ALC883_HAIER_W66] = { | ||
7150 | .mixers = { alc883_tagra_2ch_mixer}, | ||
7151 | .init_verbs = { alc883_init_verbs, alc883_haier_w66_verbs}, | ||
7152 | .num_dacs = ARRAY_SIZE(alc883_dac_nids), | ||
7153 | .dac_nids = alc883_dac_nids, | ||
7154 | .dig_out_nid = ALC883_DIGOUT_NID, | ||
7155 | .num_adc_nids = ARRAY_SIZE(alc883_adc_nids), | ||
7156 | .adc_nids = alc883_adc_nids, | ||
7157 | .num_channel_mode = ARRAY_SIZE(alc883_3ST_2ch_modes), | ||
7158 | .channel_mode = alc883_3ST_2ch_modes, | ||
7159 | .input_mux = &alc883_capture_source, | ||
7160 | .unsol_event = alc883_haier_w66_unsol_event, | ||
7161 | .init_hook = alc883_haier_w66_automute, | ||
7112 | }, | 7162 | }, |
7113 | [ALC888_6ST_HP] = { | 7163 | [ALC888_6ST_HP] = { |
7114 | .mixers = { alc888_6st_hp_mixer, alc883_chmode_mixer }, | 7164 | .mixers = { alc888_6st_hp_mixer, alc883_chmode_mixer }, |