diff options
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 217 |
1 files changed, 158 insertions, 59 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index c9cf248ce8ec..172395465e8a 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 */ |
@@ -3350,6 +3411,27 @@ static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec, | |||
3350 | } | 3411 | } |
3351 | } | 3412 | } |
3352 | 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 | |||
3353 | 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, |
3354 | const struct hda_fixup *fix, int action) | 3436 | const struct hda_fixup *fix, int action) |
3355 | { | 3437 | { |
@@ -4217,6 +4299,7 @@ enum { | |||
4217 | ALC283_FIXUP_BXBT2807_MIC, | 4299 | ALC283_FIXUP_BXBT2807_MIC, |
4218 | ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED, | 4300 | ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED, |
4219 | ALC282_FIXUP_ASPIRE_V5_PINS, | 4301 | ALC282_FIXUP_ASPIRE_V5_PINS, |
4302 | ALC280_FIXUP_HP_GPIO4, | ||
4220 | }; | 4303 | }; |
4221 | 4304 | ||
4222 | static const struct hda_fixup alc269_fixups[] = { | 4305 | static const struct hda_fixup alc269_fixups[] = { |
@@ -4680,7 +4763,10 @@ static const struct hda_fixup alc269_fixups[] = { | |||
4680 | { }, | 4763 | { }, |
4681 | }, | 4764 | }, |
4682 | }, | 4765 | }, |
4683 | 4766 | [ALC280_FIXUP_HP_GPIO4] = { | |
4767 | .type = HDA_FIXUP_FUNC, | ||
4768 | .v.func = alc280_fixup_hp_gpio4, | ||
4769 | }, | ||
4684 | }; | 4770 | }; |
4685 | 4771 | ||
4686 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { | 4772 | static const struct snd_pci_quirk alc269_fixup_tbl[] = { |
@@ -4728,21 +4814,16 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
4728 | SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4814 | SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
4729 | SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4815 | SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4730 | SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4816 | SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4731 | SND_PCI_QUIRK(0x103c, 0x8004, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4732 | /* ALC290 */ | 4817 | /* ALC290 */ |
4733 | SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4818 | SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4734 | SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4819 | SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4735 | SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4820 | SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4736 | SND_PCI_QUIRK(0x103c, 0x2246, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4821 | SND_PCI_QUIRK(0x103c, 0x2246, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4737 | SND_PCI_QUIRK(0x103c, 0x2247, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4738 | SND_PCI_QUIRK(0x103c, 0x2248, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4739 | SND_PCI_QUIRK(0x103c, 0x2249, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4740 | SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4822 | SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4741 | SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4823 | SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4742 | SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4824 | SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4743 | SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4825 | SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4744 | SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4826 | SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4745 | SND_PCI_QUIRK(0x103c, 0x2258, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4746 | SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4827 | SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4747 | SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4828 | SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4748 | SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4829 | SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
@@ -4751,7 +4832,6 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
4751 | SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4832 | SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
4752 | SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4833 | SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4753 | SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4834 | SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4754 | SND_PCI_QUIRK(0x103c, 0x2277, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | ||
4755 | SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), | 4835 | SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED), |
4756 | SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4836 | SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
4757 | SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), | 4837 | SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1), |
@@ -4804,7 +4884,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
4804 | SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK), | 4884 | SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK), |
4805 | SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK), | 4885 | SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK), |
4806 | SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK), | 4886 | SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK), |
4807 | SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), | 4887 | SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK), |
4808 | SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), | 4888 | SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), |
4809 | SND_PCI_QUIRK(0x17aa, 0x3978, "IdeaPad Y410P", ALC269_FIXUP_NO_SHUTUP), | 4889 | SND_PCI_QUIRK(0x17aa, 0x3978, "IdeaPad Y410P", ALC269_FIXUP_NO_SHUTUP), |
4810 | SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), | 4890 | SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST), |
@@ -4984,6 +5064,19 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { | |||
4984 | {0x17, 0x40000000}, | 5064 | {0x17, 0x40000000}, |
4985 | {0x1d, 0x40700001}, | 5065 | {0x1d, 0x40700001}, |
4986 | {0x21, 0x02211040}), | 5066 | {0x21, 0x02211040}), |
5067 | SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4, | ||
5068 | {0x12, 0x90a60130}, | ||
5069 | {0x13, 0x40000000}, | ||
5070 | {0x14, 0x90170110}, | ||
5071 | {0x15, 0x0421101f}, | ||
5072 | {0x16, 0x411111f0}, | ||
5073 | {0x17, 0x411111f0}, | ||
5074 | {0x18, 0x411111f0}, | ||
5075 | {0x19, 0x411111f0}, | ||
5076 | {0x1a, 0x04a11020}, | ||
5077 | {0x1b, 0x411111f0}, | ||
5078 | {0x1d, 0x40748605}, | ||
5079 | {0x1e, 0x411111f0}), | ||
4987 | SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED, | 5080 | SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED, |
4988 | {0x12, 0x90a60140}, | 5081 | {0x12, 0x90a60140}, |
4989 | {0x13, 0x40000000}, | 5082 | {0x13, 0x40000000}, |
@@ -5194,9 +5287,6 @@ static void alc269_fill_coef(struct hda_codec *codec) | |||
5194 | } | 5287 | } |
5195 | } | 5288 | } |
5196 | 5289 | ||
5197 | /* Class D */ | ||
5198 | alc_update_coef_idx(codec, 0xd, 0, 1<<14); | ||
5199 | |||
5200 | /* HP */ | 5290 | /* HP */ |
5201 | alc_update_coef_idx(codec, 0x4, 0, 1<<11); | 5291 | alc_update_coef_idx(codec, 0x4, 0, 1<<11); |
5202 | } | 5292 | } |
@@ -5651,6 +5741,35 @@ static void alc662_fixup_led_gpio1(struct hda_codec *codec, | |||
5651 | } | 5741 | } |
5652 | } | 5742 | } |
5653 | 5743 | ||
5744 | static struct coef_fw alc668_coefs[] = { | ||
5745 | WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03, 0x0), | ||
5746 | WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06, 0x0), WRITE_COEF(0x07, 0x0f80), | ||
5747 | WRITE_COEF(0x08, 0x0031), WRITE_COEF(0x0a, 0x0060), WRITE_COEF(0x0b, 0x0), | ||
5748 | WRITE_COEF(0x0c, 0x7cf7), WRITE_COEF(0x0d, 0x1080), WRITE_COEF(0x0e, 0x7f7f), | ||
5749 | WRITE_COEF(0x0f, 0xcccc), WRITE_COEF(0x10, 0xddcc), WRITE_COEF(0x11, 0x0001), | ||
5750 | WRITE_COEF(0x13, 0x0), WRITE_COEF(0x14, 0x2aa0), WRITE_COEF(0x17, 0xa940), | ||
5751 | WRITE_COEF(0x19, 0x0), WRITE_COEF(0x1a, 0x0), WRITE_COEF(0x1b, 0x0), | ||
5752 | WRITE_COEF(0x1c, 0x0), WRITE_COEF(0x1d, 0x0), WRITE_COEF(0x1e, 0x7418), | ||
5753 | WRITE_COEF(0x1f, 0x0804), WRITE_COEF(0x20, 0x4200), WRITE_COEF(0x21, 0x0468), | ||
5754 | WRITE_COEF(0x22, 0x8ccc), WRITE_COEF(0x23, 0x0250), WRITE_COEF(0x24, 0x7418), | ||
5755 | WRITE_COEF(0x27, 0x0), WRITE_COEF(0x28, 0x8ccc), WRITE_COEF(0x2a, 0xff00), | ||
5756 | WRITE_COEF(0x2b, 0x8000), WRITE_COEF(0xa7, 0xff00), WRITE_COEF(0xa8, 0x8000), | ||
5757 | WRITE_COEF(0xaa, 0x2e17), WRITE_COEF(0xab, 0xa0c0), WRITE_COEF(0xac, 0x0), | ||
5758 | WRITE_COEF(0xad, 0x0), WRITE_COEF(0xae, 0x2ac6), WRITE_COEF(0xaf, 0xa480), | ||
5759 | WRITE_COEF(0xb0, 0x0), WRITE_COEF(0xb1, 0x0), WRITE_COEF(0xb2, 0x0), | ||
5760 | WRITE_COEF(0xb3, 0x0), WRITE_COEF(0xb4, 0x0), WRITE_COEF(0xb5, 0x1040), | ||
5761 | WRITE_COEF(0xb6, 0xd697), WRITE_COEF(0xb7, 0x902b), WRITE_COEF(0xb8, 0xd697), | ||
5762 | WRITE_COEF(0xb9, 0x902b), WRITE_COEF(0xba, 0xb8ba), WRITE_COEF(0xbb, 0xaaab), | ||
5763 | WRITE_COEF(0xbc, 0xaaaf), WRITE_COEF(0xbd, 0x6aaa), WRITE_COEF(0xbe, 0x1c02), | ||
5764 | WRITE_COEF(0xc0, 0x00ff), WRITE_COEF(0xc1, 0x0fa6), | ||
5765 | {} | ||
5766 | }; | ||
5767 | |||
5768 | static void alc668_restore_default_value(struct hda_codec *codec) | ||
5769 | { | ||
5770 | alc_process_coef_fw(codec, alc668_coefs); | ||
5771 | } | ||
5772 | |||
5654 | enum { | 5773 | enum { |
5655 | ALC662_FIXUP_ASPIRE, | 5774 | ALC662_FIXUP_ASPIRE, |
5656 | ALC662_FIXUP_LED_GPIO1, | 5775 | ALC662_FIXUP_LED_GPIO1, |
@@ -6077,29 +6196,6 @@ static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = { | |||
6077 | {} | 6196 | {} |
6078 | }; | 6197 | }; |
6079 | 6198 | ||
6080 | static void alc662_fill_coef(struct hda_codec *codec) | ||
6081 | { | ||
6082 | int coef; | ||
6083 | |||
6084 | coef = alc_get_coef0(codec); | ||
6085 | |||
6086 | switch (codec->vendor_id) { | ||
6087 | case 0x10ec0662: | ||
6088 | if ((coef & 0x00f0) == 0x0030) | ||
6089 | alc_update_coef_idx(codec, 0x4, 1<<10, 0); /* EAPD Ctrl */ | ||
6090 | break; | ||
6091 | case 0x10ec0272: | ||
6092 | case 0x10ec0273: | ||
6093 | case 0x10ec0663: | ||
6094 | case 0x10ec0665: | ||
6095 | case 0x10ec0670: | ||
6096 | case 0x10ec0671: | ||
6097 | case 0x10ec0672: | ||
6098 | alc_update_coef_idx(codec, 0xd, 0, 1<<14); /* EAPD Ctrl */ | ||
6099 | break; | ||
6100 | } | ||
6101 | } | ||
6102 | |||
6103 | /* | 6199 | /* |
6104 | */ | 6200 | */ |
6105 | static int patch_alc662(struct hda_codec *codec) | 6201 | static int patch_alc662(struct hda_codec *codec) |
@@ -6118,8 +6214,11 @@ static int patch_alc662(struct hda_codec *codec) | |||
6118 | 6214 | ||
6119 | alc_fix_pll_init(codec, 0x20, 0x04, 15); | 6215 | alc_fix_pll_init(codec, 0x20, 0x04, 15); |
6120 | 6216 | ||
6121 | spec->init_hook = alc662_fill_coef; | 6217 | switch (codec->vendor_id) { |
6122 | alc662_fill_coef(codec); | 6218 | case 0x10ec0668: |
6219 | spec->init_hook = alc668_restore_default_value; | ||
6220 | break; | ||
6221 | } | ||
6123 | 6222 | ||
6124 | snd_hda_pick_fixup(codec, alc662_fixup_models, | 6223 | snd_hda_pick_fixup(codec, alc662_fixup_models, |
6125 | alc662_fixup_tbl, alc662_fixups); | 6224 | alc662_fixup_tbl, alc662_fixups); |