diff options
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 74 |
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 | ||
5583 | static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { | 5647 | static 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 | */ |
6797 | static const struct hda_device_id snd_hda_id_realtek[] = { | 6870 | static 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), |