|
@@ -6564,6 +6564,30 @@ static void alc662_fixup_led_gpio1(struct hda_codec *codec,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void alc662_usi_automute_hook(struct hda_codec *codec,
|
|
|
|
+ struct hda_jack_callback *jack)
|
|
|
|
+{
|
|
|
|
+ struct alc_spec *spec = codec->spec;
|
|
|
|
+ int vref;
|
|
|
|
+ msleep(200);
|
|
|
|
+ snd_hda_gen_hp_automute(codec, jack);
|
|
|
|
+
|
|
|
|
+ vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
|
|
|
|
+ msleep(100);
|
|
|
|
+ snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
|
|
|
|
+ vref);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void alc662_fixup_usi_headset_mic(struct hda_codec *codec,
|
|
|
|
+ const struct hda_fixup *fix, int action)
|
|
|
|
+{
|
|
|
|
+ struct alc_spec *spec = codec->spec;
|
|
|
|
+ if (action == HDA_FIXUP_ACT_PRE_PROBE) {
|
|
|
|
+ spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
|
|
|
|
+ spec->gen.hp_automute_hook = alc662_usi_automute_hook;
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
static struct coef_fw alc668_coefs[] = {
|
|
static struct coef_fw alc668_coefs[] = {
|
|
WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03, 0x0),
|
|
WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03, 0x0),
|
|
WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06, 0x0), WRITE_COEF(0x07, 0x0f80),
|
|
WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06, 0x0), WRITE_COEF(0x07, 0x0f80),
|
|
@@ -6629,6 +6653,8 @@ enum {
|
|
ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
|
|
ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
|
|
ALC662_FIXUP_ACER_VERITON,
|
|
ALC662_FIXUP_ACER_VERITON,
|
|
ALC892_FIXUP_ASROCK_MOBO,
|
|
ALC892_FIXUP_ASROCK_MOBO,
|
|
|
|
+ ALC662_FIXUP_USI_FUNC,
|
|
|
|
+ ALC662_FIXUP_USI_HEADSET_MODE,
|
|
};
|
|
};
|
|
|
|
|
|
static const struct hda_fixup alc662_fixups[] = {
|
|
static const struct hda_fixup alc662_fixups[] = {
|
|
@@ -6913,6 +6939,20 @@ static const struct hda_fixup alc662_fixups[] = {
|
|
{ }
|
|
{ }
|
|
}
|
|
}
|
|
},
|
|
},
|
|
|
|
+ [ALC662_FIXUP_USI_FUNC] = {
|
|
|
|
+ .type = HDA_FIXUP_FUNC,
|
|
|
|
+ .v.func = alc662_fixup_usi_headset_mic,
|
|
|
|
+ },
|
|
|
|
+ [ALC662_FIXUP_USI_HEADSET_MODE] = {
|
|
|
|
+ .type = HDA_FIXUP_PINS,
|
|
|
|
+ .v.pins = (const struct hda_pintbl[]) {
|
|
|
|
+ { 0x19, 0x02a1913c }, /* use as headset mic, without its own jack detect */
|
|
|
|
+ { 0x18, 0x01a1903d },
|
|
|
|
+ { }
|
|
|
|
+ },
|
|
|
|
+ .chained = true,
|
|
|
|
+ .chain_id = ALC662_FIXUP_USI_FUNC
|
|
|
|
+ },
|
|
};
|
|
};
|
|
|
|
|
|
static const struct snd_pci_quirk alc662_fixup_tbl[] = {
|
|
static const struct snd_pci_quirk alc662_fixup_tbl[] = {
|
|
@@ -6948,6 +6988,7 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = {
|
|
SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
|
|
SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
|
|
SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
|
|
SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
|
|
SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
|
|
SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
|
|
|
|
+ SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE),
|
|
SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
|
|
SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
|
|
SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
|
|
SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
|
|
SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),
|
|
SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),
|