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.c281
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 */
48enum { 45enum {
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 */
2578static const struct hda_bind_ctls alc268_bind_beep_sw = { 2577static 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
2587static const struct snd_kcontrol_new alc268_beep_mixer[] = { 2597static 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
3066static 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
3100static 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
3134static 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
3163static 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
3046static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg, 3195static 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 */
7497static const struct hda_device_id snd_hda_id_realtek[] = { 7738static 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),