diff options
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 241 |
1 files changed, 173 insertions, 68 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index bc86c36b4bfa..b118a5be18df 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -288,21 +288,91 @@ static void alc880_unsol_event(struct hda_codec *codec, unsigned int res) | |||
288 | snd_hda_jack_unsol_event(codec, res >> 2); | 288 | snd_hda_jack_unsol_event(codec, res >> 2); |
289 | } | 289 | } |
290 | 290 | ||
291 | /* additional initialization for ALC888 variants */ | 291 | /* Change EAPD to verb control */ |
292 | static void alc888_coef_init(struct hda_codec *codec) | 292 | static void alc_fill_eapd_coef(struct hda_codec *codec) |
293 | { | 293 | { |
294 | if (alc_get_coef0(codec) == 0x20) | 294 | int coef; |
295 | /* alc888S-VC */ | 295 | |
296 | alc_write_coef_idx(codec, 7, 0x830); | 296 | coef = alc_get_coef0(codec); |
297 | else | 297 | |
298 | /* alc888-VB */ | 298 | switch (codec->vendor_id) { |
299 | alc_write_coef_idx(codec, 7, 0x3030); | 299 | case 0x10ec0262: |
300 | alc_update_coef_idx(codec, 0x7, 0, 1<<5); | ||
301 | break; | ||
302 | case 0x10ec0267: | ||
303 | case 0x10ec0268: | ||
304 | alc_update_coef_idx(codec, 0x7, 0, 1<<13); | ||
305 | break; | ||
306 | case 0x10ec0269: | ||
307 | if ((coef & 0x00f0) == 0x0010) | ||
308 | alc_update_coef_idx(codec, 0xd, 0, 1<<14); | ||
309 | if ((coef & 0x00f0) == 0x0020) | ||
310 | alc_update_coef_idx(codec, 0x4, 1<<15, 0); | ||
311 | if ((coef & 0x00f0) == 0x0030) | ||
312 | alc_update_coef_idx(codec, 0x10, 1<<9, 0); | ||
313 | break; | ||
314 | case 0x10ec0280: | ||
315 | case 0x10ec0284: | ||
316 | case 0x10ec0290: | ||
317 | case 0x10ec0292: | ||
318 | alc_update_coef_idx(codec, 0x4, 1<<15, 0); | ||
319 | break; | ||
320 | case 0x10ec0233: | ||
321 | case 0x10ec0255: | ||
322 | case 0x10ec0282: | ||
323 | case 0x10ec0283: | ||
324 | case 0x10ec0286: | ||
325 | case 0x10ec0288: | ||
326 | alc_update_coef_idx(codec, 0x10, 1<<9, 0); | ||
327 | break; | ||
328 | case 0x10ec0285: | ||
329 | case 0x10ec0293: | ||
330 | alc_update_coef_idx(codec, 0xa, 1<<13, 0); | ||
331 | break; | ||
332 | case 0x10ec0662: | ||
333 | if ((coef & 0x00f0) == 0x0030) | ||
334 | alc_update_coef_idx(codec, 0x4, 1<<10, 0); /* EAPD Ctrl */ | ||
335 | break; | ||
336 | case 0x10ec0272: | ||
337 | case 0x10ec0273: | ||
338 | case 0x10ec0663: | ||
339 | case 0x10ec0665: | ||
340 | case 0x10ec0670: | ||
341 | case 0x10ec0671: | ||
342 | case 0x10ec0672: | ||
343 | alc_update_coef_idx(codec, 0xd, 0, 1<<14); /* EAPD Ctrl */ | ||
344 | break; | ||
345 | case 0x10ec0668: | ||
346 | alc_update_coef_idx(codec, 0x7, 3<<13, 0); | ||
347 | break; | ||
348 | case 0x10ec0867: | ||
349 | alc_update_coef_idx(codec, 0x4, 1<<10, 0); | ||
350 | break; | ||
351 | case 0x10ec0888: | ||
352 | if ((coef & 0x00f0) == 0x0020 || (coef & 0x00f0) == 0x0030) | ||
353 | alc_update_coef_idx(codec, 0x7, 1<<5, 0); | ||
354 | break; | ||
355 | case 0x10ec0892: | ||
356 | alc_update_coef_idx(codec, 0x7, 1<<5, 0); | ||
357 | break; | ||
358 | case 0x10ec0899: | ||
359 | case 0x10ec0900: | ||
360 | alc_update_coef_idx(codec, 0x7, 1<<1, 0); | ||
361 | break; | ||
362 | } | ||
300 | } | 363 | } |
301 | 364 | ||
302 | /* additional initialization for ALC889 variants */ | 365 | /* additional initialization for ALC888 variants */ |
303 | static void alc889_coef_init(struct hda_codec *codec) | 366 | static void alc888_coef_init(struct hda_codec *codec) |
304 | { | 367 | { |
305 | alc_update_coef_idx(codec, 7, 0, 0x2010); | 368 | switch (alc_get_coef0(codec) & 0x00f0) { |
369 | /* alc888-VA */ | ||
370 | case 0x00: | ||
371 | /* alc888-VB */ | ||
372 | case 0x10: | ||
373 | alc_update_coef_idx(codec, 7, 0, 0x2030); /* Turn EAPD to High */ | ||
374 | break; | ||
375 | } | ||
306 | } | 376 | } |
307 | 377 | ||
308 | /* turn on/off EAPD control (only if available) */ | 378 | /* turn on/off EAPD control (only if available) */ |
@@ -343,6 +413,7 @@ static void alc_eapd_shutup(struct hda_codec *codec) | |||
343 | /* generic EAPD initialization */ | 413 | /* generic EAPD initialization */ |
344 | static void alc_auto_init_amp(struct hda_codec *codec, int type) | 414 | static void alc_auto_init_amp(struct hda_codec *codec, int type) |
345 | { | 415 | { |
416 | alc_fill_eapd_coef(codec); | ||
346 | alc_auto_setup_eapd(codec, true); | 417 | alc_auto_setup_eapd(codec, true); |
347 | switch (type) { | 418 | switch (type) { |
348 | case ALC_INIT_GPIO1: | 419 | case ALC_INIT_GPIO1: |
@@ -359,25 +430,15 @@ static void alc_auto_init_amp(struct hda_codec *codec, int type) | |||
359 | case 0x10ec0260: | 430 | case 0x10ec0260: |
360 | alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x2010); | 431 | alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x2010); |
361 | break; | 432 | break; |
362 | case 0x10ec0262: | ||
363 | case 0x10ec0880: | 433 | case 0x10ec0880: |
364 | case 0x10ec0882: | 434 | case 0x10ec0882: |
365 | case 0x10ec0883: | 435 | case 0x10ec0883: |
366 | case 0x10ec0885: | 436 | case 0x10ec0885: |
367 | case 0x10ec0887: | 437 | alc_update_coef_idx(codec, 7, 0, 0x2030); |
368 | /*case 0x10ec0889:*/ /* this causes an SPDIF problem */ | ||
369 | case 0x10ec0900: | ||
370 | alc889_coef_init(codec); | ||
371 | break; | 438 | break; |
372 | case 0x10ec0888: | 439 | case 0x10ec0888: |
373 | alc888_coef_init(codec); | 440 | alc888_coef_init(codec); |
374 | break; | 441 | break; |
375 | #if 0 /* XXX: This may cause the silent output on speaker on some machines */ | ||
376 | case 0x10ec0267: | ||
377 | case 0x10ec0268: | ||
378 | alc_update_coef_idx(codec, 7, 0, 0x3000); | ||
379 | break; | ||
380 | #endif /* XXX */ | ||
381 | } | 442 | } |
382 | break; | 443 | break; |
383 | } | 444 | } |
@@ -1710,7 +1771,7 @@ static void alc889_fixup_coef(struct hda_codec *codec, | |||
1710 | { | 1771 | { |
1711 | if (action != HDA_FIXUP_ACT_INIT) | 1772 | if (action != HDA_FIXUP_ACT_INIT) |
1712 | return; | 1773 | return; |
1713 | alc889_coef_init(codec); | 1774 | alc_update_coef_idx(codec, 7, 0, 0x2030); |
1714 | } | 1775 | } |
1715 | 1776 | ||
1716 | /* toggle speaker-output according to the hp-jack state */ | 1777 | /* toggle speaker-output according to the hp-jack state */ |
@@ -2675,7 +2736,7 @@ static void alc269_shutup(struct hda_codec *codec) | |||
2675 | 2736 | ||
2676 | static struct coef_fw alc282_coefs[] = { | 2737 | static struct coef_fw alc282_coefs[] = { |
2677 | WRITE_COEF(0x03, 0x0002), /* Power Down Control */ | 2738 | WRITE_COEF(0x03, 0x0002), /* Power Down Control */ |
2678 | WRITE_COEF(0x05, 0x0700), /* FIFO and filter clock */ | 2739 | UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */ |
2679 | WRITE_COEF(0x07, 0x0200), /* DMIC control */ | 2740 | WRITE_COEF(0x07, 0x0200), /* DMIC control */ |
2680 | UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */ | 2741 | UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */ |
2681 | UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */ | 2742 | UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */ |
@@ -2786,7 +2847,7 @@ static void alc282_shutup(struct hda_codec *codec) | |||
2786 | 2847 | ||
2787 | static struct coef_fw alc283_coefs[] = { | 2848 | static struct coef_fw alc283_coefs[] = { |
2788 | WRITE_COEF(0x03, 0x0002), /* Power Down Control */ | 2849 | WRITE_COEF(0x03, 0x0002), /* Power Down Control */ |
2789 | WRITE_COEF(0x05, 0x0700), /* FIFO and filter clock */ | 2850 | UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */ |
2790 | WRITE_COEF(0x07, 0x0200), /* DMIC control */ | 2851 | WRITE_COEF(0x07, 0x0200), /* DMIC control */ |
2791 | UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */ | 2852 | UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */ |
2792 | UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */ | 2853 | UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */ |
@@ -2817,6 +2878,7 @@ static struct coef_fw alc283_coefs[] = { | |||
2817 | UPDATE_COEF(0x40, 0xf800, 0x9800), /* Class D DC enable */ | 2878 | UPDATE_COEF(0x40, 0xf800, 0x9800), /* Class D DC enable */ |
2818 | UPDATE_COEF(0x42, 0xf000, 0x2000), /* DC offset */ | 2879 | UPDATE_COEF(0x42, 0xf000, 0x2000), /* DC offset */ |
2819 | WRITE_COEF(0x37, 0xfc06), /* Class D amp control */ | 2880 | WRITE_COEF(0x37, 0xfc06), /* Class D amp control */ |
2881 | UPDATE_COEF(0x1b, 0x8000, 0), /* HP JD control */ | ||
2820 | {} | 2882 | {} |
2821 | }; | 2883 | }; |
2822 | 2884 | ||
@@ -2884,6 +2946,9 @@ static void alc283_shutup(struct hda_codec *codec) | |||
2884 | 2946 | ||
2885 | alc_write_coef_idx(codec, 0x43, 0x9004); | 2947 | alc_write_coef_idx(codec, 0x43, 0x9004); |
2886 | 2948 | ||
2949 | /*depop hp during suspend*/ | ||
2950 | alc_write_coef_idx(codec, 0x06, 0x2100); | ||
2951 | |||
2887 | snd_hda_codec_write(codec, hp_pin, 0, | 2952 | snd_hda_codec_write(codec, hp_pin, 0, |
2888 | AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); | 2953 | AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); |
2889 | 2954 | ||
@@ -3346,6 +3411,27 @@ static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec, | |||
3346 | } | 3411 | } |
3347 | } | 3412 | } |
3348 | 3413 | ||
3414 | static void alc280_fixup_hp_gpio4(struct hda_codec *codec, | ||
3415 | const struct hda_fixup *fix, int action) | ||
3416 | { | ||
3417 | /* Like hp_gpio_mic1_led, but also needs GPIO4 low to enable headphone amp */ | ||
3418 | struct alc_spec *spec = codec->spec; | ||
3419 | static const struct hda_verb gpio_init[] = { | ||
3420 | { 0x01, AC_VERB_SET_GPIO_MASK, 0x18 }, | ||
3421 | { 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x18 }, | ||
3422 | {} | ||
3423 | }; | ||
3424 | |||
3425 | if (action == HDA_FIXUP_ACT_PRE_PROBE) { | ||
3426 | spec->gen.vmaster_mute.hook = alc269_fixup_hp_gpio_mute_hook; | ||
3427 | spec->gen.cap_sync_hook = alc269_fixup_hp_cap_mic_mute_hook; | ||
3428 | spec->gpio_led = 0; | ||
3429 | spec->cap_mute_led_nid = 0x18; | ||
3430 | snd_hda_add_verbs(codec, gpio_init); | ||
3431 | codec->power_filter = led_power_filter; | ||
3432 | } | ||
3433 | } | ||
3434 | |||
3349 | static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec, | 3435 | static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec, |
3350 | const struct hda_fixup *fix, int action) | 3436 | const struct hda_fixup *fix, int action) |
3351 | { | 3437 | { |
@@ -4213,6 +4299,7 @@ enum { | |||
4213 | ALC283_FIXUP_BXBT2807_MIC, | 4299 | ALC283_FIXUP_BXBT2807_MIC, |
4214 | ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED, | 4300 | ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED, |
4215 | ALC282_FIXUP_ASPIRE_V5_PINS, | 4301 | ALC282_FIXUP_ASPIRE_V5_PINS, |
4302 | ALC280_FIXUP_HP_GPIO4, | ||
4216 | }; | 4303 | }; |
4217 | 4304 | ||
4218 | static const struct hda_fixup alc269_fixups[] = { | 4305 | static const struct hda_fixup alc269_fixups[] = { |
@@ -4433,6 +4520,8 @@ static const struct hda_fixup alc269_fixups[] = { | |||
4433 | [ALC269_FIXUP_HEADSET_MODE] = { | 4520 | [ALC269_FIXUP_HEADSET_MODE] = { |
4434 | .type = HDA_FIXUP_FUNC, | 4521 | .type = HDA_FIXUP_FUNC, |
4435 | .v.func = alc_fixup_headset_mode, | 4522 | .v.func = alc_fixup_headset_mode, |
4523 | .chained = true, | ||
4524 | .chain_id = ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED | ||
4436 | }, | 4525 | }, |
4437 | [ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = { | 4526 | [ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = { |
4438 | .type = HDA_FIXUP_FUNC, | 4527 | .type = HDA_FIXUP_FUNC, |
@@ -4622,6 +4711,8 @@ static const struct hda_fixup alc269_fixups[] = { | |||
4622 | [ALC255_FIXUP_HEADSET_MODE] = { | 4711 | [ALC255_FIXUP_HEADSET_MODE] = { |
4623 | .type = HDA_FIXUP_FUNC, | 4712 | .type = HDA_FIXUP_FUNC, |
4624 | .v.func = alc_fixup_headset_mode_alc255, | 4713 | .v.func = alc_fixup_headset_mode_alc255, |
4714 | .chained = true, | ||
4715 | .chain_id = ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED | ||
4625 | }, | 4716 | }, |
4626 | [ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = { | 4717 | [ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = { |
4627 | .type = HDA_FIXUP_FUNC, | 4718 | .type = HDA_FIXUP_FUNC, |
@@ -4657,8 +4748,6 @@ static const struct hda_fixup alc269_fixups[] = { | |||
4657 | [ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED] = { | 4748 | [ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED] = { |
4658 | .type = HDA_FIXUP_FUNC, | 4749 | .type = HDA_FIXUP_FUNC, |
4659 | .v.func = alc_fixup_dell_wmi, | 4750 | .v.func = alc_fixup_dell_wmi, |
4660 | .chained_before = true, | ||
4661 | .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE | ||
4662 | }, | 4751 | }, |
4663 | [ALC282_FIXUP_ASPIRE_V5_PINS] = { | 4752 | [ALC282_FIXUP_ASPIRE_V5_PINS] = { |
4664 | .type = HDA_FIXUP_PINS, | 4753 | .type = HDA_FIXUP_PINS, |
@@ -4676,7 +4765,10 @@ static const struct hda_fixup alc269_fixups[] = { | |||
4676 | { }, | 4765 | { }, |
4677 | }, | 4766 | }, |
4678 | }, | 4767 | }, |
4679 | 4768 | [ALC280_FIXUP_HP_GPIO4] = { | |
4769 | .type = HDA_FIXUP_FUNC, | ||
4770 | .v.func = alc280_fixup_hp_gpio4, | ||
4771 | }, | ||
4680 | }; | 4772 | }; |
4681 | 4773 | ||
4682 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { | 4774 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
@@ -4693,13 +4785,13 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
4693 | SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 4785 | SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
4694 | SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 4786 | SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
4695 | SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), | 4787 | SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE), |
4696 | SND_PCI_QUIRK(0x1028, 0x0610, "Dell", ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED), | ||
4697 | SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK), | 4788 | SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK), |
4698 | SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK), | 4789 | SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK), |
4699 | SND_PCI_QUIRK(0x1028, 0x061f, "Dell", ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED), | ||
4700 | SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK), | 4790 | SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK), |
4701 | SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | 4791 | SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
4702 | SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | 4792 | SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
4793 | SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
4794 | SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | ||
4703 | SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | 4795 | SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
4704 | SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), | 4796 | SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE), |
4705 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), | 4797 | SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2), |
@@ -4724,21 +4816,15 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
4724 | SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4816 | SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
4725 | SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4817 | SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4726 | SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4818 | SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4727 | SND_PCI_QUIRK(0x103c, 0x8004, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4728 | /* ALC290 */ | 4819 | /* ALC290 */ |
4729 | SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4820 | SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4730 | SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4821 | SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4731 | SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4822 | SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4732 | SND_PCI_QUIRK(0x103c, 0x2246, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4733 | SND_PCI_QUIRK(0x103c, 0x2247, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4734 | SND_PCI_QUIRK(0x103c, 0x2248, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4735 | SND_PCI_QUIRK(0x103c, 0x2249, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4736 | SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4823 | SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4737 | SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4824 | SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4738 | SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4825 | SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4739 | SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4826 | SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4740 | SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4827 | SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4741 | SND_PCI_QUIRK(0x103c, 0x2258, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4742 | SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4828 | SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4743 | SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4829 | SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4744 | SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4830 | SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
@@ -4747,7 +4833,6 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
4747 | SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4833 | SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
4748 | SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4834 | SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4749 | SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4835 | SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4750 | SND_PCI_QUIRK(0x103c, 0x2277, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4751 | SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4836 | SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4752 | SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4837 | SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
4753 | SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4838 | SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
@@ -4800,7 +4885,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
4800 | SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK), | 4885 | SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK), |
4801 | SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK), | 4886 | SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK), |
4802 | SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK), | 4887 | SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK), |
4803 | SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), | 4888 | SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK), |
4804 | SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), | 4889 | SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), |
4805 | SND_PCI_QUIRK(0x17aa, 0x3978, "IdeaPad Y410P", ALC269_FIXUP_NO_SHUTUP), | 4890 | SND_PCI_QUIRK(0x17aa, 0x3978, "IdeaPad Y410P", ALC269_FIXUP_NO_SHUTUP), |
4806 | SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), | 4891 | SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), |
@@ -4980,6 +5065,19 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { | |||
4980 | {0x17, 0x40000000}, | 5065 | {0x17, 0x40000000}, |
4981 | {0x1d, 0x40700001}, | 5066 | {0x1d, 0x40700001}, |
4982 | {0x21, 0x02211040}), | 5067 | {0x21, 0x02211040}), |
5068 | SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4, | ||
5069 | {0x12, 0x90a60130}, | ||
5070 | {0x13, 0x40000000}, | ||
5071 | {0x14, 0x90170110}, | ||
5072 | {0x15, 0x0421101f}, | ||
5073 | {0x16, 0x411111f0}, | ||
5074 | {0x17, 0x411111f0}, | ||
5075 | {0x18, 0x411111f0}, | ||
5076 | {0x19, 0x411111f0}, | ||
5077 | {0x1a, 0x04a11020}, | ||
5078 | {0x1b, 0x411111f0}, | ||
5079 | {0x1d, 0x40748605}, | ||
5080 | {0x1e, 0x411111f0}), | ||
4983 | SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED, | 5081 | SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED, |
4984 | {0x12, 0x90a60140}, | 5082 | {0x12, 0x90a60140}, |
4985 | {0x13, 0x40000000}, | 5083 | {0x13, 0x40000000}, |
@@ -5190,9 +5288,6 @@ static void alc269_fill_coef(struct hda_codec *codec) | |||
5190 | } | 5288 | } |
5191 | } | 5289 | } |
5192 | 5290 | ||
5193 | /* Class D */ | ||
5194 | alc_update_coef_idx(codec, 0xd, 0, 1<<14); | ||
5195 | |||
5196 | /* HP */ | 5291 | /* HP */ |
5197 | alc_update_coef_idx(codec, 0x4, 0, 1<<11); | 5292 | alc_update_coef_idx(codec, 0x4, 0, 1<<11); |
5198 | } | 5293 | } |
@@ -5610,9 +5705,9 @@ static void alc662_led_gpio1_mute_hook(void *private_data, int enabled) | |||
5610 | unsigned int oldval = spec->gpio_led; | 5705 | unsigned int oldval = spec->gpio_led; |
5611 | 5706 | ||
5612 | if (enabled) | 5707 | if (enabled) |
5613 | spec->gpio_led &= ~0x01; | ||
5614 | else | ||
5615 | spec->gpio_led |= 0x01; | 5708 | spec->gpio_led |= 0x01; |
5709 | else | ||
5710 | spec->gpio_led &= ~0x01; | ||
5616 | if (spec->gpio_led != oldval) | 5711 | if (spec->gpio_led != oldval) |
5617 | snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, | 5712 | snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA, |
5618 | spec->gpio_led); | 5713 | spec->gpio_led); |
@@ -5647,6 +5742,35 @@ static void alc662_fixup_led_gpio1(struct hda_codec *codec, | |||
5647 | } | 5742 | } |
5648 | } | 5743 | } |
5649 | 5744 | ||
5745 | static struct coef_fw alc668_coefs[] = { | ||
5746 | WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03, 0x0), | ||
5747 | WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06, 0x0), WRITE_COEF(0x07, 0x0f80), | ||
5748 | WRITE_COEF(0x08, 0x0031), WRITE_COEF(0x0a, 0x0060), WRITE_COEF(0x0b, 0x0), | ||
5749 | WRITE_COEF(0x0c, 0x7cf7), WRITE_COEF(0x0d, 0x1080), WRITE_COEF(0x0e, 0x7f7f), | ||
5750 | WRITE_COEF(0x0f, 0xcccc), WRITE_COEF(0x10, 0xddcc), WRITE_COEF(0x11, 0x0001), | ||
5751 | WRITE_COEF(0x13, 0x0), WRITE_COEF(0x14, 0x2aa0), WRITE_COEF(0x17, 0xa940), | ||
5752 | WRITE_COEF(0x19, 0x0), WRITE_COEF(0x1a, 0x0), WRITE_COEF(0x1b, 0x0), | ||
5753 | WRITE_COEF(0x1c, 0x0), WRITE_COEF(0x1d, 0x0), WRITE_COEF(0x1e, 0x7418), | ||
5754 | WRITE_COEF(0x1f, 0x0804), WRITE_COEF(0x20, 0x4200), WRITE_COEF(0x21, 0x0468), | ||
5755 | WRITE_COEF(0x22, 0x8ccc), WRITE_COEF(0x23, 0x0250), WRITE_COEF(0x24, 0x7418), | ||
5756 | WRITE_COEF(0x27, 0x0), WRITE_COEF(0x28, 0x8ccc), WRITE_COEF(0x2a, 0xff00), | ||
5757 | WRITE_COEF(0x2b, 0x8000), WRITE_COEF(0xa7, 0xff00), WRITE_COEF(0xa8, 0x8000), | ||
5758 | WRITE_COEF(0xaa, 0x2e17), WRITE_COEF(0xab, 0xa0c0), WRITE_COEF(0xac, 0x0), | ||
5759 | WRITE_COEF(0xad, 0x0), WRITE_COEF(0xae, 0x2ac6), WRITE_COEF(0xaf, 0xa480), | ||
5760 | WRITE_COEF(0xb0, 0x0), WRITE_COEF(0xb1, 0x0), WRITE_COEF(0xb2, 0x0), | ||
5761 | WRITE_COEF(0xb3, 0x0), WRITE_COEF(0xb4, 0x0), WRITE_COEF(0xb5, 0x1040), | ||
5762 | WRITE_COEF(0xb6, 0xd697), WRITE_COEF(0xb7, 0x902b), WRITE_COEF(0xb8, 0xd697), | ||
5763 | WRITE_COEF(0xb9, 0x902b), WRITE_COEF(0xba, 0xb8ba), WRITE_COEF(0xbb, 0xaaab), | ||
5764 | WRITE_COEF(0xbc, 0xaaaf), WRITE_COEF(0xbd, 0x6aaa), WRITE_COEF(0xbe, 0x1c02), | ||
5765 | WRITE_COEF(0xc0, 0x00ff), WRITE_COEF(0xc1, 0x0fa6), | ||
5766 | {} | ||
5767 | }; | ||
5768 | |||
5769 | static void alc668_restore_default_value(struct hda_codec *codec) | ||
5770 | { | ||
5771 | alc_process_coef_fw(codec, alc668_coefs); | ||
5772 | } | ||
5773 | |||
5650 | enum { | 5774 | enum { |
5651 | ALC662_FIXUP_ASPIRE, | 5775 | ALC662_FIXUP_ASPIRE, |
5652 | ALC662_FIXUP_LED_GPIO1, | 5776 | ALC662_FIXUP_LED_GPIO1, |
@@ -5919,6 +6043,7 @@ static const struct snd_pci_quirk alc662_fixup_tbl[] = { | |||
5919 | SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), | 6043 | SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), |
5920 | SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), | 6044 | SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), |
5921 | SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), | 6045 | SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), |
6046 | SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE), | ||
5922 | SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800), | 6047 | SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800), |
5923 | SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_BASS_1A), | 6048 | SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_BASS_1A), |
5924 | SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP), | 6049 | SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP), |
@@ -6072,29 +6197,6 @@ static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = { | |||
6072 | {} | 6197 | {} |
6073 | }; | 6198 | }; |
6074 | 6199 | ||
6075 | static void alc662_fill_coef(struct hda_codec *codec) | ||
6076 | { | ||
6077 | int coef; | ||
6078 | |||
6079 | coef = alc_get_coef0(codec); | ||
6080 | |||
6081 | switch (codec->vendor_id) { | ||
6082 | case 0x10ec0662: | ||
6083 | if ((coef & 0x00f0) == 0x0030) | ||
6084 | alc_update_coef_idx(codec, 0x4, 1<<10, 0); /* EAPD Ctrl */ | ||
6085 | break; | ||
6086 | case 0x10ec0272: | ||
6087 | case 0x10ec0273: | ||
6088 | case 0x10ec0663: | ||
6089 | case 0x10ec0665: | ||
6090 | case 0x10ec0670: | ||
6091 | case 0x10ec0671: | ||
6092 | case 0x10ec0672: | ||
6093 | alc_update_coef_idx(codec, 0xd, 0, 1<<14); /* EAPD Ctrl */ | ||
6094 | break; | ||
6095 | } | ||
6096 | } | ||
6097 | |||
6098 | /* | 6200 | /* |
6099 | */ | 6201 | */ |
6100 | static int patch_alc662(struct hda_codec *codec) | 6202 | static int patch_alc662(struct hda_codec *codec) |
@@ -6113,8 +6215,11 @@ static int patch_alc662(struct hda_codec *codec) | |||
6113 | 6215 | ||
6114 | alc_fix_pll_init(codec, 0x20, 0x04, 15); | 6216 | alc_fix_pll_init(codec, 0x20, 0x04, 15); |
6115 | 6217 | ||
6116 | spec->init_hook = alc662_fill_coef; | 6218 | switch (codec->vendor_id) { |
6117 | alc662_fill_coef(codec); | 6219 | case 0x10ec0668: |
6220 | spec->init_hook = alc668_restore_default_value; | ||
6221 | break; | ||
6222 | } | ||
6118 | 6223 | ||
6119 | snd_hda_pick_fixup(codec, alc662_fixup_models, | 6224 | snd_hda_pick_fixup(codec, alc662_fixup_models, |
6120 | alc662_fixup_tbl, alc662_fixups); | 6225 | alc662_fixup_tbl, alc662_fixups); |