aboutsummaryrefslogtreecommitdiffstats
path: root/sound/pci/hda/patch_realtek.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
-rw-r--r--sound/pci/hda/patch_realtek.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index 33753244f48f..21992fb7035d 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -327,6 +327,7 @@ static void alc_fill_eapd_coef(struct hda_codec *codec)
327 case 0x10ec0292: 327 case 0x10ec0292:
328 alc_update_coef_idx(codec, 0x4, 1<<15, 0); 328 alc_update_coef_idx(codec, 0x4, 1<<15, 0);
329 break; 329 break;
330 case 0x10ec0225:
330 case 0x10ec0233: 331 case 0x10ec0233:
331 case 0x10ec0255: 332 case 0x10ec0255:
332 case 0x10ec0256: 333 case 0x10ec0256:
@@ -900,6 +901,7 @@ static struct alc_codec_rename_pci_table rename_pci_tbl[] = {
900 { 0x10ec0899, 0x1028, 0, "ALC3861" }, 901 { 0x10ec0899, 0x1028, 0, "ALC3861" },
901 { 0x10ec0298, 0x1028, 0, "ALC3266" }, 902 { 0x10ec0298, 0x1028, 0, "ALC3266" },
902 { 0x10ec0256, 0x1028, 0, "ALC3246" }, 903 { 0x10ec0256, 0x1028, 0, "ALC3246" },
904 { 0x10ec0225, 0x1028, 0, "ALC3253" },
903 { 0x10ec0670, 0x1025, 0, "ALC669X" }, 905 { 0x10ec0670, 0x1025, 0, "ALC669X" },
904 { 0x10ec0676, 0x1025, 0, "ALC679X" }, 906 { 0x10ec0676, 0x1025, 0, "ALC679X" },
905 { 0x10ec0282, 0x1043, 0, "ALC3229" }, 907 { 0x10ec0282, 0x1043, 0, "ALC3229" },
@@ -2651,6 +2653,7 @@ enum {
2651 ALC269_TYPE_ALC298, 2653 ALC269_TYPE_ALC298,
2652 ALC269_TYPE_ALC255, 2654 ALC269_TYPE_ALC255,
2653 ALC269_TYPE_ALC256, 2655 ALC269_TYPE_ALC256,
2656 ALC269_TYPE_ALC225,
2654}; 2657};
2655 2658
2656/* 2659/*
@@ -2680,6 +2683,7 @@ static int alc269_parse_auto_config(struct hda_codec *codec)
2680 case ALC269_TYPE_ALC298: 2683 case ALC269_TYPE_ALC298:
2681 case ALC269_TYPE_ALC255: 2684 case ALC269_TYPE_ALC255:
2682 case ALC269_TYPE_ALC256: 2685 case ALC269_TYPE_ALC256:
2686 case ALC269_TYPE_ALC225:
2683 ssids = alc269_ssids; 2687 ssids = alc269_ssids;
2684 break; 2688 break;
2685 default: 2689 default:
@@ -3658,6 +3662,16 @@ static void alc_headset_mode_unplugged(struct hda_codec *codec)
3658 WRITE_COEF(0xb7, 0x802b), 3662 WRITE_COEF(0xb7, 0x802b),
3659 {} 3663 {}
3660 }; 3664 };
3665 static struct coef_fw coef0225[] = {
3666 UPDATE_COEF(0x4a, 1<<8, 0),
3667 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
3668 UPDATE_COEF(0x63, 3<<14, 3<<14),
3669 UPDATE_COEF(0x4a, 3<<4, 2<<4),
3670 UPDATE_COEF(0x4a, 3<<10, 3<<10),
3671 UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10),
3672 UPDATE_COEF(0x4a, 3<<10, 0),
3673 {}
3674 };
3661 3675
3662 switch (codec->core.vendor_id) { 3676 switch (codec->core.vendor_id) {
3663 case 0x10ec0255: 3677 case 0x10ec0255:
@@ -3682,6 +3696,9 @@ static void alc_headset_mode_unplugged(struct hda_codec *codec)
3682 case 0x10ec0668: 3696 case 0x10ec0668:
3683 alc_process_coef_fw(codec, coef0668); 3697 alc_process_coef_fw(codec, coef0668);
3684 break; 3698 break;
3699 case 0x10ec0225:
3700 alc_process_coef_fw(codec, coef0225);
3701 break;
3685 } 3702 }
3686 codec_dbg(codec, "Headset jack set to unplugged mode.\n"); 3703 codec_dbg(codec, "Headset jack set to unplugged mode.\n");
3687} 3704}
@@ -3727,6 +3744,13 @@ static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
3727 UPDATE_COEF(0xc3, 0, 1<<12), 3744 UPDATE_COEF(0xc3, 0, 1<<12),
3728 {} 3745 {}
3729 }; 3746 };
3747 static struct coef_fw coef0225[] = {
3748 UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14),
3749 UPDATE_COEF(0x4a, 3<<4, 2<<4),
3750 UPDATE_COEF(0x63, 3<<14, 0),
3751 {}
3752 };
3753
3730 3754
3731 switch (codec->core.vendor_id) { 3755 switch (codec->core.vendor_id) {
3732 case 0x10ec0255: 3756 case 0x10ec0255:
@@ -3772,6 +3796,12 @@ static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
3772 alc_process_coef_fw(codec, coef0688); 3796 alc_process_coef_fw(codec, coef0688);
3773 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50); 3797 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
3774 break; 3798 break;
3799 case 0x10ec0225:
3800 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x31<<10);
3801 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
3802 alc_process_coef_fw(codec, coef0225);
3803 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
3804 break;
3775 } 3805 }
3776 codec_dbg(codec, "Headset jack set to mic-in mode.\n"); 3806 codec_dbg(codec, "Headset jack set to mic-in mode.\n");
3777} 3807}
@@ -3884,6 +3914,13 @@ static void alc_headset_mode_ctia(struct hda_codec *codec)
3884 WRITE_COEF(0xc3, 0x0000), 3914 WRITE_COEF(0xc3, 0x0000),
3885 {} 3915 {}
3886 }; 3916 };
3917 static struct coef_fw coef0225[] = {
3918 UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
3919 UPDATE_COEF(0x49, 1<<8, 1<<8),
3920 UPDATE_COEF(0x4a, 7<<6, 7<<6),
3921 UPDATE_COEF(0x4a, 3<<4, 3<<4),
3922 {}
3923 };
3887 3924
3888 switch (codec->core.vendor_id) { 3925 switch (codec->core.vendor_id) {
3889 case 0x10ec0255: 3926 case 0x10ec0255:
@@ -3912,6 +3949,9 @@ static void alc_headset_mode_ctia(struct hda_codec *codec)
3912 case 0x10ec0668: 3949 case 0x10ec0668:
3913 alc_process_coef_fw(codec, coef0688); 3950 alc_process_coef_fw(codec, coef0688);
3914 break; 3951 break;
3952 case 0x10ec0225:
3953 alc_process_coef_fw(codec, coef0225);
3954 break;
3915 } 3955 }
3916 codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n"); 3956 codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n");
3917} 3957}
@@ -3955,6 +3995,13 @@ static void alc_headset_mode_omtp(struct hda_codec *codec)
3955 WRITE_COEF(0xc3, 0x0000), 3995 WRITE_COEF(0xc3, 0x0000),
3956 {} 3996 {}
3957 }; 3997 };
3998 static struct coef_fw coef0225[] = {
3999 UPDATE_COEF(0x45, 0x3f<<10, 0x39<<10),
4000 UPDATE_COEF(0x49, 1<<8, 1<<8),
4001 UPDATE_COEF(0x4a, 7<<6, 7<<6),
4002 UPDATE_COEF(0x4a, 3<<4, 3<<4),
4003 {}
4004 };
3958 4005
3959 switch (codec->core.vendor_id) { 4006 switch (codec->core.vendor_id) {
3960 case 0x10ec0255: 4007 case 0x10ec0255:
@@ -3983,6 +4030,9 @@ static void alc_headset_mode_omtp(struct hda_codec *codec)
3983 case 0x10ec0668: 4030 case 0x10ec0668:
3984 alc_process_coef_fw(codec, coef0688); 4031 alc_process_coef_fw(codec, coef0688);
3985 break; 4032 break;
4033 case 0x10ec0225:
4034 alc_process_coef_fw(codec, coef0225);
4035 break;
3986 } 4036 }
3987 codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n"); 4037 codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n");
3988} 4038}
@@ -4014,6 +4064,11 @@ static void alc_determine_headset_type(struct hda_codec *codec)
4014 WRITE_COEF(0xc3, 0x0c00), 4064 WRITE_COEF(0xc3, 0x0c00),
4015 {} 4065 {}
4016 }; 4066 };
4067 static struct coef_fw coef0225[] = {
4068 UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10),
4069 UPDATE_COEF(0x49, 1<<8, 1<<8),
4070 {}
4071 };
4017 4072
4018 switch (codec->core.vendor_id) { 4073 switch (codec->core.vendor_id) {
4019 case 0x10ec0255: 4074 case 0x10ec0255:
@@ -4058,6 +4113,12 @@ static void alc_determine_headset_type(struct hda_codec *codec)
4058 val = alc_read_coef_idx(codec, 0xbe); 4113 val = alc_read_coef_idx(codec, 0xbe);
4059 is_ctia = (val & 0x1c02) == 0x1c02; 4114 is_ctia = (val & 0x1c02) == 0x1c02;
4060 break; 4115 break;
4116 case 0x10ec0225:
4117 alc_process_coef_fw(codec, coef0225);
4118 msleep(800);
4119 val = alc_read_coef_idx(codec, 0x46);
4120 is_ctia = (val & 0x00f0) == 0x00f0;
4121 break;
4061 } 4122 }
4062 4123
4063 codec_dbg(codec, "Headset jack detected iPhone-style headset: %s\n", 4124 codec_dbg(codec, "Headset jack detected iPhone-style headset: %s\n",
@@ -5560,6 +5621,9 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
5560 {.id = ALC292_FIXUP_TPT440, .name = "tpt440"}, 5621 {.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
5561 {} 5622 {}
5562}; 5623};
5624#define ALC225_STANDARD_PINS \
5625 {0x12, 0xb7a60130}, \
5626 {0x21, 0x04211020}
5563 5627
5564#define ALC256_STANDARD_PINS \ 5628#define ALC256_STANDARD_PINS \
5565 {0x12, 0x90a60140}, \ 5629 {0x12, 0x90a60140}, \
@@ -5581,6 +5645,12 @@ static const struct hda_model_fixup alc269_fixup_models[] = {
5581 {0x21, 0x03211020} 5645 {0x21, 0x03211020}
5582 5646
5583static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { 5647static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
5648 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
5649 ALC225_STANDARD_PINS,
5650 {0x14, 0x901701a0}),
5651 SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
5652 ALC225_STANDARD_PINS,
5653 {0x14, 0x901701b0}),
5584 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, 5654 SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
5585 {0x14, 0x90170110}, 5655 {0x14, 0x90170110},
5586 {0x21, 0x02211020}), 5656 {0x21, 0x02211020}),
@@ -5906,6 +5976,9 @@ static int patch_alc269(struct hda_codec *codec)
5906 spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */ 5976 spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */
5907 alc_update_coef_idx(codec, 0x36, 1 << 13, 1 << 5); /* Switch pcbeep path to Line in path*/ 5977 alc_update_coef_idx(codec, 0x36, 1 << 13, 1 << 5); /* Switch pcbeep path to Line in path*/
5908 break; 5978 break;
5979 case 0x10ec0225:
5980 spec->codec_variant = ALC269_TYPE_ALC225;
5981 break;
5909 } 5982 }
5910 5983
5911 if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) { 5984 if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {
@@ -6796,6 +6869,7 @@ static int patch_alc680(struct hda_codec *codec)
6796 */ 6869 */
6797static const struct hda_device_id snd_hda_id_realtek[] = { 6870static const struct hda_device_id snd_hda_id_realtek[] = {
6798 HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269), 6871 HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),
6872 HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),
6799 HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269), 6873 HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),
6800 HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269), 6874 HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269),
6801 HDA_CODEC_ENTRY(0x10ec0235, "ALC233", patch_alc269), 6875 HDA_CODEC_ENTRY(0x10ec0235, "ALC233", patch_alc269),