diff options
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 73 |
1 files changed, 68 insertions, 5 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index d53c25e7a1c1..0fe18ede3e85 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -346,6 +346,9 @@ static void alc_fill_eapd_coef(struct hda_codec *codec) | |||
346 | case 0x10ec0234: | 346 | case 0x10ec0234: |
347 | case 0x10ec0274: | 347 | case 0x10ec0274: |
348 | case 0x10ec0294: | 348 | case 0x10ec0294: |
349 | case 0x10ec0700: | ||
350 | case 0x10ec0701: | ||
351 | case 0x10ec0703: | ||
349 | alc_update_coef_idx(codec, 0x10, 1<<15, 0); | 352 | alc_update_coef_idx(codec, 0x10, 1<<15, 0); |
350 | break; | 353 | break; |
351 | case 0x10ec0662: | 354 | case 0x10ec0662: |
@@ -2655,6 +2658,7 @@ enum { | |||
2655 | ALC269_TYPE_ALC256, | 2658 | ALC269_TYPE_ALC256, |
2656 | ALC269_TYPE_ALC225, | 2659 | ALC269_TYPE_ALC225, |
2657 | ALC269_TYPE_ALC294, | 2660 | ALC269_TYPE_ALC294, |
2661 | ALC269_TYPE_ALC700, | ||
2658 | }; | 2662 | }; |
2659 | 2663 | ||
2660 | /* | 2664 | /* |
@@ -2686,6 +2690,7 @@ static int alc269_parse_auto_config(struct hda_codec *codec) | |||
2686 | case ALC269_TYPE_ALC256: | 2690 | case ALC269_TYPE_ALC256: |
2687 | case ALC269_TYPE_ALC225: | 2691 | case ALC269_TYPE_ALC225: |
2688 | case ALC269_TYPE_ALC294: | 2692 | case ALC269_TYPE_ALC294: |
2693 | case ALC269_TYPE_ALC700: | ||
2689 | ssids = alc269_ssids; | 2694 | ssids = alc269_ssids; |
2690 | break; | 2695 | break; |
2691 | default: | 2696 | default: |
@@ -3618,13 +3623,20 @@ static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec, | |||
3618 | static void alc_headset_mode_unplugged(struct hda_codec *codec) | 3623 | static void alc_headset_mode_unplugged(struct hda_codec *codec) |
3619 | { | 3624 | { |
3620 | static struct coef_fw coef0255[] = { | 3625 | static struct coef_fw coef0255[] = { |
3621 | WRITE_COEF(0x1b, 0x0c0b), /* LDO and MISC control */ | ||
3622 | WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */ | 3626 | WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */ |
3623 | UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/ | 3627 | UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/ |
3624 | WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */ | 3628 | WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */ |
3625 | WRITE_COEFEX(0x57, 0x03, 0x8aa6), /* Direct Drive HP Amp control */ | 3629 | WRITE_COEFEX(0x57, 0x03, 0x8aa6), /* Direct Drive HP Amp control */ |
3626 | {} | 3630 | {} |
3627 | }; | 3631 | }; |
3632 | static struct coef_fw coef0255_1[] = { | ||
3633 | WRITE_COEF(0x1b, 0x0c0b), /* LDO and MISC control */ | ||
3634 | {} | ||
3635 | }; | ||
3636 | static struct coef_fw coef0256[] = { | ||
3637 | WRITE_COEF(0x1b, 0x0c4b), /* LDO and MISC control */ | ||
3638 | {} | ||
3639 | }; | ||
3628 | static struct coef_fw coef0233[] = { | 3640 | static struct coef_fw coef0233[] = { |
3629 | WRITE_COEF(0x1b, 0x0c0b), | 3641 | WRITE_COEF(0x1b, 0x0c0b), |
3630 | WRITE_COEF(0x45, 0xc429), | 3642 | WRITE_COEF(0x45, 0xc429), |
@@ -3677,7 +3689,11 @@ static void alc_headset_mode_unplugged(struct hda_codec *codec) | |||
3677 | 3689 | ||
3678 | switch (codec->core.vendor_id) { | 3690 | switch (codec->core.vendor_id) { |
3679 | case 0x10ec0255: | 3691 | case 0x10ec0255: |
3692 | alc_process_coef_fw(codec, coef0255_1); | ||
3693 | alc_process_coef_fw(codec, coef0255); | ||
3694 | break; | ||
3680 | case 0x10ec0256: | 3695 | case 0x10ec0256: |
3696 | alc_process_coef_fw(codec, coef0256); | ||
3681 | alc_process_coef_fw(codec, coef0255); | 3697 | alc_process_coef_fw(codec, coef0255); |
3682 | break; | 3698 | break; |
3683 | case 0x10ec0233: | 3699 | case 0x10ec0233: |
@@ -3896,6 +3912,12 @@ static void alc_headset_mode_ctia(struct hda_codec *codec) | |||
3896 | WRITE_COEFEX(0x57, 0x03, 0x8ea6), | 3912 | WRITE_COEFEX(0x57, 0x03, 0x8ea6), |
3897 | {} | 3913 | {} |
3898 | }; | 3914 | }; |
3915 | static struct coef_fw coef0256[] = { | ||
3916 | WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */ | ||
3917 | WRITE_COEF(0x1b, 0x0c6b), | ||
3918 | WRITE_COEFEX(0x57, 0x03, 0x8ea6), | ||
3919 | {} | ||
3920 | }; | ||
3899 | static struct coef_fw coef0233[] = { | 3921 | static struct coef_fw coef0233[] = { |
3900 | WRITE_COEF(0x45, 0xd429), | 3922 | WRITE_COEF(0x45, 0xd429), |
3901 | WRITE_COEF(0x1b, 0x0c2b), | 3923 | WRITE_COEF(0x1b, 0x0c2b), |
@@ -3936,9 +3958,11 @@ static void alc_headset_mode_ctia(struct hda_codec *codec) | |||
3936 | 3958 | ||
3937 | switch (codec->core.vendor_id) { | 3959 | switch (codec->core.vendor_id) { |
3938 | case 0x10ec0255: | 3960 | case 0x10ec0255: |
3939 | case 0x10ec0256: | ||
3940 | alc_process_coef_fw(codec, coef0255); | 3961 | alc_process_coef_fw(codec, coef0255); |
3941 | break; | 3962 | break; |
3963 | case 0x10ec0256: | ||
3964 | alc_process_coef_fw(codec, coef0256); | ||
3965 | break; | ||
3942 | case 0x10ec0233: | 3966 | case 0x10ec0233: |
3943 | case 0x10ec0283: | 3967 | case 0x10ec0283: |
3944 | alc_process_coef_fw(codec, coef0233); | 3968 | alc_process_coef_fw(codec, coef0233); |
@@ -3978,6 +4002,12 @@ static void alc_headset_mode_omtp(struct hda_codec *codec) | |||
3978 | WRITE_COEFEX(0x57, 0x03, 0x8ea6), | 4002 | WRITE_COEFEX(0x57, 0x03, 0x8ea6), |
3979 | {} | 4003 | {} |
3980 | }; | 4004 | }; |
4005 | static struct coef_fw coef0256[] = { | ||
4006 | WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */ | ||
4007 | WRITE_COEF(0x1b, 0x0c6b), | ||
4008 | WRITE_COEFEX(0x57, 0x03, 0x8ea6), | ||
4009 | {} | ||
4010 | }; | ||
3981 | static struct coef_fw coef0233[] = { | 4011 | static struct coef_fw coef0233[] = { |
3982 | WRITE_COEF(0x45, 0xe429), | 4012 | WRITE_COEF(0x45, 0xe429), |
3983 | WRITE_COEF(0x1b, 0x0c2b), | 4013 | WRITE_COEF(0x1b, 0x0c2b), |
@@ -4018,9 +4048,11 @@ static void alc_headset_mode_omtp(struct hda_codec *codec) | |||
4018 | 4048 | ||
4019 | switch (codec->core.vendor_id) { | 4049 | switch (codec->core.vendor_id) { |
4020 | case 0x10ec0255: | 4050 | case 0x10ec0255: |
4021 | case 0x10ec0256: | ||
4022 | alc_process_coef_fw(codec, coef0255); | 4051 | alc_process_coef_fw(codec, coef0255); |
4023 | break; | 4052 | break; |
4053 | case 0x10ec0256: | ||
4054 | alc_process_coef_fw(codec, coef0256); | ||
4055 | break; | ||
4024 | case 0x10ec0233: | 4056 | case 0x10ec0233: |
4025 | case 0x10ec0283: | 4057 | case 0x10ec0283: |
4026 | alc_process_coef_fw(codec, coef0233); | 4058 | alc_process_coef_fw(codec, coef0233); |
@@ -4266,7 +4298,7 @@ static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec, | |||
4266 | static void alc255_set_default_jack_type(struct hda_codec *codec) | 4298 | static void alc255_set_default_jack_type(struct hda_codec *codec) |
4267 | { | 4299 | { |
4268 | /* Set to iphone type */ | 4300 | /* Set to iphone type */ |
4269 | static struct coef_fw fw[] = { | 4301 | static struct coef_fw alc255fw[] = { |
4270 | WRITE_COEF(0x1b, 0x880b), | 4302 | WRITE_COEF(0x1b, 0x880b), |
4271 | WRITE_COEF(0x45, 0xd089), | 4303 | WRITE_COEF(0x45, 0xd089), |
4272 | WRITE_COEF(0x1b, 0x080b), | 4304 | WRITE_COEF(0x1b, 0x080b), |
@@ -4274,7 +4306,22 @@ static void alc255_set_default_jack_type(struct hda_codec *codec) | |||
4274 | WRITE_COEF(0x1b, 0x0c0b), | 4306 | WRITE_COEF(0x1b, 0x0c0b), |
4275 | {} | 4307 | {} |
4276 | }; | 4308 | }; |
4277 | alc_process_coef_fw(codec, fw); | 4309 | static struct coef_fw alc256fw[] = { |
4310 | WRITE_COEF(0x1b, 0x884b), | ||
4311 | WRITE_COEF(0x45, 0xd089), | ||
4312 | WRITE_COEF(0x1b, 0x084b), | ||
4313 | WRITE_COEF(0x46, 0x0004), | ||
4314 | WRITE_COEF(0x1b, 0x0c4b), | ||
4315 | {} | ||
4316 | }; | ||
4317 | switch (codec->core.vendor_id) { | ||
4318 | case 0x10ec0255: | ||
4319 | alc_process_coef_fw(codec, alc255fw); | ||
4320 | break; | ||
4321 | case 0x10ec0256: | ||
4322 | alc_process_coef_fw(codec, alc256fw); | ||
4323 | break; | ||
4324 | } | ||
4278 | msleep(30); | 4325 | msleep(30); |
4279 | } | 4326 | } |
4280 | 4327 | ||
@@ -5587,6 +5634,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = { | |||
5587 | SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK), | 5634 | SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK), |
5588 | SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK), | 5635 | SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK), |
5589 | SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK), | 5636 | SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK), |
5637 | SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460), | ||
5590 | SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460), | 5638 | SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460), |
5591 | SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), | 5639 | SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), |
5592 | SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), | 5640 | SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY), |
@@ -5775,6 +5823,10 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { | |||
5775 | {0x12, 0x90a60180}, | 5823 | {0x12, 0x90a60180}, |
5776 | {0x14, 0x90170130}, | 5824 | {0x14, 0x90170130}, |
5777 | {0x21, 0x02211040}), | 5825 | {0x21, 0x02211040}), |
5826 | SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5565", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, | ||
5827 | {0x12, 0x90a60180}, | ||
5828 | {0x14, 0x90170120}, | ||
5829 | {0x21, 0x02211030}), | ||
5778 | SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, | 5830 | SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, |
5779 | {0x12, 0x90a60160}, | 5831 | {0x12, 0x90a60160}, |
5780 | {0x14, 0x90170120}, | 5832 | {0x14, 0x90170120}, |
@@ -6053,6 +6105,14 @@ static int patch_alc269(struct hda_codec *codec) | |||
6053 | case 0x10ec0294: | 6105 | case 0x10ec0294: |
6054 | spec->codec_variant = ALC269_TYPE_ALC294; | 6106 | spec->codec_variant = ALC269_TYPE_ALC294; |
6055 | break; | 6107 | break; |
6108 | case 0x10ec0700: | ||
6109 | case 0x10ec0701: | ||
6110 | case 0x10ec0703: | ||
6111 | spec->codec_variant = ALC269_TYPE_ALC700; | ||
6112 | spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */ | ||
6113 | alc_update_coef_idx(codec, 0x4a, 0, 1 << 15); /* Combo jack auto trigger control */ | ||
6114 | break; | ||
6115 | |||
6056 | } | 6116 | } |
6057 | 6117 | ||
6058 | if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) { | 6118 | if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) { |
@@ -7008,6 +7068,9 @@ static const struct hda_device_id snd_hda_id_realtek[] = { | |||
7008 | HDA_CODEC_ENTRY(0x10ec0670, "ALC670", patch_alc662), | 7068 | HDA_CODEC_ENTRY(0x10ec0670, "ALC670", patch_alc662), |
7009 | HDA_CODEC_ENTRY(0x10ec0671, "ALC671", patch_alc662), | 7069 | HDA_CODEC_ENTRY(0x10ec0671, "ALC671", patch_alc662), |
7010 | HDA_CODEC_ENTRY(0x10ec0680, "ALC680", patch_alc680), | 7070 | HDA_CODEC_ENTRY(0x10ec0680, "ALC680", patch_alc680), |
7071 | HDA_CODEC_ENTRY(0x10ec0700, "ALC700", patch_alc269), | ||
7072 | HDA_CODEC_ENTRY(0x10ec0701, "ALC701", patch_alc269), | ||
7073 | HDA_CODEC_ENTRY(0x10ec0703, "ALC703", patch_alc269), | ||
7011 | HDA_CODEC_ENTRY(0x10ec0867, "ALC891", patch_alc882), | 7074 | HDA_CODEC_ENTRY(0x10ec0867, "ALC891", patch_alc882), |
7012 | HDA_CODEC_ENTRY(0x10ec0880, "ALC880", patch_alc880), | 7075 | HDA_CODEC_ENTRY(0x10ec0880, "ALC880", patch_alc880), |
7013 | HDA_CODEC_ENTRY(0x10ec0882, "ALC882", patch_alc882), | 7076 | HDA_CODEC_ENTRY(0x10ec0882, "ALC882", patch_alc882), |