diff options
Diffstat (limited to 'sound/pci/hda/patch_realtek.c')
-rw-r--r-- | sound/pci/hda/patch_realtek.c | 281 |
1 files changed, 262 insertions, 19 deletions
diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c index cbeebc0a9711..cd6987b5c6d9 100644 --- a/sound/pci/hda/patch_realtek.c +++ b/sound/pci/hda/patch_realtek.c | |||
@@ -41,9 +41,6 @@ | |||
41 | /* keep halting ALC5505 DSP, for power saving */ | 41 | /* keep halting ALC5505 DSP, for power saving */ |
42 | #define HALT_REALTEK_ALC5505 | 42 | #define HALT_REALTEK_ALC5505 |
43 | 43 | ||
44 | /* for GPIO Poll */ | ||
45 | #define GPIO_MASK 0x03 | ||
46 | |||
47 | /* extra amp-initialization sequence types */ | 44 | /* extra amp-initialization sequence types */ |
48 | enum { | 45 | enum { |
49 | ALC_INIT_NONE, | 46 | ALC_INIT_NONE, |
@@ -327,6 +324,7 @@ static void alc_fill_eapd_coef(struct hda_codec *codec) | |||
327 | case 0x10ec0292: | 324 | case 0x10ec0292: |
328 | alc_update_coef_idx(codec, 0x4, 1<<15, 0); | 325 | alc_update_coef_idx(codec, 0x4, 1<<15, 0); |
329 | break; | 326 | break; |
327 | case 0x10ec0215: | ||
330 | case 0x10ec0225: | 328 | case 0x10ec0225: |
331 | case 0x10ec0233: | 329 | case 0x10ec0233: |
332 | case 0x10ec0255: | 330 | case 0x10ec0255: |
@@ -335,12 +333,13 @@ static void alc_fill_eapd_coef(struct hda_codec *codec) | |||
335 | case 0x10ec0283: | 333 | case 0x10ec0283: |
336 | case 0x10ec0286: | 334 | case 0x10ec0286: |
337 | case 0x10ec0288: | 335 | case 0x10ec0288: |
336 | case 0x10ec0285: | ||
338 | case 0x10ec0295: | 337 | case 0x10ec0295: |
339 | case 0x10ec0298: | 338 | case 0x10ec0298: |
339 | case 0x10ec0289: | ||
340 | case 0x10ec0299: | 340 | case 0x10ec0299: |
341 | alc_update_coef_idx(codec, 0x10, 1<<9, 0); | 341 | alc_update_coef_idx(codec, 0x10, 1<<9, 0); |
342 | break; | 342 | break; |
343 | case 0x10ec0285: | ||
344 | case 0x10ec0293: | 343 | case 0x10ec0293: |
345 | alc_update_coef_idx(codec, 0xa, 1<<13, 0); | 344 | alc_update_coef_idx(codec, 0xa, 1<<13, 0); |
346 | break; | 345 | break; |
@@ -2575,18 +2574,37 @@ static int patch_alc262(struct hda_codec *codec) | |||
2575 | * ALC268 | 2574 | * ALC268 |
2576 | */ | 2575 | */ |
2577 | /* bind Beep switches of both NID 0x0f and 0x10 */ | 2576 | /* bind Beep switches of both NID 0x0f and 0x10 */ |
2578 | static const struct hda_bind_ctls alc268_bind_beep_sw = { | 2577 | static int alc268_beep_switch_put(struct snd_kcontrol *kcontrol, |
2579 | .ops = &snd_hda_bind_sw, | 2578 | struct snd_ctl_elem_value *ucontrol) |
2580 | .values = { | 2579 | { |
2581 | HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT), | 2580 | struct hda_codec *codec = snd_kcontrol_chip(kcontrol); |
2582 | HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT), | 2581 | unsigned long pval; |
2583 | 0 | 2582 | int err; |
2584 | }, | 2583 | |
2585 | }; | 2584 | mutex_lock(&codec->control_mutex); |
2585 | pval = kcontrol->private_value; | ||
2586 | kcontrol->private_value = (pval & ~0xff) | 0x0f; | ||
2587 | err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol); | ||
2588 | if (err >= 0) { | ||
2589 | kcontrol->private_value = (pval & ~0xff) | 0x10; | ||
2590 | err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol); | ||
2591 | } | ||
2592 | kcontrol->private_value = pval; | ||
2593 | mutex_unlock(&codec->control_mutex); | ||
2594 | return err; | ||
2595 | } | ||
2586 | 2596 | ||
2587 | static const struct snd_kcontrol_new alc268_beep_mixer[] = { | 2597 | static const struct snd_kcontrol_new alc268_beep_mixer[] = { |
2588 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT), | 2598 | HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT), |
2589 | HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw), | 2599 | { |
2600 | .iface = SNDRV_CTL_ELEM_IFACE_MIXER, | ||
2601 | .name = "Beep Playback Switch", | ||
2602 | .subdevice = HDA_SUBDEV_AMP_FLAG, | ||
2603 | .info = snd_hda_mixer_amp_switch_info, | ||
2604 | .get = snd_hda_mixer_amp_switch_get, | ||
2605 | .put = alc268_beep_switch_put, | ||
2606 | .private_value = HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT) | ||
2607 | }, | ||
2590 | { } | 2608 | { } |
2591 | }; | 2609 | }; |
2592 | 2610 | ||
@@ -2719,11 +2737,12 @@ enum { | |||
2719 | ALC269_TYPE_ALC282, | 2737 | ALC269_TYPE_ALC282, |
2720 | ALC269_TYPE_ALC283, | 2738 | ALC269_TYPE_ALC283, |
2721 | ALC269_TYPE_ALC284, | 2739 | ALC269_TYPE_ALC284, |
2722 | ALC269_TYPE_ALC285, | 2740 | ALC269_TYPE_ALC293, |
2723 | ALC269_TYPE_ALC286, | 2741 | ALC269_TYPE_ALC286, |
2724 | ALC269_TYPE_ALC298, | 2742 | ALC269_TYPE_ALC298, |
2725 | ALC269_TYPE_ALC255, | 2743 | ALC269_TYPE_ALC255, |
2726 | ALC269_TYPE_ALC256, | 2744 | ALC269_TYPE_ALC256, |
2745 | ALC269_TYPE_ALC215, | ||
2727 | ALC269_TYPE_ALC225, | 2746 | ALC269_TYPE_ALC225, |
2728 | ALC269_TYPE_ALC294, | 2747 | ALC269_TYPE_ALC294, |
2729 | ALC269_TYPE_ALC700, | 2748 | ALC269_TYPE_ALC700, |
@@ -2745,7 +2764,7 @@ static int alc269_parse_auto_config(struct hda_codec *codec) | |||
2745 | case ALC269_TYPE_ALC269VC: | 2764 | case ALC269_TYPE_ALC269VC: |
2746 | case ALC269_TYPE_ALC280: | 2765 | case ALC269_TYPE_ALC280: |
2747 | case ALC269_TYPE_ALC284: | 2766 | case ALC269_TYPE_ALC284: |
2748 | case ALC269_TYPE_ALC285: | 2767 | case ALC269_TYPE_ALC293: |
2749 | ssids = alc269va_ssids; | 2768 | ssids = alc269va_ssids; |
2750 | break; | 2769 | break; |
2751 | case ALC269_TYPE_ALC269VB: | 2770 | case ALC269_TYPE_ALC269VB: |
@@ -2756,6 +2775,7 @@ static int alc269_parse_auto_config(struct hda_codec *codec) | |||
2756 | case ALC269_TYPE_ALC298: | 2775 | case ALC269_TYPE_ALC298: |
2757 | case ALC269_TYPE_ALC255: | 2776 | case ALC269_TYPE_ALC255: |
2758 | case ALC269_TYPE_ALC256: | 2777 | case ALC269_TYPE_ALC256: |
2778 | case ALC269_TYPE_ALC215: | ||
2759 | case ALC269_TYPE_ALC225: | 2779 | case ALC269_TYPE_ALC225: |
2760 | case ALC269_TYPE_ALC294: | 2780 | case ALC269_TYPE_ALC294: |
2761 | case ALC269_TYPE_ALC700: | 2781 | case ALC269_TYPE_ALC700: |
@@ -3043,6 +3063,135 @@ static void alc283_shutup(struct hda_codec *codec) | |||
3043 | alc_write_coef_idx(codec, 0x43, 0x9614); | 3063 | alc_write_coef_idx(codec, 0x43, 0x9614); |
3044 | } | 3064 | } |
3045 | 3065 | ||
3066 | static void alc256_init(struct hda_codec *codec) | ||
3067 | { | ||
3068 | struct alc_spec *spec = codec->spec; | ||
3069 | hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0]; | ||
3070 | bool hp_pin_sense; | ||
3071 | |||
3072 | if (!hp_pin) | ||
3073 | return; | ||
3074 | |||
3075 | msleep(30); | ||
3076 | |||
3077 | hp_pin_sense = snd_hda_jack_detect(codec, hp_pin); | ||
3078 | |||
3079 | if (hp_pin_sense) | ||
3080 | msleep(2); | ||
3081 | |||
3082 | alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */ | ||
3083 | |||
3084 | snd_hda_codec_write(codec, hp_pin, 0, | ||
3085 | AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); | ||
3086 | |||
3087 | if (hp_pin_sense) | ||
3088 | msleep(85); | ||
3089 | |||
3090 | snd_hda_codec_write(codec, hp_pin, 0, | ||
3091 | AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT); | ||
3092 | |||
3093 | if (hp_pin_sense) | ||
3094 | msleep(100); | ||
3095 | |||
3096 | alc_update_coef_idx(codec, 0x46, 3 << 12, 0); | ||
3097 | alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */ | ||
3098 | } | ||
3099 | |||
3100 | static void alc256_shutup(struct hda_codec *codec) | ||
3101 | { | ||
3102 | struct alc_spec *spec = codec->spec; | ||
3103 | hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0]; | ||
3104 | bool hp_pin_sense; | ||
3105 | |||
3106 | if (!hp_pin) { | ||
3107 | alc269_shutup(codec); | ||
3108 | return; | ||
3109 | } | ||
3110 | |||
3111 | hp_pin_sense = snd_hda_jack_detect(codec, hp_pin); | ||
3112 | |||
3113 | if (hp_pin_sense) | ||
3114 | msleep(2); | ||
3115 | |||
3116 | snd_hda_codec_write(codec, hp_pin, 0, | ||
3117 | AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); | ||
3118 | |||
3119 | if (hp_pin_sense) | ||
3120 | msleep(85); | ||
3121 | |||
3122 | snd_hda_codec_write(codec, hp_pin, 0, | ||
3123 | AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0); | ||
3124 | |||
3125 | alc_update_coef_idx(codec, 0x46, 0, 3 << 12); /* 3k pull low control for Headset jack. */ | ||
3126 | |||
3127 | if (hp_pin_sense) | ||
3128 | msleep(100); | ||
3129 | |||
3130 | alc_auto_setup_eapd(codec, false); | ||
3131 | snd_hda_shutup_pins(codec); | ||
3132 | } | ||
3133 | |||
3134 | static void alc_default_init(struct hda_codec *codec) | ||
3135 | { | ||
3136 | struct alc_spec *spec = codec->spec; | ||
3137 | hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0]; | ||
3138 | bool hp_pin_sense; | ||
3139 | |||
3140 | if (!hp_pin) | ||
3141 | return; | ||
3142 | |||
3143 | msleep(30); | ||
3144 | |||
3145 | hp_pin_sense = snd_hda_jack_detect(codec, hp_pin); | ||
3146 | |||
3147 | if (hp_pin_sense) | ||
3148 | msleep(2); | ||
3149 | |||
3150 | snd_hda_codec_write(codec, hp_pin, 0, | ||
3151 | AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); | ||
3152 | |||
3153 | if (hp_pin_sense) | ||
3154 | msleep(85); | ||
3155 | |||
3156 | snd_hda_codec_write(codec, hp_pin, 0, | ||
3157 | AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT); | ||
3158 | |||
3159 | if (hp_pin_sense) | ||
3160 | msleep(100); | ||
3161 | } | ||
3162 | |||
3163 | static void alc_default_shutup(struct hda_codec *codec) | ||
3164 | { | ||
3165 | struct alc_spec *spec = codec->spec; | ||
3166 | hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0]; | ||
3167 | bool hp_pin_sense; | ||
3168 | |||
3169 | if (!hp_pin) { | ||
3170 | alc269_shutup(codec); | ||
3171 | return; | ||
3172 | } | ||
3173 | |||
3174 | hp_pin_sense = snd_hda_jack_detect(codec, hp_pin); | ||
3175 | |||
3176 | if (hp_pin_sense) | ||
3177 | msleep(2); | ||
3178 | |||
3179 | snd_hda_codec_write(codec, hp_pin, 0, | ||
3180 | AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE); | ||
3181 | |||
3182 | if (hp_pin_sense) | ||
3183 | msleep(85); | ||
3184 | |||
3185 | snd_hda_codec_write(codec, hp_pin, 0, | ||
3186 | AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0); | ||
3187 | |||
3188 | if (hp_pin_sense) | ||
3189 | msleep(100); | ||
3190 | |||
3191 | alc_auto_setup_eapd(codec, false); | ||
3192 | snd_hda_shutup_pins(codec); | ||
3193 | } | ||
3194 | |||
3046 | static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg, | 3195 | static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg, |
3047 | unsigned int val) | 3196 | unsigned int val) |
3048 | { | 3197 | { |
@@ -3754,6 +3903,16 @@ static void alc_headset_mode_unplugged(struct hda_codec *codec) | |||
3754 | UPDATE_COEF(0x4a, 3<<10, 0), | 3903 | UPDATE_COEF(0x4a, 3<<10, 0), |
3755 | {} | 3904 | {} |
3756 | }; | 3905 | }; |
3906 | static struct coef_fw coef0274[] = { | ||
3907 | UPDATE_COEF(0x4a, 0x0100, 0), | ||
3908 | UPDATE_COEFEX(0x57, 0x05, 0x4000, 0), | ||
3909 | UPDATE_COEF(0x6b, 0xf000, 0x5000), | ||
3910 | UPDATE_COEF(0x4a, 0x0010, 0), | ||
3911 | UPDATE_COEF(0x4a, 0x0c00, 0x0c00), | ||
3912 | WRITE_COEF(0x45, 0x5289), | ||
3913 | UPDATE_COEF(0x4a, 0x0c00, 0), | ||
3914 | {} | ||
3915 | }; | ||
3757 | 3916 | ||
3758 | switch (codec->core.vendor_id) { | 3917 | switch (codec->core.vendor_id) { |
3759 | case 0x10ec0255: | 3918 | case 0x10ec0255: |
@@ -3764,6 +3923,11 @@ static void alc_headset_mode_unplugged(struct hda_codec *codec) | |||
3764 | alc_process_coef_fw(codec, coef0256); | 3923 | alc_process_coef_fw(codec, coef0256); |
3765 | alc_process_coef_fw(codec, coef0255); | 3924 | alc_process_coef_fw(codec, coef0255); |
3766 | break; | 3925 | break; |
3926 | case 0x10ec0234: | ||
3927 | case 0x10ec0274: | ||
3928 | case 0x10ec0294: | ||
3929 | alc_process_coef_fw(codec, coef0274); | ||
3930 | break; | ||
3767 | case 0x10ec0233: | 3931 | case 0x10ec0233: |
3768 | case 0x10ec0283: | 3932 | case 0x10ec0283: |
3769 | alc_process_coef_fw(codec, coef0233); | 3933 | alc_process_coef_fw(codec, coef0233); |
@@ -3841,7 +4005,12 @@ static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin, | |||
3841 | UPDATE_COEF(0x63, 3<<14, 0), | 4005 | UPDATE_COEF(0x63, 3<<14, 0), |
3842 | {} | 4006 | {} |
3843 | }; | 4007 | }; |
3844 | 4008 | static struct coef_fw coef0274[] = { | |
4009 | UPDATE_COEFEX(0x57, 0x05, 0x4000, 0x4000), | ||
4010 | UPDATE_COEF(0x4a, 0x0010, 0), | ||
4011 | UPDATE_COEF(0x6b, 0xf000, 0), | ||
4012 | {} | ||
4013 | }; | ||
3845 | 4014 | ||
3846 | switch (codec->core.vendor_id) { | 4015 | switch (codec->core.vendor_id) { |
3847 | case 0x10ec0255: | 4016 | case 0x10ec0255: |
@@ -3851,6 +4020,14 @@ static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin, | |||
3851 | alc_process_coef_fw(codec, coef0255); | 4020 | alc_process_coef_fw(codec, coef0255); |
3852 | snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50); | 4021 | snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50); |
3853 | break; | 4022 | break; |
4023 | case 0x10ec0234: | ||
4024 | case 0x10ec0274: | ||
4025 | case 0x10ec0294: | ||
4026 | alc_write_coef_idx(codec, 0x45, 0x4689); | ||
4027 | snd_hda_set_pin_ctl_cache(codec, hp_pin, 0); | ||
4028 | alc_process_coef_fw(codec, coef0274); | ||
4029 | snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50); | ||
4030 | break; | ||
3854 | case 0x10ec0233: | 4031 | case 0x10ec0233: |
3855 | case 0x10ec0283: | 4032 | case 0x10ec0283: |
3856 | alc_write_coef_idx(codec, 0x45, 0xc429); | 4033 | alc_write_coef_idx(codec, 0x45, 0xc429); |
@@ -3948,6 +4125,13 @@ static void alc_headset_mode_default(struct hda_codec *codec) | |||
3948 | WRITE_COEF(0xb7, 0x802b), | 4125 | WRITE_COEF(0xb7, 0x802b), |
3949 | {} | 4126 | {} |
3950 | }; | 4127 | }; |
4128 | static struct coef_fw coef0274[] = { | ||
4129 | WRITE_COEF(0x45, 0x4289), | ||
4130 | UPDATE_COEF(0x4a, 0x0010, 0x0010), | ||
4131 | UPDATE_COEF(0x6b, 0x0f00, 0), | ||
4132 | UPDATE_COEF(0x49, 0x0300, 0x0300), | ||
4133 | {} | ||
4134 | }; | ||
3951 | 4135 | ||
3952 | switch (codec->core.vendor_id) { | 4136 | switch (codec->core.vendor_id) { |
3953 | case 0x10ec0225: | 4137 | case 0x10ec0225: |
@@ -3959,6 +4143,11 @@ static void alc_headset_mode_default(struct hda_codec *codec) | |||
3959 | case 0x10ec0256: | 4143 | case 0x10ec0256: |
3960 | alc_process_coef_fw(codec, coef0255); | 4144 | alc_process_coef_fw(codec, coef0255); |
3961 | break; | 4145 | break; |
4146 | case 0x10ec0234: | ||
4147 | case 0x10ec0274: | ||
4148 | case 0x10ec0294: | ||
4149 | alc_process_coef_fw(codec, coef0274); | ||
4150 | break; | ||
3962 | case 0x10ec0233: | 4151 | case 0x10ec0233: |
3963 | case 0x10ec0283: | 4152 | case 0x10ec0283: |
3964 | alc_process_coef_fw(codec, coef0233); | 4153 | alc_process_coef_fw(codec, coef0233); |
@@ -4044,6 +4233,11 @@ static void alc_headset_mode_ctia(struct hda_codec *codec) | |||
4044 | case 0x10ec0256: | 4233 | case 0x10ec0256: |
4045 | alc_process_coef_fw(codec, coef0256); | 4234 | alc_process_coef_fw(codec, coef0256); |
4046 | break; | 4235 | break; |
4236 | case 0x10ec0234: | ||
4237 | case 0x10ec0274: | ||
4238 | case 0x10ec0294: | ||
4239 | alc_write_coef_idx(codec, 0x45, 0xd689); | ||
4240 | break; | ||
4047 | case 0x10ec0233: | 4241 | case 0x10ec0233: |
4048 | case 0x10ec0283: | 4242 | case 0x10ec0283: |
4049 | alc_process_coef_fw(codec, coef0233); | 4243 | alc_process_coef_fw(codec, coef0233); |
@@ -4138,6 +4332,11 @@ static void alc_headset_mode_omtp(struct hda_codec *codec) | |||
4138 | case 0x10ec0256: | 4332 | case 0x10ec0256: |
4139 | alc_process_coef_fw(codec, coef0256); | 4333 | alc_process_coef_fw(codec, coef0256); |
4140 | break; | 4334 | break; |
4335 | case 0x10ec0234: | ||
4336 | case 0x10ec0274: | ||
4337 | case 0x10ec0294: | ||
4338 | alc_write_coef_idx(codec, 0x45, 0xe689); | ||
4339 | break; | ||
4141 | case 0x10ec0233: | 4340 | case 0x10ec0233: |
4142 | case 0x10ec0283: | 4341 | case 0x10ec0283: |
4143 | alc_process_coef_fw(codec, coef0233); | 4342 | alc_process_coef_fw(codec, coef0233); |
@@ -4201,6 +4400,13 @@ static void alc_determine_headset_type(struct hda_codec *codec) | |||
4201 | UPDATE_COEF(0x49, 1<<8, 1<<8), | 4400 | UPDATE_COEF(0x49, 1<<8, 1<<8), |
4202 | {} | 4401 | {} |
4203 | }; | 4402 | }; |
4403 | static struct coef_fw coef0274[] = { | ||
4404 | UPDATE_COEF(0x4a, 0x0010, 0), | ||
4405 | UPDATE_COEF(0x4a, 0x8000, 0), | ||
4406 | WRITE_COEF(0x45, 0xd289), | ||
4407 | UPDATE_COEF(0x49, 0x0300, 0x0300), | ||
4408 | {} | ||
4409 | }; | ||
4204 | 4410 | ||
4205 | switch (codec->core.vendor_id) { | 4411 | switch (codec->core.vendor_id) { |
4206 | case 0x10ec0255: | 4412 | case 0x10ec0255: |
@@ -4210,6 +4416,14 @@ static void alc_determine_headset_type(struct hda_codec *codec) | |||
4210 | val = alc_read_coef_idx(codec, 0x46); | 4416 | val = alc_read_coef_idx(codec, 0x46); |
4211 | is_ctia = (val & 0x0070) == 0x0070; | 4417 | is_ctia = (val & 0x0070) == 0x0070; |
4212 | break; | 4418 | break; |
4419 | case 0x10ec0234: | ||
4420 | case 0x10ec0274: | ||
4421 | case 0x10ec0294: | ||
4422 | alc_process_coef_fw(codec, coef0274); | ||
4423 | msleep(80); | ||
4424 | val = alc_read_coef_idx(codec, 0x46); | ||
4425 | is_ctia = (val & 0x00f0) == 0x00f0; | ||
4426 | break; | ||
4213 | case 0x10ec0233: | 4427 | case 0x10ec0233: |
4214 | case 0x10ec0283: | 4428 | case 0x10ec0283: |
4215 | alc_write_coef_idx(codec, 0x45, 0xd029); | 4429 | alc_write_coef_idx(codec, 0x45, 0xd029); |
@@ -4892,6 +5106,7 @@ enum { | |||
4892 | ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, | 5106 | ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, |
4893 | ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, | 5107 | ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, |
4894 | ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, | 5108 | ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, |
5109 | ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, | ||
4895 | ALC269_FIXUP_HEADSET_MODE, | 5110 | ALC269_FIXUP_HEADSET_MODE, |
4896 | ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, | 5111 | ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, |
4897 | ALC269_FIXUP_ASPIRE_HEADSET_MIC, | 5112 | ALC269_FIXUP_ASPIRE_HEADSET_MIC, |
@@ -5192,6 +5407,16 @@ static const struct hda_fixup alc269_fixups[] = { | |||
5192 | .chained = true, | 5407 | .chained = true, |
5193 | .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC | 5408 | .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC |
5194 | }, | 5409 | }, |
5410 | [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = { | ||
5411 | .type = HDA_FIXUP_PINS, | ||
5412 | .v.pins = (const struct hda_pintbl[]) { | ||
5413 | { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */ | ||
5414 | { 0x1b, 0x01a1913d }, /* use as headphone mic, without its own jack detect */ | ||
5415 | { } | ||
5416 | }, | ||
5417 | .chained = true, | ||
5418 | .chain_id = ALC269_FIXUP_HEADSET_MODE | ||
5419 | }, | ||
5195 | [ALC269_FIXUP_HEADSET_MODE] = { | 5420 | [ALC269_FIXUP_HEADSET_MODE] = { |
5196 | .type = HDA_FIXUP_FUNC, | 5421 | .type = HDA_FIXUP_FUNC, |
5197 | .v.func = alc_fixup_headset_mode, | 5422 | .v.func = alc_fixup_headset_mode, |
@@ -6322,6 +6547,11 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = { | |||
6322 | {0x17, 0x90170110}, | 6547 | {0x17, 0x90170110}, |
6323 | {0x1a, 0x03011020}, | 6548 | {0x1a, 0x03011020}, |
6324 | {0x21, 0x03211030}), | 6549 | {0x21, 0x03211030}), |
6550 | SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, | ||
6551 | ALC225_STANDARD_PINS, | ||
6552 | {0x12, 0xb7a60130}, | ||
6553 | {0x13, 0xb8a61140}, | ||
6554 | {0x17, 0x90170110}), | ||
6325 | {} | 6555 | {} |
6326 | }; | 6556 | }; |
6327 | 6557 | ||
@@ -6384,7 +6614,8 @@ static int patch_alc269(struct hda_codec *codec) | |||
6384 | codec->patch_ops.suspend = alc269_suspend; | 6614 | codec->patch_ops.suspend = alc269_suspend; |
6385 | codec->patch_ops.resume = alc269_resume; | 6615 | codec->patch_ops.resume = alc269_resume; |
6386 | #endif | 6616 | #endif |
6387 | spec->shutup = alc269_shutup; | 6617 | spec->shutup = alc_default_shutup; |
6618 | spec->init_hook = alc_default_init; | ||
6388 | 6619 | ||
6389 | snd_hda_pick_fixup(codec, alc269_fixup_models, | 6620 | snd_hda_pick_fixup(codec, alc269_fixup_models, |
6390 | alc269_fixup_tbl, alc269_fixups); | 6621 | alc269_fixup_tbl, alc269_fixups); |
@@ -6424,6 +6655,7 @@ static int patch_alc269(struct hda_codec *codec) | |||
6424 | } | 6655 | } |
6425 | if (err < 0) | 6656 | if (err < 0) |
6426 | goto error; | 6657 | goto error; |
6658 | spec->shutup = alc269_shutup; | ||
6427 | spec->init_hook = alc269_fill_coef; | 6659 | spec->init_hook = alc269_fill_coef; |
6428 | alc269_fill_coef(codec); | 6660 | alc269_fill_coef(codec); |
6429 | break; | 6661 | break; |
@@ -6447,9 +6679,8 @@ static int patch_alc269(struct hda_codec *codec) | |||
6447 | case 0x10ec0292: | 6679 | case 0x10ec0292: |
6448 | spec->codec_variant = ALC269_TYPE_ALC284; | 6680 | spec->codec_variant = ALC269_TYPE_ALC284; |
6449 | break; | 6681 | break; |
6450 | case 0x10ec0285: | ||
6451 | case 0x10ec0293: | 6682 | case 0x10ec0293: |
6452 | spec->codec_variant = ALC269_TYPE_ALC285; | 6683 | spec->codec_variant = ALC269_TYPE_ALC293; |
6453 | break; | 6684 | break; |
6454 | case 0x10ec0286: | 6685 | case 0x10ec0286: |
6455 | case 0x10ec0288: | 6686 | case 0x10ec0288: |
@@ -6464,9 +6695,17 @@ static int patch_alc269(struct hda_codec *codec) | |||
6464 | break; | 6695 | break; |
6465 | case 0x10ec0256: | 6696 | case 0x10ec0256: |
6466 | spec->codec_variant = ALC269_TYPE_ALC256; | 6697 | spec->codec_variant = ALC269_TYPE_ALC256; |
6698 | spec->shutup = alc256_shutup; | ||
6699 | spec->init_hook = alc256_init; | ||
6467 | spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */ | 6700 | spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */ |
6468 | alc_update_coef_idx(codec, 0x36, 1 << 13, 1 << 5); /* Switch pcbeep path to Line in path*/ | 6701 | alc_update_coef_idx(codec, 0x36, 1 << 13, 1 << 5); /* Switch pcbeep path to Line in path*/ |
6469 | break; | 6702 | break; |
6703 | case 0x10ec0215: | ||
6704 | case 0x10ec0285: | ||
6705 | case 0x10ec0289: | ||
6706 | spec->codec_variant = ALC269_TYPE_ALC215; | ||
6707 | spec->gen.mixer_nid = 0; | ||
6708 | break; | ||
6470 | case 0x10ec0225: | 6709 | case 0x10ec0225: |
6471 | case 0x10ec0295: | 6710 | case 0x10ec0295: |
6472 | spec->codec_variant = ALC269_TYPE_ALC225; | 6711 | spec->codec_variant = ALC269_TYPE_ALC225; |
@@ -6479,6 +6718,8 @@ static int patch_alc269(struct hda_codec *codec) | |||
6479 | case 0x10ec0274: | 6718 | case 0x10ec0274: |
6480 | case 0x10ec0294: | 6719 | case 0x10ec0294: |
6481 | spec->codec_variant = ALC269_TYPE_ALC294; | 6720 | spec->codec_variant = ALC269_TYPE_ALC294; |
6721 | spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */ | ||
6722 | alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */ | ||
6482 | break; | 6723 | break; |
6483 | case 0x10ec0700: | 6724 | case 0x10ec0700: |
6484 | case 0x10ec0701: | 6725 | case 0x10ec0701: |
@@ -7495,6 +7736,7 @@ static int patch_alc680(struct hda_codec *codec) | |||
7495 | * patch entries | 7736 | * patch entries |
7496 | */ | 7737 | */ |
7497 | static const struct hda_device_id snd_hda_id_realtek[] = { | 7738 | static const struct hda_device_id snd_hda_id_realtek[] = { |
7739 | HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269), | ||
7498 | HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269), | 7740 | HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269), |
7499 | HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269), | 7741 | HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269), |
7500 | HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269), | 7742 | HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269), |
@@ -7520,6 +7762,7 @@ static const struct hda_device_id snd_hda_id_realtek[] = { | |||
7520 | HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269), | 7762 | HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269), |
7521 | HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269), | 7763 | HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269), |
7522 | HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269), | 7764 | HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269), |
7765 | HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269), | ||
7523 | HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269), | 7766 | HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269), |
7524 | HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269), | 7767 | HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269), |
7525 | HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269), | 7768 | HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269), |