|
|
|
|
@@ -1046,6 +1046,7 @@ enum {
|
|
|
|
|
ALC880_FIXUP_UNIWILL,
|
|
|
|
|
ALC880_FIXUP_UNIWILL_DIG,
|
|
|
|
|
ALC880_FIXUP_Z71V,
|
|
|
|
|
ALC880_FIXUP_ASUS_W5A,
|
|
|
|
|
ALC880_FIXUP_3ST_BASE,
|
|
|
|
|
ALC880_FIXUP_3ST,
|
|
|
|
|
ALC880_FIXUP_3ST_DIG,
|
|
|
|
|
@@ -1216,6 +1217,26 @@ static const struct hda_fixup alc880_fixups[] = {
|
|
|
|
|
{ }
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
[ALC880_FIXUP_ASUS_W5A] = {
|
|
|
|
|
.type = HDA_FIXUP_PINS,
|
|
|
|
|
.v.pins = (const struct hda_pintbl[]) {
|
|
|
|
|
/* set up the whole pins as BIOS is utterly broken */
|
|
|
|
|
{ 0x14, 0x0121411f }, /* HP */
|
|
|
|
|
{ 0x15, 0x411111f0 }, /* N/A */
|
|
|
|
|
{ 0x16, 0x411111f0 }, /* N/A */
|
|
|
|
|
{ 0x17, 0x411111f0 }, /* N/A */
|
|
|
|
|
{ 0x18, 0x90a60160 }, /* mic */
|
|
|
|
|
{ 0x19, 0x411111f0 }, /* N/A */
|
|
|
|
|
{ 0x1a, 0x411111f0 }, /* N/A */
|
|
|
|
|
{ 0x1b, 0x411111f0 }, /* N/A */
|
|
|
|
|
{ 0x1c, 0x411111f0 }, /* N/A */
|
|
|
|
|
{ 0x1d, 0x411111f0 }, /* N/A */
|
|
|
|
|
{ 0x1e, 0xb743111e }, /* SPDIF out */
|
|
|
|
|
{ }
|
|
|
|
|
},
|
|
|
|
|
.chained = true,
|
|
|
|
|
.chain_id = ALC880_FIXUP_GPIO1,
|
|
|
|
|
},
|
|
|
|
|
[ALC880_FIXUP_3ST_BASE] = {
|
|
|
|
|
.type = HDA_FIXUP_PINS,
|
|
|
|
|
.v.pins = (const struct hda_pintbl[]) {
|
|
|
|
|
@@ -1337,6 +1358,7 @@ static const struct hda_fixup alc880_fixups[] = {
|
|
|
|
|
|
|
|
|
|
static const struct snd_pci_quirk alc880_fixup_tbl[] = {
|
|
|
|
|
SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_FIXUP_W810),
|
|
|
|
|
SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS W5A", ALC880_FIXUP_ASUS_W5A),
|
|
|
|
|
SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_FIXUP_Z71V),
|
|
|
|
|
SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_FIXUP_GPIO1),
|
|
|
|
|
SND_PCI_QUIRK(0x1558, 0x5401, "Clevo GPIO2", ALC880_FIXUP_GPIO2),
|
|
|
|
|
@@ -1482,6 +1504,7 @@ enum {
|
|
|
|
|
ALC260_FIXUP_KN1,
|
|
|
|
|
ALC260_FIXUP_FSC_S7020,
|
|
|
|
|
ALC260_FIXUP_FSC_S7020_JWSE,
|
|
|
|
|
ALC260_FIXUP_VAIO_PINS,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static void alc260_gpio1_automute(struct hda_codec *codec)
|
|
|
|
|
@@ -1622,6 +1645,24 @@ static const struct hda_fixup alc260_fixups[] = {
|
|
|
|
|
.chained = true,
|
|
|
|
|
.chain_id = ALC260_FIXUP_FSC_S7020,
|
|
|
|
|
},
|
|
|
|
|
[ALC260_FIXUP_VAIO_PINS] = {
|
|
|
|
|
.type = HDA_FIXUP_PINS,
|
|
|
|
|
.v.pins = (const struct hda_pintbl[]) {
|
|
|
|
|
/* Pin configs are missing completely on some VAIOs */
|
|
|
|
|
{ 0x0f, 0x01211020 },
|
|
|
|
|
{ 0x10, 0x0001003f },
|
|
|
|
|
{ 0x11, 0x411111f0 },
|
|
|
|
|
{ 0x12, 0x01a15930 },
|
|
|
|
|
{ 0x13, 0x411111f0 },
|
|
|
|
|
{ 0x14, 0x411111f0 },
|
|
|
|
|
{ 0x15, 0x411111f0 },
|
|
|
|
|
{ 0x16, 0x411111f0 },
|
|
|
|
|
{ 0x17, 0x411111f0 },
|
|
|
|
|
{ 0x18, 0x411111f0 },
|
|
|
|
|
{ 0x19, 0x411111f0 },
|
|
|
|
|
{ }
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const struct snd_pci_quirk alc260_fixup_tbl[] = {
|
|
|
|
|
@@ -1630,6 +1671,8 @@ static const struct snd_pci_quirk alc260_fixup_tbl[] = {
|
|
|
|
|
SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_FIXUP_GPIO1),
|
|
|
|
|
SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750),
|
|
|
|
|
SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900),
|
|
|
|
|
SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_FIXUP_VAIO_PINS),
|
|
|
|
|
SND_PCI_QUIRK(0x104d, 0x81e2, "Sony VAIO TX", ALC260_FIXUP_HP_PIN_0F),
|
|
|
|
|
SND_PCI_QUIRK(0x10cf, 0x1326, "FSC LifeBook S7020", ALC260_FIXUP_FSC_S7020),
|
|
|
|
|
SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1),
|
|
|
|
|
SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1),
|
|
|
|
|
@@ -2389,6 +2432,7 @@ static const struct hda_verb alc268_beep_init_verbs[] = {
|
|
|
|
|
enum {
|
|
|
|
|
ALC268_FIXUP_INV_DMIC,
|
|
|
|
|
ALC268_FIXUP_HP_EAPD,
|
|
|
|
|
ALC268_FIXUP_SPDIF,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const struct hda_fixup alc268_fixups[] = {
|
|
|
|
|
@@ -2403,6 +2447,13 @@ static const struct hda_fixup alc268_fixups[] = {
|
|
|
|
|
{}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
[ALC268_FIXUP_SPDIF] = {
|
|
|
|
|
.type = HDA_FIXUP_PINS,
|
|
|
|
|
.v.pins = (const struct hda_pintbl[]) {
|
|
|
|
|
{ 0x1e, 0x014b1180 }, /* enable SPDIF out */
|
|
|
|
|
{}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const struct hda_model_fixup alc268_fixup_models[] = {
|
|
|
|
|
@@ -2412,6 +2463,7 @@ static const struct hda_model_fixup alc268_fixup_models[] = {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const struct snd_pci_quirk alc268_fixup_tbl[] = {
|
|
|
|
|
SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF),
|
|
|
|
|
SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC),
|
|
|
|
|
/* below is codec SSID since multiple Toshiba laptops have the
|
|
|
|
|
* same PCI SSID 1179:ff00
|
|
|
|
|
@@ -2541,6 +2593,7 @@ enum {
|
|
|
|
|
ALC269_TYPE_ALC283,
|
|
|
|
|
ALC269_TYPE_ALC284,
|
|
|
|
|
ALC269_TYPE_ALC286,
|
|
|
|
|
ALC269_TYPE_ALC255,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
@@ -2565,6 +2618,7 @@ static int alc269_parse_auto_config(struct hda_codec *codec)
|
|
|
|
|
case ALC269_TYPE_ALC269VD:
|
|
|
|
|
case ALC269_TYPE_ALC282:
|
|
|
|
|
case ALC269_TYPE_ALC286:
|
|
|
|
|
case ALC269_TYPE_ALC255:
|
|
|
|
|
case ALC269_TYPE_ALC283:
|
|
|
|
|
ssids = alc269_ssids;
|
|
|
|
|
break;
|
|
|
|
|
@@ -2826,6 +2880,23 @@ static void alc269_fixup_mic_mute_hook(void *private_data, int enabled)
|
|
|
|
|
snd_hda_set_pin_ctl_cache(codec, spec->mute_led_nid, pinval);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* Make sure the led works even in runtime suspend */
|
|
|
|
|
static unsigned int led_power_filter(struct hda_codec *codec,
|
|
|
|
|
hda_nid_t nid,
|
|
|
|
|
unsigned int power_state)
|
|
|
|
|
{
|
|
|
|
|
struct alc_spec *spec = codec->spec;
|
|
|
|
|
|
|
|
|
|
if (power_state != AC_PWRST_D3 || nid != spec->mute_led_nid)
|
|
|
|
|
return power_state;
|
|
|
|
|
|
|
|
|
|
/* Set pin ctl again, it might have just been set to 0 */
|
|
|
|
|
snd_hda_set_pin_ctl(codec, nid,
|
|
|
|
|
snd_hda_codec_get_pin_target(codec, nid));
|
|
|
|
|
|
|
|
|
|
return AC_PWRST_D0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void alc269_fixup_hp_mute_led(struct hda_codec *codec,
|
|
|
|
|
const struct hda_fixup *fix, int action)
|
|
|
|
|
{
|
|
|
|
|
@@ -2845,6 +2916,7 @@ static void alc269_fixup_hp_mute_led(struct hda_codec *codec,
|
|
|
|
|
spec->mute_led_nid = pin - 0x0a + 0x18;
|
|
|
|
|
spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook;
|
|
|
|
|
spec->gen.vmaster_mute_enum = 1;
|
|
|
|
|
codec->power_filter = led_power_filter;
|
|
|
|
|
snd_printd("Detected mute LED for %x:%d\n", spec->mute_led_nid,
|
|
|
|
|
spec->mute_led_polarity);
|
|
|
|
|
break;
|
|
|
|
|
@@ -2860,6 +2932,7 @@ static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec,
|
|
|
|
|
spec->mute_led_nid = 0x18;
|
|
|
|
|
spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook;
|
|
|
|
|
spec->gen.vmaster_mute_enum = 1;
|
|
|
|
|
codec->power_filter = led_power_filter;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -2872,6 +2945,7 @@ static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,
|
|
|
|
|
spec->mute_led_nid = 0x19;
|
|
|
|
|
spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook;
|
|
|
|
|
spec->gen.vmaster_mute_enum = 1;
|
|
|
|
|
codec->power_filter = led_power_filter;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -3112,8 +3186,10 @@ static void alc_update_headset_mode(struct hda_codec *codec)
|
|
|
|
|
else
|
|
|
|
|
new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;
|
|
|
|
|
|
|
|
|
|
if (new_headset_mode == spec->current_headset_mode)
|
|
|
|
|
if (new_headset_mode == spec->current_headset_mode) {
|
|
|
|
|
snd_hda_gen_update_outputs(codec);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch (new_headset_mode) {
|
|
|
|
|
case ALC_HEADSET_MODE_UNPLUGGED:
|
|
|
|
|
@@ -3642,6 +3718,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|
|
|
|
SND_PCI_QUIRK(0x1028, 0x0608, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
|
|
|
|
SND_PCI_QUIRK(0x1028, 0x0609, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
|
|
|
|
SND_PCI_QUIRK(0x1028, 0x0613, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
|
|
|
|
SND_PCI_QUIRK(0x1028, 0x0614, "Dell Inspiron 3135", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
|
|
|
|
|
SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_MONO_SPEAKERS),
|
|
|
|
|
SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
|
|
|
|
|
SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
|
|
|
|
|
@@ -3867,6 +3944,9 @@ static int patch_alc269(struct hda_codec *codec)
|
|
|
|
|
case 0x10ec0286:
|
|
|
|
|
spec->codec_variant = ALC269_TYPE_ALC286;
|
|
|
|
|
break;
|
|
|
|
|
case 0x10ec0255:
|
|
|
|
|
spec->codec_variant = ALC269_TYPE_ALC255;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* automatic parse from the BIOS config */
|
|
|
|
|
@@ -4575,6 +4655,7 @@ static int patch_alc680(struct hda_codec *codec)
|
|
|
|
|
static const struct hda_codec_preset snd_hda_preset_realtek[] = {
|
|
|
|
|
{ .id = 0x10ec0221, .name = "ALC221", .patch = patch_alc269 },
|
|
|
|
|
{ .id = 0x10ec0233, .name = "ALC233", .patch = patch_alc269 },
|
|
|
|
|
{ .id = 0x10ec0255, .name = "ALC255", .patch = patch_alc269 },
|
|
|
|
|
{ .id = 0x10ec0260, .name = "ALC260", .patch = patch_alc260 },
|
|
|
|
|
{ .id = 0x10ec0262, .name = "ALC262", .patch = patch_alc262 },
|
|
|
|
|
{ .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
|
|
|
|
|
|