ALSA: hda/realtek: Add quirk for Samsung Galaxy Book Ion
[linux-2.6-microblaze.git] / sound / pci / hda / patch_realtek.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Universal Interface for Intel High Definition Audio Codec
4  *
5  * HD audio interface patch for Realtek ALC codecs
6  *
7  * Copyright (c) 2004 Kailang Yang <kailang@realtek.com.tw>
8  *                    PeiSen Hou <pshou@realtek.com.tw>
9  *                    Takashi Iwai <tiwai@suse.de>
10  *                    Jonathan Woithe <jwoithe@just42.net>
11  */
12
13 #include <linux/init.h>
14 #include <linux/delay.h>
15 #include <linux/slab.h>
16 #include <linux/pci.h>
17 #include <linux/dmi.h>
18 #include <linux/module.h>
19 #include <linux/input.h>
20 #include <linux/leds.h>
21 #include <sound/core.h>
22 #include <sound/jack.h>
23 #include <sound/hda_codec.h>
24 #include "hda_local.h"
25 #include "hda_auto_parser.h"
26 #include "hda_jack.h"
27 #include "hda_generic.h"
28
29 /* keep halting ALC5505 DSP, for power saving */
30 #define HALT_REALTEK_ALC5505
31
32 /* extra amp-initialization sequence types */
33 enum {
34         ALC_INIT_UNDEFINED,
35         ALC_INIT_NONE,
36         ALC_INIT_DEFAULT,
37 };
38
39 enum {
40         ALC_HEADSET_MODE_UNKNOWN,
41         ALC_HEADSET_MODE_UNPLUGGED,
42         ALC_HEADSET_MODE_HEADSET,
43         ALC_HEADSET_MODE_MIC,
44         ALC_HEADSET_MODE_HEADPHONE,
45 };
46
47 enum {
48         ALC_HEADSET_TYPE_UNKNOWN,
49         ALC_HEADSET_TYPE_CTIA,
50         ALC_HEADSET_TYPE_OMTP,
51 };
52
53 enum {
54         ALC_KEY_MICMUTE_INDEX,
55 };
56
57 struct alc_customize_define {
58         unsigned int  sku_cfg;
59         unsigned char port_connectivity;
60         unsigned char check_sum;
61         unsigned char customization;
62         unsigned char external_amp;
63         unsigned int  enable_pcbeep:1;
64         unsigned int  platform_type:1;
65         unsigned int  swap:1;
66         unsigned int  override:1;
67         unsigned int  fixup:1; /* Means that this sku is set by driver, not read from hw */
68 };
69
70 struct alc_coef_led {
71         unsigned int idx;
72         unsigned int mask;
73         unsigned int on;
74         unsigned int off;
75 };
76
77 struct alc_spec {
78         struct hda_gen_spec gen; /* must be at head */
79
80         /* codec parameterization */
81         struct alc_customize_define cdefine;
82         unsigned int parse_flags; /* flag for snd_hda_parse_pin_defcfg() */
83
84         /* GPIO bits */
85         unsigned int gpio_mask;
86         unsigned int gpio_dir;
87         unsigned int gpio_data;
88         bool gpio_write_delay;  /* add a delay before writing gpio_data */
89
90         /* mute LED for HP laptops, see vref_mute_led_set() */
91         int mute_led_polarity;
92         int micmute_led_polarity;
93         hda_nid_t mute_led_nid;
94         hda_nid_t cap_mute_led_nid;
95
96         unsigned int gpio_mute_led_mask;
97         unsigned int gpio_mic_led_mask;
98         struct alc_coef_led mute_led_coef;
99         struct alc_coef_led mic_led_coef;
100
101         hda_nid_t headset_mic_pin;
102         hda_nid_t headphone_mic_pin;
103         int current_headset_mode;
104         int current_headset_type;
105
106         /* hooks */
107         void (*init_hook)(struct hda_codec *codec);
108 #ifdef CONFIG_PM
109         void (*power_hook)(struct hda_codec *codec);
110 #endif
111         void (*shutup)(struct hda_codec *codec);
112         void (*reboot_notify)(struct hda_codec *codec);
113
114         int init_amp;
115         int codec_variant;      /* flag for other variants */
116         unsigned int has_alc5505_dsp:1;
117         unsigned int no_depop_delay:1;
118         unsigned int done_hp_init:1;
119         unsigned int no_shutup_pins:1;
120         unsigned int ultra_low_power:1;
121         unsigned int has_hs_key:1;
122
123         /* for PLL fix */
124         hda_nid_t pll_nid;
125         unsigned int pll_coef_idx, pll_coef_bit;
126         unsigned int coef0;
127         struct input_dev *kb_dev;
128         u8 alc_mute_keycode_map[1];
129 };
130
131 /*
132  * COEF access helper functions
133  */
134
135 static int alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
136                                unsigned int coef_idx)
137 {
138         unsigned int val;
139
140         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
141         val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0);
142         return val;
143 }
144
145 #define alc_read_coef_idx(codec, coef_idx) \
146         alc_read_coefex_idx(codec, 0x20, coef_idx)
147
148 static void alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
149                                  unsigned int coef_idx, unsigned int coef_val)
150 {
151         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
152         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PROC_COEF, coef_val);
153 }
154
155 #define alc_write_coef_idx(codec, coef_idx, coef_val) \
156         alc_write_coefex_idx(codec, 0x20, coef_idx, coef_val)
157
158 static void alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
159                                   unsigned int coef_idx, unsigned int mask,
160                                   unsigned int bits_set)
161 {
162         unsigned int val = alc_read_coefex_idx(codec, nid, coef_idx);
163
164         if (val != -1)
165                 alc_write_coefex_idx(codec, nid, coef_idx,
166                                      (val & ~mask) | bits_set);
167 }
168
169 #define alc_update_coef_idx(codec, coef_idx, mask, bits_set)    \
170         alc_update_coefex_idx(codec, 0x20, coef_idx, mask, bits_set)
171
172 /* a special bypass for COEF 0; read the cached value at the second time */
173 static unsigned int alc_get_coef0(struct hda_codec *codec)
174 {
175         struct alc_spec *spec = codec->spec;
176
177         if (!spec->coef0)
178                 spec->coef0 = alc_read_coef_idx(codec, 0);
179         return spec->coef0;
180 }
181
182 /* coef writes/updates batch */
183 struct coef_fw {
184         unsigned char nid;
185         unsigned char idx;
186         unsigned short mask;
187         unsigned short val;
188 };
189
190 #define UPDATE_COEFEX(_nid, _idx, _mask, _val) \
191         { .nid = (_nid), .idx = (_idx), .mask = (_mask), .val = (_val) }
192 #define WRITE_COEFEX(_nid, _idx, _val) UPDATE_COEFEX(_nid, _idx, -1, _val)
193 #define WRITE_COEF(_idx, _val) WRITE_COEFEX(0x20, _idx, _val)
194 #define UPDATE_COEF(_idx, _mask, _val) UPDATE_COEFEX(0x20, _idx, _mask, _val)
195
196 static void alc_process_coef_fw(struct hda_codec *codec,
197                                 const struct coef_fw *fw)
198 {
199         for (; fw->nid; fw++) {
200                 if (fw->mask == (unsigned short)-1)
201                         alc_write_coefex_idx(codec, fw->nid, fw->idx, fw->val);
202                 else
203                         alc_update_coefex_idx(codec, fw->nid, fw->idx,
204                                               fw->mask, fw->val);
205         }
206 }
207
208 /*
209  * GPIO setup tables, used in initialization
210  */
211
212 /* Enable GPIO mask and set output */
213 static void alc_setup_gpio(struct hda_codec *codec, unsigned int mask)
214 {
215         struct alc_spec *spec = codec->spec;
216
217         spec->gpio_mask |= mask;
218         spec->gpio_dir |= mask;
219         spec->gpio_data |= mask;
220 }
221
222 static void alc_write_gpio_data(struct hda_codec *codec)
223 {
224         struct alc_spec *spec = codec->spec;
225
226         snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
227                             spec->gpio_data);
228 }
229
230 static void alc_update_gpio_data(struct hda_codec *codec, unsigned int mask,
231                                  bool on)
232 {
233         struct alc_spec *spec = codec->spec;
234         unsigned int oldval = spec->gpio_data;
235
236         if (on)
237                 spec->gpio_data |= mask;
238         else
239                 spec->gpio_data &= ~mask;
240         if (oldval != spec->gpio_data)
241                 alc_write_gpio_data(codec);
242 }
243
244 static void alc_write_gpio(struct hda_codec *codec)
245 {
246         struct alc_spec *spec = codec->spec;
247
248         if (!spec->gpio_mask)
249                 return;
250
251         snd_hda_codec_write(codec, codec->core.afg, 0,
252                             AC_VERB_SET_GPIO_MASK, spec->gpio_mask);
253         snd_hda_codec_write(codec, codec->core.afg, 0,
254                             AC_VERB_SET_GPIO_DIRECTION, spec->gpio_dir);
255         if (spec->gpio_write_delay)
256                 msleep(1);
257         alc_write_gpio_data(codec);
258 }
259
260 static void alc_fixup_gpio(struct hda_codec *codec, int action,
261                            unsigned int mask)
262 {
263         if (action == HDA_FIXUP_ACT_PRE_PROBE)
264                 alc_setup_gpio(codec, mask);
265 }
266
267 static void alc_fixup_gpio1(struct hda_codec *codec,
268                             const struct hda_fixup *fix, int action)
269 {
270         alc_fixup_gpio(codec, action, 0x01);
271 }
272
273 static void alc_fixup_gpio2(struct hda_codec *codec,
274                             const struct hda_fixup *fix, int action)
275 {
276         alc_fixup_gpio(codec, action, 0x02);
277 }
278
279 static void alc_fixup_gpio3(struct hda_codec *codec,
280                             const struct hda_fixup *fix, int action)
281 {
282         alc_fixup_gpio(codec, action, 0x03);
283 }
284
285 static void alc_fixup_gpio4(struct hda_codec *codec,
286                             const struct hda_fixup *fix, int action)
287 {
288         alc_fixup_gpio(codec, action, 0x04);
289 }
290
291 static void alc_fixup_micmute_led(struct hda_codec *codec,
292                                   const struct hda_fixup *fix, int action)
293 {
294         if (action == HDA_FIXUP_ACT_PROBE)
295                 snd_hda_gen_add_micmute_led_cdev(codec, NULL);
296 }
297
298 /*
299  * Fix hardware PLL issue
300  * On some codecs, the analog PLL gating control must be off while
301  * the default value is 1.
302  */
303 static void alc_fix_pll(struct hda_codec *codec)
304 {
305         struct alc_spec *spec = codec->spec;
306
307         if (spec->pll_nid)
308                 alc_update_coefex_idx(codec, spec->pll_nid, spec->pll_coef_idx,
309                                       1 << spec->pll_coef_bit, 0);
310 }
311
312 static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
313                              unsigned int coef_idx, unsigned int coef_bit)
314 {
315         struct alc_spec *spec = codec->spec;
316         spec->pll_nid = nid;
317         spec->pll_coef_idx = coef_idx;
318         spec->pll_coef_bit = coef_bit;
319         alc_fix_pll(codec);
320 }
321
322 /* update the master volume per volume-knob's unsol event */
323 static void alc_update_knob_master(struct hda_codec *codec,
324                                    struct hda_jack_callback *jack)
325 {
326         unsigned int val;
327         struct snd_kcontrol *kctl;
328         struct snd_ctl_elem_value *uctl;
329
330         kctl = snd_hda_find_mixer_ctl(codec, "Master Playback Volume");
331         if (!kctl)
332                 return;
333         uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
334         if (!uctl)
335                 return;
336         val = snd_hda_codec_read(codec, jack->nid, 0,
337                                  AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
338         val &= HDA_AMP_VOLMASK;
339         uctl->value.integer.value[0] = val;
340         uctl->value.integer.value[1] = val;
341         kctl->put(kctl, uctl);
342         kfree(uctl);
343 }
344
345 static void alc880_unsol_event(struct hda_codec *codec, unsigned int res)
346 {
347         /* For some reason, the res given from ALC880 is broken.
348            Here we adjust it properly. */
349         snd_hda_jack_unsol_event(codec, res >> 2);
350 }
351
352 /* Change EAPD to verb control */
353 static void alc_fill_eapd_coef(struct hda_codec *codec)
354 {
355         int coef;
356
357         coef = alc_get_coef0(codec);
358
359         switch (codec->core.vendor_id) {
360         case 0x10ec0262:
361                 alc_update_coef_idx(codec, 0x7, 0, 1<<5);
362                 break;
363         case 0x10ec0267:
364         case 0x10ec0268:
365                 alc_update_coef_idx(codec, 0x7, 0, 1<<13);
366                 break;
367         case 0x10ec0269:
368                 if ((coef & 0x00f0) == 0x0010)
369                         alc_update_coef_idx(codec, 0xd, 0, 1<<14);
370                 if ((coef & 0x00f0) == 0x0020)
371                         alc_update_coef_idx(codec, 0x4, 1<<15, 0);
372                 if ((coef & 0x00f0) == 0x0030)
373                         alc_update_coef_idx(codec, 0x10, 1<<9, 0);
374                 break;
375         case 0x10ec0280:
376         case 0x10ec0284:
377         case 0x10ec0290:
378         case 0x10ec0292:
379                 alc_update_coef_idx(codec, 0x4, 1<<15, 0);
380                 break;
381         case 0x10ec0225:
382         case 0x10ec0295:
383         case 0x10ec0299:
384                 alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
385                 fallthrough;
386         case 0x10ec0215:
387         case 0x10ec0233:
388         case 0x10ec0235:
389         case 0x10ec0236:
390         case 0x10ec0245:
391         case 0x10ec0255:
392         case 0x10ec0256:
393         case 0x10ec0257:
394         case 0x10ec0282:
395         case 0x10ec0283:
396         case 0x10ec0286:
397         case 0x10ec0287:
398         case 0x10ec0288:
399         case 0x10ec0285:
400         case 0x10ec0298:
401         case 0x10ec0289:
402         case 0x10ec0300:
403                 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
404                 break;
405         case 0x10ec0275:
406                 alc_update_coef_idx(codec, 0xe, 0, 1<<0);
407                 break;
408         case 0x10ec0293:
409                 alc_update_coef_idx(codec, 0xa, 1<<13, 0);
410                 break;
411         case 0x10ec0234:
412         case 0x10ec0274:
413         case 0x10ec0294:
414         case 0x10ec0700:
415         case 0x10ec0701:
416         case 0x10ec0703:
417         case 0x10ec0711:
418                 alc_update_coef_idx(codec, 0x10, 1<<15, 0);
419                 break;
420         case 0x10ec0662:
421                 if ((coef & 0x00f0) == 0x0030)
422                         alc_update_coef_idx(codec, 0x4, 1<<10, 0); /* EAPD Ctrl */
423                 break;
424         case 0x10ec0272:
425         case 0x10ec0273:
426         case 0x10ec0663:
427         case 0x10ec0665:
428         case 0x10ec0670:
429         case 0x10ec0671:
430         case 0x10ec0672:
431                 alc_update_coef_idx(codec, 0xd, 0, 1<<14); /* EAPD Ctrl */
432                 break;
433         case 0x10ec0222:
434         case 0x10ec0623:
435                 alc_update_coef_idx(codec, 0x19, 1<<13, 0);
436                 break;
437         case 0x10ec0668:
438                 alc_update_coef_idx(codec, 0x7, 3<<13, 0);
439                 break;
440         case 0x10ec0867:
441                 alc_update_coef_idx(codec, 0x4, 1<<10, 0);
442                 break;
443         case 0x10ec0888:
444                 if ((coef & 0x00f0) == 0x0020 || (coef & 0x00f0) == 0x0030)
445                         alc_update_coef_idx(codec, 0x7, 1<<5, 0);
446                 break;
447         case 0x10ec0892:
448                 alc_update_coef_idx(codec, 0x7, 1<<5, 0);
449                 break;
450         case 0x10ec0899:
451         case 0x10ec0900:
452         case 0x10ec0b00:
453         case 0x10ec1168:
454         case 0x10ec1220:
455                 alc_update_coef_idx(codec, 0x7, 1<<1, 0);
456                 break;
457         }
458 }
459
460 /* additional initialization for ALC888 variants */
461 static void alc888_coef_init(struct hda_codec *codec)
462 {
463         switch (alc_get_coef0(codec) & 0x00f0) {
464         /* alc888-VA */
465         case 0x00:
466         /* alc888-VB */
467         case 0x10:
468                 alc_update_coef_idx(codec, 7, 0, 0x2030); /* Turn EAPD to High */
469                 break;
470         }
471 }
472
473 /* turn on/off EAPD control (only if available) */
474 static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
475 {
476         if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
477                 return;
478         if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
479                 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
480                                     on ? 2 : 0);
481 }
482
483 /* turn on/off EAPD controls of the codec */
484 static void alc_auto_setup_eapd(struct hda_codec *codec, bool on)
485 {
486         /* We currently only handle front, HP */
487         static const hda_nid_t pins[] = {
488                 0x0f, 0x10, 0x14, 0x15, 0x17, 0
489         };
490         const hda_nid_t *p;
491         for (p = pins; *p; p++)
492                 set_eapd(codec, *p, on);
493 }
494
495 static int find_ext_mic_pin(struct hda_codec *codec);
496
497 static void alc_headset_mic_no_shutup(struct hda_codec *codec)
498 {
499         const struct hda_pincfg *pin;
500         int mic_pin = find_ext_mic_pin(codec);
501         int i;
502
503         /* don't shut up pins when unloading the driver; otherwise it breaks
504          * the default pin setup at the next load of the driver
505          */
506         if (codec->bus->shutdown)
507                 return;
508
509         snd_array_for_each(&codec->init_pins, i, pin) {
510                 /* use read here for syncing after issuing each verb */
511                 if (pin->nid != mic_pin)
512                         snd_hda_codec_read(codec, pin->nid, 0,
513                                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
514         }
515
516         codec->pins_shutup = 1;
517 }
518
519 static void alc_shutup_pins(struct hda_codec *codec)
520 {
521         struct alc_spec *spec = codec->spec;
522
523         switch (codec->core.vendor_id) {
524         case 0x10ec0283:
525         case 0x10ec0286:
526         case 0x10ec0288:
527         case 0x10ec0298:
528                 alc_headset_mic_no_shutup(codec);
529                 break;
530         default:
531                 if (!spec->no_shutup_pins)
532                         snd_hda_shutup_pins(codec);
533                 break;
534         }
535 }
536
537 /* generic shutup callback;
538  * just turning off EAPD and a little pause for avoiding pop-noise
539  */
540 static void alc_eapd_shutup(struct hda_codec *codec)
541 {
542         struct alc_spec *spec = codec->spec;
543
544         alc_auto_setup_eapd(codec, false);
545         if (!spec->no_depop_delay)
546                 msleep(200);
547         alc_shutup_pins(codec);
548 }
549
550 /* generic EAPD initialization */
551 static void alc_auto_init_amp(struct hda_codec *codec, int type)
552 {
553         alc_auto_setup_eapd(codec, true);
554         alc_write_gpio(codec);
555         switch (type) {
556         case ALC_INIT_DEFAULT:
557                 switch (codec->core.vendor_id) {
558                 case 0x10ec0260:
559                         alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x2010);
560                         break;
561                 case 0x10ec0880:
562                 case 0x10ec0882:
563                 case 0x10ec0883:
564                 case 0x10ec0885:
565                         alc_update_coef_idx(codec, 7, 0, 0x2030);
566                         break;
567                 case 0x10ec0888:
568                         alc888_coef_init(codec);
569                         break;
570                 }
571                 break;
572         }
573 }
574
575 /* get a primary headphone pin if available */
576 static hda_nid_t alc_get_hp_pin(struct alc_spec *spec)
577 {
578         if (spec->gen.autocfg.hp_pins[0])
579                 return spec->gen.autocfg.hp_pins[0];
580         if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
581                 return spec->gen.autocfg.line_out_pins[0];
582         return 0;
583 }
584
585 /*
586  * Realtek SSID verification
587  */
588
589 /* Could be any non-zero and even value. When used as fixup, tells
590  * the driver to ignore any present sku defines.
591  */
592 #define ALC_FIXUP_SKU_IGNORE (2)
593
594 static void alc_fixup_sku_ignore(struct hda_codec *codec,
595                                  const struct hda_fixup *fix, int action)
596 {
597         struct alc_spec *spec = codec->spec;
598         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
599                 spec->cdefine.fixup = 1;
600                 spec->cdefine.sku_cfg = ALC_FIXUP_SKU_IGNORE;
601         }
602 }
603
604 static void alc_fixup_no_depop_delay(struct hda_codec *codec,
605                                     const struct hda_fixup *fix, int action)
606 {
607         struct alc_spec *spec = codec->spec;
608
609         if (action == HDA_FIXUP_ACT_PROBE) {
610                 spec->no_depop_delay = 1;
611                 codec->depop_delay = 0;
612         }
613 }
614
615 static int alc_auto_parse_customize_define(struct hda_codec *codec)
616 {
617         unsigned int ass, tmp, i;
618         unsigned nid = 0;
619         struct alc_spec *spec = codec->spec;
620
621         spec->cdefine.enable_pcbeep = 1; /* assume always enabled */
622
623         if (spec->cdefine.fixup) {
624                 ass = spec->cdefine.sku_cfg;
625                 if (ass == ALC_FIXUP_SKU_IGNORE)
626                         return -1;
627                 goto do_sku;
628         }
629
630         if (!codec->bus->pci)
631                 return -1;
632         ass = codec->core.subsystem_id & 0xffff;
633         if (ass != codec->bus->pci->subsystem_device && (ass & 1))
634                 goto do_sku;
635
636         nid = 0x1d;
637         if (codec->core.vendor_id == 0x10ec0260)
638                 nid = 0x17;
639         ass = snd_hda_codec_get_pincfg(codec, nid);
640
641         if (!(ass & 1)) {
642                 codec_info(codec, "%s: SKU not ready 0x%08x\n",
643                            codec->core.chip_name, ass);
644                 return -1;
645         }
646
647         /* check sum */
648         tmp = 0;
649         for (i = 1; i < 16; i++) {
650                 if ((ass >> i) & 1)
651                         tmp++;
652         }
653         if (((ass >> 16) & 0xf) != tmp)
654                 return -1;
655
656         spec->cdefine.port_connectivity = ass >> 30;
657         spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
658         spec->cdefine.check_sum = (ass >> 16) & 0xf;
659         spec->cdefine.customization = ass >> 8;
660 do_sku:
661         spec->cdefine.sku_cfg = ass;
662         spec->cdefine.external_amp = (ass & 0x38) >> 3;
663         spec->cdefine.platform_type = (ass & 0x4) >> 2;
664         spec->cdefine.swap = (ass & 0x2) >> 1;
665         spec->cdefine.override = ass & 0x1;
666
667         codec_dbg(codec, "SKU: Nid=0x%x sku_cfg=0x%08x\n",
668                    nid, spec->cdefine.sku_cfg);
669         codec_dbg(codec, "SKU: port_connectivity=0x%x\n",
670                    spec->cdefine.port_connectivity);
671         codec_dbg(codec, "SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
672         codec_dbg(codec, "SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
673         codec_dbg(codec, "SKU: customization=0x%08x\n", spec->cdefine.customization);
674         codec_dbg(codec, "SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
675         codec_dbg(codec, "SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
676         codec_dbg(codec, "SKU: swap=0x%x\n", spec->cdefine.swap);
677         codec_dbg(codec, "SKU: override=0x%x\n", spec->cdefine.override);
678
679         return 0;
680 }
681
682 /* return the position of NID in the list, or -1 if not found */
683 static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
684 {
685         int i;
686         for (i = 0; i < nums; i++)
687                 if (list[i] == nid)
688                         return i;
689         return -1;
690 }
691 /* return true if the given NID is found in the list */
692 static bool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
693 {
694         return find_idx_in_nid_list(nid, list, nums) >= 0;
695 }
696
697 /* check subsystem ID and set up device-specific initialization;
698  * return 1 if initialized, 0 if invalid SSID
699  */
700 /* 32-bit subsystem ID for BIOS loading in HD Audio codec.
701  *      31 ~ 16 :       Manufacture ID
702  *      15 ~ 8  :       SKU ID
703  *      7  ~ 0  :       Assembly ID
704  *      port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
705  */
706 static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports)
707 {
708         unsigned int ass, tmp, i;
709         unsigned nid;
710         struct alc_spec *spec = codec->spec;
711
712         if (spec->cdefine.fixup) {
713                 ass = spec->cdefine.sku_cfg;
714                 if (ass == ALC_FIXUP_SKU_IGNORE)
715                         return 0;
716                 goto do_sku;
717         }
718
719         ass = codec->core.subsystem_id & 0xffff;
720         if (codec->bus->pci &&
721             ass != codec->bus->pci->subsystem_device && (ass & 1))
722                 goto do_sku;
723
724         /* invalid SSID, check the special NID pin defcfg instead */
725         /*
726          * 31~30        : port connectivity
727          * 29~21        : reserve
728          * 20           : PCBEEP input
729          * 19~16        : Check sum (15:1)
730          * 15~1         : Custom
731          * 0            : override
732         */
733         nid = 0x1d;
734         if (codec->core.vendor_id == 0x10ec0260)
735                 nid = 0x17;
736         ass = snd_hda_codec_get_pincfg(codec, nid);
737         codec_dbg(codec,
738                   "realtek: No valid SSID, checking pincfg 0x%08x for NID 0x%x\n",
739                    ass, nid);
740         if (!(ass & 1))
741                 return 0;
742         if ((ass >> 30) != 1)   /* no physical connection */
743                 return 0;
744
745         /* check sum */
746         tmp = 0;
747         for (i = 1; i < 16; i++) {
748                 if ((ass >> i) & 1)
749                         tmp++;
750         }
751         if (((ass >> 16) & 0xf) != tmp)
752                 return 0;
753 do_sku:
754         codec_dbg(codec, "realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
755                    ass & 0xffff, codec->core.vendor_id);
756         /*
757          * 0 : override
758          * 1 :  Swap Jack
759          * 2 : 0 --> Desktop, 1 --> Laptop
760          * 3~5 : External Amplifier control
761          * 7~6 : Reserved
762         */
763         tmp = (ass & 0x38) >> 3;        /* external Amp control */
764         if (spec->init_amp == ALC_INIT_UNDEFINED) {
765                 switch (tmp) {
766                 case 1:
767                         alc_setup_gpio(codec, 0x01);
768                         break;
769                 case 3:
770                         alc_setup_gpio(codec, 0x02);
771                         break;
772                 case 7:
773                         alc_setup_gpio(codec, 0x03);
774                         break;
775                 case 5:
776                 default:
777                         spec->init_amp = ALC_INIT_DEFAULT;
778                         break;
779                 }
780         }
781
782         /* is laptop or Desktop and enable the function "Mute internal speaker
783          * when the external headphone out jack is plugged"
784          */
785         if (!(ass & 0x8000))
786                 return 1;
787         /*
788          * 10~8 : Jack location
789          * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
790          * 14~13: Resvered
791          * 15   : 1 --> enable the function "Mute internal speaker
792          *              when the external headphone out jack is plugged"
793          */
794         if (!alc_get_hp_pin(spec)) {
795                 hda_nid_t nid;
796                 tmp = (ass >> 11) & 0x3;        /* HP to chassis */
797                 nid = ports[tmp];
798                 if (found_in_nid_list(nid, spec->gen.autocfg.line_out_pins,
799                                       spec->gen.autocfg.line_outs))
800                         return 1;
801                 spec->gen.autocfg.hp_pins[0] = nid;
802         }
803         return 1;
804 }
805
806 /* Check the validity of ALC subsystem-id
807  * ports contains an array of 4 pin NIDs for port-A, E, D and I */
808 static void alc_ssid_check(struct hda_codec *codec, const hda_nid_t *ports)
809 {
810         if (!alc_subsystem_id(codec, ports)) {
811                 struct alc_spec *spec = codec->spec;
812                 if (spec->init_amp == ALC_INIT_UNDEFINED) {
813                         codec_dbg(codec,
814                                   "realtek: Enable default setup for auto mode as fallback\n");
815                         spec->init_amp = ALC_INIT_DEFAULT;
816                 }
817         }
818 }
819
820 /*
821  */
822
823 static void alc_fixup_inv_dmic(struct hda_codec *codec,
824                                const struct hda_fixup *fix, int action)
825 {
826         struct alc_spec *spec = codec->spec;
827
828         spec->gen.inv_dmic_split = 1;
829 }
830
831
832 static int alc_build_controls(struct hda_codec *codec)
833 {
834         int err;
835
836         err = snd_hda_gen_build_controls(codec);
837         if (err < 0)
838                 return err;
839
840         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_BUILD);
841         return 0;
842 }
843
844
845 /*
846  * Common callbacks
847  */
848
849 static void alc_pre_init(struct hda_codec *codec)
850 {
851         alc_fill_eapd_coef(codec);
852 }
853
854 #define is_s3_resume(codec) \
855         ((codec)->core.dev.power.power_state.event == PM_EVENT_RESUME)
856 #define is_s4_resume(codec) \
857         ((codec)->core.dev.power.power_state.event == PM_EVENT_RESTORE)
858
859 static int alc_init(struct hda_codec *codec)
860 {
861         struct alc_spec *spec = codec->spec;
862
863         /* hibernation resume needs the full chip initialization */
864         if (is_s4_resume(codec))
865                 alc_pre_init(codec);
866
867         if (spec->init_hook)
868                 spec->init_hook(codec);
869
870         spec->gen.skip_verbs = 1; /* applied in below */
871         snd_hda_gen_init(codec);
872         alc_fix_pll(codec);
873         alc_auto_init_amp(codec, spec->init_amp);
874         snd_hda_apply_verbs(codec); /* apply verbs here after own init */
875
876         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);
877
878         return 0;
879 }
880
881 static inline void alc_shutup(struct hda_codec *codec)
882 {
883         struct alc_spec *spec = codec->spec;
884
885         if (!snd_hda_get_bool_hint(codec, "shutup"))
886                 return; /* disabled explicitly by hints */
887
888         if (spec && spec->shutup)
889                 spec->shutup(codec);
890         else
891                 alc_shutup_pins(codec);
892 }
893
894 static void alc_reboot_notify(struct hda_codec *codec)
895 {
896         struct alc_spec *spec = codec->spec;
897
898         if (spec && spec->reboot_notify)
899                 spec->reboot_notify(codec);
900         else
901                 alc_shutup(codec);
902 }
903
904 #define alc_free        snd_hda_gen_free
905
906 #ifdef CONFIG_PM
907 static void alc_power_eapd(struct hda_codec *codec)
908 {
909         alc_auto_setup_eapd(codec, false);
910 }
911
912 static int alc_suspend(struct hda_codec *codec)
913 {
914         struct alc_spec *spec = codec->spec;
915         alc_shutup(codec);
916         if (spec && spec->power_hook)
917                 spec->power_hook(codec);
918         return 0;
919 }
920 #endif
921
922 #ifdef CONFIG_PM
923 static int alc_resume(struct hda_codec *codec)
924 {
925         struct alc_spec *spec = codec->spec;
926
927         if (!spec->no_depop_delay)
928                 msleep(150); /* to avoid pop noise */
929         codec->patch_ops.init(codec);
930         snd_hda_regmap_sync(codec);
931         hda_call_check_power_status(codec, 0x01);
932         return 0;
933 }
934 #endif
935
936 /*
937  */
938 static const struct hda_codec_ops alc_patch_ops = {
939         .build_controls = alc_build_controls,
940         .build_pcms = snd_hda_gen_build_pcms,
941         .init = alc_init,
942         .free = alc_free,
943         .unsol_event = snd_hda_jack_unsol_event,
944 #ifdef CONFIG_PM
945         .resume = alc_resume,
946         .suspend = alc_suspend,
947         .check_power_status = snd_hda_gen_check_power_status,
948 #endif
949         .reboot_notify = alc_reboot_notify,
950 };
951
952
953 #define alc_codec_rename(codec, name) snd_hda_codec_set_name(codec, name)
954
955 /*
956  * Rename codecs appropriately from COEF value or subvendor id
957  */
958 struct alc_codec_rename_table {
959         unsigned int vendor_id;
960         unsigned short coef_mask;
961         unsigned short coef_bits;
962         const char *name;
963 };
964
965 struct alc_codec_rename_pci_table {
966         unsigned int codec_vendor_id;
967         unsigned short pci_subvendor;
968         unsigned short pci_subdevice;
969         const char *name;
970 };
971
972 static const struct alc_codec_rename_table rename_tbl[] = {
973         { 0x10ec0221, 0xf00f, 0x1003, "ALC231" },
974         { 0x10ec0269, 0xfff0, 0x3010, "ALC277" },
975         { 0x10ec0269, 0xf0f0, 0x2010, "ALC259" },
976         { 0x10ec0269, 0xf0f0, 0x3010, "ALC258" },
977         { 0x10ec0269, 0x00f0, 0x0010, "ALC269VB" },
978         { 0x10ec0269, 0xffff, 0xa023, "ALC259" },
979         { 0x10ec0269, 0xffff, 0x6023, "ALC281X" },
980         { 0x10ec0269, 0x00f0, 0x0020, "ALC269VC" },
981         { 0x10ec0269, 0x00f0, 0x0030, "ALC269VD" },
982         { 0x10ec0662, 0xffff, 0x4020, "ALC656" },
983         { 0x10ec0887, 0x00f0, 0x0030, "ALC887-VD" },
984         { 0x10ec0888, 0x00f0, 0x0030, "ALC888-VD" },
985         { 0x10ec0888, 0xf0f0, 0x3020, "ALC886" },
986         { 0x10ec0899, 0x2000, 0x2000, "ALC899" },
987         { 0x10ec0892, 0xffff, 0x8020, "ALC661" },
988         { 0x10ec0892, 0xffff, 0x8011, "ALC661" },
989         { 0x10ec0892, 0xffff, 0x4011, "ALC656" },
990         { } /* terminator */
991 };
992
993 static const struct alc_codec_rename_pci_table rename_pci_tbl[] = {
994         { 0x10ec0280, 0x1028, 0, "ALC3220" },
995         { 0x10ec0282, 0x1028, 0, "ALC3221" },
996         { 0x10ec0283, 0x1028, 0, "ALC3223" },
997         { 0x10ec0288, 0x1028, 0, "ALC3263" },
998         { 0x10ec0292, 0x1028, 0, "ALC3226" },
999         { 0x10ec0293, 0x1028, 0, "ALC3235" },
1000         { 0x10ec0255, 0x1028, 0, "ALC3234" },
1001         { 0x10ec0668, 0x1028, 0, "ALC3661" },
1002         { 0x10ec0275, 0x1028, 0, "ALC3260" },
1003         { 0x10ec0899, 0x1028, 0, "ALC3861" },
1004         { 0x10ec0298, 0x1028, 0, "ALC3266" },
1005         { 0x10ec0236, 0x1028, 0, "ALC3204" },
1006         { 0x10ec0256, 0x1028, 0, "ALC3246" },
1007         { 0x10ec0225, 0x1028, 0, "ALC3253" },
1008         { 0x10ec0295, 0x1028, 0, "ALC3254" },
1009         { 0x10ec0299, 0x1028, 0, "ALC3271" },
1010         { 0x10ec0670, 0x1025, 0, "ALC669X" },
1011         { 0x10ec0676, 0x1025, 0, "ALC679X" },
1012         { 0x10ec0282, 0x1043, 0, "ALC3229" },
1013         { 0x10ec0233, 0x1043, 0, "ALC3236" },
1014         { 0x10ec0280, 0x103c, 0, "ALC3228" },
1015         { 0x10ec0282, 0x103c, 0, "ALC3227" },
1016         { 0x10ec0286, 0x103c, 0, "ALC3242" },
1017         { 0x10ec0290, 0x103c, 0, "ALC3241" },
1018         { 0x10ec0668, 0x103c, 0, "ALC3662" },
1019         { 0x10ec0283, 0x17aa, 0, "ALC3239" },
1020         { 0x10ec0292, 0x17aa, 0, "ALC3232" },
1021         { } /* terminator */
1022 };
1023
1024 static int alc_codec_rename_from_preset(struct hda_codec *codec)
1025 {
1026         const struct alc_codec_rename_table *p;
1027         const struct alc_codec_rename_pci_table *q;
1028
1029         for (p = rename_tbl; p->vendor_id; p++) {
1030                 if (p->vendor_id != codec->core.vendor_id)
1031                         continue;
1032                 if ((alc_get_coef0(codec) & p->coef_mask) == p->coef_bits)
1033                         return alc_codec_rename(codec, p->name);
1034         }
1035
1036         if (!codec->bus->pci)
1037                 return 0;
1038         for (q = rename_pci_tbl; q->codec_vendor_id; q++) {
1039                 if (q->codec_vendor_id != codec->core.vendor_id)
1040                         continue;
1041                 if (q->pci_subvendor != codec->bus->pci->subsystem_vendor)
1042                         continue;
1043                 if (!q->pci_subdevice ||
1044                     q->pci_subdevice == codec->bus->pci->subsystem_device)
1045                         return alc_codec_rename(codec, q->name);
1046         }
1047
1048         return 0;
1049 }
1050
1051
1052 /*
1053  * Digital-beep handlers
1054  */
1055 #ifdef CONFIG_SND_HDA_INPUT_BEEP
1056
1057 /* additional beep mixers; private_value will be overwritten */
1058 static const struct snd_kcontrol_new alc_beep_mixer[] = {
1059         HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
1060         HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
1061 };
1062
1063 /* set up and create beep controls */
1064 static int set_beep_amp(struct alc_spec *spec, hda_nid_t nid,
1065                         int idx, int dir)
1066 {
1067         struct snd_kcontrol_new *knew;
1068         unsigned int beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir);
1069         int i;
1070
1071         for (i = 0; i < ARRAY_SIZE(alc_beep_mixer); i++) {
1072                 knew = snd_hda_gen_add_kctl(&spec->gen, NULL,
1073                                             &alc_beep_mixer[i]);
1074                 if (!knew)
1075                         return -ENOMEM;
1076                 knew->private_value = beep_amp;
1077         }
1078         return 0;
1079 }
1080
1081 static const struct snd_pci_quirk beep_allow_list[] = {
1082         SND_PCI_QUIRK(0x1043, 0x103c, "ASUS", 1),
1083         SND_PCI_QUIRK(0x1043, 0x115d, "ASUS", 1),
1084         SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
1085         SND_PCI_QUIRK(0x1043, 0x8376, "EeePC", 1),
1086         SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),
1087         SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1),
1088         SND_PCI_QUIRK(0x1043, 0x834a, "EeePC", 1),
1089         SND_PCI_QUIRK(0x1458, 0xa002, "GA-MA790X", 1),
1090         SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
1091         /* denylist -- no beep available */
1092         SND_PCI_QUIRK(0x17aa, 0x309e, "Lenovo ThinkCentre M73", 0),
1093         SND_PCI_QUIRK(0x17aa, 0x30a3, "Lenovo ThinkCentre M93", 0),
1094         {}
1095 };
1096
1097 static inline int has_cdefine_beep(struct hda_codec *codec)
1098 {
1099         struct alc_spec *spec = codec->spec;
1100         const struct snd_pci_quirk *q;
1101         q = snd_pci_quirk_lookup(codec->bus->pci, beep_allow_list);
1102         if (q)
1103                 return q->value;
1104         return spec->cdefine.enable_pcbeep;
1105 }
1106 #else
1107 #define set_beep_amp(spec, nid, idx, dir)       0
1108 #define has_cdefine_beep(codec)         0
1109 #endif
1110
1111 /* parse the BIOS configuration and set up the alc_spec */
1112 /* return 1 if successful, 0 if the proper config is not found,
1113  * or a negative error code
1114  */
1115 static int alc_parse_auto_config(struct hda_codec *codec,
1116                                  const hda_nid_t *ignore_nids,
1117                                  const hda_nid_t *ssid_nids)
1118 {
1119         struct alc_spec *spec = codec->spec;
1120         struct auto_pin_cfg *cfg = &spec->gen.autocfg;
1121         int err;
1122
1123         err = snd_hda_parse_pin_defcfg(codec, cfg, ignore_nids,
1124                                        spec->parse_flags);
1125         if (err < 0)
1126                 return err;
1127
1128         if (ssid_nids)
1129                 alc_ssid_check(codec, ssid_nids);
1130
1131         err = snd_hda_gen_parse_auto_config(codec, cfg);
1132         if (err < 0)
1133                 return err;
1134
1135         return 1;
1136 }
1137
1138 /* common preparation job for alc_spec */
1139 static int alc_alloc_spec(struct hda_codec *codec, hda_nid_t mixer_nid)
1140 {
1141         struct alc_spec *spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1142         int err;
1143
1144         if (!spec)
1145                 return -ENOMEM;
1146         codec->spec = spec;
1147         snd_hda_gen_spec_init(&spec->gen);
1148         spec->gen.mixer_nid = mixer_nid;
1149         spec->gen.own_eapd_ctl = 1;
1150         codec->single_adc_amp = 1;
1151         /* FIXME: do we need this for all Realtek codec models? */
1152         codec->spdif_status_reset = 1;
1153         codec->patch_ops = alc_patch_ops;
1154
1155         err = alc_codec_rename_from_preset(codec);
1156         if (err < 0) {
1157                 kfree(spec);
1158                 return err;
1159         }
1160         return 0;
1161 }
1162
1163 static int alc880_parse_auto_config(struct hda_codec *codec)
1164 {
1165         static const hda_nid_t alc880_ignore[] = { 0x1d, 0 };
1166         static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 };
1167         return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids);
1168 }
1169
1170 /*
1171  * ALC880 fix-ups
1172  */
1173 enum {
1174         ALC880_FIXUP_GPIO1,
1175         ALC880_FIXUP_GPIO2,
1176         ALC880_FIXUP_MEDION_RIM,
1177         ALC880_FIXUP_LG,
1178         ALC880_FIXUP_LG_LW25,
1179         ALC880_FIXUP_W810,
1180         ALC880_FIXUP_EAPD_COEF,
1181         ALC880_FIXUP_TCL_S700,
1182         ALC880_FIXUP_VOL_KNOB,
1183         ALC880_FIXUP_FUJITSU,
1184         ALC880_FIXUP_F1734,
1185         ALC880_FIXUP_UNIWILL,
1186         ALC880_FIXUP_UNIWILL_DIG,
1187         ALC880_FIXUP_Z71V,
1188         ALC880_FIXUP_ASUS_W5A,
1189         ALC880_FIXUP_3ST_BASE,
1190         ALC880_FIXUP_3ST,
1191         ALC880_FIXUP_3ST_DIG,
1192         ALC880_FIXUP_5ST_BASE,
1193         ALC880_FIXUP_5ST,
1194         ALC880_FIXUP_5ST_DIG,
1195         ALC880_FIXUP_6ST_BASE,
1196         ALC880_FIXUP_6ST,
1197         ALC880_FIXUP_6ST_DIG,
1198         ALC880_FIXUP_6ST_AUTOMUTE,
1199 };
1200
1201 /* enable the volume-knob widget support on NID 0x21 */
1202 static void alc880_fixup_vol_knob(struct hda_codec *codec,
1203                                   const struct hda_fixup *fix, int action)
1204 {
1205         if (action == HDA_FIXUP_ACT_PROBE)
1206                 snd_hda_jack_detect_enable_callback(codec, 0x21,
1207                                                     alc_update_knob_master);
1208 }
1209
1210 static const struct hda_fixup alc880_fixups[] = {
1211         [ALC880_FIXUP_GPIO1] = {
1212                 .type = HDA_FIXUP_FUNC,
1213                 .v.func = alc_fixup_gpio1,
1214         },
1215         [ALC880_FIXUP_GPIO2] = {
1216                 .type = HDA_FIXUP_FUNC,
1217                 .v.func = alc_fixup_gpio2,
1218         },
1219         [ALC880_FIXUP_MEDION_RIM] = {
1220                 .type = HDA_FIXUP_VERBS,
1221                 .v.verbs = (const struct hda_verb[]) {
1222                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1223                         { 0x20, AC_VERB_SET_PROC_COEF,  0x3060 },
1224                         { }
1225                 },
1226                 .chained = true,
1227                 .chain_id = ALC880_FIXUP_GPIO2,
1228         },
1229         [ALC880_FIXUP_LG] = {
1230                 .type = HDA_FIXUP_PINS,
1231                 .v.pins = (const struct hda_pintbl[]) {
1232                         /* disable bogus unused pins */
1233                         { 0x16, 0x411111f0 },
1234                         { 0x18, 0x411111f0 },
1235                         { 0x1a, 0x411111f0 },
1236                         { }
1237                 }
1238         },
1239         [ALC880_FIXUP_LG_LW25] = {
1240                 .type = HDA_FIXUP_PINS,
1241                 .v.pins = (const struct hda_pintbl[]) {
1242                         { 0x1a, 0x0181344f }, /* line-in */
1243                         { 0x1b, 0x0321403f }, /* headphone */
1244                         { }
1245                 }
1246         },
1247         [ALC880_FIXUP_W810] = {
1248                 .type = HDA_FIXUP_PINS,
1249                 .v.pins = (const struct hda_pintbl[]) {
1250                         /* disable bogus unused pins */
1251                         { 0x17, 0x411111f0 },
1252                         { }
1253                 },
1254                 .chained = true,
1255                 .chain_id = ALC880_FIXUP_GPIO2,
1256         },
1257         [ALC880_FIXUP_EAPD_COEF] = {
1258                 .type = HDA_FIXUP_VERBS,
1259                 .v.verbs = (const struct hda_verb[]) {
1260                         /* change to EAPD mode */
1261                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1262                         { 0x20, AC_VERB_SET_PROC_COEF,  0x3060 },
1263                         {}
1264                 },
1265         },
1266         [ALC880_FIXUP_TCL_S700] = {
1267                 .type = HDA_FIXUP_VERBS,
1268                 .v.verbs = (const struct hda_verb[]) {
1269                         /* change to EAPD mode */
1270                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1271                         { 0x20, AC_VERB_SET_PROC_COEF,  0x3070 },
1272                         {}
1273                 },
1274                 .chained = true,
1275                 .chain_id = ALC880_FIXUP_GPIO2,
1276         },
1277         [ALC880_FIXUP_VOL_KNOB] = {
1278                 .type = HDA_FIXUP_FUNC,
1279                 .v.func = alc880_fixup_vol_knob,
1280         },
1281         [ALC880_FIXUP_FUJITSU] = {
1282                 /* override all pins as BIOS on old Amilo is broken */
1283                 .type = HDA_FIXUP_PINS,
1284                 .v.pins = (const struct hda_pintbl[]) {
1285                         { 0x14, 0x0121401f }, /* HP */
1286                         { 0x15, 0x99030120 }, /* speaker */
1287                         { 0x16, 0x99030130 }, /* bass speaker */
1288                         { 0x17, 0x411111f0 }, /* N/A */
1289                         { 0x18, 0x411111f0 }, /* N/A */
1290                         { 0x19, 0x01a19950 }, /* mic-in */
1291                         { 0x1a, 0x411111f0 }, /* N/A */
1292                         { 0x1b, 0x411111f0 }, /* N/A */
1293                         { 0x1c, 0x411111f0 }, /* N/A */
1294                         { 0x1d, 0x411111f0 }, /* N/A */
1295                         { 0x1e, 0x01454140 }, /* SPDIF out */
1296                         { }
1297                 },
1298                 .chained = true,
1299                 .chain_id = ALC880_FIXUP_VOL_KNOB,
1300         },
1301         [ALC880_FIXUP_F1734] = {
1302                 /* almost compatible with FUJITSU, but no bass and SPDIF */
1303                 .type = HDA_FIXUP_PINS,
1304                 .v.pins = (const struct hda_pintbl[]) {
1305                         { 0x14, 0x0121401f }, /* HP */
1306                         { 0x15, 0x99030120 }, /* speaker */
1307                         { 0x16, 0x411111f0 }, /* N/A */
1308                         { 0x17, 0x411111f0 }, /* N/A */
1309                         { 0x18, 0x411111f0 }, /* N/A */
1310                         { 0x19, 0x01a19950 }, /* mic-in */
1311                         { 0x1a, 0x411111f0 }, /* N/A */
1312                         { 0x1b, 0x411111f0 }, /* N/A */
1313                         { 0x1c, 0x411111f0 }, /* N/A */
1314                         { 0x1d, 0x411111f0 }, /* N/A */
1315                         { 0x1e, 0x411111f0 }, /* N/A */
1316                         { }
1317                 },
1318                 .chained = true,
1319                 .chain_id = ALC880_FIXUP_VOL_KNOB,
1320         },
1321         [ALC880_FIXUP_UNIWILL] = {
1322                 /* need to fix HP and speaker pins to be parsed correctly */
1323                 .type = HDA_FIXUP_PINS,
1324                 .v.pins = (const struct hda_pintbl[]) {
1325                         { 0x14, 0x0121411f }, /* HP */
1326                         { 0x15, 0x99030120 }, /* speaker */
1327                         { 0x16, 0x99030130 }, /* bass speaker */
1328                         { }
1329                 },
1330         },
1331         [ALC880_FIXUP_UNIWILL_DIG] = {
1332                 .type = HDA_FIXUP_PINS,
1333                 .v.pins = (const struct hda_pintbl[]) {
1334                         /* disable bogus unused pins */
1335                         { 0x17, 0x411111f0 },
1336                         { 0x19, 0x411111f0 },
1337                         { 0x1b, 0x411111f0 },
1338                         { 0x1f, 0x411111f0 },
1339                         { }
1340                 }
1341         },
1342         [ALC880_FIXUP_Z71V] = {
1343                 .type = HDA_FIXUP_PINS,
1344                 .v.pins = (const struct hda_pintbl[]) {
1345                         /* set up the whole pins as BIOS is utterly broken */
1346                         { 0x14, 0x99030120 }, /* speaker */
1347                         { 0x15, 0x0121411f }, /* HP */
1348                         { 0x16, 0x411111f0 }, /* N/A */
1349                         { 0x17, 0x411111f0 }, /* N/A */
1350                         { 0x18, 0x01a19950 }, /* mic-in */
1351                         { 0x19, 0x411111f0 }, /* N/A */
1352                         { 0x1a, 0x01813031 }, /* line-in */
1353                         { 0x1b, 0x411111f0 }, /* N/A */
1354                         { 0x1c, 0x411111f0 }, /* N/A */
1355                         { 0x1d, 0x411111f0 }, /* N/A */
1356                         { 0x1e, 0x0144111e }, /* SPDIF */
1357                         { }
1358                 }
1359         },
1360         [ALC880_FIXUP_ASUS_W5A] = {
1361                 .type = HDA_FIXUP_PINS,
1362                 .v.pins = (const struct hda_pintbl[]) {
1363                         /* set up the whole pins as BIOS is utterly broken */
1364                         { 0x14, 0x0121411f }, /* HP */
1365                         { 0x15, 0x411111f0 }, /* N/A */
1366                         { 0x16, 0x411111f0 }, /* N/A */
1367                         { 0x17, 0x411111f0 }, /* N/A */
1368                         { 0x18, 0x90a60160 }, /* mic */
1369                         { 0x19, 0x411111f0 }, /* N/A */
1370                         { 0x1a, 0x411111f0 }, /* N/A */
1371                         { 0x1b, 0x411111f0 }, /* N/A */
1372                         { 0x1c, 0x411111f0 }, /* N/A */
1373                         { 0x1d, 0x411111f0 }, /* N/A */
1374                         { 0x1e, 0xb743111e }, /* SPDIF out */
1375                         { }
1376                 },
1377                 .chained = true,
1378                 .chain_id = ALC880_FIXUP_GPIO1,
1379         },
1380         [ALC880_FIXUP_3ST_BASE] = {
1381                 .type = HDA_FIXUP_PINS,
1382                 .v.pins = (const struct hda_pintbl[]) {
1383                         { 0x14, 0x01014010 }, /* line-out */
1384                         { 0x15, 0x411111f0 }, /* N/A */
1385                         { 0x16, 0x411111f0 }, /* N/A */
1386                         { 0x17, 0x411111f0 }, /* N/A */
1387                         { 0x18, 0x01a19c30 }, /* mic-in */
1388                         { 0x19, 0x0121411f }, /* HP */
1389                         { 0x1a, 0x01813031 }, /* line-in */
1390                         { 0x1b, 0x02a19c40 }, /* front-mic */
1391                         { 0x1c, 0x411111f0 }, /* N/A */
1392                         { 0x1d, 0x411111f0 }, /* N/A */
1393                         /* 0x1e is filled in below */
1394                         { 0x1f, 0x411111f0 }, /* N/A */
1395                         { }
1396                 }
1397         },
1398         [ALC880_FIXUP_3ST] = {
1399                 .type = HDA_FIXUP_PINS,
1400                 .v.pins = (const struct hda_pintbl[]) {
1401                         { 0x1e, 0x411111f0 }, /* N/A */
1402                         { }
1403                 },
1404                 .chained = true,
1405                 .chain_id = ALC880_FIXUP_3ST_BASE,
1406         },
1407         [ALC880_FIXUP_3ST_DIG] = {
1408                 .type = HDA_FIXUP_PINS,
1409                 .v.pins = (const struct hda_pintbl[]) {
1410                         { 0x1e, 0x0144111e }, /* SPDIF */
1411                         { }
1412                 },
1413                 .chained = true,
1414                 .chain_id = ALC880_FIXUP_3ST_BASE,
1415         },
1416         [ALC880_FIXUP_5ST_BASE] = {
1417                 .type = HDA_FIXUP_PINS,
1418                 .v.pins = (const struct hda_pintbl[]) {
1419                         { 0x14, 0x01014010 }, /* front */
1420                         { 0x15, 0x411111f0 }, /* N/A */
1421                         { 0x16, 0x01011411 }, /* CLFE */
1422                         { 0x17, 0x01016412 }, /* surr */
1423                         { 0x18, 0x01a19c30 }, /* mic-in */
1424                         { 0x19, 0x0121411f }, /* HP */
1425                         { 0x1a, 0x01813031 }, /* line-in */
1426                         { 0x1b, 0x02a19c40 }, /* front-mic */
1427                         { 0x1c, 0x411111f0 }, /* N/A */
1428                         { 0x1d, 0x411111f0 }, /* N/A */
1429                         /* 0x1e is filled in below */
1430                         { 0x1f, 0x411111f0 }, /* N/A */
1431                         { }
1432                 }
1433         },
1434         [ALC880_FIXUP_5ST] = {
1435                 .type = HDA_FIXUP_PINS,
1436                 .v.pins = (const struct hda_pintbl[]) {
1437                         { 0x1e, 0x411111f0 }, /* N/A */
1438                         { }
1439                 },
1440                 .chained = true,
1441                 .chain_id = ALC880_FIXUP_5ST_BASE,
1442         },
1443         [ALC880_FIXUP_5ST_DIG] = {
1444                 .type = HDA_FIXUP_PINS,
1445                 .v.pins = (const struct hda_pintbl[]) {
1446                         { 0x1e, 0x0144111e }, /* SPDIF */
1447                         { }
1448                 },
1449                 .chained = true,
1450                 .chain_id = ALC880_FIXUP_5ST_BASE,
1451         },
1452         [ALC880_FIXUP_6ST_BASE] = {
1453                 .type = HDA_FIXUP_PINS,
1454                 .v.pins = (const struct hda_pintbl[]) {
1455                         { 0x14, 0x01014010 }, /* front */
1456                         { 0x15, 0x01016412 }, /* surr */
1457                         { 0x16, 0x01011411 }, /* CLFE */
1458                         { 0x17, 0x01012414 }, /* side */
1459                         { 0x18, 0x01a19c30 }, /* mic-in */
1460                         { 0x19, 0x02a19c40 }, /* front-mic */
1461                         { 0x1a, 0x01813031 }, /* line-in */
1462                         { 0x1b, 0x0121411f }, /* HP */
1463                         { 0x1c, 0x411111f0 }, /* N/A */
1464                         { 0x1d, 0x411111f0 }, /* N/A */
1465                         /* 0x1e is filled in below */
1466                         { 0x1f, 0x411111f0 }, /* N/A */
1467                         { }
1468                 }
1469         },
1470         [ALC880_FIXUP_6ST] = {
1471                 .type = HDA_FIXUP_PINS,
1472                 .v.pins = (const struct hda_pintbl[]) {
1473                         { 0x1e, 0x411111f0 }, /* N/A */
1474                         { }
1475                 },
1476                 .chained = true,
1477                 .chain_id = ALC880_FIXUP_6ST_BASE,
1478         },
1479         [ALC880_FIXUP_6ST_DIG] = {
1480                 .type = HDA_FIXUP_PINS,
1481                 .v.pins = (const struct hda_pintbl[]) {
1482                         { 0x1e, 0x0144111e }, /* SPDIF */
1483                         { }
1484                 },
1485                 .chained = true,
1486                 .chain_id = ALC880_FIXUP_6ST_BASE,
1487         },
1488         [ALC880_FIXUP_6ST_AUTOMUTE] = {
1489                 .type = HDA_FIXUP_PINS,
1490                 .v.pins = (const struct hda_pintbl[]) {
1491                         { 0x1b, 0x0121401f }, /* HP with jack detect */
1492                         { }
1493                 },
1494                 .chained_before = true,
1495                 .chain_id = ALC880_FIXUP_6ST_BASE,
1496         },
1497 };
1498
1499 static const struct snd_pci_quirk alc880_fixup_tbl[] = {
1500         SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_FIXUP_W810),
1501         SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS W5A", ALC880_FIXUP_ASUS_W5A),
1502         SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_FIXUP_Z71V),
1503         SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_FIXUP_GPIO1),
1504         SND_PCI_QUIRK(0x147b, 0x1045, "ABit AA8XE", ALC880_FIXUP_6ST_AUTOMUTE),
1505         SND_PCI_QUIRK(0x1558, 0x5401, "Clevo GPIO2", ALC880_FIXUP_GPIO2),
1506         SND_PCI_QUIRK_VENDOR(0x1558, "Clevo", ALC880_FIXUP_EAPD_COEF),
1507         SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_FIXUP_UNIWILL_DIG),
1508         SND_PCI_QUIRK(0x1584, 0x9054, "Uniwill", ALC880_FIXUP_F1734),
1509         SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_FIXUP_UNIWILL),
1510         SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_FIXUP_VOL_KNOB),
1511         SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_FIXUP_W810),
1512         SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_FIXUP_MEDION_RIM),
1513         SND_PCI_QUIRK(0x1631, 0xe011, "PB 13201056", ALC880_FIXUP_6ST_AUTOMUTE),
1514         SND_PCI_QUIRK(0x1734, 0x107c, "FSC Amilo M1437", ALC880_FIXUP_FUJITSU),
1515         SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FIXUP_FUJITSU),
1516         SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_FIXUP_F1734),
1517         SND_PCI_QUIRK(0x1734, 0x10b0, "FSC Amilo Pi1556", ALC880_FIXUP_FUJITSU),
1518         SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_FIXUP_LG),
1519         SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_FIXUP_LG),
1520         SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_FIXUP_LG),
1521         SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_FIXUP_LG_LW25),
1522         SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_FIXUP_TCL_S700),
1523
1524         /* Below is the copied entries from alc880_quirks.c.
1525          * It's not quite sure whether BIOS sets the correct pin-config table
1526          * on these machines, thus they are kept to be compatible with
1527          * the old static quirks.  Once when it's confirmed to work without
1528          * these overrides, it'd be better to remove.
1529          */
1530         SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_FIXUP_5ST_DIG),
1531         SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_FIXUP_6ST),
1532         SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_FIXUP_3ST_DIG),
1533         SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_FIXUP_6ST_DIG),
1534         SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_FIXUP_6ST_DIG),
1535         SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_FIXUP_6ST_DIG),
1536         SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_FIXUP_3ST_DIG),
1537         SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_FIXUP_3ST),
1538         SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_FIXUP_6ST_DIG),
1539         SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_FIXUP_3ST),
1540         SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_FIXUP_3ST),
1541         SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_FIXUP_5ST),
1542         SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_FIXUP_5ST),
1543         SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_FIXUP_5ST),
1544         SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_FIXUP_6ST_DIG),
1545         SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_FIXUP_6ST_DIG),
1546         SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_FIXUP_6ST_DIG),
1547         SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_FIXUP_6ST_DIG),
1548         SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_FIXUP_5ST_DIG),
1549         SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_FIXUP_5ST_DIG),
1550         SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_FIXUP_5ST_DIG),
1551         SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_FIXUP_6ST_DIG), /* broken BIOS */
1552         SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_FIXUP_6ST_DIG),
1553         SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1554         SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1555         SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1556         SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1557         SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1558         SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1559         SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1560         SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1561         SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1562         SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1563         /* default Intel */
1564         SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_FIXUP_3ST),
1565         SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_FIXUP_5ST_DIG),
1566         SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_FIXUP_6ST_DIG),
1567         {}
1568 };
1569
1570 static const struct hda_model_fixup alc880_fixup_models[] = {
1571         {.id = ALC880_FIXUP_3ST, .name = "3stack"},
1572         {.id = ALC880_FIXUP_3ST_DIG, .name = "3stack-digout"},
1573         {.id = ALC880_FIXUP_5ST, .name = "5stack"},
1574         {.id = ALC880_FIXUP_5ST_DIG, .name = "5stack-digout"},
1575         {.id = ALC880_FIXUP_6ST, .name = "6stack"},
1576         {.id = ALC880_FIXUP_6ST_DIG, .name = "6stack-digout"},
1577         {.id = ALC880_FIXUP_6ST_AUTOMUTE, .name = "6stack-automute"},
1578         {}
1579 };
1580
1581
1582 /*
1583  * OK, here we have finally the patch for ALC880
1584  */
1585 static int patch_alc880(struct hda_codec *codec)
1586 {
1587         struct alc_spec *spec;
1588         int err;
1589
1590         err = alc_alloc_spec(codec, 0x0b);
1591         if (err < 0)
1592                 return err;
1593
1594         spec = codec->spec;
1595         spec->gen.need_dac_fix = 1;
1596         spec->gen.beep_nid = 0x01;
1597
1598         codec->patch_ops.unsol_event = alc880_unsol_event;
1599
1600         alc_pre_init(codec);
1601
1602         snd_hda_pick_fixup(codec, alc880_fixup_models, alc880_fixup_tbl,
1603                        alc880_fixups);
1604         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1605
1606         /* automatic parse from the BIOS config */
1607         err = alc880_parse_auto_config(codec);
1608         if (err < 0)
1609                 goto error;
1610
1611         if (!spec->gen.no_analog) {
1612                 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
1613                 if (err < 0)
1614                         goto error;
1615         }
1616
1617         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1618
1619         return 0;
1620
1621  error:
1622         alc_free(codec);
1623         return err;
1624 }
1625
1626
1627 /*
1628  * ALC260 support
1629  */
1630 static int alc260_parse_auto_config(struct hda_codec *codec)
1631 {
1632         static const hda_nid_t alc260_ignore[] = { 0x17, 0 };
1633         static const hda_nid_t alc260_ssids[] = { 0x10, 0x15, 0x0f, 0 };
1634         return alc_parse_auto_config(codec, alc260_ignore, alc260_ssids);
1635 }
1636
1637 /*
1638  * Pin config fixes
1639  */
1640 enum {
1641         ALC260_FIXUP_HP_DC5750,
1642         ALC260_FIXUP_HP_PIN_0F,
1643         ALC260_FIXUP_COEF,
1644         ALC260_FIXUP_GPIO1,
1645         ALC260_FIXUP_GPIO1_TOGGLE,
1646         ALC260_FIXUP_REPLACER,
1647         ALC260_FIXUP_HP_B1900,
1648         ALC260_FIXUP_KN1,
1649         ALC260_FIXUP_FSC_S7020,
1650         ALC260_FIXUP_FSC_S7020_JWSE,
1651         ALC260_FIXUP_VAIO_PINS,
1652 };
1653
1654 static void alc260_gpio1_automute(struct hda_codec *codec)
1655 {
1656         struct alc_spec *spec = codec->spec;
1657
1658         alc_update_gpio_data(codec, 0x01, spec->gen.hp_jack_present);
1659 }
1660
1661 static void alc260_fixup_gpio1_toggle(struct hda_codec *codec,
1662                                       const struct hda_fixup *fix, int action)
1663 {
1664         struct alc_spec *spec = codec->spec;
1665         if (action == HDA_FIXUP_ACT_PROBE) {
1666                 /* although the machine has only one output pin, we need to
1667                  * toggle GPIO1 according to the jack state
1668                  */
1669                 spec->gen.automute_hook = alc260_gpio1_automute;
1670                 spec->gen.detect_hp = 1;
1671                 spec->gen.automute_speaker = 1;
1672                 spec->gen.autocfg.hp_pins[0] = 0x0f; /* copy it for automute */
1673                 snd_hda_jack_detect_enable_callback(codec, 0x0f,
1674                                                     snd_hda_gen_hp_automute);
1675                 alc_setup_gpio(codec, 0x01);
1676         }
1677 }
1678
1679 static void alc260_fixup_kn1(struct hda_codec *codec,
1680                              const struct hda_fixup *fix, int action)
1681 {
1682         struct alc_spec *spec = codec->spec;
1683         static const struct hda_pintbl pincfgs[] = {
1684                 { 0x0f, 0x02214000 }, /* HP/speaker */
1685                 { 0x12, 0x90a60160 }, /* int mic */
1686                 { 0x13, 0x02a19000 }, /* ext mic */
1687                 { 0x18, 0x01446000 }, /* SPDIF out */
1688                 /* disable bogus I/O pins */
1689                 { 0x10, 0x411111f0 },
1690                 { 0x11, 0x411111f0 },
1691                 { 0x14, 0x411111f0 },
1692                 { 0x15, 0x411111f0 },
1693                 { 0x16, 0x411111f0 },
1694                 { 0x17, 0x411111f0 },
1695                 { 0x19, 0x411111f0 },
1696                 { }
1697         };
1698
1699         switch (action) {
1700         case HDA_FIXUP_ACT_PRE_PROBE:
1701                 snd_hda_apply_pincfgs(codec, pincfgs);
1702                 spec->init_amp = ALC_INIT_NONE;
1703                 break;
1704         }
1705 }
1706
1707 static void alc260_fixup_fsc_s7020(struct hda_codec *codec,
1708                                    const struct hda_fixup *fix, int action)
1709 {
1710         struct alc_spec *spec = codec->spec;
1711         if (action == HDA_FIXUP_ACT_PRE_PROBE)
1712                 spec->init_amp = ALC_INIT_NONE;
1713 }
1714
1715 static void alc260_fixup_fsc_s7020_jwse(struct hda_codec *codec,
1716                                    const struct hda_fixup *fix, int action)
1717 {
1718         struct alc_spec *spec = codec->spec;
1719         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1720                 spec->gen.add_jack_modes = 1;
1721                 spec->gen.hp_mic = 1;
1722         }
1723 }
1724
1725 static const struct hda_fixup alc260_fixups[] = {
1726         [ALC260_FIXUP_HP_DC5750] = {
1727                 .type = HDA_FIXUP_PINS,
1728                 .v.pins = (const struct hda_pintbl[]) {
1729                         { 0x11, 0x90130110 }, /* speaker */
1730                         { }
1731                 }
1732         },
1733         [ALC260_FIXUP_HP_PIN_0F] = {
1734                 .type = HDA_FIXUP_PINS,
1735                 .v.pins = (const struct hda_pintbl[]) {
1736                         { 0x0f, 0x01214000 }, /* HP */
1737                         { }
1738                 }
1739         },
1740         [ALC260_FIXUP_COEF] = {
1741                 .type = HDA_FIXUP_VERBS,
1742                 .v.verbs = (const struct hda_verb[]) {
1743                         { 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1744                         { 0x1a, AC_VERB_SET_PROC_COEF,  0x3040 },
1745                         { }
1746                 },
1747         },
1748         [ALC260_FIXUP_GPIO1] = {
1749                 .type = HDA_FIXUP_FUNC,
1750                 .v.func = alc_fixup_gpio1,
1751         },
1752         [ALC260_FIXUP_GPIO1_TOGGLE] = {
1753                 .type = HDA_FIXUP_FUNC,
1754                 .v.func = alc260_fixup_gpio1_toggle,
1755                 .chained = true,
1756                 .chain_id = ALC260_FIXUP_HP_PIN_0F,
1757         },
1758         [ALC260_FIXUP_REPLACER] = {
1759                 .type = HDA_FIXUP_VERBS,
1760                 .v.verbs = (const struct hda_verb[]) {
1761                         { 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1762                         { 0x1a, AC_VERB_SET_PROC_COEF,  0x3050 },
1763                         { }
1764                 },
1765                 .chained = true,
1766                 .chain_id = ALC260_FIXUP_GPIO1_TOGGLE,
1767         },
1768         [ALC260_FIXUP_HP_B1900] = {
1769                 .type = HDA_FIXUP_FUNC,
1770                 .v.func = alc260_fixup_gpio1_toggle,
1771                 .chained = true,
1772                 .chain_id = ALC260_FIXUP_COEF,
1773         },
1774         [ALC260_FIXUP_KN1] = {
1775                 .type = HDA_FIXUP_FUNC,
1776                 .v.func = alc260_fixup_kn1,
1777         },
1778         [ALC260_FIXUP_FSC_S7020] = {
1779                 .type = HDA_FIXUP_FUNC,
1780                 .v.func = alc260_fixup_fsc_s7020,
1781         },
1782         [ALC260_FIXUP_FSC_S7020_JWSE] = {
1783                 .type = HDA_FIXUP_FUNC,
1784                 .v.func = alc260_fixup_fsc_s7020_jwse,
1785                 .chained = true,
1786                 .chain_id = ALC260_FIXUP_FSC_S7020,
1787         },
1788         [ALC260_FIXUP_VAIO_PINS] = {
1789                 .type = HDA_FIXUP_PINS,
1790                 .v.pins = (const struct hda_pintbl[]) {
1791                         /* Pin configs are missing completely on some VAIOs */
1792                         { 0x0f, 0x01211020 },
1793                         { 0x10, 0x0001003f },
1794                         { 0x11, 0x411111f0 },
1795                         { 0x12, 0x01a15930 },
1796                         { 0x13, 0x411111f0 },
1797                         { 0x14, 0x411111f0 },
1798                         { 0x15, 0x411111f0 },
1799                         { 0x16, 0x411111f0 },
1800                         { 0x17, 0x411111f0 },
1801                         { 0x18, 0x411111f0 },
1802                         { 0x19, 0x411111f0 },
1803                         { }
1804                 }
1805         },
1806 };
1807
1808 static const struct snd_pci_quirk alc260_fixup_tbl[] = {
1809         SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_FIXUP_GPIO1),
1810         SND_PCI_QUIRK(0x1025, 0x007f, "Acer Aspire 9500", ALC260_FIXUP_COEF),
1811         SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_FIXUP_GPIO1),
1812         SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750),
1813         SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900),
1814         SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_FIXUP_VAIO_PINS),
1815         SND_PCI_QUIRK(0x104d, 0x81e2, "Sony VAIO TX", ALC260_FIXUP_HP_PIN_0F),
1816         SND_PCI_QUIRK(0x10cf, 0x1326, "FSC LifeBook S7020", ALC260_FIXUP_FSC_S7020),
1817         SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1),
1818         SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1),
1819         SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_FIXUP_REPLACER),
1820         SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_FIXUP_COEF),
1821         {}
1822 };
1823
1824 static const struct hda_model_fixup alc260_fixup_models[] = {
1825         {.id = ALC260_FIXUP_GPIO1, .name = "gpio1"},
1826         {.id = ALC260_FIXUP_COEF, .name = "coef"},
1827         {.id = ALC260_FIXUP_FSC_S7020, .name = "fujitsu"},
1828         {.id = ALC260_FIXUP_FSC_S7020_JWSE, .name = "fujitsu-jwse"},
1829         {}
1830 };
1831
1832 /*
1833  */
1834 static int patch_alc260(struct hda_codec *codec)
1835 {
1836         struct alc_spec *spec;
1837         int err;
1838
1839         err = alc_alloc_spec(codec, 0x07);
1840         if (err < 0)
1841                 return err;
1842
1843         spec = codec->spec;
1844         /* as quite a few machines require HP amp for speaker outputs,
1845          * it's easier to enable it unconditionally; even if it's unneeded,
1846          * it's almost harmless.
1847          */
1848         spec->gen.prefer_hp_amp = 1;
1849         spec->gen.beep_nid = 0x01;
1850
1851         spec->shutup = alc_eapd_shutup;
1852
1853         alc_pre_init(codec);
1854
1855         snd_hda_pick_fixup(codec, alc260_fixup_models, alc260_fixup_tbl,
1856                            alc260_fixups);
1857         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1858
1859         /* automatic parse from the BIOS config */
1860         err = alc260_parse_auto_config(codec);
1861         if (err < 0)
1862                 goto error;
1863
1864         if (!spec->gen.no_analog) {
1865                 err = set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
1866                 if (err < 0)
1867                         goto error;
1868         }
1869
1870         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1871
1872         return 0;
1873
1874  error:
1875         alc_free(codec);
1876         return err;
1877 }
1878
1879
1880 /*
1881  * ALC882/883/885/888/889 support
1882  *
1883  * ALC882 is almost identical with ALC880 but has cleaner and more flexible
1884  * configuration.  Each pin widget can choose any input DACs and a mixer.
1885  * Each ADC is connected from a mixer of all inputs.  This makes possible
1886  * 6-channel independent captures.
1887  *
1888  * In addition, an independent DAC for the multi-playback (not used in this
1889  * driver yet).
1890  */
1891
1892 /*
1893  * Pin config fixes
1894  */
1895 enum {
1896         ALC882_FIXUP_ABIT_AW9D_MAX,
1897         ALC882_FIXUP_LENOVO_Y530,
1898         ALC882_FIXUP_PB_M5210,
1899         ALC882_FIXUP_ACER_ASPIRE_7736,
1900         ALC882_FIXUP_ASUS_W90V,
1901         ALC889_FIXUP_CD,
1902         ALC889_FIXUP_FRONT_HP_NO_PRESENCE,
1903         ALC889_FIXUP_VAIO_TT,
1904         ALC888_FIXUP_EEE1601,
1905         ALC882_FIXUP_EAPD,
1906         ALC883_FIXUP_EAPD,
1907         ALC883_FIXUP_ACER_EAPD,
1908         ALC882_FIXUP_GPIO1,
1909         ALC882_FIXUP_GPIO2,
1910         ALC882_FIXUP_GPIO3,
1911         ALC889_FIXUP_COEF,
1912         ALC882_FIXUP_ASUS_W2JC,
1913         ALC882_FIXUP_ACER_ASPIRE_4930G,
1914         ALC882_FIXUP_ACER_ASPIRE_8930G,
1915         ALC882_FIXUP_ASPIRE_8930G_VERBS,
1916         ALC885_FIXUP_MACPRO_GPIO,
1917         ALC889_FIXUP_DAC_ROUTE,
1918         ALC889_FIXUP_MBP_VREF,
1919         ALC889_FIXUP_IMAC91_VREF,
1920         ALC889_FIXUP_MBA11_VREF,
1921         ALC889_FIXUP_MBA21_VREF,
1922         ALC889_FIXUP_MP11_VREF,
1923         ALC889_FIXUP_MP41_VREF,
1924         ALC882_FIXUP_INV_DMIC,
1925         ALC882_FIXUP_NO_PRIMARY_HP,
1926         ALC887_FIXUP_ASUS_BASS,
1927         ALC887_FIXUP_BASS_CHMAP,
1928         ALC1220_FIXUP_GB_DUAL_CODECS,
1929         ALC1220_FIXUP_CLEVO_P950,
1930         ALC1220_FIXUP_CLEVO_PB51ED,
1931         ALC1220_FIXUP_CLEVO_PB51ED_PINS,
1932 };
1933
1934 static void alc889_fixup_coef(struct hda_codec *codec,
1935                               const struct hda_fixup *fix, int action)
1936 {
1937         if (action != HDA_FIXUP_ACT_INIT)
1938                 return;
1939         alc_update_coef_idx(codec, 7, 0, 0x2030);
1940 }
1941
1942 /* set up GPIO at initialization */
1943 static void alc885_fixup_macpro_gpio(struct hda_codec *codec,
1944                                      const struct hda_fixup *fix, int action)
1945 {
1946         struct alc_spec *spec = codec->spec;
1947
1948         spec->gpio_write_delay = true;
1949         alc_fixup_gpio3(codec, fix, action);
1950 }
1951
1952 /* Fix the connection of some pins for ALC889:
1953  * At least, Acer Aspire 5935 shows the connections to DAC3/4 don't
1954  * work correctly (bko#42740)
1955  */
1956 static void alc889_fixup_dac_route(struct hda_codec *codec,
1957                                    const struct hda_fixup *fix, int action)
1958 {
1959         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1960                 /* fake the connections during parsing the tree */
1961                 static const hda_nid_t conn1[] = { 0x0c, 0x0d };
1962                 static const hda_nid_t conn2[] = { 0x0e, 0x0f };
1963                 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
1964                 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
1965                 snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn2), conn2);
1966                 snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn2), conn2);
1967         } else if (action == HDA_FIXUP_ACT_PROBE) {
1968                 /* restore the connections */
1969                 static const hda_nid_t conn[] = { 0x0c, 0x0d, 0x0e, 0x0f, 0x26 };
1970                 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
1971                 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn), conn);
1972                 snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn), conn);
1973                 snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn), conn);
1974         }
1975 }
1976
1977 /* Set VREF on HP pin */
1978 static void alc889_fixup_mbp_vref(struct hda_codec *codec,
1979                                   const struct hda_fixup *fix, int action)
1980 {
1981         static const hda_nid_t nids[] = { 0x14, 0x15, 0x19 };
1982         struct alc_spec *spec = codec->spec;
1983         int i;
1984
1985         if (action != HDA_FIXUP_ACT_INIT)
1986                 return;
1987         for (i = 0; i < ARRAY_SIZE(nids); i++) {
1988                 unsigned int val = snd_hda_codec_get_pincfg(codec, nids[i]);
1989                 if (get_defcfg_device(val) != AC_JACK_HP_OUT)
1990                         continue;
1991                 val = snd_hda_codec_get_pin_target(codec, nids[i]);
1992                 val |= AC_PINCTL_VREF_80;
1993                 snd_hda_set_pin_ctl(codec, nids[i], val);
1994                 spec->gen.keep_vref_in_automute = 1;
1995                 break;
1996         }
1997 }
1998
1999 static void alc889_fixup_mac_pins(struct hda_codec *codec,
2000                                   const hda_nid_t *nids, int num_nids)
2001 {
2002         struct alc_spec *spec = codec->spec;
2003         int i;
2004
2005         for (i = 0; i < num_nids; i++) {
2006                 unsigned int val;
2007                 val = snd_hda_codec_get_pin_target(codec, nids[i]);
2008                 val |= AC_PINCTL_VREF_50;
2009                 snd_hda_set_pin_ctl(codec, nids[i], val);
2010         }
2011         spec->gen.keep_vref_in_automute = 1;
2012 }
2013
2014 /* Set VREF on speaker pins on imac91 */
2015 static void alc889_fixup_imac91_vref(struct hda_codec *codec,
2016                                      const struct hda_fixup *fix, int action)
2017 {
2018         static const hda_nid_t nids[] = { 0x18, 0x1a };
2019
2020         if (action == HDA_FIXUP_ACT_INIT)
2021                 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2022 }
2023
2024 /* Set VREF on speaker pins on mba11 */
2025 static void alc889_fixup_mba11_vref(struct hda_codec *codec,
2026                                     const struct hda_fixup *fix, int action)
2027 {
2028         static const hda_nid_t nids[] = { 0x18 };
2029
2030         if (action == HDA_FIXUP_ACT_INIT)
2031                 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2032 }
2033
2034 /* Set VREF on speaker pins on mba21 */
2035 static void alc889_fixup_mba21_vref(struct hda_codec *codec,
2036                                     const struct hda_fixup *fix, int action)
2037 {
2038         static const hda_nid_t nids[] = { 0x18, 0x19 };
2039
2040         if (action == HDA_FIXUP_ACT_INIT)
2041                 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2042 }
2043
2044 /* Don't take HP output as primary
2045  * Strangely, the speaker output doesn't work on Vaio Z and some Vaio
2046  * all-in-one desktop PCs (for example VGC-LN51JGB) through DAC 0x05
2047  */
2048 static void alc882_fixup_no_primary_hp(struct hda_codec *codec,
2049                                        const struct hda_fixup *fix, int action)
2050 {
2051         struct alc_spec *spec = codec->spec;
2052         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2053                 spec->gen.no_primary_hp = 1;
2054                 spec->gen.no_multi_io = 1;
2055         }
2056 }
2057
2058 static void alc_fixup_bass_chmap(struct hda_codec *codec,
2059                                  const struct hda_fixup *fix, int action);
2060
2061 /* For dual-codec configuration, we need to disable some features to avoid
2062  * conflicts of kctls and PCM streams
2063  */
2064 static void alc_fixup_dual_codecs(struct hda_codec *codec,
2065                                   const struct hda_fixup *fix, int action)
2066 {
2067         struct alc_spec *spec = codec->spec;
2068
2069         if (action != HDA_FIXUP_ACT_PRE_PROBE)
2070                 return;
2071         /* disable vmaster */
2072         spec->gen.suppress_vmaster = 1;
2073         /* auto-mute and auto-mic switch don't work with multiple codecs */
2074         spec->gen.suppress_auto_mute = 1;
2075         spec->gen.suppress_auto_mic = 1;
2076         /* disable aamix as well */
2077         spec->gen.mixer_nid = 0;
2078         /* add location prefix to avoid conflicts */
2079         codec->force_pin_prefix = 1;
2080 }
2081
2082 static void rename_ctl(struct hda_codec *codec, const char *oldname,
2083                        const char *newname)
2084 {
2085         struct snd_kcontrol *kctl;
2086
2087         kctl = snd_hda_find_mixer_ctl(codec, oldname);
2088         if (kctl)
2089                 strcpy(kctl->id.name, newname);
2090 }
2091
2092 static void alc1220_fixup_gb_dual_codecs(struct hda_codec *codec,
2093                                          const struct hda_fixup *fix,
2094                                          int action)
2095 {
2096         alc_fixup_dual_codecs(codec, fix, action);
2097         switch (action) {
2098         case HDA_FIXUP_ACT_PRE_PROBE:
2099                 /* override card longname to provide a unique UCM profile */
2100                 strcpy(codec->card->longname, "HDAudio-Gigabyte-ALC1220DualCodecs");
2101                 break;
2102         case HDA_FIXUP_ACT_BUILD:
2103                 /* rename Capture controls depending on the codec */
2104                 rename_ctl(codec, "Capture Volume",
2105                            codec->addr == 0 ?
2106                            "Rear-Panel Capture Volume" :
2107                            "Front-Panel Capture Volume");
2108                 rename_ctl(codec, "Capture Switch",
2109                            codec->addr == 0 ?
2110                            "Rear-Panel Capture Switch" :
2111                            "Front-Panel Capture Switch");
2112                 break;
2113         }
2114 }
2115
2116 static void alc1220_fixup_clevo_p950(struct hda_codec *codec,
2117                                      const struct hda_fixup *fix,
2118                                      int action)
2119 {
2120         static const hda_nid_t conn1[] = { 0x0c };
2121
2122         if (action != HDA_FIXUP_ACT_PRE_PROBE)
2123                 return;
2124
2125         alc_update_coef_idx(codec, 0x7, 0, 0x3c3);
2126         /* We therefore want to make sure 0x14 (front headphone) and
2127          * 0x1b (speakers) use the stereo DAC 0x02
2128          */
2129         snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2130         snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
2131 }
2132
2133 static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
2134                                 const struct hda_fixup *fix, int action);
2135
2136 static void alc1220_fixup_clevo_pb51ed(struct hda_codec *codec,
2137                                      const struct hda_fixup *fix,
2138                                      int action)
2139 {
2140         alc1220_fixup_clevo_p950(codec, fix, action);
2141         alc_fixup_headset_mode_no_hp_mic(codec, fix, action);
2142 }
2143
2144 static const struct hda_fixup alc882_fixups[] = {
2145         [ALC882_FIXUP_ABIT_AW9D_MAX] = {
2146                 .type = HDA_FIXUP_PINS,
2147                 .v.pins = (const struct hda_pintbl[]) {
2148                         { 0x15, 0x01080104 }, /* side */
2149                         { 0x16, 0x01011012 }, /* rear */
2150                         { 0x17, 0x01016011 }, /* clfe */
2151                         { }
2152                 }
2153         },
2154         [ALC882_FIXUP_LENOVO_Y530] = {
2155                 .type = HDA_FIXUP_PINS,
2156                 .v.pins = (const struct hda_pintbl[]) {
2157                         { 0x15, 0x99130112 }, /* rear int speakers */
2158                         { 0x16, 0x99130111 }, /* subwoofer */
2159                         { }
2160                 }
2161         },
2162         [ALC882_FIXUP_PB_M5210] = {
2163                 .type = HDA_FIXUP_PINCTLS,
2164                 .v.pins = (const struct hda_pintbl[]) {
2165                         { 0x19, PIN_VREF50 },
2166                         {}
2167                 }
2168         },
2169         [ALC882_FIXUP_ACER_ASPIRE_7736] = {
2170                 .type = HDA_FIXUP_FUNC,
2171                 .v.func = alc_fixup_sku_ignore,
2172         },
2173         [ALC882_FIXUP_ASUS_W90V] = {
2174                 .type = HDA_FIXUP_PINS,
2175                 .v.pins = (const struct hda_pintbl[]) {
2176                         { 0x16, 0x99130110 }, /* fix sequence for CLFE */
2177                         { }
2178                 }
2179         },
2180         [ALC889_FIXUP_CD] = {
2181                 .type = HDA_FIXUP_PINS,
2182                 .v.pins = (const struct hda_pintbl[]) {
2183                         { 0x1c, 0x993301f0 }, /* CD */
2184                         { }
2185                 }
2186         },
2187         [ALC889_FIXUP_FRONT_HP_NO_PRESENCE] = {
2188                 .type = HDA_FIXUP_PINS,
2189                 .v.pins = (const struct hda_pintbl[]) {
2190                         { 0x1b, 0x02214120 }, /* Front HP jack is flaky, disable jack detect */
2191                         { }
2192                 },
2193                 .chained = true,
2194                 .chain_id = ALC889_FIXUP_CD,
2195         },
2196         [ALC889_FIXUP_VAIO_TT] = {
2197                 .type = HDA_FIXUP_PINS,
2198                 .v.pins = (const struct hda_pintbl[]) {
2199                         { 0x17, 0x90170111 }, /* hidden surround speaker */
2200                         { }
2201                 }
2202         },
2203         [ALC888_FIXUP_EEE1601] = {
2204                 .type = HDA_FIXUP_VERBS,
2205                 .v.verbs = (const struct hda_verb[]) {
2206                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2207                         { 0x20, AC_VERB_SET_PROC_COEF,  0x0838 },
2208                         { }
2209                 }
2210         },
2211         [ALC882_FIXUP_EAPD] = {
2212                 .type = HDA_FIXUP_VERBS,
2213                 .v.verbs = (const struct hda_verb[]) {
2214                         /* change to EAPD mode */
2215                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2216                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
2217                         { }
2218                 }
2219         },
2220         [ALC883_FIXUP_EAPD] = {
2221                 .type = HDA_FIXUP_VERBS,
2222                 .v.verbs = (const struct hda_verb[]) {
2223                         /* change to EAPD mode */
2224                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2225                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2226                         { }
2227                 }
2228         },
2229         [ALC883_FIXUP_ACER_EAPD] = {
2230                 .type = HDA_FIXUP_VERBS,
2231                 .v.verbs = (const struct hda_verb[]) {
2232                         /* eanable EAPD on Acer laptops */
2233                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2234                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2235                         { }
2236                 }
2237         },
2238         [ALC882_FIXUP_GPIO1] = {
2239                 .type = HDA_FIXUP_FUNC,
2240                 .v.func = alc_fixup_gpio1,
2241         },
2242         [ALC882_FIXUP_GPIO2] = {
2243                 .type = HDA_FIXUP_FUNC,
2244                 .v.func = alc_fixup_gpio2,
2245         },
2246         [ALC882_FIXUP_GPIO3] = {
2247                 .type = HDA_FIXUP_FUNC,
2248                 .v.func = alc_fixup_gpio3,
2249         },
2250         [ALC882_FIXUP_ASUS_W2JC] = {
2251                 .type = HDA_FIXUP_FUNC,
2252                 .v.func = alc_fixup_gpio1,
2253                 .chained = true,
2254                 .chain_id = ALC882_FIXUP_EAPD,
2255         },
2256         [ALC889_FIXUP_COEF] = {
2257                 .type = HDA_FIXUP_FUNC,
2258                 .v.func = alc889_fixup_coef,
2259         },
2260         [ALC882_FIXUP_ACER_ASPIRE_4930G] = {
2261                 .type = HDA_FIXUP_PINS,
2262                 .v.pins = (const struct hda_pintbl[]) {
2263                         { 0x16, 0x99130111 }, /* CLFE speaker */
2264                         { 0x17, 0x99130112 }, /* surround speaker */
2265                         { }
2266                 },
2267                 .chained = true,
2268                 .chain_id = ALC882_FIXUP_GPIO1,
2269         },
2270         [ALC882_FIXUP_ACER_ASPIRE_8930G] = {
2271                 .type = HDA_FIXUP_PINS,
2272                 .v.pins = (const struct hda_pintbl[]) {
2273                         { 0x16, 0x99130111 }, /* CLFE speaker */
2274                         { 0x1b, 0x99130112 }, /* surround speaker */
2275                         { }
2276                 },
2277                 .chained = true,
2278                 .chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS,
2279         },
2280         [ALC882_FIXUP_ASPIRE_8930G_VERBS] = {
2281                 /* additional init verbs for Acer Aspire 8930G */
2282                 .type = HDA_FIXUP_VERBS,
2283                 .v.verbs = (const struct hda_verb[]) {
2284                         /* Enable all DACs */
2285                         /* DAC DISABLE/MUTE 1? */
2286                         /*  setting bits 1-5 disables DAC nids 0x02-0x06
2287                          *  apparently. Init=0x38 */
2288                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x03 },
2289                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2290                         /* DAC DISABLE/MUTE 2? */
2291                         /*  some bit here disables the other DACs.
2292                          *  Init=0x4900 */
2293                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x08 },
2294                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2295                         /* DMIC fix
2296                          * This laptop has a stereo digital microphone.
2297                          * The mics are only 1cm apart which makes the stereo
2298                          * useless. However, either the mic or the ALC889
2299                          * makes the signal become a difference/sum signal
2300                          * instead of standard stereo, which is annoying.
2301                          * So instead we flip this bit which makes the
2302                          * codec replicate the sum signal to both channels,
2303                          * turning it into a normal mono mic.
2304                          */
2305                         /* DMIC_CONTROL? Init value = 0x0001 */
2306                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2307                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0003 },
2308                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2309                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2310                         { }
2311                 },
2312                 .chained = true,
2313                 .chain_id = ALC882_FIXUP_GPIO1,
2314         },
2315         [ALC885_FIXUP_MACPRO_GPIO] = {
2316                 .type = HDA_FIXUP_FUNC,
2317                 .v.func = alc885_fixup_macpro_gpio,
2318         },
2319         [ALC889_FIXUP_DAC_ROUTE] = {
2320                 .type = HDA_FIXUP_FUNC,
2321                 .v.func = alc889_fixup_dac_route,
2322         },
2323         [ALC889_FIXUP_MBP_VREF] = {
2324                 .type = HDA_FIXUP_FUNC,
2325                 .v.func = alc889_fixup_mbp_vref,
2326                 .chained = true,
2327                 .chain_id = ALC882_FIXUP_GPIO1,
2328         },
2329         [ALC889_FIXUP_IMAC91_VREF] = {
2330                 .type = HDA_FIXUP_FUNC,
2331                 .v.func = alc889_fixup_imac91_vref,
2332                 .chained = true,
2333                 .chain_id = ALC882_FIXUP_GPIO1,
2334         },
2335         [ALC889_FIXUP_MBA11_VREF] = {
2336                 .type = HDA_FIXUP_FUNC,
2337                 .v.func = alc889_fixup_mba11_vref,
2338                 .chained = true,
2339                 .chain_id = ALC889_FIXUP_MBP_VREF,
2340         },
2341         [ALC889_FIXUP_MBA21_VREF] = {
2342                 .type = HDA_FIXUP_FUNC,
2343                 .v.func = alc889_fixup_mba21_vref,
2344                 .chained = true,
2345                 .chain_id = ALC889_FIXUP_MBP_VREF,
2346         },
2347         [ALC889_FIXUP_MP11_VREF] = {
2348                 .type = HDA_FIXUP_FUNC,
2349                 .v.func = alc889_fixup_mba11_vref,
2350                 .chained = true,
2351                 .chain_id = ALC885_FIXUP_MACPRO_GPIO,
2352         },
2353         [ALC889_FIXUP_MP41_VREF] = {
2354                 .type = HDA_FIXUP_FUNC,
2355                 .v.func = alc889_fixup_mbp_vref,
2356                 .chained = true,
2357                 .chain_id = ALC885_FIXUP_MACPRO_GPIO,
2358         },
2359         [ALC882_FIXUP_INV_DMIC] = {
2360                 .type = HDA_FIXUP_FUNC,
2361                 .v.func = alc_fixup_inv_dmic,
2362         },
2363         [ALC882_FIXUP_NO_PRIMARY_HP] = {
2364                 .type = HDA_FIXUP_FUNC,
2365                 .v.func = alc882_fixup_no_primary_hp,
2366         },
2367         [ALC887_FIXUP_ASUS_BASS] = {
2368                 .type = HDA_FIXUP_PINS,
2369                 .v.pins = (const struct hda_pintbl[]) {
2370                         {0x16, 0x99130130}, /* bass speaker */
2371                         {}
2372                 },
2373                 .chained = true,
2374                 .chain_id = ALC887_FIXUP_BASS_CHMAP,
2375         },
2376         [ALC887_FIXUP_BASS_CHMAP] = {
2377                 .type = HDA_FIXUP_FUNC,
2378                 .v.func = alc_fixup_bass_chmap,
2379         },
2380         [ALC1220_FIXUP_GB_DUAL_CODECS] = {
2381                 .type = HDA_FIXUP_FUNC,
2382                 .v.func = alc1220_fixup_gb_dual_codecs,
2383         },
2384         [ALC1220_FIXUP_CLEVO_P950] = {
2385                 .type = HDA_FIXUP_FUNC,
2386                 .v.func = alc1220_fixup_clevo_p950,
2387         },
2388         [ALC1220_FIXUP_CLEVO_PB51ED] = {
2389                 .type = HDA_FIXUP_FUNC,
2390                 .v.func = alc1220_fixup_clevo_pb51ed,
2391         },
2392         [ALC1220_FIXUP_CLEVO_PB51ED_PINS] = {
2393                 .type = HDA_FIXUP_PINS,
2394                 .v.pins = (const struct hda_pintbl[]) {
2395                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
2396                         {}
2397                 },
2398                 .chained = true,
2399                 .chain_id = ALC1220_FIXUP_CLEVO_PB51ED,
2400         },
2401 };
2402
2403 static const struct snd_pci_quirk alc882_fixup_tbl[] = {
2404         SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),
2405         SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2406         SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2407         SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),
2408         SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2409         SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),
2410         SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD),
2411         SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
2412                       ALC882_FIXUP_ACER_ASPIRE_4930G),
2413         SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
2414                       ALC882_FIXUP_ACER_ASPIRE_4930G),
2415         SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
2416                       ALC882_FIXUP_ACER_ASPIRE_8930G),
2417         SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
2418                       ALC882_FIXUP_ACER_ASPIRE_8930G),
2419         SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
2420                       ALC882_FIXUP_ACER_ASPIRE_4930G),
2421         SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
2422                       ALC882_FIXUP_ACER_ASPIRE_4930G),
2423         SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
2424                       ALC882_FIXUP_ACER_ASPIRE_4930G),
2425         SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
2426         SND_PCI_QUIRK(0x1025, 0x021e, "Acer Aspire 5739G",
2427                       ALC882_FIXUP_ACER_ASPIRE_4930G),
2428         SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
2429         SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G),
2430         SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
2431         SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
2432         SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
2433         SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC),
2434         SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601),
2435         SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS),
2436         SND_PCI_QUIRK(0x1043, 0x8691, "ASUS ROG Ranger VIII", ALC882_FIXUP_GPIO3),
2437         SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
2438         SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP),
2439         SND_PCI_QUIRK(0x104d, 0x9060, "Sony Vaio VPCL14M1R", ALC882_FIXUP_NO_PRIMARY_HP),
2440         SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),
2441         SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP),
2442
2443         /* All Apple entries are in codec SSIDs */
2444         SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF),
2445         SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC889_FIXUP_MBP_VREF),
2446         SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
2447         SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC889_FIXUP_MP11_VREF),
2448         SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO),
2449         SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO),
2450         SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC889_FIXUP_MBP_VREF),
2451         SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF),
2452         SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD),
2453         SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBA11_VREF),
2454         SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBA21_VREF),
2455         SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF),
2456         SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
2457         SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO),
2458         SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),
2459         SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),
2460         SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),
2461         SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 4,1/5,1", ALC889_FIXUP_MP41_VREF),
2462         SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
2463         SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
2464         SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
2465         SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF),
2466
2467         SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
2468         SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),
2469         SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
2470         SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_CLEVO_P950),
2471         SND_PCI_QUIRK(0x1458, 0xa0ce, "Gigabyte X570 Aorus Xtreme", ALC1220_FIXUP_CLEVO_P950),
2472         SND_PCI_QUIRK(0x1462, 0x11f7, "MSI-GE63", ALC1220_FIXUP_CLEVO_P950),
2473         SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950),
2474         SND_PCI_QUIRK(0x1462, 0x1275, "MSI-GL63", ALC1220_FIXUP_CLEVO_P950),
2475         SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950),
2476         SND_PCI_QUIRK(0x1462, 0x1293, "MSI-GP65", ALC1220_FIXUP_CLEVO_P950),
2477         SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
2478         SND_PCI_QUIRK(0x1462, 0xda57, "MSI Z270-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
2479         SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
2480         SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
2481         SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
2482         SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),
2483         SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950),
2484         SND_PCI_QUIRK(0x1558, 0x96e1, "Clevo P960[ER][CDFN]-K", ALC1220_FIXUP_CLEVO_P950),
2485         SND_PCI_QUIRK(0x1558, 0x97e1, "Clevo P970[ER][CDFN]", ALC1220_FIXUP_CLEVO_P950),
2486         SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2487         SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2488         SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2489         SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2490         SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2491         SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
2492         SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
2493         SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
2494         SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF),
2495         {}
2496 };
2497
2498 static const struct hda_model_fixup alc882_fixup_models[] = {
2499         {.id = ALC882_FIXUP_ABIT_AW9D_MAX, .name = "abit-aw9d"},
2500         {.id = ALC882_FIXUP_LENOVO_Y530, .name = "lenovo-y530"},
2501         {.id = ALC882_FIXUP_ACER_ASPIRE_7736, .name = "acer-aspire-7736"},
2502         {.id = ALC882_FIXUP_ASUS_W90V, .name = "asus-w90v"},
2503         {.id = ALC889_FIXUP_CD, .name = "cd"},
2504         {.id = ALC889_FIXUP_FRONT_HP_NO_PRESENCE, .name = "no-front-hp"},
2505         {.id = ALC889_FIXUP_VAIO_TT, .name = "vaio-tt"},
2506         {.id = ALC888_FIXUP_EEE1601, .name = "eee1601"},
2507         {.id = ALC882_FIXUP_EAPD, .name = "alc882-eapd"},
2508         {.id = ALC883_FIXUP_EAPD, .name = "alc883-eapd"},
2509         {.id = ALC882_FIXUP_GPIO1, .name = "gpio1"},
2510         {.id = ALC882_FIXUP_GPIO2, .name = "gpio2"},
2511         {.id = ALC882_FIXUP_GPIO3, .name = "gpio3"},
2512         {.id = ALC889_FIXUP_COEF, .name = "alc889-coef"},
2513         {.id = ALC882_FIXUP_ASUS_W2JC, .name = "asus-w2jc"},
2514         {.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"},
2515         {.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"},
2516         {.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"},
2517         {.id = ALC885_FIXUP_MACPRO_GPIO, .name = "macpro-gpio"},
2518         {.id = ALC889_FIXUP_DAC_ROUTE, .name = "dac-route"},
2519         {.id = ALC889_FIXUP_MBP_VREF, .name = "mbp-vref"},
2520         {.id = ALC889_FIXUP_IMAC91_VREF, .name = "imac91-vref"},
2521         {.id = ALC889_FIXUP_MBA11_VREF, .name = "mba11-vref"},
2522         {.id = ALC889_FIXUP_MBA21_VREF, .name = "mba21-vref"},
2523         {.id = ALC889_FIXUP_MP11_VREF, .name = "mp11-vref"},
2524         {.id = ALC889_FIXUP_MP41_VREF, .name = "mp41-vref"},
2525         {.id = ALC882_FIXUP_INV_DMIC, .name = "inv-dmic"},
2526         {.id = ALC882_FIXUP_NO_PRIMARY_HP, .name = "no-primary-hp"},
2527         {.id = ALC887_FIXUP_ASUS_BASS, .name = "asus-bass"},
2528         {.id = ALC1220_FIXUP_GB_DUAL_CODECS, .name = "dual-codecs"},
2529         {.id = ALC1220_FIXUP_CLEVO_P950, .name = "clevo-p950"},
2530         {}
2531 };
2532
2533 /*
2534  * BIOS auto configuration
2535  */
2536 /* almost identical with ALC880 parser... */
2537 static int alc882_parse_auto_config(struct hda_codec *codec)
2538 {
2539         static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };
2540         static const hda_nid_t alc882_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2541         return alc_parse_auto_config(codec, alc882_ignore, alc882_ssids);
2542 }
2543
2544 /*
2545  */
2546 static int patch_alc882(struct hda_codec *codec)
2547 {
2548         struct alc_spec *spec;
2549         int err;
2550
2551         err = alc_alloc_spec(codec, 0x0b);
2552         if (err < 0)
2553                 return err;
2554
2555         spec = codec->spec;
2556
2557         switch (codec->core.vendor_id) {
2558         case 0x10ec0882:
2559         case 0x10ec0885:
2560         case 0x10ec0900:
2561         case 0x10ec0b00:
2562         case 0x10ec1220:
2563                 break;
2564         default:
2565                 /* ALC883 and variants */
2566                 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2567                 break;
2568         }
2569
2570         alc_pre_init(codec);
2571
2572         snd_hda_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl,
2573                        alc882_fixups);
2574         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2575
2576         alc_auto_parse_customize_define(codec);
2577
2578         if (has_cdefine_beep(codec))
2579                 spec->gen.beep_nid = 0x01;
2580
2581         /* automatic parse from the BIOS config */
2582         err = alc882_parse_auto_config(codec);
2583         if (err < 0)
2584                 goto error;
2585
2586         if (!spec->gen.no_analog && spec->gen.beep_nid) {
2587                 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2588                 if (err < 0)
2589                         goto error;
2590         }
2591
2592         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2593
2594         return 0;
2595
2596  error:
2597         alc_free(codec);
2598         return err;
2599 }
2600
2601
2602 /*
2603  * ALC262 support
2604  */
2605 static int alc262_parse_auto_config(struct hda_codec *codec)
2606 {
2607         static const hda_nid_t alc262_ignore[] = { 0x1d, 0 };
2608         static const hda_nid_t alc262_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2609         return alc_parse_auto_config(codec, alc262_ignore, alc262_ssids);
2610 }
2611
2612 /*
2613  * Pin config fixes
2614  */
2615 enum {
2616         ALC262_FIXUP_FSC_H270,
2617         ALC262_FIXUP_FSC_S7110,
2618         ALC262_FIXUP_HP_Z200,
2619         ALC262_FIXUP_TYAN,
2620         ALC262_FIXUP_LENOVO_3000,
2621         ALC262_FIXUP_BENQ,
2622         ALC262_FIXUP_BENQ_T31,
2623         ALC262_FIXUP_INV_DMIC,
2624         ALC262_FIXUP_INTEL_BAYLEYBAY,
2625 };
2626
2627 static const struct hda_fixup alc262_fixups[] = {
2628         [ALC262_FIXUP_FSC_H270] = {
2629                 .type = HDA_FIXUP_PINS,
2630                 .v.pins = (const struct hda_pintbl[]) {
2631                         { 0x14, 0x99130110 }, /* speaker */
2632                         { 0x15, 0x0221142f }, /* front HP */
2633                         { 0x1b, 0x0121141f }, /* rear HP */
2634                         { }
2635                 }
2636         },
2637         [ALC262_FIXUP_FSC_S7110] = {
2638                 .type = HDA_FIXUP_PINS,
2639                 .v.pins = (const struct hda_pintbl[]) {
2640                         { 0x15, 0x90170110 }, /* speaker */
2641                         { }
2642                 },
2643                 .chained = true,
2644                 .chain_id = ALC262_FIXUP_BENQ,
2645         },
2646         [ALC262_FIXUP_HP_Z200] = {
2647                 .type = HDA_FIXUP_PINS,
2648                 .v.pins = (const struct hda_pintbl[]) {
2649                         { 0x16, 0x99130120 }, /* internal speaker */
2650                         { }
2651                 }
2652         },
2653         [ALC262_FIXUP_TYAN] = {
2654                 .type = HDA_FIXUP_PINS,
2655                 .v.pins = (const struct hda_pintbl[]) {
2656                         { 0x14, 0x1993e1f0 }, /* int AUX */
2657                         { }
2658                 }
2659         },
2660         [ALC262_FIXUP_LENOVO_3000] = {
2661                 .type = HDA_FIXUP_PINCTLS,
2662                 .v.pins = (const struct hda_pintbl[]) {
2663                         { 0x19, PIN_VREF50 },
2664                         {}
2665                 },
2666                 .chained = true,
2667                 .chain_id = ALC262_FIXUP_BENQ,
2668         },
2669         [ALC262_FIXUP_BENQ] = {
2670                 .type = HDA_FIXUP_VERBS,
2671                 .v.verbs = (const struct hda_verb[]) {
2672                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2673                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2674                         {}
2675                 }
2676         },
2677         [ALC262_FIXUP_BENQ_T31] = {
2678                 .type = HDA_FIXUP_VERBS,
2679                 .v.verbs = (const struct hda_verb[]) {
2680                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2681                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2682                         {}
2683                 }
2684         },
2685         [ALC262_FIXUP_INV_DMIC] = {
2686                 .type = HDA_FIXUP_FUNC,
2687                 .v.func = alc_fixup_inv_dmic,
2688         },
2689         [ALC262_FIXUP_INTEL_BAYLEYBAY] = {
2690                 .type = HDA_FIXUP_FUNC,
2691                 .v.func = alc_fixup_no_depop_delay,
2692         },
2693 };
2694
2695 static const struct snd_pci_quirk alc262_fixup_tbl[] = {
2696         SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", ALC262_FIXUP_HP_Z200),
2697         SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu Lifebook S7110", ALC262_FIXUP_FSC_S7110),
2698         SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ),
2699         SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN),
2700         SND_PCI_QUIRK(0x1734, 0x1141, "FSC ESPRIMO U9210", ALC262_FIXUP_FSC_H270),
2701         SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270),
2702         SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000),
2703         SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ),
2704         SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_FIXUP_BENQ_T31),
2705         SND_PCI_QUIRK(0x8086, 0x7270, "BayleyBay", ALC262_FIXUP_INTEL_BAYLEYBAY),
2706         {}
2707 };
2708
2709 static const struct hda_model_fixup alc262_fixup_models[] = {
2710         {.id = ALC262_FIXUP_INV_DMIC, .name = "inv-dmic"},
2711         {.id = ALC262_FIXUP_FSC_H270, .name = "fsc-h270"},
2712         {.id = ALC262_FIXUP_FSC_S7110, .name = "fsc-s7110"},
2713         {.id = ALC262_FIXUP_HP_Z200, .name = "hp-z200"},
2714         {.id = ALC262_FIXUP_TYAN, .name = "tyan"},
2715         {.id = ALC262_FIXUP_LENOVO_3000, .name = "lenovo-3000"},
2716         {.id = ALC262_FIXUP_BENQ, .name = "benq"},
2717         {.id = ALC262_FIXUP_BENQ_T31, .name = "benq-t31"},
2718         {.id = ALC262_FIXUP_INTEL_BAYLEYBAY, .name = "bayleybay"},
2719         {}
2720 };
2721
2722 /*
2723  */
2724 static int patch_alc262(struct hda_codec *codec)
2725 {
2726         struct alc_spec *spec;
2727         int err;
2728
2729         err = alc_alloc_spec(codec, 0x0b);
2730         if (err < 0)
2731                 return err;
2732
2733         spec = codec->spec;
2734         spec->gen.shared_mic_vref_pin = 0x18;
2735
2736         spec->shutup = alc_eapd_shutup;
2737
2738 #if 0
2739         /* pshou 07/11/05  set a zero PCM sample to DAC when FIFO is
2740          * under-run
2741          */
2742         alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x80);
2743 #endif
2744         alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2745
2746         alc_pre_init(codec);
2747
2748         snd_hda_pick_fixup(codec, alc262_fixup_models, alc262_fixup_tbl,
2749                        alc262_fixups);
2750         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2751
2752         alc_auto_parse_customize_define(codec);
2753
2754         if (has_cdefine_beep(codec))
2755                 spec->gen.beep_nid = 0x01;
2756
2757         /* automatic parse from the BIOS config */
2758         err = alc262_parse_auto_config(codec);
2759         if (err < 0)
2760                 goto error;
2761
2762         if (!spec->gen.no_analog && spec->gen.beep_nid) {
2763                 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2764                 if (err < 0)
2765                         goto error;
2766         }
2767
2768         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2769
2770         return 0;
2771
2772  error:
2773         alc_free(codec);
2774         return err;
2775 }
2776
2777 /*
2778  *  ALC268
2779  */
2780 /* bind Beep switches of both NID 0x0f and 0x10 */
2781 static int alc268_beep_switch_put(struct snd_kcontrol *kcontrol,
2782                                   struct snd_ctl_elem_value *ucontrol)
2783 {
2784         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2785         unsigned long pval;
2786         int err;
2787
2788         mutex_lock(&codec->control_mutex);
2789         pval = kcontrol->private_value;
2790         kcontrol->private_value = (pval & ~0xff) | 0x0f;
2791         err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2792         if (err >= 0) {
2793                 kcontrol->private_value = (pval & ~0xff) | 0x10;
2794                 err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2795         }
2796         kcontrol->private_value = pval;
2797         mutex_unlock(&codec->control_mutex);
2798         return err;
2799 }
2800
2801 static const struct snd_kcontrol_new alc268_beep_mixer[] = {
2802         HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
2803         {
2804                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2805                 .name = "Beep Playback Switch",
2806                 .subdevice = HDA_SUBDEV_AMP_FLAG,
2807                 .info = snd_hda_mixer_amp_switch_info,
2808                 .get = snd_hda_mixer_amp_switch_get,
2809                 .put = alc268_beep_switch_put,
2810                 .private_value = HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT)
2811         },
2812 };
2813
2814 /* set PCBEEP vol = 0, mute connections */
2815 static const struct hda_verb alc268_beep_init_verbs[] = {
2816         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2817         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2818         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2819         { }
2820 };
2821
2822 enum {
2823         ALC268_FIXUP_INV_DMIC,
2824         ALC268_FIXUP_HP_EAPD,
2825         ALC268_FIXUP_SPDIF,
2826 };
2827
2828 static const struct hda_fixup alc268_fixups[] = {
2829         [ALC268_FIXUP_INV_DMIC] = {
2830                 .type = HDA_FIXUP_FUNC,
2831                 .v.func = alc_fixup_inv_dmic,
2832         },
2833         [ALC268_FIXUP_HP_EAPD] = {
2834                 .type = HDA_FIXUP_VERBS,
2835                 .v.verbs = (const struct hda_verb[]) {
2836                         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 0},
2837                         {}
2838                 }
2839         },
2840         [ALC268_FIXUP_SPDIF] = {
2841                 .type = HDA_FIXUP_PINS,
2842                 .v.pins = (const struct hda_pintbl[]) {
2843                         { 0x1e, 0x014b1180 }, /* enable SPDIF out */
2844                         {}
2845                 }
2846         },
2847 };
2848
2849 static const struct hda_model_fixup alc268_fixup_models[] = {
2850         {.id = ALC268_FIXUP_INV_DMIC, .name = "inv-dmic"},
2851         {.id = ALC268_FIXUP_HP_EAPD, .name = "hp-eapd"},
2852         {.id = ALC268_FIXUP_SPDIF, .name = "spdif"},
2853         {}
2854 };
2855
2856 static const struct snd_pci_quirk alc268_fixup_tbl[] = {
2857         SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF),
2858         SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC),
2859         /* below is codec SSID since multiple Toshiba laptops have the
2860          * same PCI SSID 1179:ff00
2861          */
2862         SND_PCI_QUIRK(0x1179, 0xff06, "Toshiba P200", ALC268_FIXUP_HP_EAPD),
2863         {}
2864 };
2865
2866 /*
2867  * BIOS auto configuration
2868  */
2869 static int alc268_parse_auto_config(struct hda_codec *codec)
2870 {
2871         static const hda_nid_t alc268_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2872         return alc_parse_auto_config(codec, NULL, alc268_ssids);
2873 }
2874
2875 /*
2876  */
2877 static int patch_alc268(struct hda_codec *codec)
2878 {
2879         struct alc_spec *spec;
2880         int i, err;
2881
2882         /* ALC268 has no aa-loopback mixer */
2883         err = alc_alloc_spec(codec, 0);
2884         if (err < 0)
2885                 return err;
2886
2887         spec = codec->spec;
2888         if (has_cdefine_beep(codec))
2889                 spec->gen.beep_nid = 0x01;
2890
2891         spec->shutup = alc_eapd_shutup;
2892
2893         alc_pre_init(codec);
2894
2895         snd_hda_pick_fixup(codec, alc268_fixup_models, alc268_fixup_tbl, alc268_fixups);
2896         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2897
2898         /* automatic parse from the BIOS config */
2899         err = alc268_parse_auto_config(codec);
2900         if (err < 0)
2901                 goto error;
2902
2903         if (err > 0 && !spec->gen.no_analog &&
2904             spec->gen.autocfg.speaker_pins[0] != 0x1d) {
2905                 for (i = 0; i < ARRAY_SIZE(alc268_beep_mixer); i++) {
2906                         if (!snd_hda_gen_add_kctl(&spec->gen, NULL,
2907                                                   &alc268_beep_mixer[i])) {
2908                                 err = -ENOMEM;
2909                                 goto error;
2910                         }
2911                 }
2912                 snd_hda_add_verbs(codec, alc268_beep_init_verbs);
2913                 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
2914                         /* override the amp caps for beep generator */
2915                         snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
2916                                           (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
2917                                           (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
2918                                           (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
2919                                           (0 << AC_AMPCAP_MUTE_SHIFT));
2920         }
2921
2922         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2923
2924         return 0;
2925
2926  error:
2927         alc_free(codec);
2928         return err;
2929 }
2930
2931 /*
2932  * ALC269
2933  */
2934
2935 static const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
2936         .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
2937 };
2938
2939 static const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
2940         .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
2941 };
2942
2943 /* different alc269-variants */
2944 enum {
2945         ALC269_TYPE_ALC269VA,
2946         ALC269_TYPE_ALC269VB,
2947         ALC269_TYPE_ALC269VC,
2948         ALC269_TYPE_ALC269VD,
2949         ALC269_TYPE_ALC280,
2950         ALC269_TYPE_ALC282,
2951         ALC269_TYPE_ALC283,
2952         ALC269_TYPE_ALC284,
2953         ALC269_TYPE_ALC293,
2954         ALC269_TYPE_ALC286,
2955         ALC269_TYPE_ALC298,
2956         ALC269_TYPE_ALC255,
2957         ALC269_TYPE_ALC256,
2958         ALC269_TYPE_ALC257,
2959         ALC269_TYPE_ALC215,
2960         ALC269_TYPE_ALC225,
2961         ALC269_TYPE_ALC294,
2962         ALC269_TYPE_ALC300,
2963         ALC269_TYPE_ALC623,
2964         ALC269_TYPE_ALC700,
2965 };
2966
2967 /*
2968  * BIOS auto configuration
2969  */
2970 static int alc269_parse_auto_config(struct hda_codec *codec)
2971 {
2972         static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };
2973         static const hda_nid_t alc269_ssids[] = { 0, 0x1b, 0x14, 0x21 };
2974         static const hda_nid_t alc269va_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2975         struct alc_spec *spec = codec->spec;
2976         const hda_nid_t *ssids;
2977
2978         switch (spec->codec_variant) {
2979         case ALC269_TYPE_ALC269VA:
2980         case ALC269_TYPE_ALC269VC:
2981         case ALC269_TYPE_ALC280:
2982         case ALC269_TYPE_ALC284:
2983         case ALC269_TYPE_ALC293:
2984                 ssids = alc269va_ssids;
2985                 break;
2986         case ALC269_TYPE_ALC269VB:
2987         case ALC269_TYPE_ALC269VD:
2988         case ALC269_TYPE_ALC282:
2989         case ALC269_TYPE_ALC283:
2990         case ALC269_TYPE_ALC286:
2991         case ALC269_TYPE_ALC298:
2992         case ALC269_TYPE_ALC255:
2993         case ALC269_TYPE_ALC256:
2994         case ALC269_TYPE_ALC257:
2995         case ALC269_TYPE_ALC215:
2996         case ALC269_TYPE_ALC225:
2997         case ALC269_TYPE_ALC294:
2998         case ALC269_TYPE_ALC300:
2999         case ALC269_TYPE_ALC623:
3000         case ALC269_TYPE_ALC700:
3001                 ssids = alc269_ssids;
3002                 break;
3003         default:
3004                 ssids = alc269_ssids;
3005                 break;
3006         }
3007
3008         return alc_parse_auto_config(codec, alc269_ignore, ssids);
3009 }
3010
3011 static const struct hda_jack_keymap alc_headset_btn_keymap[] = {
3012         { SND_JACK_BTN_0, KEY_PLAYPAUSE },
3013         { SND_JACK_BTN_1, KEY_VOICECOMMAND },
3014         { SND_JACK_BTN_2, KEY_VOLUMEUP },
3015         { SND_JACK_BTN_3, KEY_VOLUMEDOWN },
3016         {}
3017 };
3018
3019 static void alc_headset_btn_callback(struct hda_codec *codec,
3020                                      struct hda_jack_callback *jack)
3021 {
3022         int report = 0;
3023
3024         if (jack->unsol_res & (7 << 13))
3025                 report |= SND_JACK_BTN_0;
3026
3027         if (jack->unsol_res  & (1 << 16 | 3 << 8))
3028                 report |= SND_JACK_BTN_1;
3029
3030         /* Volume up key */
3031         if (jack->unsol_res & (7 << 23))
3032                 report |= SND_JACK_BTN_2;
3033
3034         /* Volume down key */
3035         if (jack->unsol_res & (7 << 10))
3036                 report |= SND_JACK_BTN_3;
3037
3038         jack->jack->button_state = report;
3039 }
3040
3041 static void alc_disable_headset_jack_key(struct hda_codec *codec)
3042 {
3043         struct alc_spec *spec = codec->spec;
3044
3045         if (!spec->has_hs_key)
3046                 return;
3047
3048         switch (codec->core.vendor_id) {
3049         case 0x10ec0215:
3050         case 0x10ec0225:
3051         case 0x10ec0285:
3052         case 0x10ec0295:
3053         case 0x10ec0289:
3054         case 0x10ec0299:
3055                 alc_write_coef_idx(codec, 0x48, 0x0);
3056                 alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3057                 alc_update_coef_idx(codec, 0x44, 0x0045 << 8, 0x0);
3058                 break;
3059         case 0x10ec0236:
3060         case 0x10ec0256:
3061                 alc_write_coef_idx(codec, 0x48, 0x0);
3062                 alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3063                 break;
3064         }
3065 }
3066
3067 static void alc_enable_headset_jack_key(struct hda_codec *codec)
3068 {
3069         struct alc_spec *spec = codec->spec;
3070
3071         if (!spec->has_hs_key)
3072                 return;
3073
3074         switch (codec->core.vendor_id) {
3075         case 0x10ec0215:
3076         case 0x10ec0225:
3077         case 0x10ec0285:
3078         case 0x10ec0295:
3079         case 0x10ec0289:
3080         case 0x10ec0299:
3081                 alc_write_coef_idx(codec, 0x48, 0xd011);
3082                 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3083                 alc_update_coef_idx(codec, 0x44, 0x007f << 8, 0x0045 << 8);
3084                 break;
3085         case 0x10ec0236:
3086         case 0x10ec0256:
3087                 alc_write_coef_idx(codec, 0x48, 0xd011);
3088                 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3089                 break;
3090         }
3091 }
3092
3093 static void alc_fixup_headset_jack(struct hda_codec *codec,
3094                                     const struct hda_fixup *fix, int action)
3095 {
3096         struct alc_spec *spec = codec->spec;
3097
3098         switch (action) {
3099         case HDA_FIXUP_ACT_PRE_PROBE:
3100                 spec->has_hs_key = 1;
3101                 snd_hda_jack_detect_enable_callback(codec, 0x55,
3102                                                     alc_headset_btn_callback);
3103                 snd_hda_jack_add_kctl(codec, 0x55, "Headset Jack", false,
3104                                       SND_JACK_HEADSET, alc_headset_btn_keymap);
3105                 break;
3106         case HDA_FIXUP_ACT_INIT:
3107                 alc_enable_headset_jack_key(codec);
3108                 break;
3109         }
3110 }
3111
3112 static void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)
3113 {
3114         alc_update_coef_idx(codec, 0x04, 1 << 11, power_up ? (1 << 11) : 0);
3115 }
3116
3117 static void alc269_shutup(struct hda_codec *codec)
3118 {
3119         struct alc_spec *spec = codec->spec;
3120
3121         if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3122                 alc269vb_toggle_power_output(codec, 0);
3123         if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3124                         (alc_get_coef0(codec) & 0x00ff) == 0x018) {
3125                 msleep(150);
3126         }
3127         alc_shutup_pins(codec);
3128 }
3129
3130 static const struct coef_fw alc282_coefs[] = {
3131         WRITE_COEF(0x03, 0x0002), /* Power Down Control */
3132         UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
3133         WRITE_COEF(0x07, 0x0200), /* DMIC control */
3134         UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3135         UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3136         WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3137         WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3138         WRITE_COEF(0x0e, 0x6e00), /* LDO1/2/3, DAC/ADC */
3139         UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3140         UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3141         WRITE_COEF(0x6f, 0x0), /* Class D test 4 */
3142         UPDATE_COEF(0x0c, 0xfe00, 0), /* IO power down directly */
3143         WRITE_COEF(0x34, 0xa0c0), /* ANC */
3144         UPDATE_COEF(0x16, 0x0008, 0), /* AGC MUX */
3145         UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3146         UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3147         WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3148         WRITE_COEF(0x63, 0x2902), /* PLL */
3149         WRITE_COEF(0x68, 0xa080), /* capless control 2 */
3150         WRITE_COEF(0x69, 0x3400), /* capless control 3 */
3151         WRITE_COEF(0x6a, 0x2f3e), /* capless control 4 */
3152         WRITE_COEF(0x6b, 0x0), /* capless control 5 */
3153         UPDATE_COEF(0x6d, 0x0fff, 0x0900), /* class D test 2 */
3154         WRITE_COEF(0x6e, 0x110a), /* class D test 3 */
3155         UPDATE_COEF(0x70, 0x00f8, 0x00d8), /* class D test 5 */
3156         WRITE_COEF(0x71, 0x0014), /* class D test 6 */
3157         WRITE_COEF(0x72, 0xc2ba), /* classD OCP */
3158         UPDATE_COEF(0x77, 0x0f80, 0), /* classD pure DC test */
3159         WRITE_COEF(0x6c, 0xfc06), /* Class D amp control */
3160         {}
3161 };
3162
3163 static void alc282_restore_default_value(struct hda_codec *codec)
3164 {
3165         alc_process_coef_fw(codec, alc282_coefs);
3166 }
3167
3168 static void alc282_init(struct hda_codec *codec)
3169 {
3170         struct alc_spec *spec = codec->spec;
3171         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3172         bool hp_pin_sense;
3173         int coef78;
3174
3175         alc282_restore_default_value(codec);
3176
3177         if (!hp_pin)
3178                 return;
3179         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3180         coef78 = alc_read_coef_idx(codec, 0x78);
3181
3182         /* Index 0x78 Direct Drive HP AMP LPM Control 1 */
3183         /* Headphone capless set to high power mode */
3184         alc_write_coef_idx(codec, 0x78, 0x9004);
3185
3186         if (hp_pin_sense)
3187                 msleep(2);
3188
3189         snd_hda_codec_write(codec, hp_pin, 0,
3190                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3191
3192         if (hp_pin_sense)
3193                 msleep(85);
3194
3195         snd_hda_codec_write(codec, hp_pin, 0,
3196                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3197
3198         if (hp_pin_sense)
3199                 msleep(100);
3200
3201         /* Headphone capless set to normal mode */
3202         alc_write_coef_idx(codec, 0x78, coef78);
3203 }
3204
3205 static void alc282_shutup(struct hda_codec *codec)
3206 {
3207         struct alc_spec *spec = codec->spec;
3208         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3209         bool hp_pin_sense;
3210         int coef78;
3211
3212         if (!hp_pin) {
3213                 alc269_shutup(codec);
3214                 return;
3215         }
3216
3217         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3218         coef78 = alc_read_coef_idx(codec, 0x78);
3219         alc_write_coef_idx(codec, 0x78, 0x9004);
3220
3221         if (hp_pin_sense)
3222                 msleep(2);
3223
3224         snd_hda_codec_write(codec, hp_pin, 0,
3225                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3226
3227         if (hp_pin_sense)
3228                 msleep(85);
3229
3230         if (!spec->no_shutup_pins)
3231                 snd_hda_codec_write(codec, hp_pin, 0,
3232                                     AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3233
3234         if (hp_pin_sense)
3235                 msleep(100);
3236
3237         alc_auto_setup_eapd(codec, false);
3238         alc_shutup_pins(codec);
3239         alc_write_coef_idx(codec, 0x78, coef78);
3240 }
3241
3242 static const struct coef_fw alc283_coefs[] = {
3243         WRITE_COEF(0x03, 0x0002), /* Power Down Control */
3244         UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
3245         WRITE_COEF(0x07, 0x0200), /* DMIC control */
3246         UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3247         UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3248         WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3249         WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3250         WRITE_COEF(0x0e, 0x6fc0), /* LDO1/2/3, DAC/ADC */
3251         UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3252         UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3253         WRITE_COEF(0x3a, 0x0), /* Class D test 4 */
3254         UPDATE_COEF(0x0c, 0xfe00, 0x0), /* IO power down directly */
3255         WRITE_COEF(0x22, 0xa0c0), /* ANC */
3256         UPDATE_COEFEX(0x53, 0x01, 0x000f, 0x0008), /* AGC MUX */
3257         UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3258         UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3259         WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3260         WRITE_COEF(0x2e, 0x2902), /* PLL */
3261         WRITE_COEF(0x33, 0xa080), /* capless control 2 */
3262         WRITE_COEF(0x34, 0x3400), /* capless control 3 */
3263         WRITE_COEF(0x35, 0x2f3e), /* capless control 4 */
3264         WRITE_COEF(0x36, 0x0), /* capless control 5 */
3265         UPDATE_COEF(0x38, 0x0fff, 0x0900), /* class D test 2 */
3266         WRITE_COEF(0x39, 0x110a), /* class D test 3 */
3267         UPDATE_COEF(0x3b, 0x00f8, 0x00d8), /* class D test 5 */
3268         WRITE_COEF(0x3c, 0x0014), /* class D test 6 */
3269         WRITE_COEF(0x3d, 0xc2ba), /* classD OCP */
3270         UPDATE_COEF(0x42, 0x0f80, 0x0), /* classD pure DC test */
3271         WRITE_COEF(0x49, 0x0), /* test mode */
3272         UPDATE_COEF(0x40, 0xf800, 0x9800), /* Class D DC enable */
3273         UPDATE_COEF(0x42, 0xf000, 0x2000), /* DC offset */
3274         WRITE_COEF(0x37, 0xfc06), /* Class D amp control */
3275         UPDATE_COEF(0x1b, 0x8000, 0), /* HP JD control */
3276         {}
3277 };
3278
3279 static void alc283_restore_default_value(struct hda_codec *codec)
3280 {
3281         alc_process_coef_fw(codec, alc283_coefs);
3282 }
3283
3284 static void alc283_init(struct hda_codec *codec)
3285 {
3286         struct alc_spec *spec = codec->spec;
3287         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3288         bool hp_pin_sense;
3289
3290         alc283_restore_default_value(codec);
3291
3292         if (!hp_pin)
3293                 return;
3294
3295         msleep(30);
3296         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3297
3298         /* Index 0x43 Direct Drive HP AMP LPM Control 1 */
3299         /* Headphone capless set to high power mode */
3300         alc_write_coef_idx(codec, 0x43, 0x9004);
3301
3302         snd_hda_codec_write(codec, hp_pin, 0,
3303                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3304
3305         if (hp_pin_sense)
3306                 msleep(85);
3307
3308         snd_hda_codec_write(codec, hp_pin, 0,
3309                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3310
3311         if (hp_pin_sense)
3312                 msleep(85);
3313         /* Index 0x46 Combo jack auto switch control 2 */
3314         /* 3k pull low control for Headset jack. */
3315         alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3316         /* Headphone capless set to normal mode */
3317         alc_write_coef_idx(codec, 0x43, 0x9614);
3318 }
3319
3320 static void alc283_shutup(struct hda_codec *codec)
3321 {
3322         struct alc_spec *spec = codec->spec;
3323         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3324         bool hp_pin_sense;
3325
3326         if (!hp_pin) {
3327                 alc269_shutup(codec);
3328                 return;
3329         }
3330
3331         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3332
3333         alc_write_coef_idx(codec, 0x43, 0x9004);
3334
3335         /*depop hp during suspend*/
3336         alc_write_coef_idx(codec, 0x06, 0x2100);
3337
3338         snd_hda_codec_write(codec, hp_pin, 0,
3339                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3340
3341         if (hp_pin_sense)
3342                 msleep(100);
3343
3344         if (!spec->no_shutup_pins)
3345                 snd_hda_codec_write(codec, hp_pin, 0,
3346                                     AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3347
3348         alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
3349
3350         if (hp_pin_sense)
3351                 msleep(100);
3352         alc_auto_setup_eapd(codec, false);
3353         alc_shutup_pins(codec);
3354         alc_write_coef_idx(codec, 0x43, 0x9614);
3355 }
3356
3357 static void alc256_init(struct hda_codec *codec)
3358 {
3359         struct alc_spec *spec = codec->spec;
3360         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3361         bool hp_pin_sense;
3362
3363         if (!hp_pin)
3364                 hp_pin = 0x21;
3365
3366         msleep(30);
3367
3368         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3369
3370         if (hp_pin_sense)
3371                 msleep(2);
3372
3373         alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3374         if (spec->ultra_low_power) {
3375                 alc_update_coef_idx(codec, 0x03, 1<<1, 1<<1);
3376                 alc_update_coef_idx(codec, 0x08, 3<<2, 3<<2);
3377                 alc_update_coef_idx(codec, 0x08, 7<<4, 0);
3378                 alc_update_coef_idx(codec, 0x3b, 1<<15, 0);
3379                 alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3380                 msleep(30);
3381         }
3382
3383         snd_hda_codec_write(codec, hp_pin, 0,
3384                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3385
3386         if (hp_pin_sense || spec->ultra_low_power)
3387                 msleep(85);
3388
3389         snd_hda_codec_write(codec, hp_pin, 0,
3390                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3391
3392         if (hp_pin_sense || spec->ultra_low_power)
3393                 msleep(100);
3394
3395         alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3396         alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
3397         alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */
3398         alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15);
3399         /*
3400          * Expose headphone mic (or possibly Line In on some machines) instead
3401          * of PC Beep on 1Ah, and disable 1Ah loopback for all outputs. See
3402          * Documentation/sound/hd-audio/realtek-pc-beep.rst for details of
3403          * this register.
3404          */
3405         alc_write_coef_idx(codec, 0x36, 0x5757);
3406 }
3407
3408 static void alc256_shutup(struct hda_codec *codec)
3409 {
3410         struct alc_spec *spec = codec->spec;
3411         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3412         bool hp_pin_sense;
3413
3414         if (!hp_pin)
3415                 hp_pin = 0x21;
3416
3417         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3418
3419         if (hp_pin_sense)
3420                 msleep(2);
3421
3422         snd_hda_codec_write(codec, hp_pin, 0,
3423                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3424
3425         if (hp_pin_sense || spec->ultra_low_power)
3426                 msleep(85);
3427
3428         /* 3k pull low control for Headset jack. */
3429         /* NOTE: call this before clearing the pin, otherwise codec stalls */
3430         alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
3431
3432         if (!spec->no_shutup_pins)
3433                 snd_hda_codec_write(codec, hp_pin, 0,
3434                                     AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3435
3436         if (hp_pin_sense || spec->ultra_low_power)
3437                 msleep(100);
3438
3439         alc_auto_setup_eapd(codec, false);
3440         alc_shutup_pins(codec);
3441         if (spec->ultra_low_power) {
3442                 msleep(50);
3443                 alc_update_coef_idx(codec, 0x03, 1<<1, 0);
3444                 alc_update_coef_idx(codec, 0x08, 7<<4, 7<<4);
3445                 alc_update_coef_idx(codec, 0x08, 3<<2, 0);
3446                 alc_update_coef_idx(codec, 0x3b, 1<<15, 1<<15);
3447                 alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3448                 msleep(30);
3449         }
3450 }
3451
3452 static void alc225_init(struct hda_codec *codec)
3453 {
3454         struct alc_spec *spec = codec->spec;
3455         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3456         bool hp1_pin_sense, hp2_pin_sense;
3457
3458         if (!hp_pin)
3459                 hp_pin = 0x21;
3460         msleep(30);
3461
3462         hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3463         hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3464
3465         if (hp1_pin_sense || hp2_pin_sense)
3466                 msleep(2);
3467
3468         alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3469         if (spec->ultra_low_power) {
3470                 alc_update_coef_idx(codec, 0x08, 0x0f << 2, 3<<2);
3471                 alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3472                 alc_update_coef_idx(codec, 0x33, 1<<11, 0);
3473                 msleep(30);
3474         }
3475
3476         if (hp1_pin_sense || spec->ultra_low_power)
3477                 snd_hda_codec_write(codec, hp_pin, 0,
3478                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3479         if (hp2_pin_sense)
3480                 snd_hda_codec_write(codec, 0x16, 0,
3481                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3482
3483         if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3484                 msleep(85);
3485
3486         if (hp1_pin_sense || spec->ultra_low_power)
3487                 snd_hda_codec_write(codec, hp_pin, 0,
3488                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3489         if (hp2_pin_sense)
3490                 snd_hda_codec_write(codec, 0x16, 0,
3491                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3492
3493         if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3494                 msleep(100);
3495
3496         alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3497         alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
3498 }
3499
3500 static void alc225_shutup(struct hda_codec *codec)
3501 {
3502         struct alc_spec *spec = codec->spec;
3503         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3504         bool hp1_pin_sense, hp2_pin_sense;
3505
3506         if (!hp_pin)
3507                 hp_pin = 0x21;
3508
3509         alc_disable_headset_jack_key(codec);
3510         /* 3k pull low control for Headset jack. */
3511         alc_update_coef_idx(codec, 0x4a, 0, 3 << 10);
3512
3513         hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3514         hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3515
3516         if (hp1_pin_sense || hp2_pin_sense)
3517                 msleep(2);
3518
3519         if (hp1_pin_sense || spec->ultra_low_power)
3520                 snd_hda_codec_write(codec, hp_pin, 0,
3521                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3522         if (hp2_pin_sense)
3523                 snd_hda_codec_write(codec, 0x16, 0,
3524                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3525
3526         if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3527                 msleep(85);
3528
3529         if (hp1_pin_sense || spec->ultra_low_power)
3530                 snd_hda_codec_write(codec, hp_pin, 0,
3531                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3532         if (hp2_pin_sense)
3533                 snd_hda_codec_write(codec, 0x16, 0,
3534                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3535
3536         if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3537                 msleep(100);
3538
3539         alc_auto_setup_eapd(codec, false);
3540         alc_shutup_pins(codec);
3541         if (spec->ultra_low_power) {
3542                 msleep(50);
3543                 alc_update_coef_idx(codec, 0x08, 0x0f << 2, 0x0c << 2);
3544                 alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3545                 alc_update_coef_idx(codec, 0x33, 1<<11, 1<<11);
3546                 alc_update_coef_idx(codec, 0x4a, 3<<4, 2<<4);
3547                 msleep(30);
3548         }
3549
3550         alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3551         alc_enable_headset_jack_key(codec);
3552 }
3553
3554 static void alc_default_init(struct hda_codec *codec)
3555 {
3556         struct alc_spec *spec = codec->spec;
3557         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3558         bool hp_pin_sense;
3559
3560         if (!hp_pin)
3561                 return;
3562
3563         msleep(30);
3564
3565         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3566
3567         if (hp_pin_sense)
3568                 msleep(2);
3569
3570         snd_hda_codec_write(codec, hp_pin, 0,
3571                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3572
3573         if (hp_pin_sense)
3574                 msleep(85);
3575
3576         snd_hda_codec_write(codec, hp_pin, 0,
3577                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3578
3579         if (hp_pin_sense)
3580                 msleep(100);
3581 }
3582
3583 static void alc_default_shutup(struct hda_codec *codec)
3584 {
3585         struct alc_spec *spec = codec->spec;
3586         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3587         bool hp_pin_sense;
3588
3589         if (!hp_pin) {
3590                 alc269_shutup(codec);
3591                 return;
3592         }
3593
3594         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3595
3596         if (hp_pin_sense)
3597                 msleep(2);
3598
3599         snd_hda_codec_write(codec, hp_pin, 0,
3600                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3601
3602         if (hp_pin_sense)
3603                 msleep(85);
3604
3605         if (!spec->no_shutup_pins)
3606                 snd_hda_codec_write(codec, hp_pin, 0,
3607                                     AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3608
3609         if (hp_pin_sense)
3610                 msleep(100);
3611
3612         alc_auto_setup_eapd(codec, false);
3613         alc_shutup_pins(codec);
3614 }
3615
3616 static void alc294_hp_init(struct hda_codec *codec)
3617 {
3618         struct alc_spec *spec = codec->spec;
3619         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3620         int i, val;
3621
3622         if (!hp_pin)
3623                 return;
3624
3625         snd_hda_codec_write(codec, hp_pin, 0,
3626                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3627
3628         msleep(100);
3629
3630         if (!spec->no_shutup_pins)
3631                 snd_hda_codec_write(codec, hp_pin, 0,
3632                                     AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3633
3634         alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */
3635         alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */
3636
3637         /* Wait for depop procedure finish  */
3638         val = alc_read_coefex_idx(codec, 0x58, 0x01);
3639         for (i = 0; i < 20 && val & 0x0080; i++) {
3640                 msleep(50);
3641                 val = alc_read_coefex_idx(codec, 0x58, 0x01);
3642         }
3643         /* Set HP depop to auto mode */
3644         alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b);
3645         msleep(50);
3646 }
3647
3648 static void alc294_init(struct hda_codec *codec)
3649 {
3650         struct alc_spec *spec = codec->spec;
3651
3652         /* required only at boot or S4 resume time */
3653         if (!spec->done_hp_init ||
3654             codec->core.dev.power.power_state.event == PM_EVENT_RESTORE) {
3655                 alc294_hp_init(codec);
3656                 spec->done_hp_init = true;
3657         }
3658         alc_default_init(codec);
3659 }
3660
3661 static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg,
3662                              unsigned int val)
3663 {
3664         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3665         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val & 0xffff); /* LSB */
3666         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val >> 16); /* MSB */
3667 }
3668
3669 static int alc5505_coef_get(struct hda_codec *codec, unsigned int index_reg)
3670 {
3671         unsigned int val;
3672
3673         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3674         val = snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3675                 & 0xffff;
3676         val |= snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3677                 << 16;
3678         return val;
3679 }
3680
3681 static void alc5505_dsp_halt(struct hda_codec *codec)
3682 {
3683         unsigned int val;
3684
3685         alc5505_coef_set(codec, 0x3000, 0x000c); /* DSP CPU stop */
3686         alc5505_coef_set(codec, 0x880c, 0x0008); /* DDR enter self refresh */
3687         alc5505_coef_set(codec, 0x61c0, 0x11110080); /* Clock control for PLL and CPU */
3688         alc5505_coef_set(codec, 0x6230, 0xfc0d4011); /* Disable Input OP */
3689         alc5505_coef_set(codec, 0x61b4, 0x040a2b03); /* Stop PLL2 */
3690         alc5505_coef_set(codec, 0x61b0, 0x00005b17); /* Stop PLL1 */
3691         alc5505_coef_set(codec, 0x61b8, 0x04133303); /* Stop PLL3 */
3692         val = alc5505_coef_get(codec, 0x6220);
3693         alc5505_coef_set(codec, 0x6220, (val | 0x3000)); /* switch Ringbuffer clock to DBUS clock */
3694 }
3695
3696 static void alc5505_dsp_back_from_halt(struct hda_codec *codec)
3697 {
3698         alc5505_coef_set(codec, 0x61b8, 0x04133302);
3699         alc5505_coef_set(codec, 0x61b0, 0x00005b16);
3700         alc5505_coef_set(codec, 0x61b4, 0x040a2b02);
3701         alc5505_coef_set(codec, 0x6230, 0xf80d4011);
3702         alc5505_coef_set(codec, 0x6220, 0x2002010f);
3703         alc5505_coef_set(codec, 0x880c, 0x00000004);
3704 }
3705
3706 static void alc5505_dsp_init(struct hda_codec *codec)
3707 {
3708         unsigned int val;
3709
3710         alc5505_dsp_halt(codec);
3711         alc5505_dsp_back_from_halt(codec);
3712         alc5505_coef_set(codec, 0x61b0, 0x5b14); /* PLL1 control */
3713         alc5505_coef_set(codec, 0x61b0, 0x5b16);
3714         alc5505_coef_set(codec, 0x61b4, 0x04132b00); /* PLL2 control */
3715         alc5505_coef_set(codec, 0x61b4, 0x04132b02);
3716         alc5505_coef_set(codec, 0x61b8, 0x041f3300); /* PLL3 control*/
3717         alc5505_coef_set(codec, 0x61b8, 0x041f3302);
3718         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_CODEC_RESET, 0); /* Function reset */
3719         alc5505_coef_set(codec, 0x61b8, 0x041b3302);
3720         alc5505_coef_set(codec, 0x61b8, 0x04173302);
3721         alc5505_coef_set(codec, 0x61b8, 0x04163302);
3722         alc5505_coef_set(codec, 0x8800, 0x348b328b); /* DRAM control */
3723         alc5505_coef_set(codec, 0x8808, 0x00020022); /* DRAM control */
3724         alc5505_coef_set(codec, 0x8818, 0x00000400); /* DRAM control */
3725
3726         val = alc5505_coef_get(codec, 0x6200) >> 16; /* Read revision ID */
3727         if (val <= 3)
3728                 alc5505_coef_set(codec, 0x6220, 0x2002010f); /* I/O PAD Configuration */
3729         else
3730                 alc5505_coef_set(codec, 0x6220, 0x6002018f);
3731
3732         alc5505_coef_set(codec, 0x61ac, 0x055525f0); /**/
3733         alc5505_coef_set(codec, 0x61c0, 0x12230080); /* Clock control */
3734         alc5505_coef_set(codec, 0x61b4, 0x040e2b02); /* PLL2 control */
3735         alc5505_coef_set(codec, 0x61bc, 0x010234f8); /* OSC Control */
3736         alc5505_coef_set(codec, 0x880c, 0x00000004); /* DRAM Function control */
3737         alc5505_coef_set(codec, 0x880c, 0x00000003);
3738         alc5505_coef_set(codec, 0x880c, 0x00000010);
3739
3740 #ifdef HALT_REALTEK_ALC5505
3741         alc5505_dsp_halt(codec);
3742 #endif
3743 }
3744
3745 #ifdef HALT_REALTEK_ALC5505
3746 #define alc5505_dsp_suspend(codec)      do { } while (0) /* NOP */
3747 #define alc5505_dsp_resume(codec)       do { } while (0) /* NOP */
3748 #else
3749 #define alc5505_dsp_suspend(codec)      alc5505_dsp_halt(codec)
3750 #define alc5505_dsp_resume(codec)       alc5505_dsp_back_from_halt(codec)
3751 #endif
3752
3753 #ifdef CONFIG_PM
3754 static int alc269_suspend(struct hda_codec *codec)
3755 {
3756         struct alc_spec *spec = codec->spec;
3757
3758         if (spec->has_alc5505_dsp)
3759                 alc5505_dsp_suspend(codec);
3760         return alc_suspend(codec);
3761 }
3762
3763 static int alc269_resume(struct hda_codec *codec)
3764 {
3765         struct alc_spec *spec = codec->spec;
3766
3767         if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3768                 alc269vb_toggle_power_output(codec, 0);
3769         if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3770                         (alc_get_coef0(codec) & 0x00ff) == 0x018) {
3771                 msleep(150);
3772         }
3773
3774         codec->patch_ops.init(codec);
3775
3776         if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3777                 alc269vb_toggle_power_output(codec, 1);
3778         if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3779                         (alc_get_coef0(codec) & 0x00ff) == 0x017) {
3780                 msleep(200);
3781         }
3782
3783         snd_hda_regmap_sync(codec);
3784         hda_call_check_power_status(codec, 0x01);
3785
3786         /* on some machine, the BIOS will clear the codec gpio data when enter
3787          * suspend, and won't restore the data after resume, so we restore it
3788          * in the driver.
3789          */
3790         if (spec->gpio_data)
3791                 alc_write_gpio_data(codec);
3792
3793         if (spec->has_alc5505_dsp)
3794                 alc5505_dsp_resume(codec);
3795
3796         return 0;
3797 }
3798 #endif /* CONFIG_PM */
3799
3800 static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,
3801                                                  const struct hda_fixup *fix, int action)
3802 {
3803         struct alc_spec *spec = codec->spec;
3804
3805         if (action == HDA_FIXUP_ACT_PRE_PROBE)
3806                 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
3807 }
3808
3809 static void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec,
3810                                                  const struct hda_fixup *fix,
3811                                                  int action)
3812 {
3813         unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21);
3814         unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19);
3815
3816         if (cfg_headphone && cfg_headset_mic == 0x411111f0)
3817                 snd_hda_codec_set_pincfg(codec, 0x19,
3818                         (cfg_headphone & ~AC_DEFCFG_DEVICE) |
3819                         (AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT));
3820 }
3821
3822 static void alc269_fixup_hweq(struct hda_codec *codec,
3823                                const struct hda_fixup *fix, int action)
3824 {
3825         if (action == HDA_FIXUP_ACT_INIT)
3826                 alc_update_coef_idx(codec, 0x1e, 0, 0x80);
3827 }
3828
3829 static void alc269_fixup_headset_mic(struct hda_codec *codec,
3830                                        const struct hda_fixup *fix, int action)
3831 {
3832         struct alc_spec *spec = codec->spec;
3833
3834         if (action == HDA_FIXUP_ACT_PRE_PROBE)
3835                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
3836 }
3837
3838 static void alc271_fixup_dmic(struct hda_codec *codec,
3839                               const struct hda_fixup *fix, int action)
3840 {
3841         static const struct hda_verb verbs[] = {
3842                 {0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
3843                 {0x20, AC_VERB_SET_PROC_COEF, 0x4000},
3844                 {}
3845         };
3846         unsigned int cfg;
3847
3848         if (strcmp(codec->core.chip_name, "ALC271X") &&
3849             strcmp(codec->core.chip_name, "ALC269VB"))
3850                 return;
3851         cfg = snd_hda_codec_get_pincfg(codec, 0x12);
3852         if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
3853                 snd_hda_sequence_write(codec, verbs);
3854 }
3855
3856 static void alc269_fixup_pcm_44k(struct hda_codec *codec,
3857                                  const struct hda_fixup *fix, int action)
3858 {
3859         struct alc_spec *spec = codec->spec;
3860
3861         if (action != HDA_FIXUP_ACT_PROBE)
3862                 return;
3863
3864         /* Due to a hardware problem on Lenovo Ideadpad, we need to
3865          * fix the sample rate of analog I/O to 44.1kHz
3866          */
3867         spec->gen.stream_analog_playback = &alc269_44k_pcm_analog_playback;
3868         spec->gen.stream_analog_capture = &alc269_44k_pcm_analog_capture;
3869 }
3870
3871 static void alc269_fixup_stereo_dmic(struct hda_codec *codec,
3872                                      const struct hda_fixup *fix, int action)
3873 {
3874         /* The digital-mic unit sends PDM (differential signal) instead of
3875          * the standard PCM, thus you can't record a valid mono stream as is.
3876          * Below is a workaround specific to ALC269 to control the dmic
3877          * signal source as mono.
3878          */
3879         if (action == HDA_FIXUP_ACT_INIT)
3880                 alc_update_coef_idx(codec, 0x07, 0, 0x80);
3881 }
3882
3883 static void alc269_quanta_automute(struct hda_codec *codec)
3884 {
3885         snd_hda_gen_update_outputs(codec);
3886
3887         alc_write_coef_idx(codec, 0x0c, 0x680);
3888         alc_write_coef_idx(codec, 0x0c, 0x480);
3889 }
3890
3891 static void alc269_fixup_quanta_mute(struct hda_codec *codec,
3892                                      const struct hda_fixup *fix, int action)
3893 {
3894         struct alc_spec *spec = codec->spec;
3895         if (action != HDA_FIXUP_ACT_PROBE)
3896                 return;
3897         spec->gen.automute_hook = alc269_quanta_automute;
3898 }
3899
3900 static void alc269_x101_hp_automute_hook(struct hda_codec *codec,
3901                                          struct hda_jack_callback *jack)
3902 {
3903         struct alc_spec *spec = codec->spec;
3904         int vref;
3905         msleep(200);
3906         snd_hda_gen_hp_automute(codec, jack);
3907
3908         vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
3909         msleep(100);
3910         snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
3911                             vref);
3912         msleep(500);
3913         snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
3914                             vref);
3915 }
3916
3917 /*
3918  * Magic sequence to make Huawei Matebook X right speaker working (bko#197801)
3919  */
3920 struct hda_alc298_mbxinit {
3921         unsigned char value_0x23;
3922         unsigned char value_0x25;
3923 };
3924
3925 static void alc298_huawei_mbx_stereo_seq(struct hda_codec *codec,
3926                                          const struct hda_alc298_mbxinit *initval,
3927                                          bool first)
3928 {
3929         snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x0);
3930         alc_write_coef_idx(codec, 0x26, 0xb000);
3931
3932         if (first)
3933                 snd_hda_codec_write(codec, 0x21, 0, AC_VERB_GET_PIN_SENSE, 0x0);
3934
3935         snd_hda_codec_write(codec, 0x6, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
3936         alc_write_coef_idx(codec, 0x26, 0xf000);
3937         alc_write_coef_idx(codec, 0x23, initval->value_0x23);
3938
3939         if (initval->value_0x23 != 0x1e)
3940                 alc_write_coef_idx(codec, 0x25, initval->value_0x25);
3941
3942         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
3943         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
3944 }
3945
3946 static void alc298_fixup_huawei_mbx_stereo(struct hda_codec *codec,
3947                                            const struct hda_fixup *fix,
3948                                            int action)
3949 {
3950         /* Initialization magic */
3951         static const struct hda_alc298_mbxinit dac_init[] = {
3952                 {0x0c, 0x00}, {0x0d, 0x00}, {0x0e, 0x00}, {0x0f, 0x00},
3953                 {0x10, 0x00}, {0x1a, 0x40}, {0x1b, 0x82}, {0x1c, 0x00},
3954                 {0x1d, 0x00}, {0x1e, 0x00}, {0x1f, 0x00},
3955                 {0x20, 0xc2}, {0x21, 0xc8}, {0x22, 0x26}, {0x23, 0x24},
3956                 {0x27, 0xff}, {0x28, 0xff}, {0x29, 0xff}, {0x2a, 0x8f},
3957                 {0x2b, 0x02}, {0x2c, 0x48}, {0x2d, 0x34}, {0x2e, 0x00},
3958                 {0x2f, 0x00},
3959                 {0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00},
3960                 {0x34, 0x00}, {0x35, 0x01}, {0x36, 0x93}, {0x37, 0x0c},
3961                 {0x38, 0x00}, {0x39, 0x00}, {0x3a, 0xf8}, {0x38, 0x80},
3962                 {}
3963         };
3964         const struct hda_alc298_mbxinit *seq;
3965
3966         if (action != HDA_FIXUP_ACT_INIT)
3967                 return;
3968
3969         /* Start */
3970         snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x00);
3971         snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
3972         alc_write_coef_idx(codec, 0x26, 0xf000);
3973         alc_write_coef_idx(codec, 0x22, 0x31);
3974         alc_write_coef_idx(codec, 0x23, 0x0b);
3975         alc_write_coef_idx(codec, 0x25, 0x00);
3976         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
3977         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
3978
3979         for (seq = dac_init; seq->value_0x23; seq++)
3980                 alc298_huawei_mbx_stereo_seq(codec, seq, seq == dac_init);
3981 }
3982
3983 static void alc269_fixup_x101_headset_mic(struct hda_codec *codec,
3984                                      const struct hda_fixup *fix, int action)
3985 {
3986         struct alc_spec *spec = codec->spec;
3987         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3988                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
3989                 spec->gen.hp_automute_hook = alc269_x101_hp_automute_hook;
3990         }
3991 }
3992
3993 static void alc_update_vref_led(struct hda_codec *codec, hda_nid_t pin,
3994                                 bool polarity, bool on)
3995 {
3996         unsigned int pinval;
3997
3998         if (!pin)
3999                 return;
4000         if (polarity)
4001                 on = !on;
4002         pinval = snd_hda_codec_get_pin_target(codec, pin);
4003         pinval &= ~AC_PINCTL_VREFEN;
4004         pinval |= on ? AC_PINCTL_VREF_80 : AC_PINCTL_VREF_HIZ;
4005         /* temporarily power up/down for setting VREF */
4006         snd_hda_power_up_pm(codec);
4007         snd_hda_set_pin_ctl_cache(codec, pin, pinval);
4008         snd_hda_power_down_pm(codec);
4009 }
4010
4011 /* update mute-LED according to the speaker mute state via mic VREF pin */
4012 static int vref_mute_led_set(struct led_classdev *led_cdev,
4013                              enum led_brightness brightness)
4014 {
4015         struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4016         struct alc_spec *spec = codec->spec;
4017
4018         alc_update_vref_led(codec, spec->mute_led_nid,
4019                             spec->mute_led_polarity, brightness);
4020         return 0;
4021 }
4022
4023 /* Make sure the led works even in runtime suspend */
4024 static unsigned int led_power_filter(struct hda_codec *codec,
4025                                                   hda_nid_t nid,
4026                                                   unsigned int power_state)
4027 {
4028         struct alc_spec *spec = codec->spec;
4029
4030         if (power_state != AC_PWRST_D3 || nid == 0 ||
4031             (nid != spec->mute_led_nid && nid != spec->cap_mute_led_nid))
4032                 return power_state;
4033
4034         /* Set pin ctl again, it might have just been set to 0 */
4035         snd_hda_set_pin_ctl(codec, nid,
4036                             snd_hda_codec_get_pin_target(codec, nid));
4037
4038         return snd_hda_gen_path_power_filter(codec, nid, power_state);
4039 }
4040
4041 static void alc269_fixup_hp_mute_led(struct hda_codec *codec,
4042                                      const struct hda_fixup *fix, int action)
4043 {
4044         struct alc_spec *spec = codec->spec;
4045         const struct dmi_device *dev = NULL;
4046
4047         if (action != HDA_FIXUP_ACT_PRE_PROBE)
4048                 return;
4049
4050         while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
4051                 int pol, pin;
4052                 if (sscanf(dev->name, "HP_Mute_LED_%d_%x", &pol, &pin) != 2)
4053                         continue;
4054                 if (pin < 0x0a || pin >= 0x10)
4055                         break;
4056                 spec->mute_led_polarity = pol;
4057                 spec->mute_led_nid = pin - 0x0a + 0x18;
4058                 snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
4059                 codec->power_filter = led_power_filter;
4060                 codec_dbg(codec,
4061                           "Detected mute LED for %x:%d\n", spec->mute_led_nid,
4062                            spec->mute_led_polarity);
4063                 break;
4064         }
4065 }
4066
4067 static void alc269_fixup_hp_mute_led_micx(struct hda_codec *codec,
4068                                           const struct hda_fixup *fix,
4069                                           int action, hda_nid_t pin)
4070 {
4071         struct alc_spec *spec = codec->spec;
4072
4073         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4074                 spec->mute_led_polarity = 0;
4075                 spec->mute_led_nid = pin;
4076                 snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
4077                 codec->power_filter = led_power_filter;
4078         }
4079 }
4080
4081 static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec,
4082                                 const struct hda_fixup *fix, int action)
4083 {
4084         alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x18);
4085 }
4086
4087 static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,
4088                                 const struct hda_fixup *fix, int action)
4089 {
4090         alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x19);
4091 }
4092
4093 static void alc269_fixup_hp_mute_led_mic3(struct hda_codec *codec,
4094                                 const struct hda_fixup *fix, int action)
4095 {
4096         alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1b);
4097 }
4098
4099 /* update LED status via GPIO */
4100 static void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask,
4101                                 int polarity, bool enabled)
4102 {
4103         if (polarity)
4104                 enabled = !enabled;
4105         alc_update_gpio_data(codec, mask, !enabled); /* muted -> LED on */
4106 }
4107
4108 /* turn on/off mute LED via GPIO per vmaster hook */
4109 static int gpio_mute_led_set(struct led_classdev *led_cdev,
4110                              enum led_brightness brightness)
4111 {
4112         struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4113         struct alc_spec *spec = codec->spec;
4114
4115         alc_update_gpio_led(codec, spec->gpio_mute_led_mask,
4116                             spec->mute_led_polarity, !brightness);
4117         return 0;
4118 }
4119
4120 /* turn on/off mic-mute LED via GPIO per capture hook */
4121 static int micmute_led_set(struct led_classdev *led_cdev,
4122                            enum led_brightness brightness)
4123 {
4124         struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4125         struct alc_spec *spec = codec->spec;
4126
4127         alc_update_gpio_led(codec, spec->gpio_mic_led_mask,
4128                             spec->micmute_led_polarity, !brightness);
4129         return 0;
4130 }
4131
4132 /* setup mute and mic-mute GPIO bits, add hooks appropriately */
4133 static void alc_fixup_hp_gpio_led(struct hda_codec *codec,
4134                                   int action,
4135                                   unsigned int mute_mask,
4136                                   unsigned int micmute_mask)
4137 {
4138         struct alc_spec *spec = codec->spec;
4139
4140         alc_fixup_gpio(codec, action, mute_mask | micmute_mask);
4141
4142         if (action != HDA_FIXUP_ACT_PRE_PROBE)
4143                 return;
4144         if (mute_mask) {
4145                 spec->gpio_mute_led_mask = mute_mask;
4146                 snd_hda_gen_add_mute_led_cdev(codec, gpio_mute_led_set);
4147         }
4148         if (micmute_mask) {
4149                 spec->gpio_mic_led_mask = micmute_mask;
4150                 snd_hda_gen_add_micmute_led_cdev(codec, micmute_led_set);
4151         }
4152 }
4153
4154 static void alc269_fixup_hp_gpio_led(struct hda_codec *codec,
4155                                 const struct hda_fixup *fix, int action)
4156 {
4157         alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
4158 }
4159
4160 static void alc285_fixup_hp_gpio_led(struct hda_codec *codec,
4161                                 const struct hda_fixup *fix, int action)
4162 {
4163         alc_fixup_hp_gpio_led(codec, action, 0x04, 0x01);
4164 }
4165
4166 static void alc286_fixup_hp_gpio_led(struct hda_codec *codec,
4167                                 const struct hda_fixup *fix, int action)
4168 {
4169         alc_fixup_hp_gpio_led(codec, action, 0x02, 0x20);
4170 }
4171
4172 /* turn on/off mic-mute LED per capture hook via VREF change */
4173 static int vref_micmute_led_set(struct led_classdev *led_cdev,
4174                                 enum led_brightness brightness)
4175 {
4176         struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4177         struct alc_spec *spec = codec->spec;
4178
4179         alc_update_vref_led(codec, spec->cap_mute_led_nid,
4180                             spec->micmute_led_polarity, brightness);
4181         return 0;
4182 }
4183
4184 static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec,
4185                                 const struct hda_fixup *fix, int action)
4186 {
4187         struct alc_spec *spec = codec->spec;
4188
4189         alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
4190         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4191                 /* Like hp_gpio_mic1_led, but also needs GPIO4 low to
4192                  * enable headphone amp
4193                  */
4194                 spec->gpio_mask |= 0x10;
4195                 spec->gpio_dir |= 0x10;
4196                 spec->cap_mute_led_nid = 0x18;
4197                 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4198                 codec->power_filter = led_power_filter;
4199         }
4200 }
4201
4202 static void alc280_fixup_hp_gpio4(struct hda_codec *codec,
4203                                    const struct hda_fixup *fix, int action)
4204 {
4205         struct alc_spec *spec = codec->spec;
4206
4207         alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
4208         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4209                 spec->cap_mute_led_nid = 0x18;
4210                 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4211                 codec->power_filter = led_power_filter;
4212         }
4213 }
4214
4215 static void alc_update_coef_led(struct hda_codec *codec,
4216                                 struct alc_coef_led *led,
4217                                 bool polarity, bool on)
4218 {
4219         if (polarity)
4220                 on = !on;
4221         /* temporarily power up/down for setting COEF bit */
4222         alc_update_coef_idx(codec, led->idx, led->mask,
4223                             on ? led->on : led->off);
4224 }
4225
4226 /* update mute-LED according to the speaker mute state via COEF bit */
4227 static int coef_mute_led_set(struct led_classdev *led_cdev,
4228                              enum led_brightness brightness)
4229 {
4230         struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4231         struct alc_spec *spec = codec->spec;
4232
4233         alc_update_coef_led(codec, &spec->mute_led_coef,
4234                             spec->mute_led_polarity, brightness);
4235         return 0;
4236 }
4237
4238 static void alc285_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4239                                           const struct hda_fixup *fix,
4240                                           int action)
4241 {
4242         struct alc_spec *spec = codec->spec;
4243
4244         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4245                 spec->mute_led_polarity = 0;
4246                 spec->mute_led_coef.idx = 0x0b;
4247                 spec->mute_led_coef.mask = 1 << 3;
4248                 spec->mute_led_coef.on = 1 << 3;
4249                 spec->mute_led_coef.off = 0;
4250                 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4251         }
4252 }
4253
4254 static void alc236_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4255                                           const struct hda_fixup *fix,
4256                                           int action)
4257 {
4258         struct alc_spec *spec = codec->spec;
4259
4260         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4261                 spec->mute_led_polarity = 0;
4262                 spec->mute_led_coef.idx = 0x34;
4263                 spec->mute_led_coef.mask = 1 << 5;
4264                 spec->mute_led_coef.on = 0;
4265                 spec->mute_led_coef.off = 1 << 5;
4266                 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4267         }
4268 }
4269
4270 /* turn on/off mic-mute LED per capture hook by coef bit */
4271 static int coef_micmute_led_set(struct led_classdev *led_cdev,
4272                                 enum led_brightness brightness)
4273 {
4274         struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4275         struct alc_spec *spec = codec->spec;
4276
4277         alc_update_coef_led(codec, &spec->mic_led_coef,
4278                             spec->micmute_led_polarity, brightness);
4279         return 0;
4280 }
4281
4282 static void alc285_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4283                                 const struct hda_fixup *fix, int action)
4284 {
4285         struct alc_spec *spec = codec->spec;
4286
4287         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4288                 spec->mic_led_coef.idx = 0x19;
4289                 spec->mic_led_coef.mask = 1 << 13;
4290                 spec->mic_led_coef.on = 1 << 13;
4291                 spec->mic_led_coef.off = 0;
4292                 snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
4293         }
4294 }
4295
4296 static void alc236_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4297                                 const struct hda_fixup *fix, int action)
4298 {
4299         struct alc_spec *spec = codec->spec;
4300
4301         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4302                 spec->mic_led_coef.idx = 0x35;
4303                 spec->mic_led_coef.mask = 3 << 2;
4304                 spec->mic_led_coef.on = 2 << 2;
4305                 spec->mic_led_coef.off = 1 << 2;
4306                 snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
4307         }
4308 }
4309
4310 static void alc285_fixup_hp_mute_led(struct hda_codec *codec,
4311                                 const struct hda_fixup *fix, int action)
4312 {
4313         alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
4314         alc285_fixup_hp_coef_micmute_led(codec, fix, action);
4315 }
4316
4317 static void alc236_fixup_hp_mute_led(struct hda_codec *codec,
4318                                 const struct hda_fixup *fix, int action)
4319 {
4320         alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
4321         alc236_fixup_hp_coef_micmute_led(codec, fix, action);
4322 }
4323
4324 #if IS_REACHABLE(CONFIG_INPUT)
4325 static void gpio2_mic_hotkey_event(struct hda_codec *codec,
4326                                    struct hda_jack_callback *event)
4327 {
4328         struct alc_spec *spec = codec->spec;
4329
4330         /* GPIO2 just toggles on a keypress/keyrelease cycle. Therefore
4331            send both key on and key off event for every interrupt. */
4332         input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1);
4333         input_sync(spec->kb_dev);
4334         input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0);
4335         input_sync(spec->kb_dev);
4336 }
4337
4338 static int alc_register_micmute_input_device(struct hda_codec *codec)
4339 {
4340         struct alc_spec *spec = codec->spec;
4341         int i;
4342
4343         spec->kb_dev = input_allocate_device();
4344         if (!spec->kb_dev) {
4345                 codec_err(codec, "Out of memory (input_allocate_device)\n");
4346                 return -ENOMEM;
4347         }
4348
4349         spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE;
4350
4351         spec->kb_dev->name = "Microphone Mute Button";
4352         spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);
4353         spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]);
4354         spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map);
4355         spec->kb_dev->keycode = spec->alc_mute_keycode_map;
4356         for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++)
4357                 set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit);
4358
4359         if (input_register_device(spec->kb_dev)) {
4360                 codec_err(codec, "input_register_device failed\n");
4361                 input_free_device(spec->kb_dev);
4362                 spec->kb_dev = NULL;
4363                 return -ENOMEM;
4364         }
4365
4366         return 0;
4367 }
4368
4369 /* GPIO1 = set according to SKU external amp
4370  * GPIO2 = mic mute hotkey
4371  * GPIO3 = mute LED
4372  * GPIO4 = mic mute LED
4373  */
4374 static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
4375                                              const struct hda_fixup *fix, int action)
4376 {
4377         struct alc_spec *spec = codec->spec;
4378
4379         alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
4380         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4381                 spec->init_amp = ALC_INIT_DEFAULT;
4382                 if (alc_register_micmute_input_device(codec) != 0)
4383                         return;
4384
4385                 spec->gpio_mask |= 0x06;
4386                 spec->gpio_dir |= 0x02;
4387                 spec->gpio_data |= 0x02;
4388                 snd_hda_codec_write_cache(codec, codec->core.afg, 0,
4389                                           AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x04);
4390                 snd_hda_jack_detect_enable_callback(codec, codec->core.afg,
4391                                                     gpio2_mic_hotkey_event);
4392                 return;
4393         }
4394
4395         if (!spec->kb_dev)
4396                 return;
4397
4398         switch (action) {
4399         case HDA_FIXUP_ACT_FREE:
4400                 input_unregister_device(spec->kb_dev);
4401                 spec->kb_dev = NULL;
4402         }
4403 }
4404
4405 /* Line2 = mic mute hotkey
4406  * GPIO2 = mic mute LED
4407  */
4408 static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,
4409                                              const struct hda_fixup *fix, int action)
4410 {
4411         struct alc_spec *spec = codec->spec;
4412
4413         alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4414         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4415                 spec->init_amp = ALC_INIT_DEFAULT;
4416                 if (alc_register_micmute_input_device(codec) != 0)
4417                         return;
4418
4419                 snd_hda_jack_detect_enable_callback(codec, 0x1b,
4420                                                     gpio2_mic_hotkey_event);
4421                 return;
4422         }
4423
4424         if (!spec->kb_dev)
4425                 return;
4426
4427         switch (action) {
4428         case HDA_FIXUP_ACT_FREE:
4429                 input_unregister_device(spec->kb_dev);
4430                 spec->kb_dev = NULL;
4431         }
4432 }
4433 #else /* INPUT */
4434 #define alc280_fixup_hp_gpio2_mic_hotkey        NULL
4435 #define alc233_fixup_lenovo_line2_mic_hotkey    NULL
4436 #endif /* INPUT */
4437
4438 static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,
4439                                 const struct hda_fixup *fix, int action)
4440 {
4441         struct alc_spec *spec = codec->spec;
4442
4443         alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1a);
4444         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4445                 spec->cap_mute_led_nid = 0x18;
4446                 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4447         }
4448 }
4449
4450 static const struct coef_fw alc225_pre_hsmode[] = {
4451         UPDATE_COEF(0x4a, 1<<8, 0),
4452         UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
4453         UPDATE_COEF(0x63, 3<<14, 3<<14),
4454         UPDATE_COEF(0x4a, 3<<4, 2<<4),
4455         UPDATE_COEF(0x4a, 3<<10, 3<<10),
4456         UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10),
4457         UPDATE_COEF(0x4a, 3<<10, 0),
4458         {}
4459 };
4460
4461 static void alc_headset_mode_unplugged(struct hda_codec *codec)
4462 {
4463         static const struct coef_fw coef0255[] = {
4464                 WRITE_COEF(0x1b, 0x0c0b), /* LDO and MISC control */
4465                 WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4466                 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4467                 WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4468                 WRITE_COEFEX(0x57, 0x03, 0x8aa6), /* Direct Drive HP Amp control */
4469                 {}
4470         };
4471         static const struct coef_fw coef0256[] = {
4472                 WRITE_COEF(0x1b, 0x0c4b), /* LDO and MISC control */
4473                 WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4474                 WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4475                 WRITE_COEFEX(0x57, 0x03, 0x09a3), /* Direct Drive HP Amp control */
4476                 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4477                 {}
4478         };
4479         static const struct coef_fw coef0233[] = {
4480                 WRITE_COEF(0x1b, 0x0c0b),
4481                 WRITE_COEF(0x45, 0xc429),
4482                 UPDATE_COEF(0x35, 0x4000, 0),
4483                 WRITE_COEF(0x06, 0x2104),
4484                 WRITE_COEF(0x1a, 0x0001),
4485                 WRITE_COEF(0x26, 0x0004),
4486                 WRITE_COEF(0x32, 0x42a3),
4487                 {}
4488         };
4489         static const struct coef_fw coef0288[] = {
4490                 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
4491                 UPDATE_COEF(0x50, 0x2000, 0x2000),
4492                 UPDATE_COEF(0x56, 0x0006, 0x0006),
4493                 UPDATE_COEF(0x66, 0x0008, 0),
4494                 UPDATE_COEF(0x67, 0x2000, 0),
4495                 {}
4496         };
4497         static const struct coef_fw coef0298[] = {
4498                 UPDATE_COEF(0x19, 0x1300, 0x0300),
4499                 {}
4500         };
4501         static const struct coef_fw coef0292[] = {
4502                 WRITE_COEF(0x76, 0x000e),
4503                 WRITE_COEF(0x6c, 0x2400),
4504                 WRITE_COEF(0x18, 0x7308),
4505                 WRITE_COEF(0x6b, 0xc429),
4506                 {}
4507         };
4508         static const struct coef_fw coef0293[] = {
4509                 UPDATE_COEF(0x10, 7<<8, 6<<8), /* SET Line1 JD to 0 */
4510                 UPDATE_COEFEX(0x57, 0x05, 1<<15|1<<13, 0x0), /* SET charge pump by verb */
4511                 UPDATE_COEFEX(0x57, 0x03, 1<<10, 1<<10), /* SET EN_OSW to 1 */
4512                 UPDATE_COEF(0x1a, 1<<3, 1<<3), /* Combo JD gating with LINE1-VREFO */
4513                 WRITE_COEF(0x45, 0xc429), /* Set to TRS type */
4514                 UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
4515                 {}
4516         };
4517         static const struct coef_fw coef0668[] = {
4518                 WRITE_COEF(0x15, 0x0d40),
4519                 WRITE_COEF(0xb7, 0x802b),
4520                 {}
4521         };
4522         static const struct coef_fw coef0225[] = {
4523                 UPDATE_COEF(0x63, 3<<14, 0),
4524                 {}
4525         };
4526         static const struct coef_fw coef0274[] = {
4527                 UPDATE_COEF(0x4a, 0x0100, 0),
4528                 UPDATE_COEFEX(0x57, 0x05, 0x4000, 0),
4529                 UPDATE_COEF(0x6b, 0xf000, 0x5000),
4530                 UPDATE_COEF(0x4a, 0x0010, 0),
4531                 UPDATE_COEF(0x4a, 0x0c00, 0x0c00),
4532                 WRITE_COEF(0x45, 0x5289),
4533                 UPDATE_COEF(0x4a, 0x0c00, 0),
4534                 {}
4535         };
4536
4537         switch (codec->core.vendor_id) {
4538         case 0x10ec0255:
4539                 alc_process_coef_fw(codec, coef0255);
4540                 break;
4541         case 0x10ec0236:
4542         case 0x10ec0256:
4543                 alc_process_coef_fw(codec, coef0256);
4544                 break;
4545         case 0x10ec0234:
4546         case 0x10ec0274:
4547         case 0x10ec0294:
4548                 alc_process_coef_fw(codec, coef0274);
4549                 break;
4550         case 0x10ec0233:
4551         case 0x10ec0283:
4552                 alc_process_coef_fw(codec, coef0233);
4553                 break;
4554         case 0x10ec0286:
4555         case 0x10ec0288:
4556                 alc_process_coef_fw(codec, coef0288);
4557                 break;
4558         case 0x10ec0298:
4559                 alc_process_coef_fw(codec, coef0298);
4560                 alc_process_coef_fw(codec, coef0288);
4561                 break;
4562         case 0x10ec0292:
4563                 alc_process_coef_fw(codec, coef0292);
4564                 break;
4565         case 0x10ec0293:
4566                 alc_process_coef_fw(codec, coef0293);
4567                 break;
4568         case 0x10ec0668:
4569                 alc_process_coef_fw(codec, coef0668);
4570                 break;
4571         case 0x10ec0215:
4572         case 0x10ec0225:
4573         case 0x10ec0285:
4574         case 0x10ec0295:
4575         case 0x10ec0289:
4576         case 0x10ec0299:
4577                 alc_process_coef_fw(codec, alc225_pre_hsmode);
4578                 alc_process_coef_fw(codec, coef0225);
4579                 break;
4580         case 0x10ec0867:
4581                 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
4582                 break;
4583         }
4584         codec_dbg(codec, "Headset jack set to unplugged mode.\n");
4585 }
4586
4587
4588 static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
4589                                     hda_nid_t mic_pin)
4590 {
4591         static const struct coef_fw coef0255[] = {
4592                 WRITE_COEFEX(0x57, 0x03, 0x8aa6),
4593                 WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
4594                 {}
4595         };
4596         static const struct coef_fw coef0256[] = {
4597                 UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14), /* Direct Drive HP Amp control(Set to verb control)*/
4598                 WRITE_COEFEX(0x57, 0x03, 0x09a3),
4599                 WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
4600                 {}
4601         };
4602         static const struct coef_fw coef0233[] = {
4603                 UPDATE_COEF(0x35, 0, 1<<14),
4604                 WRITE_COEF(0x06, 0x2100),
4605                 WRITE_COEF(0x1a, 0x0021),
4606                 WRITE_COEF(0x26, 0x008c),
4607                 {}
4608         };
4609         static const struct coef_fw coef0288[] = {
4610                 UPDATE_COEF(0x4f, 0x00c0, 0),
4611                 UPDATE_COEF(0x50, 0x2000, 0),
4612                 UPDATE_COEF(0x56, 0x0006, 0),
4613                 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
4614                 UPDATE_COEF(0x66, 0x0008, 0x0008),
4615                 UPDATE_COEF(0x67, 0x2000, 0x2000),
4616                 {}
4617         };
4618         static const struct coef_fw coef0292[] = {
4619                 WRITE_COEF(0x19, 0xa208),
4620                 WRITE_COEF(0x2e, 0xacf0),
4621                 {}
4622         };
4623         static const struct coef_fw coef0293[] = {
4624                 UPDATE_COEFEX(0x57, 0x05, 0, 1<<15|1<<13), /* SET charge pump by verb */
4625                 UPDATE_COEFEX(0x57, 0x03, 1<<10, 0), /* SET EN_OSW to 0 */
4626                 UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
4627                 {}
4628         };
4629         static const struct coef_fw coef0688[] = {
4630                 WRITE_COEF(0xb7, 0x802b),
4631                 WRITE_COEF(0xb5, 0x1040),
4632                 UPDATE_COEF(0xc3, 0, 1<<12),
4633                 {}
4634         };
4635         static const struct coef_fw coef0225[] = {
4636                 UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14),
4637                 UPDATE_COEF(0x4a, 3<<4, 2<<4),
4638                 UPDATE_COEF(0x63, 3<<14, 0),
4639                 {}
4640         };
4641         static const struct coef_fw coef0274[] = {
4642                 UPDATE_COEFEX(0x57, 0x05, 0x4000, 0x4000),
4643                 UPDATE_COEF(0x4a, 0x0010, 0),
4644                 UPDATE_COEF(0x6b, 0xf000, 0),
4645                 {}
4646         };
4647
4648         switch (codec->core.vendor_id) {
4649         case 0x10ec0255:
4650                 alc_write_coef_idx(codec, 0x45, 0xc489);
4651                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4652                 alc_process_coef_fw(codec, coef0255);
4653                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4654                 break;
4655         case 0x10ec0236:
4656         case 0x10ec0256:
4657                 alc_write_coef_idx(codec, 0x45, 0xc489);
4658                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4659                 alc_process_coef_fw(codec, coef0256);
4660                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4661                 break;
4662         case 0x10ec0234:
4663         case 0x10ec0274:
4664         case 0x10ec0294:
4665                 alc_write_coef_idx(codec, 0x45, 0x4689);
4666                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4667                 alc_process_coef_fw(codec, coef0274);
4668                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4669                 break;
4670         case 0x10ec0233:
4671         case 0x10ec0283:
4672                 alc_write_coef_idx(codec, 0x45, 0xc429);
4673                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4674                 alc_process_coef_fw(codec, coef0233);
4675                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4676                 break;
4677         case 0x10ec0286:
4678         case 0x10ec0288:
4679         case 0x10ec0298:
4680                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4681                 alc_process_coef_fw(codec, coef0288);
4682                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4683                 break;
4684         case 0x10ec0292:
4685                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4686                 alc_process_coef_fw(codec, coef0292);
4687                 break;
4688         case 0x10ec0293:
4689                 /* Set to TRS mode */
4690                 alc_write_coef_idx(codec, 0x45, 0xc429);
4691                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4692                 alc_process_coef_fw(codec, coef0293);
4693                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4694                 break;
4695         case 0x10ec0867:
4696                 alc_update_coefex_idx(codec, 0x57, 0x5, 0, 1<<14);
4697                 fallthrough;
4698         case 0x10ec0221:
4699         case 0x10ec0662:
4700                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4701                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4702                 break;
4703         case 0x10ec0668:
4704                 alc_write_coef_idx(codec, 0x11, 0x0001);
4705                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4706                 alc_process_coef_fw(codec, coef0688);
4707                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4708                 break;
4709         case 0x10ec0215:
4710         case 0x10ec0225:
4711         case 0x10ec0285:
4712         case 0x10ec0295:
4713         case 0x10ec0289:
4714         case 0x10ec0299:
4715                 alc_process_coef_fw(codec, alc225_pre_hsmode);
4716                 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x31<<10);
4717                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
4718                 alc_process_coef_fw(codec, coef0225);
4719                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
4720                 break;
4721         }
4722         codec_dbg(codec, "Headset jack set to mic-in mode.\n");
4723 }
4724
4725 static void alc_headset_mode_default(struct hda_codec *codec)
4726 {
4727         static const struct coef_fw coef0225[] = {
4728                 UPDATE_COEF(0x45, 0x3f<<10, 0x30<<10),
4729                 UPDATE_COEF(0x45, 0x3f<<10, 0x31<<10),
4730                 UPDATE_COEF(0x49, 3<<8, 0<<8),
4731                 UPDATE_COEF(0x4a, 3<<4, 3<<4),
4732                 UPDATE_COEF(0x63, 3<<14, 0),
4733                 UPDATE_COEF(0x67, 0xf000, 0x3000),
4734                 {}
4735         };
4736         static const struct coef_fw coef0255[] = {
4737                 WRITE_COEF(0x45, 0xc089),
4738                 WRITE_COEF(0x45, 0xc489),
4739                 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
4740                 WRITE_COEF(0x49, 0x0049),
4741                 {}
4742         };
4743         static const struct coef_fw coef0256[] = {
4744                 WRITE_COEF(0x45, 0xc489),
4745                 WRITE_COEFEX(0x57, 0x03, 0x0da3),
4746                 WRITE_COEF(0x49, 0x0049),
4747                 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4748                 WRITE_COEF(0x06, 0x6100),
4749                 {}
4750         };
4751         static const struct coef_fw coef0233[] = {
4752                 WRITE_COEF(0x06, 0x2100),
4753                 WRITE_COEF(0x32, 0x4ea3),
4754                 {}
4755         };
4756         static const struct coef_fw coef0288[] = {
4757                 UPDATE_COEF(0x4f, 0xfcc0, 0xc400), /* Set to TRS type */
4758                 UPDATE_COEF(0x50, 0x2000, 0x2000),
4759                 UPDATE_COEF(0x56, 0x0006, 0x0006),
4760                 UPDATE_COEF(0x66, 0x0008, 0),
4761                 UPDATE_COEF(0x67, 0x2000, 0),
4762                 {}
4763         };
4764         static const struct coef_fw coef0292[] = {
4765                 WRITE_COEF(0x76, 0x000e),
4766                 WRITE_COEF(0x6c, 0x2400),
4767                 WRITE_COEF(0x6b, 0xc429),
4768                 WRITE_COEF(0x18, 0x7308),
4769                 {}
4770         };
4771         static const struct coef_fw coef0293[] = {
4772                 UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
4773                 WRITE_COEF(0x45, 0xC429), /* Set to TRS type */
4774                 UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
4775                 {}
4776         };
4777         static const struct coef_fw coef0688[] = {
4778                 WRITE_COEF(0x11, 0x0041),
4779                 WRITE_COEF(0x15, 0x0d40),
4780                 WRITE_COEF(0xb7, 0x802b),
4781                 {}
4782         };
4783         static const struct coef_fw coef0274[] = {
4784                 WRITE_COEF(0x45, 0x4289),
4785                 UPDATE_COEF(0x4a, 0x0010, 0x0010),
4786                 UPDATE_COEF(0x6b, 0x0f00, 0),
4787                 UPDATE_COEF(0x49, 0x0300, 0x0300),
4788                 {}
4789         };
4790
4791         switch (codec->core.vendor_id) {
4792         case 0x10ec0215:
4793         case 0x10ec0225:
4794         case 0x10ec0285:
4795         case 0x10ec0295:
4796         case 0x10ec0289:
4797         case 0x10ec0299:
4798                 alc_process_coef_fw(codec, alc225_pre_hsmode);
4799                 alc_process_coef_fw(codec, coef0225);
4800                 break;
4801         case 0x10ec0255:
4802                 alc_process_coef_fw(codec, coef0255);
4803                 break;
4804         case 0x10ec0236:
4805         case 0x10ec0256:
4806                 alc_write_coef_idx(codec, 0x1b, 0x0e4b);
4807                 alc_write_coef_idx(codec, 0x45, 0xc089);
4808                 msleep(50);
4809                 alc_process_coef_fw(codec, coef0256);
4810                 break;
4811         case 0x10ec0234:
4812         case 0x10ec0274:
4813         case 0x10ec0294:
4814                 alc_process_coef_fw(codec, coef0274);
4815                 break;
4816         case 0x10ec0233:
4817         case 0x10ec0283:
4818                 alc_process_coef_fw(codec, coef0233);
4819                 break;
4820         case 0x10ec0286:
4821         case 0x10ec0288:
4822         case 0x10ec0298:
4823                 alc_process_coef_fw(codec, coef0288);
4824                 break;
4825         case 0x10ec0292:
4826                 alc_process_coef_fw(codec, coef0292);
4827                 break;
4828         case 0x10ec0293:
4829                 alc_process_coef_fw(codec, coef0293);
4830                 break;
4831         case 0x10ec0668:
4832                 alc_process_coef_fw(codec, coef0688);
4833                 break;
4834         case 0x10ec0867:
4835                 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
4836                 break;
4837         }
4838         codec_dbg(codec, "Headset jack set to headphone (default) mode.\n");
4839 }
4840
4841 /* Iphone type */
4842 static void alc_headset_mode_ctia(struct hda_codec *codec)
4843 {
4844         int val;
4845
4846         static const struct coef_fw coef0255[] = {
4847                 WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
4848                 WRITE_COEF(0x1b, 0x0c2b),
4849                 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
4850                 {}
4851         };
4852         static const struct coef_fw coef0256[] = {
4853                 WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
4854                 WRITE_COEF(0x1b, 0x0e6b),
4855                 {}
4856         };
4857         static const struct coef_fw coef0233[] = {
4858                 WRITE_COEF(0x45, 0xd429),
4859                 WRITE_COEF(0x1b, 0x0c2b),
4860                 WRITE_COEF(0x32, 0x4ea3),
4861                 {}
4862         };
4863         static const struct coef_fw coef0288[] = {
4864                 UPDATE_COEF(0x50, 0x2000, 0x2000),
4865                 UPDATE_COEF(0x56, 0x0006, 0x0006),
4866                 UPDATE_COEF(0x66, 0x0008, 0),
4867                 UPDATE_COEF(0x67, 0x2000, 0),
4868                 {}
4869         };
4870         static const struct coef_fw coef0292[] = {
4871                 WRITE_COEF(0x6b, 0xd429),
4872                 WRITE_COEF(0x76, 0x0008),
4873                 WRITE_COEF(0x18, 0x7388),
4874                 {}
4875         };
4876         static const struct coef_fw coef0293[] = {
4877                 WRITE_COEF(0x45, 0xd429), /* Set to ctia type */
4878                 UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
4879                 {}
4880         };
4881         static const struct coef_fw coef0688[] = {
4882                 WRITE_COEF(0x11, 0x0001),
4883                 WRITE_COEF(0x15, 0x0d60),
4884                 WRITE_COEF(0xc3, 0x0000),
4885                 {}
4886         };
4887         static const struct coef_fw coef0225_1[] = {
4888                 UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
4889                 UPDATE_COEF(0x63, 3<<14, 2<<14),
4890                 {}
4891         };
4892         static const struct coef_fw coef0225_2[] = {
4893                 UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
4894                 UPDATE_COEF(0x63, 3<<14, 1<<14),
4895                 {}
4896         };
4897
4898         switch (codec->core.vendor_id) {
4899         case 0x10ec0255:
4900                 alc_process_coef_fw(codec, coef0255);
4901                 break;
4902         case 0x10ec0236:
4903         case 0x10ec0256:
4904                 alc_process_coef_fw(codec, coef0256);
4905                 break;
4906         case 0x10ec0234:
4907         case 0x10ec0274:
4908         case 0x10ec0294:
4909                 alc_write_coef_idx(codec, 0x45, 0xd689);
4910                 break;
4911         case 0x10ec0233:
4912         case 0x10ec0283:
4913                 alc_process_coef_fw(codec, coef0233);
4914                 break;
4915         case 0x10ec0298:
4916                 val = alc_read_coef_idx(codec, 0x50);
4917                 if (val & (1 << 12)) {
4918                         alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
4919                         alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
4920                         msleep(300);
4921                 } else {
4922                         alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
4923                         alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
4924                         msleep(300);
4925                 }
4926                 break;
4927         case 0x10ec0286:
4928         case 0x10ec0288:
4929                 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
4930                 msleep(300);
4931                 alc_process_coef_fw(codec, coef0288);
4932                 break;
4933         case 0x10ec0292:
4934                 alc_process_coef_fw(codec, coef0292);
4935                 break;
4936         case 0x10ec0293:
4937                 alc_process_coef_fw(codec, coef0293);
4938                 break;
4939         case 0x10ec0668:
4940                 alc_process_coef_fw(codec, coef0688);
4941                 break;
4942         case 0x10ec0215:
4943         case 0x10ec0225:
4944         case 0x10ec0285:
4945         case 0x10ec0295:
4946         case 0x10ec0289:
4947         case 0x10ec0299:
4948                 val = alc_read_coef_idx(codec, 0x45);
4949                 if (val & (1 << 9))
4950                         alc_process_coef_fw(codec, coef0225_2);
4951                 else
4952                         alc_process_coef_fw(codec, coef0225_1);
4953                 break;
4954         case 0x10ec0867:
4955                 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
4956                 break;
4957         }
4958         codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n");
4959 }
4960
4961 /* Nokia type */
4962 static void alc_headset_mode_omtp(struct hda_codec *codec)
4963 {
4964         static const struct coef_fw coef0255[] = {
4965                 WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
4966                 WRITE_COEF(0x1b, 0x0c2b),
4967                 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
4968                 {}
4969         };
4970         static const struct coef_fw coef0256[] = {
4971                 WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
4972                 WRITE_COEF(0x1b, 0x0e6b),
4973                 {}
4974         };
4975         static const struct coef_fw coef0233[] = {
4976                 WRITE_COEF(0x45, 0xe429),
4977                 WRITE_COEF(0x1b, 0x0c2b),
4978                 WRITE_COEF(0x32, 0x4ea3),
4979                 {}
4980         };
4981         static const struct coef_fw coef0288[] = {
4982                 UPDATE_COEF(0x50, 0x2000, 0x2000),
4983                 UPDATE_COEF(0x56, 0x0006, 0x0006),
4984                 UPDATE_COEF(0x66, 0x0008, 0),
4985                 UPDATE_COEF(0x67, 0x2000, 0),
4986                 {}
4987         };
4988         static const struct coef_fw coef0292[] = {
4989                 WRITE_COEF(0x6b, 0xe429),
4990                 WRITE_COEF(0x76, 0x0008),
4991                 WRITE_COEF(0x18, 0x7388),
4992                 {}
4993         };
4994         static const struct coef_fw coef0293[] = {
4995                 WRITE_COEF(0x45, 0xe429), /* Set to omtp type */
4996                 UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
4997                 {}
4998         };
4999         static const struct coef_fw coef0688[] = {
5000                 WRITE_COEF(0x11, 0x0001),
5001                 WRITE_COEF(0x15, 0x0d50),
5002                 WRITE_COEF(0xc3, 0x0000),
5003                 {}
5004         };
5005         static const struct coef_fw coef0225[] = {
5006                 UPDATE_COEF(0x45, 0x3f<<10, 0x39<<10),
5007                 UPDATE_COEF(0x63, 3<<14, 2<<14),
5008                 {}
5009         };
5010
5011         switch (codec->core.vendor_id) {
5012         case 0x10ec0255:
5013                 alc_process_coef_fw(codec, coef0255);
5014                 break;
5015         case 0x10ec0236:
5016         case 0x10ec0256:
5017                 alc_process_coef_fw(codec, coef0256);
5018                 break;
5019         case 0x10ec0234:
5020         case 0x10ec0274:
5021         case 0x10ec0294:
5022                 alc_write_coef_idx(codec, 0x45, 0xe689);
5023                 break;
5024         case 0x10ec0233:
5025         case 0x10ec0283:
5026                 alc_process_coef_fw(codec, coef0233);
5027                 break;
5028         case 0x10ec0298:
5029                 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);/* Headset output enable */
5030                 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5031                 msleep(300);
5032                 break;
5033         case 0x10ec0286:
5034         case 0x10ec0288:
5035                 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5036                 msleep(300);
5037                 alc_process_coef_fw(codec, coef0288);
5038                 break;
5039         case 0x10ec0292:
5040                 alc_process_coef_fw(codec, coef0292);
5041                 break;
5042         case 0x10ec0293:
5043                 alc_process_coef_fw(codec, coef0293);
5044                 break;
5045         case 0x10ec0668:
5046                 alc_process_coef_fw(codec, coef0688);
5047                 break;
5048         case 0x10ec0215:
5049         case 0x10ec0225:
5050         case 0x10ec0285:
5051         case 0x10ec0295:
5052         case 0x10ec0289:
5053         case 0x10ec0299:
5054                 alc_process_coef_fw(codec, coef0225);
5055                 break;
5056         }
5057         codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n");
5058 }
5059
5060 static void alc_determine_headset_type(struct hda_codec *codec)
5061 {
5062         int val;
5063         bool is_ctia = false;
5064         struct alc_spec *spec = codec->spec;
5065         static const struct coef_fw coef0255[] = {
5066                 WRITE_COEF(0x45, 0xd089), /* combo jack auto switch control(Check type)*/
5067                 WRITE_COEF(0x49, 0x0149), /* combo jack auto switch control(Vref
5068  conteol) */
5069                 {}
5070         };
5071         static const struct coef_fw coef0288[] = {
5072                 UPDATE_COEF(0x4f, 0xfcc0, 0xd400), /* Check Type */
5073                 {}
5074         };
5075         static const struct coef_fw coef0298[] = {
5076                 UPDATE_COEF(0x50, 0x2000, 0x2000),
5077                 UPDATE_COEF(0x56, 0x0006, 0x0006),
5078                 UPDATE_COEF(0x66, 0x0008, 0),
5079                 UPDATE_COEF(0x67, 0x2000, 0),
5080                 UPDATE_COEF(0x19, 0x1300, 0x1300),
5081                 {}
5082         };
5083         static const struct coef_fw coef0293[] = {
5084                 UPDATE_COEF(0x4a, 0x000f, 0x0008), /* Combo Jack auto detect */
5085                 WRITE_COEF(0x45, 0xD429), /* Set to ctia type */
5086                 {}
5087         };
5088         static const struct coef_fw coef0688[] = {
5089                 WRITE_COEF(0x11, 0x0001),
5090                 WRITE_COEF(0xb7, 0x802b),
5091                 WRITE_COEF(0x15, 0x0d60),
5092                 WRITE_COEF(0xc3, 0x0c00),
5093                 {}
5094         };
5095         static const struct coef_fw coef0274[] = {
5096                 UPDATE_COEF(0x4a, 0x0010, 0),
5097                 UPDATE_COEF(0x4a, 0x8000, 0),
5098                 WRITE_COEF(0x45, 0xd289),
5099                 UPDATE_COEF(0x49, 0x0300, 0x0300),
5100                 {}
5101         };
5102
5103         switch (codec->core.vendor_id) {
5104         case 0x10ec0255:
5105                 alc_process_coef_fw(codec, coef0255);
5106                 msleep(300);
5107                 val = alc_read_coef_idx(codec, 0x46);
5108                 is_ctia = (val & 0x0070) == 0x0070;
5109                 break;
5110         case 0x10ec0236:
5111         case 0x10ec0256:
5112                 alc_write_coef_idx(codec, 0x1b, 0x0e4b);
5113                 alc_write_coef_idx(codec, 0x06, 0x6104);
5114                 alc_write_coefex_idx(codec, 0x57, 0x3, 0x09a3);
5115
5116                 snd_hda_codec_write(codec, 0x21, 0,
5117                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5118                 msleep(80);
5119                 snd_hda_codec_write(codec, 0x21, 0,
5120                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5121
5122                 alc_process_coef_fw(codec, coef0255);
5123                 msleep(300);
5124                 val = alc_read_coef_idx(codec, 0x46);
5125                 is_ctia = (val & 0x0070) == 0x0070;
5126
5127                 alc_write_coefex_idx(codec, 0x57, 0x3, 0x0da3);
5128                 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5129
5130                 snd_hda_codec_write(codec, 0x21, 0,
5131                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5132                 msleep(80);
5133                 snd_hda_codec_write(codec, 0x21, 0,
5134                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5135                 break;
5136         case 0x10ec0234:
5137         case 0x10ec0274:
5138         case 0x10ec0294:
5139                 alc_process_coef_fw(codec, coef0274);
5140                 msleep(80);
5141                 val = alc_read_coef_idx(codec, 0x46);
5142                 is_ctia = (val & 0x00f0) == 0x00f0;
5143                 break;
5144         case 0x10ec0233:
5145         case 0x10ec0283:
5146                 alc_write_coef_idx(codec, 0x45, 0xd029);
5147                 msleep(300);
5148                 val = alc_read_coef_idx(codec, 0x46);
5149                 is_ctia = (val & 0x0070) == 0x0070;
5150                 break;
5151         case 0x10ec0298:
5152                 snd_hda_codec_write(codec, 0x21, 0,
5153                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5154                 msleep(100);
5155                 snd_hda_codec_write(codec, 0x21, 0,
5156                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5157                 msleep(200);
5158
5159                 val = alc_read_coef_idx(codec, 0x50);
5160                 if (val & (1 << 12)) {
5161                         alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
5162                         alc_process_coef_fw(codec, coef0288);
5163                         msleep(350);
5164                         val = alc_read_coef_idx(codec, 0x50);
5165                         is_ctia = (val & 0x0070) == 0x0070;
5166                 } else {
5167                         alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5168                         alc_process_coef_fw(codec, coef0288);
5169                         msleep(350);
5170                         val = alc_read_coef_idx(codec, 0x50);
5171                         is_ctia = (val & 0x0070) == 0x0070;
5172                 }
5173                 alc_process_coef_fw(codec, coef0298);
5174                 snd_hda_codec_write(codec, 0x21, 0,
5175                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
5176                 msleep(75);
5177                 snd_hda_codec_write(codec, 0x21, 0,
5178                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5179                 break;
5180         case 0x10ec0286:
5181         case 0x10ec0288:
5182                 alc_process_coef_fw(codec, coef0288);
5183                 msleep(350);
5184                 val = alc_read_coef_idx(codec, 0x50);
5185                 is_ctia = (val & 0x0070) == 0x0070;
5186                 break;
5187         case 0x10ec0292:
5188                 alc_write_coef_idx(codec, 0x6b, 0xd429);
5189                 msleep(300);
5190                 val = alc_read_coef_idx(codec, 0x6c);
5191                 is_ctia = (val & 0x001c) == 0x001c;
5192                 break;
5193         case 0x10ec0293:
5194                 alc_process_coef_fw(codec, coef0293);
5195                 msleep(300);
5196                 val = alc_read_coef_idx(codec, 0x46);
5197                 is_ctia = (val & 0x0070) == 0x0070;
5198                 break;
5199         case 0x10ec0668:
5200                 alc_process_coef_fw(codec, coef0688);
5201                 msleep(300);
5202                 val = alc_read_coef_idx(codec, 0xbe);
5203                 is_ctia = (val & 0x1c02) == 0x1c02;
5204                 break;
5205         case 0x10ec0215:
5206         case 0x10ec0225:
5207         case 0x10ec0285:
5208         case 0x10ec0295:
5209         case 0x10ec0289:
5210         case 0x10ec0299:
5211                 snd_hda_codec_write(codec, 0x21, 0,
5212                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5213                 msleep(80);
5214                 snd_hda_codec_write(codec, 0x21, 0,
5215                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5216
5217                 alc_process_coef_fw(codec, alc225_pre_hsmode);
5218                 alc_update_coef_idx(codec, 0x67, 0xf000, 0x1000);
5219                 val = alc_read_coef_idx(codec, 0x45);
5220                 if (val & (1 << 9)) {
5221                         alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5222                         alc_update_coef_idx(codec, 0x49, 3<<8, 2<<8);
5223                         msleep(800);
5224                         val = alc_read_coef_idx(codec, 0x46);
5225                         is_ctia = (val & 0x00f0) == 0x00f0;
5226                 } else {
5227                         alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5228                         alc_update_coef_idx(codec, 0x49, 3<<8, 1<<8);
5229                         msleep(800);
5230                         val = alc_read_coef_idx(codec, 0x46);
5231                         is_ctia = (val & 0x00f0) == 0x00f0;
5232                 }
5233                 alc_update_coef_idx(codec, 0x4a, 7<<6, 7<<6);
5234                 alc_update_coef_idx(codec, 0x4a, 3<<4, 3<<4);
5235                 alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
5236
5237                 snd_hda_codec_write(codec, 0x21, 0,
5238                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5239                 msleep(80);
5240                 snd_hda_codec_write(codec, 0x21, 0,
5241                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5242                 break;
5243         case 0x10ec0867:
5244                 is_ctia = true;
5245                 break;
5246         }
5247
5248         codec_dbg(codec, "Headset jack detected iPhone-style headset: %s\n",
5249                     is_ctia ? "yes" : "no");
5250         spec->current_headset_type = is_ctia ? ALC_HEADSET_TYPE_CTIA : ALC_HEADSET_TYPE_OMTP;
5251 }
5252
5253 static void alc_update_headset_mode(struct hda_codec *codec)
5254 {
5255         struct alc_spec *spec = codec->spec;
5256
5257         hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]];
5258         hda_nid_t hp_pin = alc_get_hp_pin(spec);
5259
5260         int new_headset_mode;
5261
5262         if (!snd_hda_jack_detect(codec, hp_pin))
5263                 new_headset_mode = ALC_HEADSET_MODE_UNPLUGGED;
5264         else if (mux_pin == spec->headset_mic_pin)
5265                 new_headset_mode = ALC_HEADSET_MODE_HEADSET;
5266         else if (mux_pin == spec->headphone_mic_pin)
5267                 new_headset_mode = ALC_HEADSET_MODE_MIC;
5268         else
5269                 new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;
5270
5271         if (new_headset_mode == spec->current_headset_mode) {
5272                 snd_hda_gen_update_outputs(codec);
5273                 return;
5274         }
5275
5276         switch (new_headset_mode) {
5277         case ALC_HEADSET_MODE_UNPLUGGED:
5278                 alc_headset_mode_unplugged(codec);
5279                 spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5280                 spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5281                 spec->gen.hp_jack_present = false;
5282                 break;
5283         case ALC_HEADSET_MODE_HEADSET:
5284                 if (spec->current_headset_type == ALC_HEADSET_TYPE_UNKNOWN)
5285                         alc_determine_headset_type(codec);
5286                 if (spec->current_headset_type == ALC_HEADSET_TYPE_CTIA)
5287                         alc_headset_mode_ctia(codec);
5288                 else if (spec->current_headset_type == ALC_HEADSET_TYPE_OMTP)
5289                         alc_headset_mode_omtp(codec);
5290                 spec->gen.hp_jack_present = true;
5291                 break;
5292         case ALC_HEADSET_MODE_MIC:
5293                 alc_headset_mode_mic_in(codec, hp_pin, spec->headphone_mic_pin);
5294                 spec->gen.hp_jack_present = false;
5295                 break;
5296         case ALC_HEADSET_MODE_HEADPHONE:
5297                 alc_headset_mode_default(codec);
5298                 spec->gen.hp_jack_present = true;
5299                 break;
5300         }
5301         if (new_headset_mode != ALC_HEADSET_MODE_MIC) {
5302                 snd_hda_set_pin_ctl_cache(codec, hp_pin,
5303                                           AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
5304                 if (spec->headphone_mic_pin && spec->headphone_mic_pin != hp_pin)
5305                         snd_hda_set_pin_ctl_cache(codec, spec->headphone_mic_pin,
5306                                                   PIN_VREFHIZ);
5307         }
5308         spec->current_headset_mode = new_headset_mode;
5309
5310         snd_hda_gen_update_outputs(codec);
5311 }
5312
5313 static void alc_update_headset_mode_hook(struct hda_codec *codec,
5314                                          struct snd_kcontrol *kcontrol,
5315                                          struct snd_ctl_elem_value *ucontrol)
5316 {
5317         alc_update_headset_mode(codec);
5318 }
5319
5320 static void alc_update_headset_jack_cb(struct hda_codec *codec,
5321                                        struct hda_jack_callback *jack)
5322 {
5323         snd_hda_gen_hp_automute(codec, jack);
5324 }
5325
5326 static void alc_probe_headset_mode(struct hda_codec *codec)
5327 {
5328         int i;
5329         struct alc_spec *spec = codec->spec;
5330         struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5331
5332         /* Find mic pins */
5333         for (i = 0; i < cfg->num_inputs; i++) {
5334                 if (cfg->inputs[i].is_headset_mic && !spec->headset_mic_pin)
5335                         spec->headset_mic_pin = cfg->inputs[i].pin;
5336                 if (cfg->inputs[i].is_headphone_mic && !spec->headphone_mic_pin)
5337                         spec->headphone_mic_pin = cfg->inputs[i].pin;
5338         }
5339
5340         WARN_ON(spec->gen.cap_sync_hook);
5341         spec->gen.cap_sync_hook = alc_update_headset_mode_hook;
5342         spec->gen.automute_hook = alc_update_headset_mode;
5343         spec->gen.hp_automute_hook = alc_update_headset_jack_cb;
5344 }
5345
5346 static void alc_fixup_headset_mode(struct hda_codec *codec,
5347                                 const struct hda_fixup *fix, int action)
5348 {
5349         struct alc_spec *spec = codec->spec;
5350
5351         switch (action) {
5352         case HDA_FIXUP_ACT_PRE_PROBE:
5353                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC | HDA_PINCFG_HEADPHONE_MIC;
5354                 break;
5355         case HDA_FIXUP_ACT_PROBE:
5356                 alc_probe_headset_mode(codec);
5357                 break;
5358         case HDA_FIXUP_ACT_INIT:
5359                 if (is_s3_resume(codec) || is_s4_resume(codec)) {
5360                         spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5361                         spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5362                 }
5363                 alc_update_headset_mode(codec);
5364                 break;
5365         }
5366 }
5367
5368 static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
5369                                 const struct hda_fixup *fix, int action)
5370 {
5371         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5372                 struct alc_spec *spec = codec->spec;
5373                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5374         }
5375         else
5376                 alc_fixup_headset_mode(codec, fix, action);
5377 }
5378
5379 static void alc255_set_default_jack_type(struct hda_codec *codec)
5380 {
5381         /* Set to iphone type */
5382         static const struct coef_fw alc255fw[] = {
5383                 WRITE_COEF(0x1b, 0x880b),
5384                 WRITE_COEF(0x45, 0xd089),
5385                 WRITE_COEF(0x1b, 0x080b),
5386                 WRITE_COEF(0x46, 0x0004),
5387                 WRITE_COEF(0x1b, 0x0c0b),
5388                 {}
5389         };
5390         static const struct coef_fw alc256fw[] = {
5391                 WRITE_COEF(0x1b, 0x884b),
5392                 WRITE_COEF(0x45, 0xd089),
5393                 WRITE_COEF(0x1b, 0x084b),
5394                 WRITE_COEF(0x46, 0x0004),
5395                 WRITE_COEF(0x1b, 0x0c4b),
5396                 {}
5397         };
5398         switch (codec->core.vendor_id) {
5399         case 0x10ec0255:
5400                 alc_process_coef_fw(codec, alc255fw);
5401                 break;
5402         case 0x10ec0236:
5403         case 0x10ec0256:
5404                 alc_process_coef_fw(codec, alc256fw);
5405                 break;
5406         }
5407         msleep(30);
5408 }
5409
5410 static void alc_fixup_headset_mode_alc255(struct hda_codec *codec,
5411                                 const struct hda_fixup *fix, int action)
5412 {
5413         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5414                 alc255_set_default_jack_type(codec);
5415         }
5416         alc_fixup_headset_mode(codec, fix, action);
5417 }
5418
5419 static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,
5420                                 const struct hda_fixup *fix, int action)
5421 {
5422         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5423                 struct alc_spec *spec = codec->spec;
5424                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5425                 alc255_set_default_jack_type(codec);
5426         } 
5427         else
5428                 alc_fixup_headset_mode(codec, fix, action);
5429 }
5430
5431 static void alc288_update_headset_jack_cb(struct hda_codec *codec,
5432                                        struct hda_jack_callback *jack)
5433 {
5434         struct alc_spec *spec = codec->spec;
5435
5436         alc_update_headset_jack_cb(codec, jack);
5437         /* Headset Mic enable or disable, only for Dell Dino */
5438         alc_update_gpio_data(codec, 0x40, spec->gen.hp_jack_present);
5439 }
5440
5441 static void alc_fixup_headset_mode_dell_alc288(struct hda_codec *codec,
5442                                 const struct hda_fixup *fix, int action)
5443 {
5444         alc_fixup_headset_mode(codec, fix, action);
5445         if (action == HDA_FIXUP_ACT_PROBE) {
5446                 struct alc_spec *spec = codec->spec;
5447                 /* toggled via hp_automute_hook */
5448                 spec->gpio_mask |= 0x40;
5449                 spec->gpio_dir |= 0x40;
5450                 spec->gen.hp_automute_hook = alc288_update_headset_jack_cb;
5451         }
5452 }
5453
5454 static void alc_fixup_auto_mute_via_amp(struct hda_codec *codec,
5455                                         const struct hda_fixup *fix, int action)
5456 {
5457         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5458                 struct alc_spec *spec = codec->spec;
5459                 spec->gen.auto_mute_via_amp = 1;
5460         }
5461 }
5462
5463 static void alc_fixup_no_shutup(struct hda_codec *codec,
5464                                 const struct hda_fixup *fix, int action)
5465 {
5466         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5467                 struct alc_spec *spec = codec->spec;
5468                 spec->no_shutup_pins = 1;
5469         }
5470 }
5471
5472 static void alc_fixup_disable_aamix(struct hda_codec *codec,
5473                                     const struct hda_fixup *fix, int action)
5474 {
5475         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5476                 struct alc_spec *spec = codec->spec;
5477                 /* Disable AA-loopback as it causes white noise */
5478                 spec->gen.mixer_nid = 0;
5479         }
5480 }
5481
5482 /* fixup for Thinkpad docks: add dock pins, avoid HP parser fixup */
5483 static void alc_fixup_tpt440_dock(struct hda_codec *codec,
5484                                   const struct hda_fixup *fix, int action)
5485 {
5486         static const struct hda_pintbl pincfgs[] = {
5487                 { 0x16, 0x21211010 }, /* dock headphone */
5488                 { 0x19, 0x21a11010 }, /* dock mic */
5489                 { }
5490         };
5491         struct alc_spec *spec = codec->spec;
5492
5493         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5494                 spec->reboot_notify = snd_hda_gen_reboot_notify; /* reduce noise */
5495                 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
5496                 codec->power_save_node = 0; /* avoid click noises */
5497                 snd_hda_apply_pincfgs(codec, pincfgs);
5498         }
5499 }
5500
5501 static void alc_fixup_tpt470_dock(struct hda_codec *codec,
5502                                   const struct hda_fixup *fix, int action)
5503 {
5504         static const struct hda_pintbl pincfgs[] = {
5505                 { 0x17, 0x21211010 }, /* dock headphone */
5506                 { 0x19, 0x21a11010 }, /* dock mic */
5507                 { }
5508         };
5509         struct alc_spec *spec = codec->spec;
5510
5511         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5512                 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
5513                 snd_hda_apply_pincfgs(codec, pincfgs);
5514         } else if (action == HDA_FIXUP_ACT_INIT) {
5515                 /* Enable DOCK device */
5516                 snd_hda_codec_write(codec, 0x17, 0,
5517                             AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
5518                 /* Enable DOCK device */
5519                 snd_hda_codec_write(codec, 0x19, 0,
5520                             AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
5521         }
5522 }
5523
5524 static void alc_fixup_tpt470_dacs(struct hda_codec *codec,
5525                                   const struct hda_fixup *fix, int action)
5526 {
5527         /* Assure the speaker pin to be coupled with DAC NID 0x03; otherwise
5528          * the speaker output becomes too low by some reason on Thinkpads with
5529          * ALC298 codec
5530          */
5531         static const hda_nid_t preferred_pairs[] = {
5532                 0x14, 0x03, 0x17, 0x02, 0x21, 0x02,
5533                 0
5534         };
5535         struct alc_spec *spec = codec->spec;
5536
5537         if (action == HDA_FIXUP_ACT_PRE_PROBE)
5538                 spec->gen.preferred_dacs = preferred_pairs;
5539 }
5540
5541 static void alc_shutup_dell_xps13(struct hda_codec *codec)
5542 {
5543         struct alc_spec *spec = codec->spec;
5544         int hp_pin = alc_get_hp_pin(spec);
5545
5546         /* Prevent pop noises when headphones are plugged in */
5547         snd_hda_codec_write(codec, hp_pin, 0,
5548                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5549         msleep(20);
5550 }
5551
5552 static void alc_fixup_dell_xps13(struct hda_codec *codec,
5553                                 const struct hda_fixup *fix, int action)
5554 {
5555         struct alc_spec *spec = codec->spec;
5556         struct hda_input_mux *imux = &spec->gen.input_mux;
5557         int i;
5558
5559         switch (action) {
5560         case HDA_FIXUP_ACT_PRE_PROBE:
5561                 /* mic pin 0x19 must be initialized with Vref Hi-Z, otherwise
5562                  * it causes a click noise at start up
5563                  */
5564                 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
5565                 spec->shutup = alc_shutup_dell_xps13;
5566                 break;
5567         case HDA_FIXUP_ACT_PROBE:
5568                 /* Make the internal mic the default input source. */
5569                 for (i = 0; i < imux->num_items; i++) {
5570                         if (spec->gen.imux_pins[i] == 0x12) {
5571                                 spec->gen.cur_mux[0] = i;
5572                                 break;
5573                         }
5574                 }
5575                 break;
5576         }
5577 }
5578
5579 static void alc_fixup_headset_mode_alc662(struct hda_codec *codec,
5580                                 const struct hda_fixup *fix, int action)
5581 {
5582         struct alc_spec *spec = codec->spec;
5583
5584         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5585                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5586                 spec->gen.hp_mic = 1; /* Mic-in is same pin as headphone */
5587
5588                 /* Disable boost for mic-in permanently. (This code is only called
5589                    from quirks that guarantee that the headphone is at NID 0x1b.) */
5590                 snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000);
5591                 snd_hda_override_wcaps(codec, 0x1b, get_wcaps(codec, 0x1b) & ~AC_WCAP_IN_AMP);
5592         } else
5593                 alc_fixup_headset_mode(codec, fix, action);
5594 }
5595
5596 static void alc_fixup_headset_mode_alc668(struct hda_codec *codec,
5597                                 const struct hda_fixup *fix, int action)
5598 {
5599         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5600                 alc_write_coef_idx(codec, 0xc4, 0x8000);
5601                 alc_update_coef_idx(codec, 0xc2, ~0xfe, 0);
5602                 snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
5603         }
5604         alc_fixup_headset_mode(codec, fix, action);
5605 }
5606
5607 /* Returns the nid of the external mic input pin, or 0 if it cannot be found. */
5608 static int find_ext_mic_pin(struct hda_codec *codec)
5609 {
5610         struct alc_spec *spec = codec->spec;
5611         struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5612         hda_nid_t nid;
5613         unsigned int defcfg;
5614         int i;
5615
5616         for (i = 0; i < cfg->num_inputs; i++) {
5617                 if (cfg->inputs[i].type != AUTO_PIN_MIC)
5618                         continue;
5619                 nid = cfg->inputs[i].pin;
5620                 defcfg = snd_hda_codec_get_pincfg(codec, nid);
5621                 if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT)
5622                         continue;
5623                 return nid;
5624         }
5625
5626         return 0;
5627 }
5628
5629 static void alc271_hp_gate_mic_jack(struct hda_codec *codec,
5630                                     const struct hda_fixup *fix,
5631                                     int action)
5632 {
5633         struct alc_spec *spec = codec->spec;
5634
5635         if (action == HDA_FIXUP_ACT_PROBE) {
5636                 int mic_pin = find_ext_mic_pin(codec);
5637                 int hp_pin = alc_get_hp_pin(spec);
5638
5639                 if (snd_BUG_ON(!mic_pin || !hp_pin))
5640                         return;
5641                 snd_hda_jack_set_gating_jack(codec, mic_pin, hp_pin);
5642         }
5643 }
5644
5645 static void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec,
5646                                              const struct hda_fixup *fix,
5647                                              int action)
5648 {
5649         struct alc_spec *spec = codec->spec;
5650         struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5651         int i;
5652
5653         /* The mic boosts on level 2 and 3 are too noisy
5654            on the internal mic input.
5655            Therefore limit the boost to 0 or 1. */
5656
5657         if (action != HDA_FIXUP_ACT_PROBE)
5658                 return;
5659
5660         for (i = 0; i < cfg->num_inputs; i++) {
5661                 hda_nid_t nid = cfg->inputs[i].pin;
5662                 unsigned int defcfg;
5663                 if (cfg->inputs[i].type != AUTO_PIN_MIC)
5664                         continue;
5665                 defcfg = snd_hda_codec_get_pincfg(codec, nid);
5666                 if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
5667                         continue;
5668
5669                 snd_hda_override_amp_caps(codec, nid, HDA_INPUT,
5670                                           (0x00 << AC_AMPCAP_OFFSET_SHIFT) |
5671                                           (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) |
5672                                           (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) |
5673                                           (0 << AC_AMPCAP_MUTE_SHIFT));
5674         }
5675 }
5676
5677 static void alc283_hp_automute_hook(struct hda_codec *codec,
5678                                     struct hda_jack_callback *jack)
5679 {
5680         struct alc_spec *spec = codec->spec;
5681         int vref;
5682
5683         msleep(200);
5684         snd_hda_gen_hp_automute(codec, jack);
5685
5686         vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
5687
5688         msleep(600);
5689         snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
5690                             vref);
5691 }
5692
5693 static void alc283_fixup_chromebook(struct hda_codec *codec,
5694                                     const struct hda_fixup *fix, int action)
5695 {
5696         struct alc_spec *spec = codec->spec;
5697
5698         switch (action) {
5699         case HDA_FIXUP_ACT_PRE_PROBE:
5700                 snd_hda_override_wcaps(codec, 0x03, 0);
5701                 /* Disable AA-loopback as it causes white noise */
5702                 spec->gen.mixer_nid = 0;
5703                 break;
5704         case HDA_FIXUP_ACT_INIT:
5705                 /* MIC2-VREF control */
5706                 /* Set to manual mode */
5707                 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
5708                 /* Enable Line1 input control by verb */
5709                 alc_update_coef_idx(codec, 0x1a, 0, 1 << 4);
5710                 break;
5711         }
5712 }
5713
5714 static void alc283_fixup_sense_combo_jack(struct hda_codec *codec,
5715                                     const struct hda_fixup *fix, int action)
5716 {
5717         struct alc_spec *spec = codec->spec;
5718
5719         switch (action) {
5720         case HDA_FIXUP_ACT_PRE_PROBE:
5721                 spec->gen.hp_automute_hook = alc283_hp_automute_hook;
5722                 break;
5723         case HDA_FIXUP_ACT_INIT:
5724                 /* MIC2-VREF control */
5725                 /* Set to manual mode */
5726                 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
5727                 break;
5728         }
5729 }
5730
5731 /* mute tablet speaker pin (0x14) via dock plugging in addition */
5732 static void asus_tx300_automute(struct hda_codec *codec)
5733 {
5734         struct alc_spec *spec = codec->spec;
5735         snd_hda_gen_update_outputs(codec);
5736         if (snd_hda_jack_detect(codec, 0x1b))
5737                 spec->gen.mute_bits |= (1ULL << 0x14);
5738 }
5739
5740 static void alc282_fixup_asus_tx300(struct hda_codec *codec,
5741                                     const struct hda_fixup *fix, int action)
5742 {
5743         struct alc_spec *spec = codec->spec;
5744         static const struct hda_pintbl dock_pins[] = {
5745                 { 0x1b, 0x21114000 }, /* dock speaker pin */
5746                 {}
5747         };
5748
5749         switch (action) {
5750         case HDA_FIXUP_ACT_PRE_PROBE:
5751                 spec->init_amp = ALC_INIT_DEFAULT;
5752                 /* TX300 needs to set up GPIO2 for the speaker amp */
5753                 alc_setup_gpio(codec, 0x04);
5754                 snd_hda_apply_pincfgs(codec, dock_pins);
5755                 spec->gen.auto_mute_via_amp = 1;
5756                 spec->gen.automute_hook = asus_tx300_automute;
5757                 snd_hda_jack_detect_enable_callback(codec, 0x1b,
5758                                                     snd_hda_gen_hp_automute);
5759                 break;
5760         case HDA_FIXUP_ACT_PROBE:
5761                 spec->init_amp = ALC_INIT_DEFAULT;
5762                 break;
5763         case HDA_FIXUP_ACT_BUILD:
5764                 /* this is a bit tricky; give more sane names for the main
5765                  * (tablet) speaker and the dock speaker, respectively
5766                  */
5767                 rename_ctl(codec, "Speaker Playback Switch",
5768                            "Dock Speaker Playback Switch");
5769                 rename_ctl(codec, "Bass Speaker Playback Switch",
5770                            "Speaker Playback Switch");
5771                 break;
5772         }
5773 }
5774
5775 static void alc290_fixup_mono_speakers(struct hda_codec *codec,
5776                                        const struct hda_fixup *fix, int action)
5777 {
5778         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5779                 /* DAC node 0x03 is giving mono output. We therefore want to
5780                    make sure 0x14 (front speaker) and 0x15 (headphones) use the
5781                    stereo DAC, while leaving 0x17 (bass speaker) for node 0x03. */
5782                 static const hda_nid_t conn1[] = { 0x0c };
5783                 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
5784                 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
5785         }
5786 }
5787
5788 static void alc298_fixup_speaker_volume(struct hda_codec *codec,
5789                                         const struct hda_fixup *fix, int action)
5790 {
5791         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5792                 /* The speaker is routed to the Node 0x06 by a mistake, as a result
5793                    we can't adjust the speaker's volume since this node does not has
5794                    Amp-out capability. we change the speaker's route to:
5795                    Node 0x02 (Audio Output) -> Node 0x0c (Audio Mixer) -> Node 0x17 (
5796                    Pin Complex), since Node 0x02 has Amp-out caps, we can adjust
5797                    speaker's volume now. */
5798
5799                 static const hda_nid_t conn1[] = { 0x0c };
5800                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn1), conn1);
5801         }
5802 }
5803
5804 /* disable DAC3 (0x06) selection on NID 0x17 as it has no volume amp control */
5805 static void alc295_fixup_disable_dac3(struct hda_codec *codec,
5806                                       const struct hda_fixup *fix, int action)
5807 {
5808         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5809                 static const hda_nid_t conn[] = { 0x02, 0x03 };
5810                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
5811         }
5812 }
5813
5814 /* force NID 0x17 (Bass Speaker) to DAC1 to share it with the main speaker */
5815 static void alc285_fixup_speaker2_to_dac1(struct hda_codec *codec,
5816                                           const struct hda_fixup *fix, int action)
5817 {
5818         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5819                 static const hda_nid_t conn[] = { 0x02 };
5820                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
5821         }
5822 }
5823
5824 /* Hook to update amp GPIO4 for automute */
5825 static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,
5826                                           struct hda_jack_callback *jack)
5827 {
5828         struct alc_spec *spec = codec->spec;
5829
5830         snd_hda_gen_hp_automute(codec, jack);
5831         /* mute_led_polarity is set to 0, so we pass inverted value here */
5832         alc_update_gpio_led(codec, 0x10, spec->mute_led_polarity,
5833                             !spec->gen.hp_jack_present);
5834 }
5835
5836 /* Manage GPIOs for HP EliteBook Folio 9480m.
5837  *
5838  * GPIO4 is the headphone amplifier power control
5839  * GPIO3 is the audio output mute indicator LED
5840  */
5841
5842 static void alc280_fixup_hp_9480m(struct hda_codec *codec,
5843                                   const struct hda_fixup *fix,
5844                                   int action)
5845 {
5846         struct alc_spec *spec = codec->spec;
5847
5848         alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
5849         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5850                 /* amp at GPIO4; toggled via alc280_hp_gpio4_automute_hook() */
5851                 spec->gpio_mask |= 0x10;
5852                 spec->gpio_dir |= 0x10;
5853                 spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook;
5854         }
5855 }
5856
5857 static void alc275_fixup_gpio4_off(struct hda_codec *codec,
5858                                    const struct hda_fixup *fix,
5859                                    int action)
5860 {
5861         struct alc_spec *spec = codec->spec;
5862
5863         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5864                 spec->gpio_mask |= 0x04;
5865                 spec->gpio_dir |= 0x04;
5866                 /* set data bit low */
5867         }
5868 }
5869
5870 static void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec,
5871                                          const struct hda_fixup *fix,
5872                                          int action)
5873 {
5874         alc_fixup_dual_codecs(codec, fix, action);
5875         switch (action) {
5876         case HDA_FIXUP_ACT_PRE_PROBE:
5877                 /* override card longname to provide a unique UCM profile */
5878                 strcpy(codec->card->longname, "HDAudio-Lenovo-DualCodecs");
5879                 break;
5880         case HDA_FIXUP_ACT_BUILD:
5881                 /* rename Capture controls depending on the codec */
5882                 rename_ctl(codec, "Capture Volume",
5883                            codec->addr == 0 ?
5884                            "Rear-Panel Capture Volume" :
5885                            "Front-Panel Capture Volume");
5886                 rename_ctl(codec, "Capture Switch",
5887                            codec->addr == 0 ?
5888                            "Rear-Panel Capture Switch" :
5889                            "Front-Panel Capture Switch");
5890                 break;
5891         }
5892 }
5893
5894 static void alc225_fixup_s3_pop_noise(struct hda_codec *codec,
5895                                       const struct hda_fixup *fix, int action)
5896 {
5897         if (action != HDA_FIXUP_ACT_PRE_PROBE)
5898                 return;
5899
5900         codec->power_save_node = 1;
5901 }
5902
5903 /* Forcibly assign NID 0x03 to HP/LO while NID 0x02 to SPK for EQ */
5904 static void alc274_fixup_bind_dacs(struct hda_codec *codec,
5905                                     const struct hda_fixup *fix, int action)
5906 {
5907         struct alc_spec *spec = codec->spec;
5908         static const hda_nid_t preferred_pairs[] = {
5909                 0x21, 0x03, 0x1b, 0x03, 0x16, 0x02,
5910                 0
5911         };
5912
5913         if (action != HDA_FIXUP_ACT_PRE_PROBE)
5914                 return;
5915
5916         spec->gen.preferred_dacs = preferred_pairs;
5917         spec->gen.auto_mute_via_amp = 1;
5918         codec->power_save_node = 0;
5919 }
5920
5921 /* The DAC of NID 0x3 will introduce click/pop noise on headphones, so invalidate it */
5922 static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
5923                               const struct hda_fixup *fix, int action)
5924 {
5925         if (action != HDA_FIXUP_ACT_PRE_PROBE)
5926                 return;
5927
5928         snd_hda_override_wcaps(codec, 0x03, 0);
5929 }
5930
5931 static void alc295_fixup_chromebook(struct hda_codec *codec,
5932                                     const struct hda_fixup *fix, int action)
5933 {
5934         struct alc_spec *spec = codec->spec;
5935
5936         switch (action) {
5937         case HDA_FIXUP_ACT_PRE_PROBE:
5938                 spec->ultra_low_power = true;
5939                 break;
5940         case HDA_FIXUP_ACT_INIT:
5941                 switch (codec->core.vendor_id) {
5942                 case 0x10ec0295:
5943                         alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */
5944                         alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
5945                         break;
5946                 case 0x10ec0236:
5947                         alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */
5948                         alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
5949                         break;
5950                 }
5951                 break;
5952         }
5953 }
5954
5955 static void alc_fixup_disable_mic_vref(struct hda_codec *codec,
5956                                   const struct hda_fixup *fix, int action)
5957 {
5958         if (action == HDA_FIXUP_ACT_PRE_PROBE)
5959                 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
5960 }
5961
5962 static void  alc285_fixup_hp_gpio_amp_init(struct hda_codec *codec,
5963                               const struct hda_fixup *fix, int action)
5964 {
5965         if (action != HDA_FIXUP_ACT_INIT)
5966                 return;
5967
5968         msleep(100);
5969         alc_write_coef_idx(codec, 0x65, 0x0);
5970 }
5971
5972 /* for hda_fixup_thinkpad_acpi() */
5973 #include "thinkpad_helper.c"
5974
5975 static void alc_fixup_thinkpad_acpi(struct hda_codec *codec,
5976                                     const struct hda_fixup *fix, int action)
5977 {
5978         alc_fixup_no_shutup(codec, fix, action); /* reduce click noise */
5979         hda_fixup_thinkpad_acpi(codec, fix, action);
5980 }
5981
5982 /* for alc295_fixup_hp_top_speakers */
5983 #include "hp_x360_helper.c"
5984
5985 enum {
5986         ALC269_FIXUP_SONY_VAIO,
5987         ALC275_FIXUP_SONY_VAIO_GPIO2,
5988         ALC269_FIXUP_DELL_M101Z,
5989         ALC269_FIXUP_SKU_IGNORE,
5990         ALC269_FIXUP_ASUS_G73JW,
5991         ALC269_FIXUP_LENOVO_EAPD,
5992         ALC275_FIXUP_SONY_HWEQ,
5993         ALC275_FIXUP_SONY_DISABLE_AAMIX,
5994         ALC271_FIXUP_DMIC,
5995         ALC269_FIXUP_PCM_44K,
5996         ALC269_FIXUP_STEREO_DMIC,
5997         ALC269_FIXUP_HEADSET_MIC,
5998         ALC269_FIXUP_QUANTA_MUTE,
5999         ALC269_FIXUP_LIFEBOOK,
6000         ALC269_FIXUP_LIFEBOOK_EXTMIC,
6001         ALC269_FIXUP_LIFEBOOK_HP_PIN,
6002         ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT,
6003         ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC,
6004         ALC269_FIXUP_AMIC,
6005         ALC269_FIXUP_DMIC,
6006         ALC269VB_FIXUP_AMIC,
6007         ALC269VB_FIXUP_DMIC,
6008         ALC269_FIXUP_HP_MUTE_LED,
6009         ALC269_FIXUP_HP_MUTE_LED_MIC1,
6010         ALC269_FIXUP_HP_MUTE_LED_MIC2,
6011         ALC269_FIXUP_HP_MUTE_LED_MIC3,
6012         ALC269_FIXUP_HP_GPIO_LED,
6013         ALC269_FIXUP_HP_GPIO_MIC1_LED,
6014         ALC269_FIXUP_HP_LINE1_MIC1_LED,
6015         ALC269_FIXUP_INV_DMIC,
6016         ALC269_FIXUP_LENOVO_DOCK,
6017         ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST,
6018         ALC269_FIXUP_NO_SHUTUP,
6019         ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
6020         ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
6021         ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
6022         ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
6023         ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
6024         ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
6025         ALC269_FIXUP_HEADSET_MODE,
6026         ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
6027         ALC269_FIXUP_ASPIRE_HEADSET_MIC,
6028         ALC269_FIXUP_ASUS_X101_FUNC,
6029         ALC269_FIXUP_ASUS_X101_VERB,
6030         ALC269_FIXUP_ASUS_X101,
6031         ALC271_FIXUP_AMIC_MIC2,
6032         ALC271_FIXUP_HP_GATE_MIC_JACK,
6033         ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572,
6034         ALC269_FIXUP_ACER_AC700,
6035         ALC269_FIXUP_LIMIT_INT_MIC_BOOST,
6036         ALC269VB_FIXUP_ASUS_ZENBOOK,
6037         ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,
6038         ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,
6039         ALC269VB_FIXUP_ORDISSIMO_EVE2,
6040         ALC283_FIXUP_CHROME_BOOK,
6041         ALC283_FIXUP_SENSE_COMBO_JACK,
6042         ALC282_FIXUP_ASUS_TX300,
6043         ALC283_FIXUP_INT_MIC,
6044         ALC290_FIXUP_MONO_SPEAKERS,
6045         ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
6046         ALC290_FIXUP_SUBWOOFER,
6047         ALC290_FIXUP_SUBWOOFER_HSJACK,
6048         ALC269_FIXUP_THINKPAD_ACPI,
6049         ALC269_FIXUP_DMIC_THINKPAD_ACPI,
6050         ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
6051         ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
6052         ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6053         ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
6054         ALC255_FIXUP_HEADSET_MODE,
6055         ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
6056         ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
6057         ALC292_FIXUP_TPT440_DOCK,
6058         ALC292_FIXUP_TPT440,
6059         ALC283_FIXUP_HEADSET_MIC,
6060         ALC255_FIXUP_MIC_MUTE_LED,
6061         ALC282_FIXUP_ASPIRE_V5_PINS,
6062         ALC280_FIXUP_HP_GPIO4,
6063         ALC286_FIXUP_HP_GPIO_LED,
6064         ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
6065         ALC280_FIXUP_HP_DOCK_PINS,
6066         ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,
6067         ALC280_FIXUP_HP_9480M,
6068         ALC288_FIXUP_DELL_HEADSET_MODE,
6069         ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
6070         ALC288_FIXUP_DELL_XPS_13,
6071         ALC288_FIXUP_DISABLE_AAMIX,
6072         ALC292_FIXUP_DELL_E7X_AAMIX,
6073         ALC292_FIXUP_DELL_E7X,
6074         ALC292_FIXUP_DISABLE_AAMIX,
6075         ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK,
6076         ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
6077         ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
6078         ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
6079         ALC275_FIXUP_DELL_XPS,
6080         ALC293_FIXUP_LENOVO_SPK_NOISE,
6081         ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
6082         ALC255_FIXUP_DELL_SPK_NOISE,
6083         ALC225_FIXUP_DISABLE_MIC_VREF,
6084         ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
6085         ALC295_FIXUP_DISABLE_DAC3,
6086         ALC285_FIXUP_SPEAKER2_TO_DAC1,
6087         ALC280_FIXUP_HP_HEADSET_MIC,
6088         ALC221_FIXUP_HP_FRONT_MIC,
6089         ALC292_FIXUP_TPT460,
6090         ALC298_FIXUP_SPK_VOLUME,
6091         ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER,
6092         ALC269_FIXUP_ATIV_BOOK_8,
6093         ALC221_FIXUP_HP_MIC_NO_PRESENCE,
6094         ALC256_FIXUP_ASUS_HEADSET_MODE,
6095         ALC256_FIXUP_ASUS_MIC,
6096         ALC256_FIXUP_ASUS_AIO_GPIO2,
6097         ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,
6098         ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,
6099         ALC233_FIXUP_LENOVO_MULTI_CODECS,
6100         ALC233_FIXUP_ACER_HEADSET_MIC,
6101         ALC294_FIXUP_LENOVO_MIC_LOCATION,
6102         ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE,
6103         ALC225_FIXUP_S3_POP_NOISE,
6104         ALC700_FIXUP_INTEL_REFERENCE,
6105         ALC274_FIXUP_DELL_BIND_DACS,
6106         ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
6107         ALC298_FIXUP_TPT470_DOCK_FIX,
6108         ALC298_FIXUP_TPT470_DOCK,
6109         ALC255_FIXUP_DUMMY_LINEOUT_VERB,
6110         ALC255_FIXUP_DELL_HEADSET_MIC,
6111         ALC256_FIXUP_HUAWEI_MACH_WX9_PINS,
6112         ALC298_FIXUP_HUAWEI_MBX_STEREO,
6113         ALC295_FIXUP_HP_X360,
6114         ALC221_FIXUP_HP_HEADSET_MIC,
6115         ALC285_FIXUP_LENOVO_HEADPHONE_NOISE,
6116         ALC295_FIXUP_HP_AUTO_MUTE,
6117         ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
6118         ALC294_FIXUP_ASUS_MIC,
6119         ALC294_FIXUP_ASUS_HEADSET_MIC,
6120         ALC294_FIXUP_ASUS_SPK,
6121         ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
6122         ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
6123         ALC255_FIXUP_ACER_HEADSET_MIC,
6124         ALC295_FIXUP_CHROME_BOOK,
6125         ALC225_FIXUP_HEADSET_JACK,
6126         ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE,
6127         ALC225_FIXUP_WYSE_AUTO_MUTE,
6128         ALC225_FIXUP_WYSE_DISABLE_MIC_VREF,
6129         ALC286_FIXUP_ACER_AIO_HEADSET_MIC,
6130         ALC256_FIXUP_ASUS_HEADSET_MIC,
6131         ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
6132         ALC299_FIXUP_PREDATOR_SPK,
6133         ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE,
6134         ALC289_FIXUP_DELL_SPK2,
6135         ALC289_FIXUP_DUAL_SPK,
6136         ALC294_FIXUP_SPK2_TO_DAC1,
6137         ALC294_FIXUP_ASUS_DUAL_SPK,
6138         ALC285_FIXUP_THINKPAD_HEADSET_JACK,
6139         ALC294_FIXUP_ASUS_HPE,
6140         ALC294_FIXUP_ASUS_COEF_1B,
6141         ALC285_FIXUP_HP_GPIO_LED,
6142         ALC285_FIXUP_HP_MUTE_LED,
6143         ALC236_FIXUP_HP_MUTE_LED,
6144         ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
6145         ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
6146         ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS,
6147         ALC269VC_FIXUP_ACER_HEADSET_MIC,
6148         ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE,
6149         ALC289_FIXUP_ASUS_GA401,
6150         ALC289_FIXUP_ASUS_GA502,
6151         ALC256_FIXUP_ACER_MIC_NO_PRESENCE,
6152         ALC285_FIXUP_HP_GPIO_AMP_INIT,
6153         ALC269_FIXUP_CZC_B20,
6154         ALC269_FIXUP_CZC_TMI,
6155         ALC269_FIXUP_CZC_L101,
6156         ALC269_FIXUP_LEMOTE_A1802,
6157         ALC269_FIXUP_LEMOTE_A190X,
6158         ALC256_FIXUP_INTEL_NUC8_RUGGED,
6159 };
6160
6161 static const struct hda_fixup alc269_fixups[] = {
6162         [ALC269_FIXUP_SONY_VAIO] = {
6163                 .type = HDA_FIXUP_PINCTLS,
6164                 .v.pins = (const struct hda_pintbl[]) {
6165                         {0x19, PIN_VREFGRD},
6166                         {}
6167                 }
6168         },
6169         [ALC275_FIXUP_SONY_VAIO_GPIO2] = {
6170                 .type = HDA_FIXUP_FUNC,
6171                 .v.func = alc275_fixup_gpio4_off,
6172                 .chained = true,
6173                 .chain_id = ALC269_FIXUP_SONY_VAIO
6174         },
6175         [ALC269_FIXUP_DELL_M101Z] = {
6176                 .type = HDA_FIXUP_VERBS,
6177                 .v.verbs = (const struct hda_verb[]) {
6178                         /* Enables internal speaker */
6179                         {0x20, AC_VERB_SET_COEF_INDEX, 13},
6180                         {0x20, AC_VERB_SET_PROC_COEF, 0x4040},
6181                         {}
6182                 }
6183         },
6184         [ALC269_FIXUP_SKU_IGNORE] = {
6185                 .type = HDA_FIXUP_FUNC,
6186                 .v.func = alc_fixup_sku_ignore,
6187         },
6188         [ALC269_FIXUP_ASUS_G73JW] = {
6189                 .type = HDA_FIXUP_PINS,
6190                 .v.pins = (const struct hda_pintbl[]) {
6191                         { 0x17, 0x99130111 }, /* subwoofer */
6192                         { }
6193                 }
6194         },
6195         [ALC269_FIXUP_LENOVO_EAPD] = {
6196                 .type = HDA_FIXUP_VERBS,
6197                 .v.verbs = (const struct hda_verb[]) {
6198                         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
6199                         {}
6200                 }
6201         },
6202         [ALC275_FIXUP_SONY_HWEQ] = {
6203                 .type = HDA_FIXUP_FUNC,
6204                 .v.func = alc269_fixup_hweq,
6205                 .chained = true,
6206                 .chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
6207         },
6208         [ALC275_FIXUP_SONY_DISABLE_AAMIX] = {
6209                 .type = HDA_FIXUP_FUNC,
6210                 .v.func = alc_fixup_disable_aamix,
6211                 .chained = true,
6212                 .chain_id = ALC269_FIXUP_SONY_VAIO
6213         },
6214         [ALC271_FIXUP_DMIC] = {
6215                 .type = HDA_FIXUP_FUNC,
6216                 .v.func = alc271_fixup_dmic,
6217         },
6218         [ALC269_FIXUP_PCM_44K] = {
6219                 .type = HDA_FIXUP_FUNC,
6220                 .v.func = alc269_fixup_pcm_44k,
6221                 .chained = true,
6222                 .chain_id = ALC269_FIXUP_QUANTA_MUTE
6223         },
6224         [ALC269_FIXUP_STEREO_DMIC] = {
6225                 .type = HDA_FIXUP_FUNC,
6226                 .v.func = alc269_fixup_stereo_dmic,
6227         },
6228         [ALC269_FIXUP_HEADSET_MIC] = {
6229                 .type = HDA_FIXUP_FUNC,
6230                 .v.func = alc269_fixup_headset_mic,
6231         },
6232         [ALC269_FIXUP_QUANTA_MUTE] = {
6233                 .type = HDA_FIXUP_FUNC,
6234                 .v.func = alc269_fixup_quanta_mute,
6235         },
6236         [ALC269_FIXUP_LIFEBOOK] = {
6237                 .type = HDA_FIXUP_PINS,
6238                 .v.pins = (const struct hda_pintbl[]) {
6239                         { 0x1a, 0x2101103f }, /* dock line-out */
6240                         { 0x1b, 0x23a11040 }, /* dock mic-in */
6241                         { }
6242                 },
6243                 .chained = true,
6244                 .chain_id = ALC269_FIXUP_QUANTA_MUTE
6245         },
6246         [ALC269_FIXUP_LIFEBOOK_EXTMIC] = {
6247                 .type = HDA_FIXUP_PINS,
6248                 .v.pins = (const struct hda_pintbl[]) {
6249                         { 0x19, 0x01a1903c }, /* headset mic, with jack detect */
6250                         { }
6251                 },
6252         },
6253         [ALC269_FIXUP_LIFEBOOK_HP_PIN] = {
6254                 .type = HDA_FIXUP_PINS,
6255                 .v.pins = (const struct hda_pintbl[]) {
6256                         { 0x21, 0x0221102f }, /* HP out */
6257                         { }
6258                 },
6259         },
6260         [ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT] = {
6261                 .type = HDA_FIXUP_FUNC,
6262                 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
6263         },
6264         [ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = {
6265                 .type = HDA_FIXUP_FUNC,
6266                 .v.func = alc269_fixup_pincfg_U7x7_headset_mic,
6267         },
6268         [ALC269_FIXUP_AMIC] = {
6269                 .type = HDA_FIXUP_PINS,
6270                 .v.pins = (const struct hda_pintbl[]) {
6271                         { 0x14, 0x99130110 }, /* speaker */
6272                         { 0x15, 0x0121401f }, /* HP out */
6273                         { 0x18, 0x01a19c20 }, /* mic */
6274                         { 0x19, 0x99a3092f }, /* int-mic */
6275                         { }
6276                 },
6277         },
6278         [ALC269_FIXUP_DMIC] = {
6279                 .type = HDA_FIXUP_PINS,
6280                 .v.pins = (const struct hda_pintbl[]) {
6281                         { 0x12, 0x99a3092f }, /* int-mic */
6282                         { 0x14, 0x99130110 }, /* speaker */
6283                         { 0x15, 0x0121401f }, /* HP out */
6284                         { 0x18, 0x01a19c20 }, /* mic */
6285                         { }
6286                 },
6287         },
6288         [ALC269VB_FIXUP_AMIC] = {
6289                 .type = HDA_FIXUP_PINS,
6290                 .v.pins = (const struct hda_pintbl[]) {
6291                         { 0x14, 0x99130110 }, /* speaker */
6292                         { 0x18, 0x01a19c20 }, /* mic */
6293                         { 0x19, 0x99a3092f }, /* int-mic */
6294                         { 0x21, 0x0121401f }, /* HP out */
6295                         { }
6296                 },
6297         },
6298         [ALC269VB_FIXUP_DMIC] = {
6299                 .type = HDA_FIXUP_PINS,
6300                 .v.pins = (const struct hda_pintbl[]) {
6301                         { 0x12, 0x99a3092f }, /* int-mic */
6302                         { 0x14, 0x99130110 }, /* speaker */
6303                         { 0x18, 0x01a19c20 }, /* mic */
6304                         { 0x21, 0x0121401f }, /* HP out */
6305                         { }
6306                 },
6307         },
6308         [ALC269_FIXUP_HP_MUTE_LED] = {
6309                 .type = HDA_FIXUP_FUNC,
6310                 .v.func = alc269_fixup_hp_mute_led,
6311         },
6312         [ALC269_FIXUP_HP_MUTE_LED_MIC1] = {
6313                 .type = HDA_FIXUP_FUNC,
6314                 .v.func = alc269_fixup_hp_mute_led_mic1,
6315         },
6316         [ALC269_FIXUP_HP_MUTE_LED_MIC2] = {
6317                 .type = HDA_FIXUP_FUNC,
6318                 .v.func = alc269_fixup_hp_mute_led_mic2,
6319         },
6320         [ALC269_FIXUP_HP_MUTE_LED_MIC3] = {
6321                 .type = HDA_FIXUP_FUNC,
6322                 .v.func = alc269_fixup_hp_mute_led_mic3,
6323                 .chained = true,
6324                 .chain_id = ALC295_FIXUP_HP_AUTO_MUTE
6325         },
6326         [ALC269_FIXUP_HP_GPIO_LED] = {
6327                 .type = HDA_FIXUP_FUNC,
6328                 .v.func = alc269_fixup_hp_gpio_led,
6329         },
6330         [ALC269_FIXUP_HP_GPIO_MIC1_LED] = {
6331                 .type = HDA_FIXUP_FUNC,
6332                 .v.func = alc269_fixup_hp_gpio_mic1_led,
6333         },
6334         [ALC269_FIXUP_HP_LINE1_MIC1_LED] = {
6335                 .type = HDA_FIXUP_FUNC,
6336                 .v.func = alc269_fixup_hp_line1_mic1_led,
6337         },
6338         [ALC269_FIXUP_INV_DMIC] = {
6339                 .type = HDA_FIXUP_FUNC,
6340                 .v.func = alc_fixup_inv_dmic,
6341         },
6342         [ALC269_FIXUP_NO_SHUTUP] = {
6343                 .type = HDA_FIXUP_FUNC,
6344                 .v.func = alc_fixup_no_shutup,
6345         },
6346         [ALC269_FIXUP_LENOVO_DOCK] = {
6347                 .type = HDA_FIXUP_PINS,
6348                 .v.pins = (const struct hda_pintbl[]) {
6349                         { 0x19, 0x23a11040 }, /* dock mic */
6350                         { 0x1b, 0x2121103f }, /* dock headphone */
6351                         { }
6352                 },
6353                 .chained = true,
6354                 .chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT
6355         },
6356         [ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST] = {
6357                 .type = HDA_FIXUP_FUNC,
6358                 .v.func = alc269_fixup_limit_int_mic_boost,
6359                 .chained = true,
6360                 .chain_id = ALC269_FIXUP_LENOVO_DOCK,
6361         },
6362         [ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = {
6363                 .type = HDA_FIXUP_FUNC,
6364                 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
6365                 .chained = true,
6366                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
6367         },
6368         [ALC269_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6369                 .type = HDA_FIXUP_PINS,
6370                 .v.pins = (const struct hda_pintbl[]) {
6371                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6372                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6373                         { }
6374                 },
6375                 .chained = true,
6376                 .chain_id = ALC269_FIXUP_HEADSET_MODE
6377         },
6378         [ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {
6379                 .type = HDA_FIXUP_PINS,
6380                 .v.pins = (const struct hda_pintbl[]) {
6381                         { 0x16, 0x21014020 }, /* dock line out */
6382                         { 0x19, 0x21a19030 }, /* dock mic */
6383                         { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6384                         { }
6385                 },
6386                 .chained = true,
6387                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6388         },
6389         [ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = {
6390                 .type = HDA_FIXUP_PINS,
6391                 .v.pins = (const struct hda_pintbl[]) {
6392                         { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6393                         { }
6394                 },
6395                 .chained = true,
6396                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
6397         },
6398         [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = {
6399                 .type = HDA_FIXUP_PINS,
6400                 .v.pins = (const struct hda_pintbl[]) {
6401                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6402                         { 0x1b, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6403                         { }
6404                 },
6405                 .chained = true,
6406                 .chain_id = ALC269_FIXUP_HEADSET_MODE
6407         },
6408         [ALC269_FIXUP_HEADSET_MODE] = {
6409                 .type = HDA_FIXUP_FUNC,
6410                 .v.func = alc_fixup_headset_mode,
6411                 .chained = true,
6412                 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
6413         },
6414         [ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
6415                 .type = HDA_FIXUP_FUNC,
6416                 .v.func = alc_fixup_headset_mode_no_hp_mic,
6417         },
6418         [ALC269_FIXUP_ASPIRE_HEADSET_MIC] = {
6419                 .type = HDA_FIXUP_PINS,
6420                 .v.pins = (const struct hda_pintbl[]) {
6421                         { 0x19, 0x01a1913c }, /* headset mic w/o jack detect */
6422                         { }
6423                 },
6424                 .chained = true,
6425                 .chain_id = ALC269_FIXUP_HEADSET_MODE,
6426         },
6427         [ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {
6428                 .type = HDA_FIXUP_PINS,
6429                 .v.pins = (const struct hda_pintbl[]) {
6430                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6431                         { }
6432                 },
6433                 .chained = true,
6434                 .chain_id = ALC269_FIXUP_HEADSET_MIC
6435         },
6436         [ALC256_FIXUP_HUAWEI_MACH_WX9_PINS] = {
6437                 .type = HDA_FIXUP_PINS,
6438                 .v.pins = (const struct hda_pintbl[]) {
6439                         {0x12, 0x90a60130},
6440                         {0x13, 0x40000000},
6441                         {0x14, 0x90170110},
6442                         {0x18, 0x411111f0},
6443                         {0x19, 0x04a11040},
6444                         {0x1a, 0x411111f0},
6445                         {0x1b, 0x90170112},
6446                         {0x1d, 0x40759a05},
6447                         {0x1e, 0x411111f0},
6448                         {0x21, 0x04211020},
6449                         { }
6450                 },
6451                 .chained = true,
6452                 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
6453         },
6454         [ALC298_FIXUP_HUAWEI_MBX_STEREO] = {
6455                 .type = HDA_FIXUP_FUNC,
6456                 .v.func = alc298_fixup_huawei_mbx_stereo,
6457                 .chained = true,
6458                 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
6459         },
6460         [ALC269_FIXUP_ASUS_X101_FUNC] = {
6461                 .type = HDA_FIXUP_FUNC,
6462                 .v.func = alc269_fixup_x101_headset_mic,
6463         },
6464         [ALC269_FIXUP_ASUS_X101_VERB] = {
6465                 .type = HDA_FIXUP_VERBS,
6466                 .v.verbs = (const struct hda_verb[]) {
6467                         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
6468                         {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
6469                         {0x20, AC_VERB_SET_PROC_COEF,  0x0310},
6470                         { }
6471                 },
6472                 .chained = true,
6473                 .chain_id = ALC269_FIXUP_ASUS_X101_FUNC
6474         },
6475         [ALC269_FIXUP_ASUS_X101] = {
6476                 .type = HDA_FIXUP_PINS,
6477                 .v.pins = (const struct hda_pintbl[]) {
6478                         { 0x18, 0x04a1182c }, /* Headset mic */
6479                         { }
6480                 },
6481                 .chained = true,
6482                 .chain_id = ALC269_FIXUP_ASUS_X101_VERB
6483         },
6484         [ALC271_FIXUP_AMIC_MIC2] = {
6485                 .type = HDA_FIXUP_PINS,
6486                 .v.pins = (const struct hda_pintbl[]) {
6487                         { 0x14, 0x99130110 }, /* speaker */
6488                         { 0x19, 0x01a19c20 }, /* mic */
6489                         { 0x1b, 0x99a7012f }, /* int-mic */
6490                         { 0x21, 0x0121401f }, /* HP out */
6491                         { }
6492                 },
6493         },
6494         [ALC271_FIXUP_HP_GATE_MIC_JACK] = {
6495                 .type = HDA_FIXUP_FUNC,
6496                 .v.func = alc271_hp_gate_mic_jack,
6497                 .chained = true,
6498                 .chain_id = ALC271_FIXUP_AMIC_MIC2,
6499         },
6500         [ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572] = {
6501                 .type = HDA_FIXUP_FUNC,
6502                 .v.func = alc269_fixup_limit_int_mic_boost,
6503                 .chained = true,
6504                 .chain_id = ALC271_FIXUP_HP_GATE_MIC_JACK,
6505         },
6506         [ALC269_FIXUP_ACER_AC700] = {
6507                 .type = HDA_FIXUP_PINS,
6508                 .v.pins = (const struct hda_pintbl[]) {
6509                         { 0x12, 0x99a3092f }, /* int-mic */
6510                         { 0x14, 0x99130110 }, /* speaker */
6511                         { 0x18, 0x03a11c20 }, /* mic */
6512                         { 0x1e, 0x0346101e }, /* SPDIF1 */
6513                         { 0x21, 0x0321101f }, /* HP out */
6514                         { }
6515                 },
6516                 .chained = true,
6517                 .chain_id = ALC271_FIXUP_DMIC,
6518         },
6519         [ALC269_FIXUP_LIMIT_INT_MIC_BOOST] = {
6520                 .type = HDA_FIXUP_FUNC,
6521                 .v.func = alc269_fixup_limit_int_mic_boost,
6522                 .chained = true,
6523                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
6524         },
6525         [ALC269VB_FIXUP_ASUS_ZENBOOK] = {
6526                 .type = HDA_FIXUP_FUNC,
6527                 .v.func = alc269_fixup_limit_int_mic_boost,
6528                 .chained = true,
6529                 .chain_id = ALC269VB_FIXUP_DMIC,
6530         },
6531         [ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A] = {
6532                 .type = HDA_FIXUP_VERBS,
6533                 .v.verbs = (const struct hda_verb[]) {
6534                         /* class-D output amp +5dB */
6535                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x12 },
6536                         { 0x20, AC_VERB_SET_PROC_COEF, 0x2800 },
6537                         {}
6538                 },
6539                 .chained = true,
6540                 .chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,
6541         },
6542         [ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {
6543                 .type = HDA_FIXUP_FUNC,
6544                 .v.func = alc269_fixup_limit_int_mic_boost,
6545                 .chained = true,
6546                 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC1,
6547         },
6548         [ALC269VB_FIXUP_ORDISSIMO_EVE2] = {
6549                 .type = HDA_FIXUP_PINS,
6550                 .v.pins = (const struct hda_pintbl[]) {
6551                         { 0x12, 0x99a3092f }, /* int-mic */
6552                         { 0x18, 0x03a11d20 }, /* mic */
6553                         { 0x19, 0x411111f0 }, /* Unused bogus pin */
6554                         { }
6555                 },
6556         },
6557         [ALC283_FIXUP_CHROME_BOOK] = {
6558                 .type = HDA_FIXUP_FUNC,
6559                 .v.func = alc283_fixup_chromebook,
6560         },
6561         [ALC283_FIXUP_SENSE_COMBO_JACK] = {
6562                 .type = HDA_FIXUP_FUNC,
6563                 .v.func = alc283_fixup_sense_combo_jack,
6564                 .chained = true,
6565                 .chain_id = ALC283_FIXUP_CHROME_BOOK,
6566         },
6567         [ALC282_FIXUP_ASUS_TX300] = {
6568                 .type = HDA_FIXUP_FUNC,
6569                 .v.func = alc282_fixup_asus_tx300,
6570         },
6571         [ALC283_FIXUP_INT_MIC] = {
6572                 .type = HDA_FIXUP_VERBS,
6573                 .v.verbs = (const struct hda_verb[]) {
6574                         {0x20, AC_VERB_SET_COEF_INDEX, 0x1a},
6575                         {0x20, AC_VERB_SET_PROC_COEF, 0x0011},
6576                         { }
6577                 },
6578                 .chained = true,
6579                 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
6580         },
6581         [ALC290_FIXUP_SUBWOOFER_HSJACK] = {
6582                 .type = HDA_FIXUP_PINS,
6583                 .v.pins = (const struct hda_pintbl[]) {
6584                         { 0x17, 0x90170112 }, /* subwoofer */
6585                         { }
6586                 },
6587                 .chained = true,
6588                 .chain_id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
6589         },
6590         [ALC290_FIXUP_SUBWOOFER] = {
6591                 .type = HDA_FIXUP_PINS,
6592                 .v.pins = (const struct hda_pintbl[]) {
6593                         { 0x17, 0x90170112 }, /* subwoofer */
6594                         { }
6595                 },
6596                 .chained = true,
6597                 .chain_id = ALC290_FIXUP_MONO_SPEAKERS,
6598         },
6599         [ALC290_FIXUP_MONO_SPEAKERS] = {
6600                 .type = HDA_FIXUP_FUNC,
6601                 .v.func = alc290_fixup_mono_speakers,
6602         },
6603         [ALC290_FIXUP_MONO_SPEAKERS_HSJACK] = {
6604                 .type = HDA_FIXUP_FUNC,
6605                 .v.func = alc290_fixup_mono_speakers,
6606                 .chained = true,
6607                 .chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
6608         },
6609         [ALC269_FIXUP_THINKPAD_ACPI] = {
6610                 .type = HDA_FIXUP_FUNC,
6611                 .v.func = alc_fixup_thinkpad_acpi,
6612                 .chained = true,
6613                 .chain_id = ALC269_FIXUP_SKU_IGNORE,
6614         },
6615         [ALC269_FIXUP_DMIC_THINKPAD_ACPI] = {
6616                 .type = HDA_FIXUP_FUNC,
6617                 .v.func = alc_fixup_inv_dmic,
6618                 .chained = true,
6619                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
6620         },
6621         [ALC255_FIXUP_ACER_MIC_NO_PRESENCE] = {
6622                 .type = HDA_FIXUP_PINS,
6623                 .v.pins = (const struct hda_pintbl[]) {
6624                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6625                         { }
6626                 },
6627                 .chained = true,
6628                 .chain_id = ALC255_FIXUP_HEADSET_MODE
6629         },
6630         [ALC255_FIXUP_ASUS_MIC_NO_PRESENCE] = {
6631                 .type = HDA_FIXUP_PINS,
6632                 .v.pins = (const struct hda_pintbl[]) {
6633                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6634                         { }
6635                 },
6636                 .chained = true,
6637                 .chain_id = ALC255_FIXUP_HEADSET_MODE
6638         },
6639         [ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6640                 .type = HDA_FIXUP_PINS,
6641                 .v.pins = (const struct hda_pintbl[]) {
6642                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6643                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6644                         { }
6645                 },
6646                 .chained = true,
6647                 .chain_id = ALC255_FIXUP_HEADSET_MODE
6648         },
6649         [ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {
6650                 .type = HDA_FIXUP_PINS,
6651                 .v.pins = (const struct hda_pintbl[]) {
6652                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6653                         { }
6654                 },
6655                 .chained = true,
6656                 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
6657         },
6658         [ALC255_FIXUP_HEADSET_MODE] = {
6659                 .type = HDA_FIXUP_FUNC,
6660                 .v.func = alc_fixup_headset_mode_alc255,
6661                 .chained = true,
6662                 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
6663         },
6664         [ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
6665                 .type = HDA_FIXUP_FUNC,
6666                 .v.func = alc_fixup_headset_mode_alc255_no_hp_mic,
6667         },
6668         [ALC293_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6669                 .type = HDA_FIXUP_PINS,
6670                 .v.pins = (const struct hda_pintbl[]) {
6671                         { 0x18, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6672                         { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6673                         { }
6674                 },
6675                 .chained = true,
6676                 .chain_id = ALC269_FIXUP_HEADSET_MODE
6677         },
6678         [ALC292_FIXUP_TPT440_DOCK] = {
6679                 .type = HDA_FIXUP_FUNC,
6680                 .v.func = alc_fixup_tpt440_dock,
6681                 .chained = true,
6682                 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
6683         },
6684         [ALC292_FIXUP_TPT440] = {
6685                 .type = HDA_FIXUP_FUNC,
6686                 .v.func = alc_fixup_disable_aamix,
6687                 .chained = true,
6688                 .chain_id = ALC292_FIXUP_TPT440_DOCK,
6689         },
6690         [ALC283_FIXUP_HEADSET_MIC] = {
6691                 .type = HDA_FIXUP_PINS,
6692                 .v.pins = (const struct hda_pintbl[]) {
6693                         { 0x19, 0x04a110f0 },
6694                         { },
6695                 },
6696         },
6697         [ALC255_FIXUP_MIC_MUTE_LED] = {
6698                 .type = HDA_FIXUP_FUNC,
6699                 .v.func = alc_fixup_micmute_led,
6700         },
6701         [ALC282_FIXUP_ASPIRE_V5_PINS] = {
6702                 .type = HDA_FIXUP_PINS,
6703                 .v.pins = (const struct hda_pintbl[]) {
6704                         { 0x12, 0x90a60130 },
6705                         { 0x14, 0x90170110 },
6706                         { 0x17, 0x40000008 },
6707                         { 0x18, 0x411111f0 },
6708                         { 0x19, 0x01a1913c },
6709                         { 0x1a, 0x411111f0 },
6710                         { 0x1b, 0x411111f0 },
6711                         { 0x1d, 0x40f89b2d },
6712                         { 0x1e, 0x411111f0 },
6713                         { 0x21, 0x0321101f },
6714                         { },
6715                 },
6716         },
6717         [ALC280_FIXUP_HP_GPIO4] = {
6718                 .type = HDA_FIXUP_FUNC,
6719                 .v.func = alc280_fixup_hp_gpio4,
6720         },
6721         [ALC286_FIXUP_HP_GPIO_LED] = {
6722                 .type = HDA_FIXUP_FUNC,
6723                 .v.func = alc286_fixup_hp_gpio_led,
6724         },
6725         [ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY] = {
6726                 .type = HDA_FIXUP_FUNC,
6727                 .v.func = alc280_fixup_hp_gpio2_mic_hotkey,
6728         },
6729         [ALC280_FIXUP_HP_DOCK_PINS] = {
6730                 .type = HDA_FIXUP_PINS,
6731                 .v.pins = (const struct hda_pintbl[]) {
6732                         { 0x1b, 0x21011020 }, /* line-out */
6733                         { 0x1a, 0x01a1903c }, /* headset mic */
6734                         { 0x18, 0x2181103f }, /* line-in */
6735                         { },
6736                 },
6737                 .chained = true,
6738                 .chain_id = ALC280_FIXUP_HP_GPIO4
6739         },
6740         [ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {
6741                 .type = HDA_FIXUP_PINS,
6742                 .v.pins = (const struct hda_pintbl[]) {
6743                         { 0x1b, 0x21011020 }, /* line-out */
6744                         { 0x18, 0x2181103f }, /* line-in */
6745                         { },
6746                 },
6747                 .chained = true,
6748                 .chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED
6749         },
6750         [ALC280_FIXUP_HP_9480M] = {
6751                 .type = HDA_FIXUP_FUNC,
6752                 .v.func = alc280_fixup_hp_9480m,
6753         },
6754         [ALC288_FIXUP_DELL_HEADSET_MODE] = {
6755                 .type = HDA_FIXUP_FUNC,
6756                 .v.func = alc_fixup_headset_mode_dell_alc288,
6757                 .chained = true,
6758                 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
6759         },
6760         [ALC288_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6761                 .type = HDA_FIXUP_PINS,
6762                 .v.pins = (const struct hda_pintbl[]) {
6763                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6764                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6765                         { }
6766                 },
6767                 .chained = true,
6768                 .chain_id = ALC288_FIXUP_DELL_HEADSET_MODE
6769         },
6770         [ALC288_FIXUP_DISABLE_AAMIX] = {
6771                 .type = HDA_FIXUP_FUNC,
6772                 .v.func = alc_fixup_disable_aamix,
6773                 .chained = true,
6774                 .chain_id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE
6775         },
6776         [ALC288_FIXUP_DELL_XPS_13] = {
6777                 .type = HDA_FIXUP_FUNC,
6778                 .v.func = alc_fixup_dell_xps13,
6779                 .chained = true,
6780                 .chain_id = ALC288_FIXUP_DISABLE_AAMIX
6781         },
6782         [ALC292_FIXUP_DISABLE_AAMIX] = {
6783                 .type = HDA_FIXUP_FUNC,
6784                 .v.func = alc_fixup_disable_aamix,
6785                 .chained = true,
6786                 .chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE
6787         },
6788         [ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = {
6789                 .type = HDA_FIXUP_FUNC,
6790                 .v.func = alc_fixup_disable_aamix,
6791                 .chained = true,
6792                 .chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE
6793         },
6794         [ALC292_FIXUP_DELL_E7X_AAMIX] = {
6795                 .type = HDA_FIXUP_FUNC,
6796                 .v.func = alc_fixup_dell_xps13,
6797                 .chained = true,
6798                 .chain_id = ALC292_FIXUP_DISABLE_AAMIX
6799         },
6800         [ALC292_FIXUP_DELL_E7X] = {
6801                 .type = HDA_FIXUP_FUNC,
6802                 .v.func = alc_fixup_micmute_led,
6803                 /* micmute fixup must be applied at last */
6804                 .chained_before = true,
6805                 .chain_id = ALC292_FIXUP_DELL_E7X_AAMIX,
6806         },
6807         [ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE] = {
6808                 .type = HDA_FIXUP_PINS,
6809                 .v.pins = (const struct hda_pintbl[]) {
6810                         { 0x18, 0x01a1913c }, /* headset mic w/o jack detect */
6811                         { }
6812                 },
6813                 .chained_before = true,
6814                 .chain_id = ALC269_FIXUP_HEADSET_MODE,
6815         },
6816         [ALC298_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6817                 .type = HDA_FIXUP_PINS,
6818                 .v.pins = (const struct hda_pintbl[]) {
6819                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6820                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6821                         { }
6822                 },
6823                 .chained = true,
6824                 .chain_id = ALC269_FIXUP_HEADSET_MODE
6825         },
6826         [ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE] = {
6827                 .type = HDA_FIXUP_PINS,
6828                 .v.pins = (const struct hda_pintbl[]) {
6829                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6830                         { }
6831                 },
6832                 .chained = true,
6833                 .chain_id = ALC269_FIXUP_HEADSET_MODE
6834         },
6835         [ALC275_FIXUP_DELL_XPS] = {
6836                 .type = HDA_FIXUP_VERBS,
6837                 .v.verbs = (const struct hda_verb[]) {
6838                         /* Enables internal speaker */
6839                         {0x20, AC_VERB_SET_COEF_INDEX, 0x1f},
6840                         {0x20, AC_VERB_SET_PROC_COEF, 0x00c0},
6841                         {0x20, AC_VERB_SET_COEF_INDEX, 0x30},
6842                         {0x20, AC_VERB_SET_PROC_COEF, 0x00b1},
6843                         {}
6844                 }
6845         },
6846         [ALC293_FIXUP_LENOVO_SPK_NOISE] = {
6847                 .type = HDA_FIXUP_FUNC,
6848                 .v.func = alc_fixup_disable_aamix,
6849                 .chained = true,
6850                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
6851         },
6852         [ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = {
6853                 .type = HDA_FIXUP_FUNC,
6854                 .v.func = alc233_fixup_lenovo_line2_mic_hotkey,
6855         },
6856         [ALC255_FIXUP_DELL_SPK_NOISE] = {
6857                 .type = HDA_FIXUP_FUNC,
6858                 .v.func = alc_fixup_disable_aamix,
6859                 .chained = true,
6860                 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
6861         },
6862         [ALC225_FIXUP_DISABLE_MIC_VREF] = {
6863                 .type = HDA_FIXUP_FUNC,
6864                 .v.func = alc_fixup_disable_mic_vref,
6865                 .chained = true,
6866                 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
6867         },
6868         [ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = {
6869                 .type = HDA_FIXUP_VERBS,
6870                 .v.verbs = (const struct hda_verb[]) {
6871                         /* Disable pass-through path for FRONT 14h */
6872                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
6873                         { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
6874                         {}
6875                 },
6876                 .chained = true,
6877                 .chain_id = ALC225_FIXUP_DISABLE_MIC_VREF
6878         },
6879         [ALC280_FIXUP_HP_HEADSET_MIC] = {
6880                 .type = HDA_FIXUP_FUNC,
6881                 .v.func = alc_fixup_disable_aamix,
6882                 .chained = true,
6883                 .chain_id = ALC269_FIXUP_HEADSET_MIC,
6884         },
6885         [ALC221_FIXUP_HP_FRONT_MIC] = {
6886                 .type = HDA_FIXUP_PINS,
6887                 .v.pins = (const struct hda_pintbl[]) {
6888                         { 0x19, 0x02a19020 }, /* Front Mic */
6889                         { }
6890                 },
6891         },
6892         [ALC292_FIXUP_TPT460] = {
6893                 .type = HDA_FIXUP_FUNC,
6894                 .v.func = alc_fixup_tpt440_dock,
6895                 .chained = true,
6896                 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE,
6897         },
6898         [ALC298_FIXUP_SPK_VOLUME] = {
6899                 .type = HDA_FIXUP_FUNC,
6900                 .v.func = alc298_fixup_speaker_volume,
6901                 .chained = true,
6902                 .chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
6903         },
6904         [ALC295_FIXUP_DISABLE_DAC3] = {
6905                 .type = HDA_FIXUP_FUNC,
6906                 .v.func = alc295_fixup_disable_dac3,
6907         },
6908         [ALC285_FIXUP_SPEAKER2_TO_DAC1] = {
6909                 .type = HDA_FIXUP_FUNC,
6910                 .v.func = alc285_fixup_speaker2_to_dac1,
6911                 .chained = true,
6912                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
6913         },
6914         [ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
6915                 .type = HDA_FIXUP_PINS,
6916                 .v.pins = (const struct hda_pintbl[]) {
6917                         { 0x1b, 0x90170151 },
6918                         { }
6919                 },
6920                 .chained = true,
6921                 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
6922         },
6923         [ALC269_FIXUP_ATIV_BOOK_8] = {
6924                 .type = HDA_FIXUP_FUNC,
6925                 .v.func = alc_fixup_auto_mute_via_amp,
6926                 .chained = true,
6927                 .chain_id = ALC269_FIXUP_NO_SHUTUP
6928         },
6929         [ALC221_FIXUP_HP_MIC_NO_PRESENCE] = {
6930                 .type = HDA_FIXUP_PINS,
6931                 .v.pins = (const struct hda_pintbl[]) {
6932                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6933                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
6934                         { }
6935                 },
6936                 .chained = true,
6937                 .chain_id = ALC269_FIXUP_HEADSET_MODE
6938         },
6939         [ALC256_FIXUP_ASUS_HEADSET_MODE] = {
6940                 .type = HDA_FIXUP_FUNC,
6941                 .v.func = alc_fixup_headset_mode,
6942         },
6943         [ALC256_FIXUP_ASUS_MIC] = {
6944                 .type = HDA_FIXUP_PINS,
6945                 .v.pins = (const struct hda_pintbl[]) {
6946                         { 0x13, 0x90a60160 }, /* use as internal mic */
6947                         { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
6948                         { }
6949                 },
6950                 .chained = true,
6951                 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
6952         },
6953         [ALC256_FIXUP_ASUS_AIO_GPIO2] = {
6954                 .type = HDA_FIXUP_FUNC,
6955                 /* Set up GPIO2 for the speaker amp */
6956                 .v.func = alc_fixup_gpio4,
6957         },
6958         [ALC233_FIXUP_ASUS_MIC_NO_PRESENCE] = {
6959                 .type = HDA_FIXUP_PINS,
6960                 .v.pins = (const struct hda_pintbl[]) {
6961                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
6962                         { }
6963                 },
6964                 .chained = true,
6965                 .chain_id = ALC269_FIXUP_HEADSET_MIC
6966         },
6967         [ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE] = {
6968                 .type = HDA_FIXUP_VERBS,
6969                 .v.verbs = (const struct hda_verb[]) {
6970                         /* Enables internal speaker */
6971                         {0x20, AC_VERB_SET_COEF_INDEX, 0x40},
6972                         {0x20, AC_VERB_SET_PROC_COEF, 0x8800},
6973                         {}
6974                 },
6975                 .chained = true,
6976                 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
6977         },
6978         [ALC233_FIXUP_LENOVO_MULTI_CODECS] = {
6979                 .type = HDA_FIXUP_FUNC,
6980                 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
6981         },
6982         [ALC233_FIXUP_ACER_HEADSET_MIC] = {
6983                 .type = HDA_FIXUP_VERBS,
6984                 .v.verbs = (const struct hda_verb[]) {
6985                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
6986                         { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
6987                         { }
6988                 },
6989                 .chained = true,
6990                 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
6991         },
6992         [ALC294_FIXUP_LENOVO_MIC_LOCATION] = {
6993                 .type = HDA_FIXUP_PINS,
6994                 .v.pins = (const struct hda_pintbl[]) {
6995                         /* Change the mic location from front to right, otherwise there are
6996                            two front mics with the same name, pulseaudio can't handle them.
6997                            This is just a temporary workaround, after applying this fixup,
6998                            there will be one "Front Mic" and one "Mic" in this machine.
6999                          */
7000                         { 0x1a, 0x04a19040 },
7001                         { }
7002                 },
7003         },
7004         [ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE] = {
7005                 .type = HDA_FIXUP_PINS,
7006                 .v.pins = (const struct hda_pintbl[]) {
7007                         { 0x16, 0x0101102f }, /* Rear Headset HP */
7008                         { 0x19, 0x02a1913c }, /* use as Front headset mic, without its own jack detect */
7009                         { 0x1a, 0x01a19030 }, /* Rear Headset MIC */
7010                         { 0x1b, 0x02011020 },
7011                         { }
7012                 },
7013                 .chained = true,
7014                 .chain_id = ALC225_FIXUP_S3_POP_NOISE
7015         },
7016         [ALC225_FIXUP_S3_POP_NOISE] = {
7017                 .type = HDA_FIXUP_FUNC,
7018                 .v.func = alc225_fixup_s3_pop_noise,
7019                 .chained = true,
7020                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7021         },
7022         [ALC700_FIXUP_INTEL_REFERENCE] = {
7023                 .type = HDA_FIXUP_VERBS,
7024                 .v.verbs = (const struct hda_verb[]) {
7025                         /* Enables internal speaker */
7026                         {0x20, AC_VERB_SET_COEF_INDEX, 0x45},
7027                         {0x20, AC_VERB_SET_PROC_COEF, 0x5289},
7028                         {0x20, AC_VERB_SET_COEF_INDEX, 0x4A},
7029                         {0x20, AC_VERB_SET_PROC_COEF, 0x001b},
7030                         {0x58, AC_VERB_SET_COEF_INDEX, 0x00},
7031                         {0x58, AC_VERB_SET_PROC_COEF, 0x3888},
7032                         {0x20, AC_VERB_SET_COEF_INDEX, 0x6f},
7033                         {0x20, AC_VERB_SET_PROC_COEF, 0x2c0b},
7034                         {}
7035                 }
7036         },
7037         [ALC274_FIXUP_DELL_BIND_DACS] = {
7038                 .type = HDA_FIXUP_FUNC,
7039                 .v.func = alc274_fixup_bind_dacs,
7040                 .chained = true,
7041                 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
7042         },
7043         [ALC274_FIXUP_DELL_AIO_LINEOUT_VERB] = {
7044                 .type = HDA_FIXUP_PINS,
7045                 .v.pins = (const struct hda_pintbl[]) {
7046                         { 0x1b, 0x0401102f },
7047                         { }
7048                 },
7049                 .chained = true,
7050                 .chain_id = ALC274_FIXUP_DELL_BIND_DACS
7051         },
7052         [ALC298_FIXUP_TPT470_DOCK_FIX] = {
7053                 .type = HDA_FIXUP_FUNC,
7054                 .v.func = alc_fixup_tpt470_dock,
7055                 .chained = true,
7056                 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE
7057         },
7058         [ALC298_FIXUP_TPT470_DOCK] = {
7059                 .type = HDA_FIXUP_FUNC,
7060                 .v.func = alc_fixup_tpt470_dacs,
7061                 .chained = true,
7062                 .chain_id = ALC298_FIXUP_TPT470_DOCK_FIX
7063         },
7064         [ALC255_FIXUP_DUMMY_LINEOUT_VERB] = {
7065                 .type = HDA_FIXUP_PINS,
7066                 .v.pins = (const struct hda_pintbl[]) {
7067                         { 0x14, 0x0201101f },
7068                         { }
7069                 },
7070                 .chained = true,
7071                 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
7072         },
7073         [ALC255_FIXUP_DELL_HEADSET_MIC] = {
7074                 .type = HDA_FIXUP_PINS,
7075                 .v.pins = (const struct hda_pintbl[]) {
7076                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7077                         { }
7078                 },
7079                 .chained = true,
7080                 .chain_id = ALC269_FIXUP_HEADSET_MIC
7081         },
7082         [ALC295_FIXUP_HP_X360] = {
7083                 .type = HDA_FIXUP_FUNC,
7084                 .v.func = alc295_fixup_hp_top_speakers,
7085                 .chained = true,
7086                 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC3
7087         },
7088         [ALC221_FIXUP_HP_HEADSET_MIC] = {
7089                 .type = HDA_FIXUP_PINS,
7090                 .v.pins = (const struct hda_pintbl[]) {
7091                         { 0x19, 0x0181313f},
7092                         { }
7093                 },
7094                 .chained = true,
7095                 .chain_id = ALC269_FIXUP_HEADSET_MIC
7096         },
7097         [ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = {
7098                 .type = HDA_FIXUP_FUNC,
7099                 .v.func = alc285_fixup_invalidate_dacs,
7100                 .chained = true,
7101                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
7102         },
7103         [ALC295_FIXUP_HP_AUTO_MUTE] = {
7104                 .type = HDA_FIXUP_FUNC,
7105                 .v.func = alc_fixup_auto_mute_via_amp,
7106         },
7107         [ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE] = {
7108                 .type = HDA_FIXUP_PINS,
7109                 .v.pins = (const struct hda_pintbl[]) {
7110                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7111                         { }
7112                 },
7113                 .chained = true,
7114                 .chain_id = ALC269_FIXUP_HEADSET_MIC
7115         },
7116         [ALC294_FIXUP_ASUS_MIC] = {
7117                 .type = HDA_FIXUP_PINS,
7118                 .v.pins = (const struct hda_pintbl[]) {
7119                         { 0x13, 0x90a60160 }, /* use as internal mic */
7120                         { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
7121                         { }
7122                 },
7123                 .chained = true,
7124                 .chain_id = ALC269_FIXUP_HEADSET_MIC
7125         },
7126         [ALC294_FIXUP_ASUS_HEADSET_MIC] = {
7127                 .type = HDA_FIXUP_PINS,
7128                 .v.pins = (const struct hda_pintbl[]) {
7129                         { 0x19, 0x01a1103c }, /* use as headset mic */
7130                         { }
7131                 },
7132                 .chained = true,
7133                 .chain_id = ALC269_FIXUP_HEADSET_MIC
7134         },
7135         [ALC294_FIXUP_ASUS_SPK] = {
7136                 .type = HDA_FIXUP_VERBS,
7137                 .v.verbs = (const struct hda_verb[]) {
7138                         /* Set EAPD high */
7139                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x40 },
7140                         { 0x20, AC_VERB_SET_PROC_COEF, 0x8800 },
7141                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
7142                         { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
7143                         { }
7144                 },
7145                 .chained = true,
7146                 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
7147         },
7148         [ALC295_FIXUP_CHROME_BOOK] = {
7149                 .type = HDA_FIXUP_FUNC,
7150                 .v.func = alc295_fixup_chromebook,
7151                 .chained = true,
7152                 .chain_id = ALC225_FIXUP_HEADSET_JACK
7153         },
7154         [ALC225_FIXUP_HEADSET_JACK] = {
7155                 .type = HDA_FIXUP_FUNC,
7156                 .v.func = alc_fixup_headset_jack,
7157         },
7158         [ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
7159                 .type = HDA_FIXUP_PINS,
7160                 .v.pins = (const struct hda_pintbl[]) {
7161                         { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7162                         { }
7163                 },
7164                 .chained = true,
7165                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7166         },
7167         [ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE] = {
7168                 .type = HDA_FIXUP_VERBS,
7169                 .v.verbs = (const struct hda_verb[]) {
7170                         /* Disable PCBEEP-IN passthrough */
7171                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
7172                         { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
7173                         { }
7174                 },
7175                 .chained = true,
7176                 .chain_id = ALC285_FIXUP_LENOVO_HEADPHONE_NOISE
7177         },
7178         [ALC255_FIXUP_ACER_HEADSET_MIC] = {
7179                 .type = HDA_FIXUP_PINS,
7180                 .v.pins = (const struct hda_pintbl[]) {
7181                         { 0x19, 0x03a11130 },
7182                         { 0x1a, 0x90a60140 }, /* use as internal mic */
7183                         { }
7184                 },
7185                 .chained = true,
7186                 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
7187         },
7188         [ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE] = {
7189                 .type = HDA_FIXUP_PINS,
7190                 .v.pins = (const struct hda_pintbl[]) {
7191                         { 0x16, 0x01011020 }, /* Rear Line out */
7192                         { 0x19, 0x01a1913c }, /* use as Front headset mic, without its own jack detect */
7193                         { }
7194                 },
7195                 .chained = true,
7196                 .chain_id = ALC225_FIXUP_WYSE_AUTO_MUTE
7197         },
7198         [ALC225_FIXUP_WYSE_AUTO_MUTE] = {
7199                 .type = HDA_FIXUP_FUNC,
7200                 .v.func = alc_fixup_auto_mute_via_amp,
7201                 .chained = true,
7202                 .chain_id = ALC225_FIXUP_WYSE_DISABLE_MIC_VREF
7203         },
7204         [ALC225_FIXUP_WYSE_DISABLE_MIC_VREF] = {
7205                 .type = HDA_FIXUP_FUNC,
7206                 .v.func = alc_fixup_disable_mic_vref,
7207                 .chained = true,
7208                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7209         },
7210         [ALC286_FIXUP_ACER_AIO_HEADSET_MIC] = {
7211                 .type = HDA_FIXUP_VERBS,
7212                 .v.verbs = (const struct hda_verb[]) {
7213                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x4f },
7214                         { 0x20, AC_VERB_SET_PROC_COEF, 0x5029 },
7215                         { }
7216                 },
7217                 .chained = true,
7218                 .chain_id = ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE
7219         },
7220         [ALC256_FIXUP_ASUS_HEADSET_MIC] = {
7221                 .type = HDA_FIXUP_PINS,
7222                 .v.pins = (const struct hda_pintbl[]) {
7223                         { 0x19, 0x03a11020 }, /* headset mic with jack detect */
7224                         { }
7225                 },
7226                 .chained = true,
7227                 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7228         },
7229         [ALC256_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7230                 .type = HDA_FIXUP_PINS,
7231                 .v.pins = (const struct hda_pintbl[]) {
7232                         { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
7233                         { }
7234                 },
7235                 .chained = true,
7236                 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7237         },
7238         [ALC299_FIXUP_PREDATOR_SPK] = {
7239                 .type = HDA_FIXUP_PINS,
7240                 .v.pins = (const struct hda_pintbl[]) {
7241                         { 0x21, 0x90170150 }, /* use as headset mic, without its own jack detect */
7242                         { }
7243                 }
7244         },
7245         [ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE] = {
7246                 .type = HDA_FIXUP_PINS,
7247                 .v.pins = (const struct hda_pintbl[]) {
7248                         { 0x19, 0x04a11040 },
7249                         { 0x21, 0x04211020 },
7250                         { }
7251                 },
7252                 .chained = true,
7253                 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7254         },
7255         [ALC289_FIXUP_DELL_SPK2] = {
7256                 .type = HDA_FIXUP_PINS,
7257                 .v.pins = (const struct hda_pintbl[]) {
7258                         { 0x17, 0x90170130 }, /* bass spk */
7259                         { }
7260                 },
7261                 .chained = true,
7262                 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
7263         },
7264         [ALC289_FIXUP_DUAL_SPK] = {
7265                 .type = HDA_FIXUP_FUNC,
7266                 .v.func = alc285_fixup_speaker2_to_dac1,
7267                 .chained = true,
7268                 .chain_id = ALC289_FIXUP_DELL_SPK2
7269         },
7270         [ALC294_FIXUP_SPK2_TO_DAC1] = {
7271                 .type = HDA_FIXUP_FUNC,
7272                 .v.func = alc285_fixup_speaker2_to_dac1,
7273                 .chained = true,
7274                 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
7275         },
7276         [ALC294_FIXUP_ASUS_DUAL_SPK] = {
7277                 .type = HDA_FIXUP_FUNC,
7278                 /* The GPIO must be pulled to initialize the AMP */
7279                 .v.func = alc_fixup_gpio4,
7280                 .chained = true,
7281                 .chain_id = ALC294_FIXUP_SPK2_TO_DAC1
7282         },
7283         [ALC285_FIXUP_THINKPAD_HEADSET_JACK] = {
7284                 .type = HDA_FIXUP_FUNC,
7285                 .v.func = alc_fixup_headset_jack,
7286                 .chained = true,
7287                 .chain_id = ALC285_FIXUP_SPEAKER2_TO_DAC1
7288         },
7289         [ALC294_FIXUP_ASUS_HPE] = {
7290                 .type = HDA_FIXUP_VERBS,
7291                 .v.verbs = (const struct hda_verb[]) {
7292                         /* Set EAPD high */
7293                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
7294                         { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
7295                         { }
7296                 },
7297                 .chained = true,
7298                 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
7299         },
7300         [ALC294_FIXUP_ASUS_COEF_1B] = {
7301                 .type = HDA_FIXUP_VERBS,
7302                 .v.verbs = (const struct hda_verb[]) {
7303                         /* Set bit 10 to correct noisy output after reboot from
7304                          * Windows 10 (due to pop noise reduction?)
7305                          */
7306                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x1b },
7307                         { 0x20, AC_VERB_SET_PROC_COEF, 0x4e4b },
7308                         { }
7309                 },
7310         },
7311         [ALC285_FIXUP_HP_GPIO_LED] = {
7312                 .type = HDA_FIXUP_FUNC,
7313                 .v.func = alc285_fixup_hp_gpio_led,
7314         },
7315         [ALC285_FIXUP_HP_MUTE_LED] = {
7316                 .type = HDA_FIXUP_FUNC,
7317                 .v.func = alc285_fixup_hp_mute_led,
7318         },
7319         [ALC236_FIXUP_HP_MUTE_LED] = {
7320                 .type = HDA_FIXUP_FUNC,
7321                 .v.func = alc236_fixup_hp_mute_led,
7322         },
7323         [ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
7324                 .type = HDA_FIXUP_VERBS,
7325                 .v.verbs = (const struct hda_verb[]) {
7326                         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc5 },
7327                         { }
7328                 },
7329         },
7330         [ALC295_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7331                 .type = HDA_FIXUP_PINS,
7332                 .v.pins = (const struct hda_pintbl[]) {
7333                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7334                         { }
7335                 },
7336                 .chained = true,
7337                 .chain_id = ALC269_FIXUP_HEADSET_MODE
7338         },
7339         [ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS] = {
7340                 .type = HDA_FIXUP_PINS,
7341                 .v.pins = (const struct hda_pintbl[]) {
7342                         { 0x14, 0x90100120 }, /* use as internal speaker */
7343                         { 0x18, 0x02a111f0 }, /* use as headset mic, without its own jack detect */
7344                         { 0x1a, 0x01011020 }, /* use as line out */
7345                         { },
7346                 },
7347                 .chained = true,
7348                 .chain_id = ALC269_FIXUP_HEADSET_MIC
7349         },
7350         [ALC269VC_FIXUP_ACER_HEADSET_MIC] = {
7351                 .type = HDA_FIXUP_PINS,
7352                 .v.pins = (const struct hda_pintbl[]) {
7353                         { 0x18, 0x02a11030 }, /* use as headset mic */
7354                         { }
7355                 },
7356                 .chained = true,
7357                 .chain_id = ALC269_FIXUP_HEADSET_MIC
7358         },
7359         [ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE] = {
7360                 .type = HDA_FIXUP_PINS,
7361                 .v.pins = (const struct hda_pintbl[]) {
7362                         { 0x18, 0x01a11130 }, /* use as headset mic, without its own jack detect */
7363                         { }
7364                 },
7365                 .chained = true,
7366                 .chain_id = ALC269_FIXUP_HEADSET_MIC
7367         },
7368         [ALC289_FIXUP_ASUS_GA401] = {
7369                 .type = HDA_FIXUP_PINS,
7370                 .v.pins = (const struct hda_pintbl[]) {
7371                         { 0x19, 0x03a11020 }, /* headset mic with jack detect */
7372                         { }
7373                 },
7374         },
7375         [ALC289_FIXUP_ASUS_GA502] = {
7376                 .type = HDA_FIXUP_PINS,
7377                 .v.pins = (const struct hda_pintbl[]) {
7378                         { 0x19, 0x03a11020 }, /* headset mic with jack detect */
7379                         { }
7380                 },
7381         },
7382         [ALC256_FIXUP_ACER_MIC_NO_PRESENCE] = {
7383                 .type = HDA_FIXUP_PINS,
7384                 .v.pins = (const struct hda_pintbl[]) {
7385                         { 0x19, 0x02a11120 }, /* use as headset mic, without its own jack detect */
7386                         { }
7387                 },
7388                 .chained = true,
7389                 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
7390         },
7391         [ALC285_FIXUP_HP_GPIO_AMP_INIT] = {
7392                 .type = HDA_FIXUP_FUNC,
7393                 .v.func = alc285_fixup_hp_gpio_amp_init,
7394                 .chained = true,
7395                 .chain_id = ALC285_FIXUP_HP_GPIO_LED
7396         },
7397         [ALC269_FIXUP_CZC_B20] = {
7398                 .type = HDA_FIXUP_PINS,
7399                 .v.pins = (const struct hda_pintbl[]) {
7400                         { 0x12, 0x411111f0 },
7401                         { 0x14, 0x90170110 }, /* speaker */
7402                         { 0x15, 0x032f1020 }, /* HP out */
7403                         { 0x17, 0x411111f0 },
7404                         { 0x18, 0x03ab1040 }, /* mic */
7405                         { 0x19, 0xb7a7013f },
7406                         { 0x1a, 0x0181305f },
7407                         { 0x1b, 0x411111f0 },
7408                         { 0x1d, 0x411111f0 },
7409                         { 0x1e, 0x411111f0 },
7410                         { }
7411                 },
7412                 .chain_id = ALC269_FIXUP_DMIC,
7413         },
7414         [ALC269_FIXUP_CZC_TMI] = {
7415                 .type = HDA_FIXUP_PINS,
7416                 .v.pins = (const struct hda_pintbl[]) {
7417                         { 0x12, 0x4000c000 },
7418                         { 0x14, 0x90170110 }, /* speaker */
7419                         { 0x15, 0x0421401f }, /* HP out */
7420                         { 0x17, 0x411111f0 },
7421                         { 0x18, 0x04a19020 }, /* mic */
7422                         { 0x19, 0x411111f0 },
7423                         { 0x1a, 0x411111f0 },
7424                         { 0x1b, 0x411111f0 },
7425                         { 0x1d, 0x40448505 },
7426                         { 0x1e, 0x411111f0 },
7427                         { 0x20, 0x8000ffff },
7428                         { }
7429                 },
7430                 .chain_id = ALC269_FIXUP_DMIC,
7431         },
7432         [ALC269_FIXUP_CZC_L101] = {
7433                 .type = HDA_FIXUP_PINS,
7434                 .v.pins = (const struct hda_pintbl[]) {
7435                         { 0x12, 0x40000000 },
7436                         { 0x14, 0x01014010 }, /* speaker */
7437                         { 0x15, 0x411111f0 }, /* HP out */
7438                         { 0x16, 0x411111f0 },
7439                         { 0x18, 0x01a19020 }, /* mic */
7440                         { 0x19, 0x02a19021 },
7441                         { 0x1a, 0x0181302f },
7442                         { 0x1b, 0x0221401f },
7443                         { 0x1c, 0x411111f0 },
7444                         { 0x1d, 0x4044c601 },
7445                         { 0x1e, 0x411111f0 },
7446                         { }
7447                 },
7448                 .chain_id = ALC269_FIXUP_DMIC,
7449         },
7450         [ALC269_FIXUP_LEMOTE_A1802] = {
7451                 .type = HDA_FIXUP_PINS,
7452                 .v.pins = (const struct hda_pintbl[]) {
7453                         { 0x12, 0x40000000 },
7454                         { 0x14, 0x90170110 }, /* speaker */
7455                         { 0x17, 0x411111f0 },
7456                         { 0x18, 0x03a19040 }, /* mic1 */
7457                         { 0x19, 0x90a70130 }, /* mic2 */
7458                         { 0x1a, 0x411111f0 },
7459                         { 0x1b, 0x411111f0 },
7460                         { 0x1d, 0x40489d2d },
7461                         { 0x1e, 0x411111f0 },
7462                         { 0x20, 0x0003ffff },
7463                         { 0x21, 0x03214020 },
7464                         { }
7465                 },
7466                 .chain_id = ALC269_FIXUP_DMIC,
7467         },
7468         [ALC269_FIXUP_LEMOTE_A190X] = {
7469                 .type = HDA_FIXUP_PINS,
7470                 .v.pins = (const struct hda_pintbl[]) {
7471                         { 0x14, 0x99130110 }, /* speaker */
7472                         { 0x15, 0x0121401f }, /* HP out */
7473                         { 0x18, 0x01a19c20 }, /* rear  mic */
7474                         { 0x19, 0x99a3092f }, /* front mic */
7475                         { 0x1b, 0x0201401f }, /* front lineout */
7476                         { }
7477                 },
7478                 .chain_id = ALC269_FIXUP_DMIC,
7479         },
7480         [ALC256_FIXUP_INTEL_NUC8_RUGGED] = {
7481                 .type = HDA_FIXUP_PINS,
7482                 .v.pins = (const struct hda_pintbl[]) {
7483                         { 0x1b, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7484                         { }
7485                 },
7486                 .chained = true,
7487                 .chain_id = ALC269_FIXUP_HEADSET_MODE
7488         },
7489 };
7490
7491 static const struct snd_pci_quirk alc269_fixup_tbl[] = {
7492         SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC),
7493         SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC),
7494         SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC),
7495         SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700),
7496         SND_PCI_QUIRK(0x1025, 0x072d, "Acer Aspire V5-571G", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
7497         SND_PCI_QUIRK(0x1025, 0x080d, "Acer Aspire V5-122P", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
7498         SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK),
7499         SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK),
7500         SND_PCI_QUIRK(0x1025, 0x0762, "Acer Aspire E1-472", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
7501         SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
7502         SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),
7503         SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE),
7504         SND_PCI_QUIRK(0x1025, 0x1065, "Acer Aspire C20-820", ALC269VC_FIXUP_ACER_HEADSET_MIC),
7505         SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),
7506         SND_PCI_QUIRK(0x1025, 0x1099, "Acer Aspire E5-523G", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
7507         SND_PCI_QUIRK(0x1025, 0x110e, "Acer Aspire ES1-432", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
7508         SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", ALC299_FIXUP_PREDATOR_SPK),
7509         SND_PCI_QUIRK(0x1025, 0x1247, "Acer vCopperbox", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),
7510         SND_PCI_QUIRK(0x1025, 0x1248, "Acer Veriton N4660G", ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE),
7511         SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
7512         SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
7513         SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
7514         SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
7515         SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC),
7516         SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),
7517         SND_PCI_QUIRK(0x1025, 0x1430, "Acer TravelMate B311R-31", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
7518         SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
7519         SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),
7520         SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X),
7521         SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X),
7522         SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X),
7523         SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X),
7524         SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
7525         SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
7526         SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
7527         SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
7528         SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
7529         SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
7530         SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X),
7531         SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X),
7532         SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
7533         SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7534         SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7535         SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),
7536         SND_PCI_QUIRK(0x1028, 0x0669, "Dell Optiplex 9020m", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
7537         SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
7538         SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
7539         SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7540         SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7541         SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7542         SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7543         SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7544         SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7545         SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
7546         SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
7547         SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE),
7548         SND_PCI_QUIRK(0x1028, 0x0738, "Dell Precision 5820", ALC269_FIXUP_NO_SHUTUP),
7549         SND_PCI_QUIRK(0x1028, 0x075c, "Dell XPS 27 7760", ALC298_FIXUP_SPK_VOLUME),
7550         SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME),
7551         SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3),
7552         SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
7553         SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE),
7554         SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
7555         SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
7556         SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
7557         SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
7558         SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB),
7559         SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE),
7560         SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE),
7561         SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
7562         SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
7563         SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
7564         SND_PCI_QUIRK(0x1028, 0x098d, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
7565         SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
7566         SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7567         SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
7568         SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
7569         SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
7570         SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
7571         SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
7572         /* ALC282 */
7573         SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7574         SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7575         SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7576         SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
7577         SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
7578         SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
7579         SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
7580         SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
7581         SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7582         SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7583         SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7584         SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7585         SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED),
7586         SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS),
7587         SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS),
7588         SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7589         SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7590         SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7591         SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7592         SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7593         SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),
7594         SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7595         SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7596         /* ALC290 */
7597         SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7598         SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7599         SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7600         SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7601         SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7602         SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7603         SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7604         SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7605         SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7606         SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
7607         SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7608         SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7609         SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7610         SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7611         SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7612         SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7613         SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
7614         SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7615         SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7616         SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7617         SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7618         SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7619         SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7620         SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7621         SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7622         SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7623         SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7624         SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7625         SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
7626         SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC),
7627         SND_PCI_QUIRK(0x103c, 0x802e, "HP Z240 SFF", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
7628         SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
7629         SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
7630         SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
7631         SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),
7632         SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
7633         SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
7634         SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
7635         SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
7636         SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
7637         SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),
7638         SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED),
7639         SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT),
7640         SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED),
7641         SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED),
7642         SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
7643         SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
7644         SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
7645         SND_PCI_QUIRK(0x1043, 0x10a1, "ASUS UX391UA", ALC294_FIXUP_ASUS_SPK),
7646         SND_PCI_QUIRK(0x1043, 0x10c0, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
7647         SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
7648         SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
7649         SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
7650         SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
7651         SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
7652         SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
7653         SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
7654         SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
7655         SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
7656         SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
7657         SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
7658         SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK),
7659         SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC),
7660         SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC),
7661         SND_PCI_QUIRK(0x1043, 0x194e, "ASUS UX563FD", ALC294_FIXUP_ASUS_HPE),
7662         SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE),
7663         SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE),
7664         SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
7665         SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
7666         SND_PCI_QUIRK(0x1043, 0x1b11, "ASUS UX431DA", ALC294_FIXUP_ASUS_COEF_1B),
7667         SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC),
7668         SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
7669         SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
7670         SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
7671         SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502),
7672         SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),
7673         SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
7674         SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
7675         SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
7676         SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
7677         SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
7678         SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
7679         SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
7680         SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
7681         SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
7682         SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
7683         SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
7684         SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),
7685         SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
7686         SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),
7687         SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),
7688         SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN),
7689         SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),
7690         SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
7691         SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE),
7692         SND_PCI_QUIRK(0x10ec, 0x1230, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
7693         SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_HEADSET_MODE),
7694         SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
7695         SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
7696         SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
7697         SND_PCI_QUIRK(0x144d, 0xc189, "Samsung Galaxy Flex Book (NT950QCG-X716)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
7698         SND_PCI_QUIRK(0x144d, 0xc18a, "Samsung Galaxy Book Ion (NT950XCJ-X716A)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
7699         SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
7700         SND_PCI_QUIRK(0x144d, 0xc812, "Samsung Notebook Pen S (NT950SBE-X58)", ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
7701         SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
7702         SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
7703         SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
7704         SND_PCI_QUIRK(0x1558, 0x1325, "System76 Darter Pro (darp5)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
7705         SND_PCI_QUIRK(0x1558, 0x8550, "System76 Gazelle (gaze14)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
7706         SND_PCI_QUIRK(0x1558, 0x8551, "System76 Gazelle (gaze14)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
7707         SND_PCI_QUIRK(0x1558, 0x8560, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
7708         SND_PCI_QUIRK(0x1558, 0x8561, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
7709         SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
7710         SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
7711         SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
7712         SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
7713         SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
7714         SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
7715         SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
7716         SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST),
7717         SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
7718         SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
7719         SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
7720         SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
7721         SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
7722         SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440),
7723         SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK),
7724         SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK),
7725         SND_PCI_QUIRK(0x17aa, 0x2211, "Thinkpad W541", ALC292_FIXUP_TPT440_DOCK),
7726         SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),
7727         SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK),
7728         SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
7729         SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK),
7730         SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
7731         SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
7732         SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7733         SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7734         SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460),
7735         SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),
7736         SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK),
7737         SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7738         SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7739         SND_PCI_QUIRK(0x17aa, 0x2249, "Thinkpad", ALC292_FIXUP_TPT460),
7740         SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7741         SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7742         SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7743         SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
7744         SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
7745         SND_PCI_QUIRK(0x17aa, 0x22be, "Thinkpad X1 Carbon 8th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
7746         SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
7747         SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
7748         SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
7749         SND_PCI_QUIRK(0x17aa, 0x3111, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
7750         SND_PCI_QUIRK(0x17aa, 0x312a, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
7751         SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
7752         SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
7753         SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
7754         SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
7755         SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
7756         SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
7757         SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
7758         SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
7759         SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
7760         SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
7761         SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
7762         SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
7763         SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK),
7764         SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK),
7765         SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK),
7766         SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK),
7767         SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
7768         SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),
7769         SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),
7770         SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460),
7771         SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7772         SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7773         SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7774         SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
7775         SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7776         SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
7777         SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
7778         SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
7779         SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
7780         SND_PCI_QUIRK(0x1b35, 0x1235, "CZC B20", ALC269_FIXUP_CZC_B20),
7781         SND_PCI_QUIRK(0x1b35, 0x1236, "CZC TMI", ALC269_FIXUP_CZC_TMI),
7782         SND_PCI_QUIRK(0x1b35, 0x1237, "CZC L101", ALC269_FIXUP_CZC_L101),
7783         SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
7784         SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC),
7785         SND_PCI_QUIRK(0x10ec, 0x118c, "Medion EE4254 MD62100", ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE),
7786         SND_PCI_QUIRK(0x1c06, 0x2013, "Lemote A1802", ALC269_FIXUP_LEMOTE_A1802),
7787         SND_PCI_QUIRK(0x1c06, 0x2015, "Lemote A190X", ALC269_FIXUP_LEMOTE_A190X),
7788         SND_PCI_QUIRK(0x8086, 0x2080, "Intel NUC 8 Rugged", ALC256_FIXUP_INTEL_NUC8_RUGGED),
7789
7790 #if 0
7791         /* Below is a quirk table taken from the old code.
7792          * Basically the device should work as is without the fixup table.
7793          * If BIOS doesn't give a proper info, enable the corresponding
7794          * fixup entry.
7795          */
7796         SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
7797                       ALC269_FIXUP_AMIC),
7798         SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
7799         SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),
7800         SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),
7801         SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),
7802         SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC),
7803         SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC),
7804         SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC),
7805         SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC),
7806         SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC),
7807         SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC),
7808         SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC),
7809         SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC),
7810         SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC),
7811         SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC),
7812         SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC),
7813         SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC),
7814         SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC),
7815         SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC),
7816         SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC),
7817         SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC),
7818         SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC),
7819         SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC),
7820         SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC),
7821         SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC),
7822         SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC),
7823         SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC),
7824         SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC),
7825         SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC),
7826         SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC),
7827         SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC),
7828         SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC),
7829         SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC),
7830         SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC),
7831         SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC),
7832         SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC),
7833         SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC),
7834         SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC),
7835         SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC),
7836         SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC),
7837 #endif
7838         {}
7839 };
7840
7841 static const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = {
7842         SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
7843         SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),
7844         SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
7845         SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI),
7846         SND_PCI_QUIRK_VENDOR(0x19e5, "Huawei Matebook", ALC255_FIXUP_MIC_MUTE_LED),
7847         {}
7848 };
7849
7850 static const struct hda_model_fixup alc269_fixup_models[] = {
7851         {.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
7852         {.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
7853         {.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},
7854         {.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},
7855         {.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
7856         {.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"},
7857         {.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"},
7858         {.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"},
7859         {.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
7860         {.id = ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST, .name = "lenovo-dock-limit-boost"},
7861         {.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
7862         {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"},
7863         {.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
7864         {.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
7865         {.id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, .name = "dell-headset3"},
7866         {.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, .name = "dell-headset4"},
7867         {.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
7868         {.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},
7869         {.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
7870         {.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
7871         {.id = ALC292_FIXUP_TPT460, .name = "tpt460"},
7872         {.id = ALC298_FIXUP_TPT470_DOCK_FIX, .name = "tpt470-dock-fix"},
7873         {.id = ALC298_FIXUP_TPT470_DOCK, .name = "tpt470-dock"},
7874         {.id = ALC233_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
7875         {.id = ALC700_FIXUP_INTEL_REFERENCE, .name = "alc700-ref"},
7876         {.id = ALC269_FIXUP_SONY_VAIO, .name = "vaio"},
7877         {.id = ALC269_FIXUP_DELL_M101Z, .name = "dell-m101z"},
7878         {.id = ALC269_FIXUP_ASUS_G73JW, .name = "asus-g73jw"},
7879         {.id = ALC269_FIXUP_LENOVO_EAPD, .name = "lenovo-eapd"},
7880         {.id = ALC275_FIXUP_SONY_HWEQ, .name = "sony-hweq"},
7881         {.id = ALC269_FIXUP_PCM_44K, .name = "pcm44k"},
7882         {.id = ALC269_FIXUP_LIFEBOOK, .name = "lifebook"},
7883         {.id = ALC269_FIXUP_LIFEBOOK_EXTMIC, .name = "lifebook-extmic"},
7884         {.id = ALC269_FIXUP_LIFEBOOK_HP_PIN, .name = "lifebook-hp-pin"},
7885         {.id = ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC, .name = "lifebook-u7x7"},
7886         {.id = ALC269VB_FIXUP_AMIC, .name = "alc269vb-amic"},
7887         {.id = ALC269VB_FIXUP_DMIC, .name = "alc269vb-dmic"},
7888         {.id = ALC269_FIXUP_HP_MUTE_LED_MIC1, .name = "hp-mute-led-mic1"},
7889         {.id = ALC269_FIXUP_HP_MUTE_LED_MIC2, .name = "hp-mute-led-mic2"},
7890         {.id = ALC269_FIXUP_HP_MUTE_LED_MIC3, .name = "hp-mute-led-mic3"},
7891         {.id = ALC269_FIXUP_HP_GPIO_MIC1_LED, .name = "hp-gpio-mic1"},
7892         {.id = ALC269_FIXUP_HP_LINE1_MIC1_LED, .name = "hp-line1-mic1"},
7893         {.id = ALC269_FIXUP_NO_SHUTUP, .name = "noshutup"},
7894         {.id = ALC286_FIXUP_SONY_MIC_NO_PRESENCE, .name = "sony-nomic"},
7895         {.id = ALC269_FIXUP_ASPIRE_HEADSET_MIC, .name = "aspire-headset-mic"},
7896         {.id = ALC269_FIXUP_ASUS_X101, .name = "asus-x101"},
7897         {.id = ALC271_FIXUP_HP_GATE_MIC_JACK, .name = "acer-ao7xx"},
7898         {.id = ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572, .name = "acer-aspire-e1"},
7899         {.id = ALC269_FIXUP_ACER_AC700, .name = "acer-ac700"},
7900         {.id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST, .name = "limit-mic-boost"},
7901         {.id = ALC269VB_FIXUP_ASUS_ZENBOOK, .name = "asus-zenbook"},
7902         {.id = ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A, .name = "asus-zenbook-ux31a"},
7903         {.id = ALC269VB_FIXUP_ORDISSIMO_EVE2, .name = "ordissimo"},
7904         {.id = ALC282_FIXUP_ASUS_TX300, .name = "asus-tx300"},
7905         {.id = ALC283_FIXUP_INT_MIC, .name = "alc283-int-mic"},
7906         {.id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK, .name = "mono-speakers"},
7907         {.id = ALC290_FIXUP_SUBWOOFER_HSJACK, .name = "alc290-subwoofer"},
7908         {.id = ALC269_FIXUP_THINKPAD_ACPI, .name = "thinkpad"},
7909         {.id = ALC269_FIXUP_DMIC_THINKPAD_ACPI, .name = "dmic-thinkpad"},
7910         {.id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE, .name = "alc255-acer"},
7911         {.id = ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc255-asus"},
7912         {.id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc255-dell1"},
7913         {.id = ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "alc255-dell2"},
7914         {.id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc293-dell1"},
7915         {.id = ALC283_FIXUP_HEADSET_MIC, .name = "alc283-headset"},
7916         {.id = ALC255_FIXUP_MIC_MUTE_LED, .name = "alc255-dell-mute"},
7917         {.id = ALC282_FIXUP_ASPIRE_V5_PINS, .name = "aspire-v5"},
7918         {.id = ALC280_FIXUP_HP_GPIO4, .name = "hp-gpio4"},
7919         {.id = ALC286_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
7920         {.id = ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, .name = "hp-gpio2-hotkey"},
7921         {.id = ALC280_FIXUP_HP_DOCK_PINS, .name = "hp-dock-pins"},
7922         {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic"},
7923         {.id = ALC280_FIXUP_HP_9480M, .name = "hp-9480m"},
7924         {.id = ALC288_FIXUP_DELL_HEADSET_MODE, .name = "alc288-dell-headset"},
7925         {.id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc288-dell1"},
7926         {.id = ALC288_FIXUP_DELL_XPS_13, .name = "alc288-dell-xps13"},
7927         {.id = ALC292_FIXUP_DELL_E7X, .name = "dell-e7x"},
7928         {.id = ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK, .name = "alc293-dell"},
7929         {.id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc298-dell1"},
7930         {.id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, .name = "alc298-dell-aio"},
7931         {.id = ALC275_FIXUP_DELL_XPS, .name = "alc275-dell-xps"},
7932         {.id = ALC293_FIXUP_LENOVO_SPK_NOISE, .name = "lenovo-spk-noise"},
7933         {.id = ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, .name = "lenovo-hotkey"},
7934         {.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"},
7935         {.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc225-dell1"},
7936         {.id = ALC295_FIXUP_DISABLE_DAC3, .name = "alc295-disable-dac3"},
7937         {.id = ALC285_FIXUP_SPEAKER2_TO_DAC1, .name = "alc285-speaker2-to-dac1"},
7938         {.id = ALC280_FIXUP_HP_HEADSET_MIC, .name = "alc280-hp-headset"},
7939         {.id = ALC221_FIXUP_HP_FRONT_MIC, .name = "alc221-hp-mic"},
7940         {.id = ALC298_FIXUP_SPK_VOLUME, .name = "alc298-spk-volume"},
7941         {.id = ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER, .name = "dell-inspiron-7559"},
7942         {.id = ALC269_FIXUP_ATIV_BOOK_8, .name = "ativ-book"},
7943         {.id = ALC221_FIXUP_HP_MIC_NO_PRESENCE, .name = "alc221-hp-mic"},
7944         {.id = ALC256_FIXUP_ASUS_HEADSET_MODE, .name = "alc256-asus-headset"},
7945         {.id = ALC256_FIXUP_ASUS_MIC, .name = "alc256-asus-mic"},
7946         {.id = ALC256_FIXUP_ASUS_AIO_GPIO2, .name = "alc256-asus-aio"},
7947         {.id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc233-asus"},
7948         {.id = ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE, .name = "alc233-eapd"},
7949         {.id = ALC294_FIXUP_LENOVO_MIC_LOCATION, .name = "alc294-lenovo-mic"},
7950         {.id = ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE, .name = "alc225-wyse"},
7951         {.id = ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, .name = "alc274-dell-aio"},
7952         {.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"},
7953         {.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"},
7954         {.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"},
7955         {.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-headset-jack"},
7956         {.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-chrome-book"},
7957         {.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"},
7958         {.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"},
7959         {.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"},
7960         {.id = ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, .name = "alc298-samsung-headphone"},
7961         {}
7962 };
7963 #define ALC225_STANDARD_PINS \
7964         {0x21, 0x04211020}
7965
7966 #define ALC256_STANDARD_PINS \
7967         {0x12, 0x90a60140}, \
7968         {0x14, 0x90170110}, \
7969         {0x21, 0x02211020}
7970
7971 #define ALC282_STANDARD_PINS \
7972         {0x14, 0x90170110}
7973
7974 #define ALC290_STANDARD_PINS \
7975         {0x12, 0x99a30130}
7976
7977 #define ALC292_STANDARD_PINS \
7978         {0x14, 0x90170110}, \
7979         {0x15, 0x0221401f}
7980
7981 #define ALC295_STANDARD_PINS \
7982         {0x12, 0xb7a60130}, \
7983         {0x14, 0x90170110}, \
7984         {0x21, 0x04211020}
7985
7986 #define ALC298_STANDARD_PINS \
7987         {0x12, 0x90a60130}, \
7988         {0x21, 0x03211020}
7989
7990 static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
7991         SND_HDA_PIN_QUIRK(0x10ec0221, 0x103c, "HP Workstation", ALC221_FIXUP_HP_HEADSET_MIC,
7992                 {0x14, 0x01014020},
7993                 {0x17, 0x90170110},
7994                 {0x18, 0x02a11030},
7995                 {0x19, 0x0181303F},
7996                 {0x21, 0x0221102f}),
7997         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
7998                 {0x12, 0x90a601c0},
7999                 {0x14, 0x90171120},
8000                 {0x21, 0x02211030}),
8001         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
8002                 {0x14, 0x90170110},
8003                 {0x1b, 0x90a70130},
8004                 {0x21, 0x03211020}),
8005         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
8006                 {0x1a, 0x90a70130},
8007                 {0x1b, 0x90170110},
8008                 {0x21, 0x03211020}),
8009         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
8010                 ALC225_STANDARD_PINS,
8011                 {0x12, 0xb7a60130},
8012                 {0x14, 0x901701a0}),
8013         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
8014                 ALC225_STANDARD_PINS,
8015                 {0x12, 0xb7a60130},
8016                 {0x14, 0x901701b0}),
8017         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
8018                 ALC225_STANDARD_PINS,
8019                 {0x12, 0xb7a60150},
8020                 {0x14, 0x901701a0}),
8021         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
8022                 ALC225_STANDARD_PINS,
8023                 {0x12, 0xb7a60150},
8024                 {0x14, 0x901701b0}),
8025         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
8026                 ALC225_STANDARD_PINS,
8027                 {0x12, 0xb7a60130},
8028                 {0x1b, 0x90170110}),
8029         SND_HDA_PIN_QUIRK(0x10ec0233, 0x8086, "Intel NUC Skull Canyon", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8030                 {0x1b, 0x01111010},
8031                 {0x1e, 0x01451130},
8032                 {0x21, 0x02211020}),
8033         SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
8034                 {0x12, 0x90a60140},
8035                 {0x14, 0x90170110},
8036                 {0x19, 0x02a11030},
8037                 {0x21, 0x02211020}),
8038         SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
8039                 {0x14, 0x90170110},
8040                 {0x19, 0x02a11030},
8041                 {0x1a, 0x02a11040},
8042                 {0x1b, 0x01014020},
8043                 {0x21, 0x0221101f}),
8044         SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
8045                 {0x14, 0x90170110},
8046                 {0x19, 0x02a11030},
8047                 {0x1a, 0x02a11040},
8048                 {0x1b, 0x01011020},
8049                 {0x21, 0x0221101f}),
8050         SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
8051                 {0x14, 0x90170110},
8052                 {0x19, 0x02a11020},
8053                 {0x1a, 0x02a11030},
8054                 {0x21, 0x0221101f}),
8055         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
8056                 {0x14, 0x90170110},
8057                 {0x21, 0x02211020}),
8058         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8059                 {0x14, 0x90170130},
8060                 {0x21, 0x02211040}),
8061         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8062                 {0x12, 0x90a60140},
8063                 {0x14, 0x90170110},
8064                 {0x21, 0x02211020}),
8065         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8066                 {0x12, 0x90a60160},
8067                 {0x14, 0x90170120},
8068                 {0x21, 0x02211030}),
8069         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8070                 {0x14, 0x90170110},
8071                 {0x1b, 0x02011020},
8072                 {0x21, 0x0221101f}),
8073         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8074                 {0x14, 0x90170110},
8075                 {0x1b, 0x01011020},
8076                 {0x21, 0x0221101f}),
8077         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8078                 {0x14, 0x90170130},
8079                 {0x1b, 0x01014020},
8080                 {0x21, 0x0221103f}),
8081         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8082                 {0x14, 0x90170130},
8083                 {0x1b, 0x01011020},
8084                 {0x21, 0x0221103f}),
8085         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8086                 {0x14, 0x90170130},
8087                 {0x1b, 0x02011020},
8088                 {0x21, 0x0221103f}),
8089         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8090                 {0x14, 0x90170150},
8091                 {0x1b, 0x02011020},
8092                 {0x21, 0x0221105f}),
8093         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8094                 {0x14, 0x90170110},
8095                 {0x1b, 0x01014020},
8096                 {0x21, 0x0221101f}),
8097         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8098                 {0x12, 0x90a60160},
8099                 {0x14, 0x90170120},
8100                 {0x17, 0x90170140},
8101                 {0x21, 0x0321102f}),
8102         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8103                 {0x12, 0x90a60160},
8104                 {0x14, 0x90170130},
8105                 {0x21, 0x02211040}),
8106         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8107                 {0x12, 0x90a60160},
8108                 {0x14, 0x90170140},
8109                 {0x21, 0x02211050}),
8110         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8111                 {0x12, 0x90a60170},
8112                 {0x14, 0x90170120},
8113                 {0x21, 0x02211030}),
8114         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8115                 {0x12, 0x90a60170},
8116                 {0x14, 0x90170130},
8117                 {0x21, 0x02211040}),
8118         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8119                 {0x12, 0x90a60170},
8120                 {0x14, 0x90171130},
8121                 {0x21, 0x02211040}),
8122         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8123                 {0x12, 0x90a60170},
8124                 {0x14, 0x90170140},
8125                 {0x21, 0x02211050}),
8126         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8127                 {0x12, 0x90a60180},
8128                 {0x14, 0x90170130},
8129                 {0x21, 0x02211040}),
8130         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5565", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8131                 {0x12, 0x90a60180},
8132                 {0x14, 0x90170120},
8133                 {0x21, 0x02211030}),
8134         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8135                 {0x1b, 0x01011020},
8136                 {0x21, 0x02211010}),
8137         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
8138                 {0x14, 0x90170110},
8139                 {0x1b, 0x90a70130},
8140                 {0x21, 0x04211020}),
8141         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
8142                 {0x14, 0x90170110},
8143                 {0x1b, 0x90a70130},
8144                 {0x21, 0x03211020}),
8145         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
8146                 {0x12, 0x90a60130},
8147                 {0x14, 0x90170110},
8148                 {0x21, 0x03211020}),
8149         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
8150                 {0x12, 0x90a60130},
8151                 {0x14, 0x90170110},
8152                 {0x21, 0x04211020}),
8153         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
8154                 {0x1a, 0x90a70130},
8155                 {0x1b, 0x90170110},
8156                 {0x21, 0x03211020}),
8157         SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
8158                 {0x12, 0x90a60130},
8159                 {0x14, 0x90170110},
8160                 {0x15, 0x0421101f},
8161                 {0x1a, 0x04a11020}),
8162         SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED,
8163                 {0x12, 0x90a60140},
8164                 {0x14, 0x90170110},
8165                 {0x15, 0x0421101f},
8166                 {0x18, 0x02811030},
8167                 {0x1a, 0x04a1103f},
8168                 {0x1b, 0x02011020}),
8169         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1,
8170                 ALC282_STANDARD_PINS,
8171                 {0x12, 0x99a30130},
8172                 {0x19, 0x03a11020},
8173                 {0x21, 0x0321101f}),
8174         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
8175                 ALC282_STANDARD_PINS,
8176                 {0x12, 0x99a30130},
8177                 {0x19, 0x03a11020},
8178                 {0x21, 0x03211040}),
8179         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
8180                 ALC282_STANDARD_PINS,
8181                 {0x12, 0x99a30130},
8182                 {0x19, 0x03a11030},
8183                 {0x21, 0x03211020}),
8184         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
8185                 ALC282_STANDARD_PINS,
8186                 {0x12, 0x99a30130},
8187                 {0x19, 0x04a11020},
8188                 {0x21, 0x0421101f}),
8189         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED,
8190                 ALC282_STANDARD_PINS,
8191                 {0x12, 0x90a60140},
8192                 {0x19, 0x04a11030},
8193                 {0x21, 0x04211020}),
8194         SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8195                 ALC282_STANDARD_PINS,
8196                 {0x12, 0x90a60130},
8197                 {0x21, 0x0321101f}),
8198         SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8199                 {0x12, 0x90a60160},
8200                 {0x14, 0x90170120},
8201                 {0x21, 0x02211030}),
8202         SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8203                 ALC282_STANDARD_PINS,
8204                 {0x12, 0x90a60130},
8205                 {0x19, 0x03a11020},
8206                 {0x21, 0x0321101f}),
8207         SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
8208                 {0x12, 0x90a60130},
8209                 {0x14, 0x90170110},
8210                 {0x19, 0x04a11040},
8211                 {0x21, 0x04211020}),
8212         SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
8213                 {0x12, 0x90a60130},
8214                 {0x17, 0x90170110},
8215                 {0x21, 0x02211020}),
8216         SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
8217                 {0x12, 0x90a60120},
8218                 {0x14, 0x90170110},
8219                 {0x21, 0x0321101f}),
8220         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
8221                 ALC290_STANDARD_PINS,
8222                 {0x15, 0x04211040},
8223                 {0x18, 0x90170112},
8224                 {0x1a, 0x04a11020}),
8225         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
8226                 ALC290_STANDARD_PINS,
8227                 {0x15, 0x04211040},
8228                 {0x18, 0x90170110},
8229                 {0x1a, 0x04a11020}),
8230         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
8231                 ALC290_STANDARD_PINS,
8232                 {0x15, 0x0421101f},
8233                 {0x1a, 0x04a11020}),
8234         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
8235                 ALC290_STANDARD_PINS,
8236                 {0x15, 0x04211020},
8237                 {0x1a, 0x04a11040}),
8238         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
8239                 ALC290_STANDARD_PINS,
8240                 {0x14, 0x90170110},
8241                 {0x15, 0x04211020},
8242                 {0x1a, 0x04a11040}),
8243         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
8244                 ALC290_STANDARD_PINS,
8245                 {0x14, 0x90170110},
8246                 {0x15, 0x04211020},
8247                 {0x1a, 0x04a11020}),
8248         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
8249                 ALC290_STANDARD_PINS,
8250                 {0x14, 0x90170110},
8251                 {0x15, 0x0421101f},
8252                 {0x1a, 0x04a11020}),
8253         SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
8254                 ALC292_STANDARD_PINS,
8255                 {0x12, 0x90a60140},
8256                 {0x16, 0x01014020},
8257                 {0x19, 0x01a19030}),
8258         SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
8259                 ALC292_STANDARD_PINS,
8260                 {0x12, 0x90a60140},
8261                 {0x16, 0x01014020},
8262                 {0x18, 0x02a19031},
8263                 {0x19, 0x01a1903e}),
8264         SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
8265                 ALC292_STANDARD_PINS,
8266                 {0x12, 0x90a60140}),
8267         SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
8268                 ALC292_STANDARD_PINS,
8269                 {0x13, 0x90a60140},
8270                 {0x16, 0x21014020},
8271                 {0x19, 0x21a19030}),
8272         SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
8273                 ALC292_STANDARD_PINS,
8274                 {0x13, 0x90a60140}),
8275         SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC,
8276                 {0x14, 0x90170110},
8277                 {0x1b, 0x90a70130},
8278                 {0x21, 0x04211020}),
8279         SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
8280                 {0x12, 0x90a60130},
8281                 {0x17, 0x90170110},
8282                 {0x21, 0x03211020}),
8283         SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
8284                 {0x12, 0x90a60130},
8285                 {0x17, 0x90170110},
8286                 {0x21, 0x04211020}),
8287         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
8288                 {0x12, 0x90a60130},
8289                 {0x17, 0x90170110},
8290                 {0x21, 0x03211020}),
8291         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
8292                 {0x12, 0x90a60120},
8293                 {0x17, 0x90170110},
8294                 {0x21, 0x04211030}),
8295         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
8296                 {0x12, 0x90a60130},
8297                 {0x17, 0x90170110},
8298                 {0x21, 0x03211020}),
8299         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
8300                 {0x12, 0x90a60130},
8301                 {0x17, 0x90170110},
8302                 {0x21, 0x03211020}),
8303         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
8304                 {0x14, 0x90170110},
8305                 {0x21, 0x04211020}),
8306         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
8307                 {0x14, 0x90170110},
8308                 {0x21, 0x04211030}),
8309         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8310                 ALC295_STANDARD_PINS,
8311                 {0x17, 0x21014020},
8312                 {0x18, 0x21a19030}),
8313         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8314                 ALC295_STANDARD_PINS,
8315                 {0x17, 0x21014040},
8316                 {0x18, 0x21a19050}),
8317         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
8318                 ALC295_STANDARD_PINS),
8319         SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
8320                 ALC298_STANDARD_PINS,
8321                 {0x17, 0x90170110}),
8322         SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
8323                 ALC298_STANDARD_PINS,
8324                 {0x17, 0x90170140}),
8325         SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
8326                 ALC298_STANDARD_PINS,
8327                 {0x17, 0x90170150}),
8328         SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_SPK_VOLUME,
8329                 {0x12, 0xb7a60140},
8330                 {0x13, 0xb7a60150},
8331                 {0x17, 0x90170110},
8332                 {0x1a, 0x03011020},
8333                 {0x21, 0x03211030}),
8334         SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
8335                 {0x12, 0xb7a60140},
8336                 {0x17, 0x90170110},
8337                 {0x1a, 0x03a11030},
8338                 {0x21, 0x03211020}),
8339         SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
8340                 ALC225_STANDARD_PINS,
8341                 {0x12, 0xb7a60130},
8342                 {0x17, 0x90170110}),
8343         SND_HDA_PIN_QUIRK(0x10ec0623, 0x17aa, "Lenovo", ALC283_FIXUP_HEADSET_MIC,
8344                 {0x14, 0x01014010},
8345                 {0x17, 0x90170120},
8346                 {0x18, 0x02a11030},
8347                 {0x19, 0x02a1103f},
8348                 {0x21, 0x0221101f}),
8349         {}
8350 };
8351
8352 /* This is the fallback pin_fixup_tbl for alc269 family, to make the tbl match
8353  * more machines, don't need to match all valid pins, just need to match
8354  * all the pins defined in the tbl. Just because of this reason, it is possible
8355  * that a single machine matches multiple tbls, so there is one limitation:
8356  *   at most one tbl is allowed to define for the same vendor and same codec
8357  */
8358 static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = {
8359         SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
8360                 {0x19, 0x40000000},
8361                 {0x1b, 0x40000000}),
8362         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8363                 {0x19, 0x40000000},
8364                 {0x1a, 0x40000000}),
8365         SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
8366                 {0x19, 0x40000000},
8367                 {0x1a, 0x40000000}),
8368         SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
8369                 {0x19, 0x40000000},
8370                 {0x1a, 0x40000000}),
8371         {}
8372 };
8373
8374 static void alc269_fill_coef(struct hda_codec *codec)
8375 {
8376         struct alc_spec *spec = codec->spec;
8377         int val;
8378
8379         if (spec->codec_variant != ALC269_TYPE_ALC269VB)
8380                 return;
8381
8382         if ((alc_get_coef0(codec) & 0x00ff) < 0x015) {
8383                 alc_write_coef_idx(codec, 0xf, 0x960b);
8384                 alc_write_coef_idx(codec, 0xe, 0x8817);
8385         }
8386
8387         if ((alc_get_coef0(codec) & 0x00ff) == 0x016) {
8388                 alc_write_coef_idx(codec, 0xf, 0x960b);
8389                 alc_write_coef_idx(codec, 0xe, 0x8814);
8390         }
8391
8392         if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
8393                 /* Power up output pin */
8394                 alc_update_coef_idx(codec, 0x04, 0, 1<<11);
8395         }
8396
8397         if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
8398                 val = alc_read_coef_idx(codec, 0xd);
8399                 if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {
8400                         /* Capless ramp up clock control */
8401                         alc_write_coef_idx(codec, 0xd, val | (1<<10));
8402                 }
8403                 val = alc_read_coef_idx(codec, 0x17);
8404                 if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {
8405                         /* Class D power on reset */
8406                         alc_write_coef_idx(codec, 0x17, val | (1<<7));
8407                 }
8408         }
8409
8410         /* HP */
8411         alc_update_coef_idx(codec, 0x4, 0, 1<<11);
8412 }
8413
8414 /*
8415  */
8416 static int patch_alc269(struct hda_codec *codec)
8417 {
8418         struct alc_spec *spec;
8419         int err;
8420
8421         err = alc_alloc_spec(codec, 0x0b);
8422         if (err < 0)
8423                 return err;
8424
8425         spec = codec->spec;
8426         spec->gen.shared_mic_vref_pin = 0x18;
8427         codec->power_save_node = 0;
8428
8429 #ifdef CONFIG_PM
8430         codec->patch_ops.suspend = alc269_suspend;
8431         codec->patch_ops.resume = alc269_resume;
8432 #endif
8433         spec->shutup = alc_default_shutup;
8434         spec->init_hook = alc_default_init;
8435
8436         switch (codec->core.vendor_id) {
8437         case 0x10ec0269:
8438                 spec->codec_variant = ALC269_TYPE_ALC269VA;
8439                 switch (alc_get_coef0(codec) & 0x00f0) {
8440                 case 0x0010:
8441                         if (codec->bus->pci &&
8442                             codec->bus->pci->subsystem_vendor == 0x1025 &&
8443                             spec->cdefine.platform_type == 1)
8444                                 err = alc_codec_rename(codec, "ALC271X");
8445                         spec->codec_variant = ALC269_TYPE_ALC269VB;
8446                         break;
8447                 case 0x0020:
8448                         if (codec->bus->pci &&
8449                             codec->bus->pci->subsystem_vendor == 0x17aa &&
8450                             codec->bus->pci->subsystem_device == 0x21f3)
8451                                 err = alc_codec_rename(codec, "ALC3202");
8452                         spec->codec_variant = ALC269_TYPE_ALC269VC;
8453                         break;
8454                 case 0x0030:
8455                         spec->codec_variant = ALC269_TYPE_ALC269VD;
8456                         break;
8457                 default:
8458                         alc_fix_pll_init(codec, 0x20, 0x04, 15);
8459                 }
8460                 if (err < 0)
8461                         goto error;
8462                 spec->shutup = alc269_shutup;
8463                 spec->init_hook = alc269_fill_coef;
8464                 alc269_fill_coef(codec);
8465                 break;
8466
8467         case 0x10ec0280:
8468         case 0x10ec0290:
8469                 spec->codec_variant = ALC269_TYPE_ALC280;
8470                 break;
8471         case 0x10ec0282:
8472                 spec->codec_variant = ALC269_TYPE_ALC282;
8473                 spec->shutup = alc282_shutup;
8474                 spec->init_hook = alc282_init;
8475                 break;
8476         case 0x10ec0233:
8477         case 0x10ec0283:
8478                 spec->codec_variant = ALC269_TYPE_ALC283;
8479                 spec->shutup = alc283_shutup;
8480                 spec->init_hook = alc283_init;
8481                 break;
8482         case 0x10ec0284:
8483         case 0x10ec0292:
8484                 spec->codec_variant = ALC269_TYPE_ALC284;
8485                 break;
8486         case 0x10ec0293:
8487                 spec->codec_variant = ALC269_TYPE_ALC293;
8488                 break;
8489         case 0x10ec0286:
8490         case 0x10ec0288:
8491                 spec->codec_variant = ALC269_TYPE_ALC286;
8492                 break;
8493         case 0x10ec0298:
8494                 spec->codec_variant = ALC269_TYPE_ALC298;
8495                 break;
8496         case 0x10ec0235:
8497         case 0x10ec0255:
8498                 spec->codec_variant = ALC269_TYPE_ALC255;
8499                 spec->shutup = alc256_shutup;
8500                 spec->init_hook = alc256_init;
8501                 break;
8502         case 0x10ec0236:
8503         case 0x10ec0256:
8504                 spec->codec_variant = ALC269_TYPE_ALC256;
8505                 spec->shutup = alc256_shutup;
8506                 spec->init_hook = alc256_init;
8507                 spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */
8508                 break;
8509         case 0x10ec0257:
8510                 spec->codec_variant = ALC269_TYPE_ALC257;
8511                 spec->shutup = alc256_shutup;
8512                 spec->init_hook = alc256_init;
8513                 spec->gen.mixer_nid = 0;
8514                 break;
8515         case 0x10ec0215:
8516         case 0x10ec0245:
8517         case 0x10ec0285:
8518         case 0x10ec0287:
8519         case 0x10ec0289:
8520                 spec->codec_variant = ALC269_TYPE_ALC215;
8521                 spec->shutup = alc225_shutup;
8522                 spec->init_hook = alc225_init;
8523                 spec->gen.mixer_nid = 0;
8524                 break;
8525         case 0x10ec0225:
8526         case 0x10ec0295:
8527         case 0x10ec0299:
8528                 spec->codec_variant = ALC269_TYPE_ALC225;
8529                 spec->shutup = alc225_shutup;
8530                 spec->init_hook = alc225_init;
8531                 spec->gen.mixer_nid = 0; /* no loopback on ALC225, ALC295 and ALC299 */
8532                 break;
8533         case 0x10ec0234:
8534         case 0x10ec0274:
8535         case 0x10ec0294:
8536                 spec->codec_variant = ALC269_TYPE_ALC294;
8537                 spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */
8538                 alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */
8539                 spec->init_hook = alc294_init;
8540                 break;
8541         case 0x10ec0300:
8542                 spec->codec_variant = ALC269_TYPE_ALC300;
8543                 spec->gen.mixer_nid = 0; /* no loopback on ALC300 */
8544                 break;
8545         case 0x10ec0623:
8546                 spec->codec_variant = ALC269_TYPE_ALC623;
8547                 break;
8548         case 0x10ec0700:
8549         case 0x10ec0701:
8550         case 0x10ec0703:
8551         case 0x10ec0711:
8552                 spec->codec_variant = ALC269_TYPE_ALC700;
8553                 spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */
8554                 alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */
8555                 spec->init_hook = alc294_init;
8556                 break;
8557
8558         }
8559
8560         if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {
8561                 spec->has_alc5505_dsp = 1;
8562                 spec->init_hook = alc5505_dsp_init;
8563         }
8564
8565         alc_pre_init(codec);
8566
8567         snd_hda_pick_fixup(codec, alc269_fixup_models,
8568                        alc269_fixup_tbl, alc269_fixups);
8569         snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups, true);
8570         snd_hda_pick_pin_fixup(codec, alc269_fallback_pin_fixup_tbl, alc269_fixups, false);
8571         snd_hda_pick_fixup(codec, NULL, alc269_fixup_vendor_tbl,
8572                            alc269_fixups);
8573         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
8574
8575         alc_auto_parse_customize_define(codec);
8576
8577         if (has_cdefine_beep(codec))
8578                 spec->gen.beep_nid = 0x01;
8579
8580         /* automatic parse from the BIOS config */
8581         err = alc269_parse_auto_config(codec);
8582         if (err < 0)
8583                 goto error;
8584
8585         if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid) {
8586                 err = set_beep_amp(spec, spec->gen.mixer_nid, 0x04, HDA_INPUT);
8587                 if (err < 0)
8588                         goto error;
8589         }
8590
8591         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
8592
8593         return 0;
8594
8595  error:
8596         alc_free(codec);
8597         return err;
8598 }
8599
8600 /*
8601  * ALC861
8602  */
8603
8604 static int alc861_parse_auto_config(struct hda_codec *codec)
8605 {
8606         static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
8607         static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 };
8608         return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids);
8609 }
8610
8611 /* Pin config fixes */
8612 enum {
8613         ALC861_FIXUP_FSC_AMILO_PI1505,
8614         ALC861_FIXUP_AMP_VREF_0F,
8615         ALC861_FIXUP_NO_JACK_DETECT,
8616         ALC861_FIXUP_ASUS_A6RP,
8617         ALC660_FIXUP_ASUS_W7J,
8618 };
8619
8620 /* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */
8621 static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,
8622                         const struct hda_fixup *fix, int action)
8623 {
8624         struct alc_spec *spec = codec->spec;
8625         unsigned int val;
8626
8627         if (action != HDA_FIXUP_ACT_INIT)
8628                 return;
8629         val = snd_hda_codec_get_pin_target(codec, 0x0f);
8630         if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)))
8631                 val |= AC_PINCTL_IN_EN;
8632         val |= AC_PINCTL_VREF_50;
8633         snd_hda_set_pin_ctl(codec, 0x0f, val);
8634         spec->gen.keep_vref_in_automute = 1;
8635 }
8636
8637 /* suppress the jack-detection */
8638 static void alc_fixup_no_jack_detect(struct hda_codec *codec,
8639                                      const struct hda_fixup *fix, int action)
8640 {
8641         if (action == HDA_FIXUP_ACT_PRE_PROBE)
8642                 codec->no_jack_detect = 1;
8643 }
8644
8645 static const struct hda_fixup alc861_fixups[] = {
8646         [ALC861_FIXUP_FSC_AMILO_PI1505] = {
8647                 .type = HDA_FIXUP_PINS,
8648                 .v.pins = (const struct hda_pintbl[]) {
8649                         { 0x0b, 0x0221101f }, /* HP */
8650                         { 0x0f, 0x90170310 }, /* speaker */
8651                         { }
8652                 }
8653         },
8654         [ALC861_FIXUP_AMP_VREF_0F] = {
8655                 .type = HDA_FIXUP_FUNC,
8656                 .v.func = alc861_fixup_asus_amp_vref_0f,
8657         },
8658         [ALC861_FIXUP_NO_JACK_DETECT] = {
8659                 .type = HDA_FIXUP_FUNC,
8660                 .v.func = alc_fixup_no_jack_detect,
8661         },
8662         [ALC861_FIXUP_ASUS_A6RP] = {
8663                 .type = HDA_FIXUP_FUNC,
8664                 .v.func = alc861_fixup_asus_amp_vref_0f,
8665                 .chained = true,
8666                 .chain_id = ALC861_FIXUP_NO_JACK_DETECT,
8667         },
8668         [ALC660_FIXUP_ASUS_W7J] = {
8669                 .type = HDA_FIXUP_VERBS,
8670                 .v.verbs = (const struct hda_verb[]) {
8671                         /* ASUS W7J needs a magic pin setup on unused NID 0x10
8672                          * for enabling outputs
8673                          */
8674                         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
8675                         { }
8676                 },
8677         }
8678 };
8679
8680 static const struct snd_pci_quirk alc861_fixup_tbl[] = {
8681         SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J),
8682         SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J),
8683         SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),
8684         SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),
8685         SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),
8686         SND_PCI_QUIRK(0x1584, 0x2b01, "Haier W18", ALC861_FIXUP_AMP_VREF_0F),
8687         SND_PCI_QUIRK(0x1584, 0x0000, "Uniwill ECS M31EI", ALC861_FIXUP_AMP_VREF_0F),
8688         SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505),
8689         {}
8690 };
8691
8692 /*
8693  */
8694 static int patch_alc861(struct hda_codec *codec)
8695 {
8696         struct alc_spec *spec;
8697         int err;
8698
8699         err = alc_alloc_spec(codec, 0x15);
8700         if (err < 0)
8701                 return err;
8702
8703         spec = codec->spec;
8704         if (has_cdefine_beep(codec))
8705                 spec->gen.beep_nid = 0x23;
8706
8707 #ifdef CONFIG_PM
8708         spec->power_hook = alc_power_eapd;
8709 #endif
8710
8711         alc_pre_init(codec);
8712
8713         snd_hda_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
8714         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
8715
8716         /* automatic parse from the BIOS config */
8717         err = alc861_parse_auto_config(codec);
8718         if (err < 0)
8719                 goto error;
8720
8721         if (!spec->gen.no_analog) {
8722                 err = set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
8723                 if (err < 0)
8724                         goto error;
8725         }
8726
8727         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
8728
8729         return 0;
8730
8731  error:
8732         alc_free(codec);
8733         return err;
8734 }
8735
8736 /*
8737  * ALC861-VD support
8738  *
8739  * Based on ALC882
8740  *
8741  * In addition, an independent DAC
8742  */
8743 static int alc861vd_parse_auto_config(struct hda_codec *codec)
8744 {
8745         static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
8746         static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 };
8747         return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids);
8748 }
8749
8750 enum {
8751         ALC660VD_FIX_ASUS_GPIO1,
8752         ALC861VD_FIX_DALLAS,
8753 };
8754
8755 /* exclude VREF80 */
8756 static void alc861vd_fixup_dallas(struct hda_codec *codec,
8757                                   const struct hda_fixup *fix, int action)
8758 {
8759         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
8760                 snd_hda_override_pin_caps(codec, 0x18, 0x00000734);
8761                 snd_hda_override_pin_caps(codec, 0x19, 0x0000073c);
8762         }
8763 }
8764
8765 /* reset GPIO1 */
8766 static void alc660vd_fixup_asus_gpio1(struct hda_codec *codec,
8767                                       const struct hda_fixup *fix, int action)
8768 {
8769         struct alc_spec *spec = codec->spec;
8770
8771         if (action == HDA_FIXUP_ACT_PRE_PROBE)
8772                 spec->gpio_mask |= 0x02;
8773         alc_fixup_gpio(codec, action, 0x01);
8774 }
8775
8776 static const struct hda_fixup alc861vd_fixups[] = {
8777         [ALC660VD_FIX_ASUS_GPIO1] = {
8778                 .type = HDA_FIXUP_FUNC,
8779                 .v.func = alc660vd_fixup_asus_gpio1,
8780         },
8781         [ALC861VD_FIX_DALLAS] = {
8782                 .type = HDA_FIXUP_FUNC,
8783                 .v.func = alc861vd_fixup_dallas,
8784         },
8785 };
8786
8787 static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
8788         SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS),
8789         SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
8790         SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS),
8791         {}
8792 };
8793
8794 /*
8795  */
8796 static int patch_alc861vd(struct hda_codec *codec)
8797 {
8798         struct alc_spec *spec;
8799         int err;
8800
8801         err = alc_alloc_spec(codec, 0x0b);
8802         if (err < 0)
8803                 return err;
8804
8805         spec = codec->spec;
8806         if (has_cdefine_beep(codec))
8807                 spec->gen.beep_nid = 0x23;
8808
8809         spec->shutup = alc_eapd_shutup;
8810
8811         alc_pre_init(codec);
8812
8813         snd_hda_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
8814         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
8815
8816         /* automatic parse from the BIOS config */
8817         err = alc861vd_parse_auto_config(codec);
8818         if (err < 0)
8819                 goto error;
8820
8821         if (!spec->gen.no_analog) {
8822                 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
8823                 if (err < 0)
8824                         goto error;
8825         }
8826
8827         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
8828
8829         return 0;
8830
8831  error:
8832         alc_free(codec);
8833         return err;
8834 }
8835
8836 /*
8837  * ALC662 support
8838  *
8839  * ALC662 is almost identical with ALC880 but has cleaner and more flexible
8840  * configuration.  Each pin widget can choose any input DACs and a mixer.
8841  * Each ADC is connected from a mixer of all inputs.  This makes possible
8842  * 6-channel independent captures.
8843  *
8844  * In addition, an independent DAC for the multi-playback (not used in this
8845  * driver yet).
8846  */
8847
8848 /*
8849  * BIOS auto configuration
8850  */
8851
8852 static int alc662_parse_auto_config(struct hda_codec *codec)
8853 {
8854         static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
8855         static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 };
8856         static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 };
8857         const hda_nid_t *ssids;
8858
8859         if (codec->core.vendor_id == 0x10ec0272 || codec->core.vendor_id == 0x10ec0663 ||
8860             codec->core.vendor_id == 0x10ec0665 || codec->core.vendor_id == 0x10ec0670 ||
8861             codec->core.vendor_id == 0x10ec0671)
8862                 ssids = alc663_ssids;
8863         else
8864                 ssids = alc662_ssids;
8865         return alc_parse_auto_config(codec, alc662_ignore, ssids);
8866 }
8867
8868 static void alc272_fixup_mario(struct hda_codec *codec,
8869                                const struct hda_fixup *fix, int action)
8870 {
8871         if (action != HDA_FIXUP_ACT_PRE_PROBE)
8872                 return;
8873         if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
8874                                       (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
8875                                       (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
8876                                       (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
8877                                       (0 << AC_AMPCAP_MUTE_SHIFT)))
8878                 codec_warn(codec, "failed to override amp caps for NID 0x2\n");
8879 }
8880
8881 static const struct snd_pcm_chmap_elem asus_pcm_2_1_chmaps[] = {
8882         { .channels = 2,
8883           .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
8884         { .channels = 4,
8885           .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
8886                    SNDRV_CHMAP_NA, SNDRV_CHMAP_LFE } }, /* LFE only on right */
8887         { }
8888 };
8889
8890 /* override the 2.1 chmap */
8891 static void alc_fixup_bass_chmap(struct hda_codec *codec,
8892                                     const struct hda_fixup *fix, int action)
8893 {
8894         if (action == HDA_FIXUP_ACT_BUILD) {
8895                 struct alc_spec *spec = codec->spec;
8896                 spec->gen.pcm_rec[0]->stream[0].chmap = asus_pcm_2_1_chmaps;
8897         }
8898 }
8899
8900 /* avoid D3 for keeping GPIO up */
8901 static unsigned int gpio_led_power_filter(struct hda_codec *codec,
8902                                           hda_nid_t nid,
8903                                           unsigned int power_state)
8904 {
8905         struct alc_spec *spec = codec->spec;
8906         if (nid == codec->core.afg && power_state == AC_PWRST_D3 && spec->gpio_data)
8907                 return AC_PWRST_D0;
8908         return power_state;
8909 }
8910
8911 static void alc662_fixup_led_gpio1(struct hda_codec *codec,
8912                                    const struct hda_fixup *fix, int action)
8913 {
8914         struct alc_spec *spec = codec->spec;
8915
8916         alc_fixup_hp_gpio_led(codec, action, 0x01, 0);
8917         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
8918                 spec->mute_led_polarity = 1;
8919                 codec->power_filter = gpio_led_power_filter;
8920         }
8921 }
8922
8923 static void alc662_usi_automute_hook(struct hda_codec *codec,
8924                                          struct hda_jack_callback *jack)
8925 {
8926         struct alc_spec *spec = codec->spec;
8927         int vref;
8928         msleep(200);
8929         snd_hda_gen_hp_automute(codec, jack);
8930
8931         vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
8932         msleep(100);
8933         snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
8934                             vref);
8935 }
8936
8937 static void alc662_fixup_usi_headset_mic(struct hda_codec *codec,
8938                                      const struct hda_fixup *fix, int action)
8939 {
8940         struct alc_spec *spec = codec->spec;
8941         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
8942                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
8943                 spec->gen.hp_automute_hook = alc662_usi_automute_hook;
8944         }
8945 }
8946
8947 static void alc662_aspire_ethos_mute_speakers(struct hda_codec *codec,
8948                                         struct hda_jack_callback *cb)
8949 {
8950         /* surround speakers at 0x1b already get muted automatically when
8951          * headphones are plugged in, but we have to mute/unmute the remaining
8952          * channels manually:
8953          * 0x15 - front left/front right
8954          * 0x18 - front center/ LFE
8955          */
8956         if (snd_hda_jack_detect_state(codec, 0x1b) == HDA_JACK_PRESENT) {
8957                 snd_hda_set_pin_ctl_cache(codec, 0x15, 0);
8958                 snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
8959         } else {
8960                 snd_hda_set_pin_ctl_cache(codec, 0x15, PIN_OUT);
8961                 snd_hda_set_pin_ctl_cache(codec, 0x18, PIN_OUT);
8962         }
8963 }
8964
8965 static void alc662_fixup_aspire_ethos_hp(struct hda_codec *codec,
8966                                         const struct hda_fixup *fix, int action)
8967 {
8968     /* Pin 0x1b: shared headphones jack and surround speakers */
8969         if (!is_jack_detectable(codec, 0x1b))
8970                 return;
8971
8972         switch (action) {
8973         case HDA_FIXUP_ACT_PRE_PROBE:
8974                 snd_hda_jack_detect_enable_callback(codec, 0x1b,
8975                                 alc662_aspire_ethos_mute_speakers);
8976                 /* subwoofer needs an extra GPIO setting to become audible */
8977                 alc_setup_gpio(codec, 0x02);
8978                 break;
8979         case HDA_FIXUP_ACT_INIT:
8980                 /* Make sure to start in a correct state, i.e. if
8981                  * headphones have been plugged in before powering up the system
8982                  */
8983                 alc662_aspire_ethos_mute_speakers(codec, NULL);
8984                 break;
8985         }
8986 }
8987
8988 static void alc671_fixup_hp_headset_mic2(struct hda_codec *codec,
8989                                              const struct hda_fixup *fix, int action)
8990 {
8991         struct alc_spec *spec = codec->spec;
8992
8993         static const struct hda_pintbl pincfgs[] = {
8994                 { 0x19, 0x02a11040 }, /* use as headset mic, with its own jack detect */
8995                 { 0x1b, 0x0181304f },
8996                 { }
8997         };
8998
8999         switch (action) {
9000         case HDA_FIXUP_ACT_PRE_PROBE:
9001                 spec->gen.mixer_nid = 0;
9002                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
9003                 snd_hda_apply_pincfgs(codec, pincfgs);
9004                 break;
9005         case HDA_FIXUP_ACT_INIT:
9006                 alc_write_coef_idx(codec, 0x19, 0xa054);
9007                 break;
9008         }
9009 }
9010
9011 static const struct coef_fw alc668_coefs[] = {
9012         WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03,    0x0),
9013         WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06,    0x0), WRITE_COEF(0x07, 0x0f80),
9014         WRITE_COEF(0x08, 0x0031), WRITE_COEF(0x0a, 0x0060), WRITE_COEF(0x0b,    0x0),
9015         WRITE_COEF(0x0c, 0x7cf7), WRITE_COEF(0x0d, 0x1080), WRITE_COEF(0x0e, 0x7f7f),
9016         WRITE_COEF(0x0f, 0xcccc), WRITE_COEF(0x10, 0xddcc), WRITE_COEF(0x11, 0x0001),
9017         WRITE_COEF(0x13,    0x0), WRITE_COEF(0x14, 0x2aa0), WRITE_COEF(0x17, 0xa940),
9018         WRITE_COEF(0x19,    0x0), WRITE_COEF(0x1a,    0x0), WRITE_COEF(0x1b,    0x0),
9019         WRITE_COEF(0x1c,    0x0), WRITE_COEF(0x1d,    0x0), WRITE_COEF(0x1e, 0x7418),
9020         WRITE_COEF(0x1f, 0x0804), WRITE_COEF(0x20, 0x4200), WRITE_COEF(0x21, 0x0468),
9021         WRITE_COEF(0x22, 0x8ccc), WRITE_COEF(0x23, 0x0250), WRITE_COEF(0x24, 0x7418),
9022         WRITE_COEF(0x27,    0x0), WRITE_COEF(0x28, 0x8ccc), WRITE_COEF(0x2a, 0xff00),
9023         WRITE_COEF(0x2b, 0x8000), WRITE_COEF(0xa7, 0xff00), WRITE_COEF(0xa8, 0x8000),
9024         WRITE_COEF(0xaa, 0x2e17), WRITE_COEF(0xab, 0xa0c0), WRITE_COEF(0xac,    0x0),
9025         WRITE_COEF(0xad,    0x0), WRITE_COEF(0xae, 0x2ac6), WRITE_COEF(0xaf, 0xa480),
9026         WRITE_COEF(0xb0,    0x0), WRITE_COEF(0xb1,    0x0), WRITE_COEF(0xb2,    0x0),
9027         WRITE_COEF(0xb3,    0x0), WRITE_COEF(0xb4,    0x0), WRITE_COEF(0xb5, 0x1040),
9028         WRITE_COEF(0xb6, 0xd697), WRITE_COEF(0xb7, 0x902b), WRITE_COEF(0xb8, 0xd697),
9029         WRITE_COEF(0xb9, 0x902b), WRITE_COEF(0xba, 0xb8ba), WRITE_COEF(0xbb, 0xaaab),
9030         WRITE_COEF(0xbc, 0xaaaf), WRITE_COEF(0xbd, 0x6aaa), WRITE_COEF(0xbe, 0x1c02),
9031         WRITE_COEF(0xc0, 0x00ff), WRITE_COEF(0xc1, 0x0fa6),
9032         {}
9033 };
9034
9035 static void alc668_restore_default_value(struct hda_codec *codec)
9036 {
9037         alc_process_coef_fw(codec, alc668_coefs);
9038 }
9039
9040 enum {
9041         ALC662_FIXUP_ASPIRE,
9042         ALC662_FIXUP_LED_GPIO1,
9043         ALC662_FIXUP_IDEAPAD,
9044         ALC272_FIXUP_MARIO,
9045         ALC662_FIXUP_CZC_ET26,
9046         ALC662_FIXUP_CZC_P10T,
9047         ALC662_FIXUP_SKU_IGNORE,
9048         ALC662_FIXUP_HP_RP5800,
9049         ALC662_FIXUP_ASUS_MODE1,
9050         ALC662_FIXUP_ASUS_MODE2,
9051         ALC662_FIXUP_ASUS_MODE3,
9052         ALC662_FIXUP_ASUS_MODE4,
9053         ALC662_FIXUP_ASUS_MODE5,
9054         ALC662_FIXUP_ASUS_MODE6,
9055         ALC662_FIXUP_ASUS_MODE7,
9056         ALC662_FIXUP_ASUS_MODE8,
9057         ALC662_FIXUP_NO_JACK_DETECT,
9058         ALC662_FIXUP_ZOTAC_Z68,
9059         ALC662_FIXUP_INV_DMIC,
9060         ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
9061         ALC668_FIXUP_DELL_MIC_NO_PRESENCE,
9062         ALC662_FIXUP_HEADSET_MODE,
9063         ALC668_FIXUP_HEADSET_MODE,
9064         ALC662_FIXUP_BASS_MODE4_CHMAP,
9065         ALC662_FIXUP_BASS_16,
9066         ALC662_FIXUP_BASS_1A,
9067         ALC662_FIXUP_BASS_CHMAP,
9068         ALC668_FIXUP_AUTO_MUTE,
9069         ALC668_FIXUP_DELL_DISABLE_AAMIX,
9070         ALC668_FIXUP_DELL_XPS13,
9071         ALC662_FIXUP_ASUS_Nx50,
9072         ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
9073         ALC668_FIXUP_ASUS_Nx51,
9074         ALC668_FIXUP_MIC_COEF,
9075         ALC668_FIXUP_ASUS_G751,
9076         ALC891_FIXUP_HEADSET_MODE,
9077         ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
9078         ALC662_FIXUP_ACER_VERITON,
9079         ALC892_FIXUP_ASROCK_MOBO,
9080         ALC662_FIXUP_USI_FUNC,
9081         ALC662_FIXUP_USI_HEADSET_MODE,
9082         ALC662_FIXUP_LENOVO_MULTI_CODECS,
9083         ALC669_FIXUP_ACER_ASPIRE_ETHOS,
9084         ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET,
9085         ALC671_FIXUP_HP_HEADSET_MIC2,
9086         ALC662_FIXUP_ACER_X2660G_HEADSET_MODE,
9087         ALC662_FIXUP_ACER_NITRO_HEADSET_MODE,
9088 };
9089
9090 static const struct hda_fixup alc662_fixups[] = {
9091         [ALC662_FIXUP_ASPIRE] = {
9092                 .type = HDA_FIXUP_PINS,
9093                 .v.pins = (const struct hda_pintbl[]) {
9094                         { 0x15, 0x99130112 }, /* subwoofer */
9095                         { }
9096                 }
9097         },
9098         [ALC662_FIXUP_LED_GPIO1] = {
9099                 .type = HDA_FIXUP_FUNC,
9100                 .v.func = alc662_fixup_led_gpio1,
9101         },
9102         [ALC662_FIXUP_IDEAPAD] = {
9103                 .type = HDA_FIXUP_PINS,
9104                 .v.pins = (const struct hda_pintbl[]) {
9105                         { 0x17, 0x99130112 }, /* subwoofer */
9106                         { }
9107                 },
9108                 .chained = true,
9109                 .chain_id = ALC662_FIXUP_LED_GPIO1,
9110         },
9111         [ALC272_FIXUP_MARIO] = {
9112                 .type = HDA_FIXUP_FUNC,
9113                 .v.func = alc272_fixup_mario,
9114         },
9115         [ALC662_FIXUP_CZC_ET26] = {
9116                 .type = HDA_FIXUP_PINS,
9117                 .v.pins = (const struct hda_pintbl[]) {
9118                         {0x12, 0x403cc000},
9119                         {0x14, 0x90170110}, /* speaker */
9120                         {0x15, 0x411111f0},
9121                         {0x16, 0x411111f0},
9122                         {0x18, 0x01a19030}, /* mic */
9123                         {0x19, 0x90a7013f}, /* int-mic */
9124                         {0x1a, 0x01014020},
9125                         {0x1b, 0x0121401f},
9126                         {0x1c, 0x411111f0},
9127                         {0x1d, 0x411111f0},
9128                         {0x1e, 0x40478e35},
9129                         {}
9130                 },
9131                 .chained = true,
9132                 .chain_id = ALC662_FIXUP_SKU_IGNORE
9133         },
9134         [ALC662_FIXUP_CZC_P10T] = {
9135                 .type = HDA_FIXUP_VERBS,
9136                 .v.verbs = (const struct hda_verb[]) {
9137                         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
9138                         {}
9139                 }
9140         },
9141         [ALC662_FIXUP_SKU_IGNORE] = {
9142                 .type = HDA_FIXUP_FUNC,
9143                 .v.func = alc_fixup_sku_ignore,
9144         },
9145         [ALC662_FIXUP_HP_RP5800] = {
9146                 .type = HDA_FIXUP_PINS,
9147                 .v.pins = (const struct hda_pintbl[]) {
9148                         { 0x14, 0x0221201f }, /* HP out */
9149                         { }
9150                 },
9151                 .chained = true,
9152                 .chain_id = ALC662_FIXUP_SKU_IGNORE
9153         },
9154         [ALC662_FIXUP_ASUS_MODE1] = {
9155                 .type = HDA_FIXUP_PINS,
9156                 .v.pins = (const struct hda_pintbl[]) {
9157                         { 0x14, 0x99130110 }, /* speaker */
9158                         { 0x18, 0x01a19c20 }, /* mic */
9159                         { 0x19, 0x99a3092f }, /* int-mic */
9160                         { 0x21, 0x0121401f }, /* HP out */
9161                         { }
9162                 },
9163                 .chained = true,
9164                 .chain_id = ALC662_FIXUP_SKU_IGNORE
9165         },
9166         [ALC662_FIXUP_ASUS_MODE2] = {
9167                 .type = HDA_FIXUP_PINS,
9168                 .v.pins = (const struct hda_pintbl[]) {
9169                         { 0x14, 0x99130110 }, /* speaker */
9170                         { 0x18, 0x01a19820 }, /* mic */
9171                         { 0x19, 0x99a3092f }, /* int-mic */
9172                         { 0x1b, 0x0121401f }, /* HP out */
9173                         { }
9174                 },
9175                 .chained = true,
9176                 .chain_id = ALC662_FIXUP_SKU_IGNORE
9177         },
9178         [ALC662_FIXUP_ASUS_MODE3] = {
9179                 .type = HDA_FIXUP_PINS,
9180                 .v.pins = (const struct hda_pintbl[]) {
9181                         { 0x14, 0x99130110 }, /* speaker */
9182                         { 0x15, 0x0121441f }, /* HP */
9183                         { 0x18, 0x01a19840 }, /* mic */
9184                         { 0x19, 0x99a3094f }, /* int-mic */
9185                         { 0x21, 0x01211420 }, /* HP2 */
9186                         { }
9187                 },
9188                 .chained = true,
9189                 .chain_id = ALC662_FIXUP_SKU_IGNORE
9190         },
9191         [ALC662_FIXUP_ASUS_MODE4] = {
9192                 .type = HDA_FIXUP_PINS,
9193                 .v.pins = (const struct hda_pintbl[]) {
9194                         { 0x14, 0x99130110 }, /* speaker */
9195                         { 0x16, 0x99130111 }, /* speaker */
9196                         { 0x18, 0x01a19840 }, /* mic */
9197                         { 0x19, 0x99a3094f }, /* int-mic */
9198                         { 0x21, 0x0121441f }, /* HP */
9199                         { }
9200                 },
9201                 .chained = true,
9202                 .chain_id = ALC662_FIXUP_SKU_IGNORE
9203         },
9204         [ALC662_FIXUP_ASUS_MODE5] = {
9205                 .type = HDA_FIXUP_PINS,
9206                 .v.pins = (const struct hda_pintbl[]) {
9207                         { 0x14, 0x99130110 }, /* speaker */
9208                         { 0x15, 0x0121441f }, /* HP */
9209                         { 0x16, 0x99130111 }, /* speaker */
9210                         { 0x18, 0x01a19840 }, /* mic */
9211                         { 0x19, 0x99a3094f }, /* int-mic */
9212                         { }
9213                 },
9214                 .chained = true,
9215                 .chain_id = ALC662_FIXUP_SKU_IGNORE
9216         },
9217         [ALC662_FIXUP_ASUS_MODE6] = {
9218                 .type = HDA_FIXUP_PINS,
9219                 .v.pins = (const struct hda_pintbl[]) {
9220                         { 0x14, 0x99130110 }, /* speaker */
9221                         { 0x15, 0x01211420 }, /* HP2 */
9222                         { 0x18, 0x01a19840 }, /* mic */
9223                         { 0x19, 0x99a3094f }, /* int-mic */
9224                         { 0x1b, 0x0121441f }, /* HP */
9225                         { }
9226                 },
9227                 .chained = true,
9228                 .chain_id = ALC662_FIXUP_SKU_IGNORE
9229         },
9230         [ALC662_FIXUP_ASUS_MODE7] = {
9231                 .type = HDA_FIXUP_PINS,
9232                 .v.pins = (const struct hda_pintbl[]) {
9233                         { 0x14, 0x99130110 }, /* speaker */
9234                         { 0x17, 0x99130111 }, /* speaker */
9235                         { 0x18, 0x01a19840 }, /* mic */
9236                         { 0x19, 0x99a3094f }, /* int-mic */
9237                         { 0x1b, 0x01214020 }, /* HP */
9238                         { 0x21, 0x0121401f }, /* HP */
9239                         { }
9240                 },
9241                 .chained = true,
9242                 .chain_id = ALC662_FIXUP_SKU_IGNORE
9243         },
9244         [ALC662_FIXUP_ASUS_MODE8] = {
9245                 .type = HDA_FIXUP_PINS,
9246                 .v.pins = (const struct hda_pintbl[]) {
9247                         { 0x14, 0x99130110 }, /* speaker */
9248                         { 0x12, 0x99a30970 }, /* int-mic */
9249                         { 0x15, 0x01214020 }, /* HP */
9250                         { 0x17, 0x99130111 }, /* speaker */
9251                         { 0x18, 0x01a19840 }, /* mic */
9252                         { 0x21, 0x0121401f }, /* HP */
9253                         { }
9254                 },
9255                 .chained = true,
9256                 .chain_id = ALC662_FIXUP_SKU_IGNORE
9257         },
9258         [ALC662_FIXUP_NO_JACK_DETECT] = {
9259                 .type = HDA_FIXUP_FUNC,
9260                 .v.func = alc_fixup_no_jack_detect,
9261         },
9262         [ALC662_FIXUP_ZOTAC_Z68] = {
9263                 .type = HDA_FIXUP_PINS,
9264                 .v.pins = (const struct hda_pintbl[]) {
9265                         { 0x1b, 0x02214020 }, /* Front HP */
9266                         { }
9267                 }
9268         },
9269         [ALC662_FIXUP_INV_DMIC] = {
9270                 .type = HDA_FIXUP_FUNC,
9271                 .v.func = alc_fixup_inv_dmic,
9272         },
9273         [ALC668_FIXUP_DELL_XPS13] = {
9274                 .type = HDA_FIXUP_FUNC,
9275                 .v.func = alc_fixup_dell_xps13,
9276                 .chained = true,
9277                 .chain_id = ALC668_FIXUP_DELL_DISABLE_AAMIX
9278         },
9279         [ALC668_FIXUP_DELL_DISABLE_AAMIX] = {
9280                 .type = HDA_FIXUP_FUNC,
9281                 .v.func = alc_fixup_disable_aamix,
9282                 .chained = true,
9283                 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
9284         },
9285         [ALC668_FIXUP_AUTO_MUTE] = {
9286                 .type = HDA_FIXUP_FUNC,
9287                 .v.func = alc_fixup_auto_mute_via_amp,
9288                 .chained = true,
9289                 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
9290         },
9291         [ALC662_FIXUP_DELL_MIC_NO_PRESENCE] = {
9292                 .type = HDA_FIXUP_PINS,
9293                 .v.pins = (const struct hda_pintbl[]) {
9294                         { 0x19, 0x03a1113c }, /* use as headset mic, without its own jack detect */
9295                         /* headphone mic by setting pin control of 0x1b (headphone out) to in + vref_50 */
9296                         { }
9297                 },
9298                 .chained = true,
9299                 .chain_id = ALC662_FIXUP_HEADSET_MODE
9300         },
9301         [ALC662_FIXUP_HEADSET_MODE] = {
9302                 .type = HDA_FIXUP_FUNC,
9303                 .v.func = alc_fixup_headset_mode_alc662,
9304         },
9305         [ALC668_FIXUP_DELL_MIC_NO_PRESENCE] = {
9306                 .type = HDA_FIXUP_PINS,
9307                 .v.pins = (const struct hda_pintbl[]) {
9308                         { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
9309                         { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
9310                         { }
9311                 },
9312                 .chained = true,
9313                 .chain_id = ALC668_FIXUP_HEADSET_MODE
9314         },
9315         [ALC668_FIXUP_HEADSET_MODE] = {
9316                 .type = HDA_FIXUP_FUNC,
9317                 .v.func = alc_fixup_headset_mode_alc668,
9318         },
9319         [ALC662_FIXUP_BASS_MODE4_CHMAP] = {
9320                 .type = HDA_FIXUP_FUNC,
9321                 .v.func = alc_fixup_bass_chmap,
9322                 .chained = true,
9323                 .chain_id = ALC662_FIXUP_ASUS_MODE4
9324         },
9325         [ALC662_FIXUP_BASS_16] = {
9326                 .type = HDA_FIXUP_PINS,
9327                 .v.pins = (const struct hda_pintbl[]) {
9328                         {0x16, 0x80106111}, /* bass speaker */
9329                         {}
9330                 },
9331                 .chained = true,
9332                 .chain_id = ALC662_FIXUP_BASS_CHMAP,
9333         },
9334         [ALC662_FIXUP_BASS_1A] = {
9335                 .type = HDA_FIXUP_PINS,
9336                 .v.pins = (const struct hda_pintbl[]) {
9337                         {0x1a, 0x80106111}, /* bass speaker */
9338                         {}
9339                 },
9340                 .chained = true,
9341                 .chain_id = ALC662_FIXUP_BASS_CHMAP,
9342         },
9343         [ALC662_FIXUP_BASS_CHMAP] = {
9344                 .type = HDA_FIXUP_FUNC,
9345                 .v.func = alc_fixup_bass_chmap,
9346         },
9347         [ALC662_FIXUP_ASUS_Nx50] = {
9348                 .type = HDA_FIXUP_FUNC,
9349                 .v.func = alc_fixup_auto_mute_via_amp,
9350                 .chained = true,
9351                 .chain_id = ALC662_FIXUP_BASS_1A
9352         },
9353         [ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE] = {
9354                 .type = HDA_FIXUP_FUNC,
9355                 .v.func = alc_fixup_headset_mode_alc668,
9356                 .chain_id = ALC662_FIXUP_BASS_CHMAP
9357         },
9358         [ALC668_FIXUP_ASUS_Nx51] = {
9359                 .type = HDA_FIXUP_PINS,
9360                 .v.pins = (const struct hda_pintbl[]) {
9361                         { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
9362                         { 0x1a, 0x90170151 }, /* bass speaker */
9363                         { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
9364                         {}
9365                 },
9366                 .chained = true,
9367                 .chain_id = ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
9368         },
9369         [ALC668_FIXUP_MIC_COEF] = {
9370                 .type = HDA_FIXUP_VERBS,
9371                 .v.verbs = (const struct hda_verb[]) {
9372                         { 0x20, AC_VERB_SET_COEF_INDEX, 0xc3 },
9373                         { 0x20, AC_VERB_SET_PROC_COEF, 0x4000 },
9374                         {}
9375                 },
9376         },
9377         [ALC668_FIXUP_ASUS_G751] = {
9378                 .type = HDA_FIXUP_PINS,
9379                 .v.pins = (const struct hda_pintbl[]) {
9380                         { 0x16, 0x0421101f }, /* HP */
9381                         {}
9382                 },
9383                 .chained = true,
9384                 .chain_id = ALC668_FIXUP_MIC_COEF
9385         },
9386         [ALC891_FIXUP_HEADSET_MODE] = {
9387                 .type = HDA_FIXUP_FUNC,
9388                 .v.func = alc_fixup_headset_mode,
9389         },
9390         [ALC891_FIXUP_DELL_MIC_NO_PRESENCE] = {
9391                 .type = HDA_FIXUP_PINS,
9392                 .v.pins = (const struct hda_pintbl[]) {
9393                         { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
9394                         { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
9395                         { }
9396                 },
9397                 .chained = true,
9398                 .chain_id = ALC891_FIXUP_HEADSET_MODE
9399         },
9400         [ALC662_FIXUP_ACER_VERITON] = {
9401                 .type = HDA_FIXUP_PINS,
9402                 .v.pins = (const struct hda_pintbl[]) {
9403                         { 0x15, 0x50170120 }, /* no internal speaker */
9404                         { }
9405                 }
9406         },
9407         [ALC892_FIXUP_ASROCK_MOBO] = {
9408                 .type = HDA_FIXUP_PINS,
9409                 .v.pins = (const struct hda_pintbl[]) {
9410                         { 0x15, 0x40f000f0 }, /* disabled */
9411                         { 0x16, 0x40f000f0 }, /* disabled */
9412                         { }
9413                 }
9414         },
9415         [ALC662_FIXUP_USI_FUNC] = {
9416                 .type = HDA_FIXUP_FUNC,
9417                 .v.func = alc662_fixup_usi_headset_mic,
9418         },
9419         [ALC662_FIXUP_USI_HEADSET_MODE] = {
9420                 .type = HDA_FIXUP_PINS,
9421                 .v.pins = (const struct hda_pintbl[]) {
9422                         { 0x19, 0x02a1913c }, /* use as headset mic, without its own jack detect */
9423                         { 0x18, 0x01a1903d },
9424                         { }
9425                 },
9426                 .chained = true,
9427                 .chain_id = ALC662_FIXUP_USI_FUNC
9428         },
9429         [ALC662_FIXUP_LENOVO_MULTI_CODECS] = {
9430                 .type = HDA_FIXUP_FUNC,
9431                 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
9432         },
9433         [ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET] = {
9434                 .type = HDA_FIXUP_FUNC,
9435                 .v.func = alc662_fixup_aspire_ethos_hp,
9436         },
9437         [ALC669_FIXUP_ACER_ASPIRE_ETHOS] = {
9438                 .type = HDA_FIXUP_PINS,
9439                 .v.pins = (const struct hda_pintbl[]) {
9440                         { 0x15, 0x92130110 }, /* front speakers */
9441                         { 0x18, 0x99130111 }, /* center/subwoofer */
9442                         { 0x1b, 0x11130012 }, /* surround plus jack for HP */
9443                         { }
9444                 },
9445                 .chained = true,
9446                 .chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET
9447         },
9448         [ALC671_FIXUP_HP_HEADSET_MIC2] = {
9449                 .type = HDA_FIXUP_FUNC,
9450                 .v.func = alc671_fixup_hp_headset_mic2,
9451         },
9452         [ALC662_FIXUP_ACER_X2660G_HEADSET_MODE] = {
9453                 .type = HDA_FIXUP_PINS,
9454                 .v.pins = (const struct hda_pintbl[]) {
9455                         { 0x1a, 0x02a1113c }, /* use as headset mic, without its own jack detect */
9456                         { }
9457                 },
9458                 .chained = true,
9459                 .chain_id = ALC662_FIXUP_USI_FUNC
9460         },
9461         [ALC662_FIXUP_ACER_NITRO_HEADSET_MODE] = {
9462                 .type = HDA_FIXUP_PINS,
9463                 .v.pins = (const struct hda_pintbl[]) {
9464                         { 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */
9465                         { 0x1b, 0x0221144f },
9466                         { }
9467                 },
9468                 .chained = true,
9469                 .chain_id = ALC662_FIXUP_USI_FUNC
9470         },
9471 };
9472
9473 static const struct snd_pci_quirk alc662_fixup_tbl[] = {
9474         SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2),
9475         SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC),
9476         SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", ALC662_FIXUP_INV_DMIC),
9477         SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
9478         SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
9479         SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC),
9480         SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC),
9481         SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
9482         SND_PCI_QUIRK(0x1025, 0x123c, "Acer Nitro N50-600", ALC662_FIXUP_ACER_NITRO_HEADSET_MODE),
9483         SND_PCI_QUIRK(0x1025, 0x124e, "Acer 2660G", ALC662_FIXUP_ACER_X2660G_HEADSET_MODE),
9484         SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
9485         SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
9486         SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13),
9487         SND_PCI_QUIRK(0x1028, 0x060a, "Dell XPS 13", ALC668_FIXUP_DELL_XPS13),
9488         SND_PCI_QUIRK(0x1028, 0x060d, "Dell M3800", ALC668_FIXUP_DELL_XPS13),
9489         SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
9490         SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
9491         SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
9492         SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
9493         SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
9494         SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
9495         SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE),
9496         SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50),
9497         SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A),
9498         SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50),
9499         SND_PCI_QUIRK(0x1043, 0x12ff, "ASUS G751", ALC668_FIXUP_ASUS_G751),
9500         SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
9501         SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16),
9502         SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51),
9503         SND_PCI_QUIRK(0x1043, 0x17bd, "ASUS N751", ALC668_FIXUP_ASUS_Nx51),
9504         SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71SL", ALC662_FIXUP_ASUS_MODE8),
9505         SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16),
9506         SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
9507         SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
9508         SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
9509         SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
9510         SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE),
9511         SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC662_FIXUP_LENOVO_MULTI_CODECS),
9512         SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
9513         SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
9514         SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),
9515         SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68),
9516         SND_PCI_QUIRK(0x1b0a, 0x01b8, "ACER Veriton", ALC662_FIXUP_ACER_VERITON),
9517         SND_PCI_QUIRK(0x1b35, 0x1234, "CZC ET26", ALC662_FIXUP_CZC_ET26),
9518         SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
9519         SND_PCI_QUIRK(0x1025, 0x0566, "Acer Aspire Ethos 8951G", ALC669_FIXUP_ACER_ASPIRE_ETHOS),
9520
9521 #if 0
9522         /* Below is a quirk table taken from the old code.
9523          * Basically the device should work as is without the fixup table.
9524          * If BIOS doesn't give a proper info, enable the corresponding
9525          * fixup entry.
9526          */
9527         SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),
9528         SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),
9529         SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1),
9530         SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC662_FIXUP_ASUS_MODE3),
9531         SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
9532         SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9533         SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
9534         SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC662_FIXUP_ASUS_MODE1),
9535         SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC662_FIXUP_ASUS_MODE1),
9536         SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9537         SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC662_FIXUP_ASUS_MODE7),
9538         SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC662_FIXUP_ASUS_MODE7),
9539         SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC662_FIXUP_ASUS_MODE8),
9540         SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC662_FIXUP_ASUS_MODE3),
9541         SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC662_FIXUP_ASUS_MODE1),
9542         SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9543         SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_FIXUP_ASUS_MODE2),
9544         SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC662_FIXUP_ASUS_MODE1),
9545         SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9546         SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
9547         SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
9548         SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9549         SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC662_FIXUP_ASUS_MODE1),
9550         SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC662_FIXUP_ASUS_MODE3),
9551         SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_FIXUP_ASUS_MODE2),
9552         SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9553         SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC662_FIXUP_ASUS_MODE5),
9554         SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
9555         SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9556         SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC662_FIXUP_ASUS_MODE1),
9557         SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9558         SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9559         SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC662_FIXUP_ASUS_MODE3),
9560         SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC662_FIXUP_ASUS_MODE3),
9561         SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC662_FIXUP_ASUS_MODE1),
9562         SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC662_FIXUP_ASUS_MODE1),
9563         SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC662_FIXUP_ASUS_MODE1),
9564         SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC662_FIXUP_ASUS_MODE1),
9565         SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC662_FIXUP_ASUS_MODE1),
9566         SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
9567         SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_FIXUP_ASUS_MODE2),
9568         SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC662_FIXUP_ASUS_MODE1),
9569         SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
9570         SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC662_FIXUP_ASUS_MODE3),
9571         SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC662_FIXUP_ASUS_MODE1),
9572         SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC662_FIXUP_ASUS_MODE1),
9573         SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC662_FIXUP_ASUS_MODE1),
9574         SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_FIXUP_ASUS_MODE2),
9575         SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
9576         SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE4),
9577 #endif
9578         {}
9579 };
9580
9581 static const struct hda_model_fixup alc662_fixup_models[] = {
9582         {.id = ALC662_FIXUP_ASPIRE, .name = "aspire"},
9583         {.id = ALC662_FIXUP_IDEAPAD, .name = "ideapad"},
9584         {.id = ALC272_FIXUP_MARIO, .name = "mario"},
9585         {.id = ALC662_FIXUP_HP_RP5800, .name = "hp-rp5800"},
9586         {.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"},
9587         {.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"},
9588         {.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"},
9589         {.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"},
9590         {.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"},
9591         {.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
9592         {.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
9593         {.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
9594         {.id = ALC662_FIXUP_ZOTAC_Z68, .name = "zotac-z68"},
9595         {.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},
9596         {.id = ALC662_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc662-headset-multi"},
9597         {.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
9598         {.id = ALC662_FIXUP_HEADSET_MODE, .name = "alc662-headset"},
9599         {.id = ALC668_FIXUP_HEADSET_MODE, .name = "alc668-headset"},
9600         {.id = ALC662_FIXUP_BASS_16, .name = "bass16"},
9601         {.id = ALC662_FIXUP_BASS_1A, .name = "bass1a"},
9602         {.id = ALC668_FIXUP_AUTO_MUTE, .name = "automute"},
9603         {.id = ALC668_FIXUP_DELL_XPS13, .name = "dell-xps13"},
9604         {.id = ALC662_FIXUP_ASUS_Nx50, .name = "asus-nx50"},
9605         {.id = ALC668_FIXUP_ASUS_Nx51, .name = "asus-nx51"},
9606         {.id = ALC668_FIXUP_ASUS_G751, .name = "asus-g751"},
9607         {.id = ALC891_FIXUP_HEADSET_MODE, .name = "alc891-headset"},
9608         {.id = ALC891_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc891-headset-multi"},
9609         {.id = ALC662_FIXUP_ACER_VERITON, .name = "acer-veriton"},
9610         {.id = ALC892_FIXUP_ASROCK_MOBO, .name = "asrock-mobo"},
9611         {.id = ALC662_FIXUP_USI_HEADSET_MODE, .name = "usi-headset"},
9612         {.id = ALC662_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
9613         {.id = ALC669_FIXUP_ACER_ASPIRE_ETHOS, .name = "aspire-ethos"},
9614         {}
9615 };
9616
9617 static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {
9618         SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
9619                 {0x17, 0x02211010},
9620                 {0x18, 0x01a19030},
9621                 {0x1a, 0x01813040},
9622                 {0x21, 0x01014020}),
9623         SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
9624                 {0x16, 0x01813030},
9625                 {0x17, 0x02211010},
9626                 {0x18, 0x01a19040},
9627                 {0x21, 0x01014020}),
9628         SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
9629                 {0x14, 0x01014010},
9630                 {0x18, 0x01a19020},
9631                 {0x1a, 0x0181302f},
9632                 {0x1b, 0x0221401f}),
9633         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
9634                 {0x12, 0x99a30130},
9635                 {0x14, 0x90170110},
9636                 {0x15, 0x0321101f},
9637                 {0x16, 0x03011020}),
9638         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
9639                 {0x12, 0x99a30140},
9640                 {0x14, 0x90170110},
9641                 {0x15, 0x0321101f},
9642                 {0x16, 0x03011020}),
9643         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
9644                 {0x12, 0x99a30150},
9645                 {0x14, 0x90170110},
9646                 {0x15, 0x0321101f},
9647                 {0x16, 0x03011020}),
9648         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
9649                 {0x14, 0x90170110},
9650                 {0x15, 0x0321101f},
9651                 {0x16, 0x03011020}),
9652         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell XPS 15", ALC668_FIXUP_AUTO_MUTE,
9653                 {0x12, 0x90a60130},
9654                 {0x14, 0x90170110},
9655                 {0x15, 0x0321101f}),
9656         SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
9657                 {0x14, 0x01014010},
9658                 {0x17, 0x90170150},
9659                 {0x19, 0x02a11060},
9660                 {0x1b, 0x01813030},
9661                 {0x21, 0x02211020}),
9662         SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
9663                 {0x14, 0x01014010},
9664                 {0x18, 0x01a19040},
9665                 {0x1b, 0x01813030},
9666                 {0x21, 0x02211020}),
9667         SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
9668                 {0x14, 0x01014020},
9669                 {0x17, 0x90170110},
9670                 {0x18, 0x01a19050},
9671                 {0x1b, 0x01813040},
9672                 {0x21, 0x02211030}),
9673         {}
9674 };
9675
9676 /*
9677  */
9678 static int patch_alc662(struct hda_codec *codec)
9679 {
9680         struct alc_spec *spec;
9681         int err;
9682
9683         err = alc_alloc_spec(codec, 0x0b);
9684         if (err < 0)
9685                 return err;
9686
9687         spec = codec->spec;
9688
9689         spec->shutup = alc_eapd_shutup;
9690
9691         /* handle multiple HPs as is */
9692         spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
9693
9694         alc_fix_pll_init(codec, 0x20, 0x04, 15);
9695
9696         switch (codec->core.vendor_id) {
9697         case 0x10ec0668:
9698                 spec->init_hook = alc668_restore_default_value;
9699                 break;
9700         }
9701
9702         alc_pre_init(codec);
9703
9704         snd_hda_pick_fixup(codec, alc662_fixup_models,
9705                        alc662_fixup_tbl, alc662_fixups);
9706         snd_hda_pick_pin_fixup(codec, alc662_pin_fixup_tbl, alc662_fixups, true);
9707         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
9708
9709         alc_auto_parse_customize_define(codec);
9710
9711         if (has_cdefine_beep(codec))
9712                 spec->gen.beep_nid = 0x01;
9713
9714         if ((alc_get_coef0(codec) & (1 << 14)) &&
9715             codec->bus->pci && codec->bus->pci->subsystem_vendor == 0x1025 &&
9716             spec->cdefine.platform_type == 1) {
9717                 err = alc_codec_rename(codec, "ALC272X");
9718                 if (err < 0)
9719                         goto error;
9720         }
9721
9722         /* automatic parse from the BIOS config */
9723         err = alc662_parse_auto_config(codec);
9724         if (err < 0)
9725                 goto error;
9726
9727         if (!spec->gen.no_analog && spec->gen.beep_nid) {
9728                 switch (codec->core.vendor_id) {
9729                 case 0x10ec0662:
9730                         err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
9731                         break;
9732                 case 0x10ec0272:
9733                 case 0x10ec0663:
9734                 case 0x10ec0665:
9735                 case 0x10ec0668:
9736                         err = set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
9737                         break;
9738                 case 0x10ec0273:
9739                         err = set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
9740                         break;
9741                 }
9742                 if (err < 0)
9743                         goto error;
9744         }
9745
9746         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
9747
9748         return 0;
9749
9750  error:
9751         alc_free(codec);
9752         return err;
9753 }
9754
9755 /*
9756  * ALC680 support
9757  */
9758
9759 static int alc680_parse_auto_config(struct hda_codec *codec)
9760 {
9761         return alc_parse_auto_config(codec, NULL, NULL);
9762 }
9763
9764 /*
9765  */
9766 static int patch_alc680(struct hda_codec *codec)
9767 {
9768         int err;
9769
9770         /* ALC680 has no aa-loopback mixer */
9771         err = alc_alloc_spec(codec, 0);
9772         if (err < 0)
9773                 return err;
9774
9775         /* automatic parse from the BIOS config */
9776         err = alc680_parse_auto_config(codec);
9777         if (err < 0) {
9778                 alc_free(codec);
9779                 return err;
9780         }
9781
9782         return 0;
9783 }
9784
9785 /*
9786  * patch entries
9787  */
9788 static const struct hda_device_id snd_hda_id_realtek[] = {
9789         HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269),
9790         HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),
9791         HDA_CODEC_ENTRY(0x10ec0222, "ALC222", patch_alc269),
9792         HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),
9793         HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),
9794         HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269),
9795         HDA_CODEC_ENTRY(0x10ec0234, "ALC234", patch_alc269),
9796         HDA_CODEC_ENTRY(0x10ec0235, "ALC233", patch_alc269),
9797         HDA_CODEC_ENTRY(0x10ec0236, "ALC236", patch_alc269),
9798         HDA_CODEC_ENTRY(0x10ec0245, "ALC245", patch_alc269),
9799         HDA_CODEC_ENTRY(0x10ec0255, "ALC255", patch_alc269),
9800         HDA_CODEC_ENTRY(0x10ec0256, "ALC256", patch_alc269),
9801         HDA_CODEC_ENTRY(0x10ec0257, "ALC257", patch_alc269),
9802         HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260),
9803         HDA_CODEC_ENTRY(0x10ec0262, "ALC262", patch_alc262),
9804         HDA_CODEC_ENTRY(0x10ec0267, "ALC267", patch_alc268),
9805         HDA_CODEC_ENTRY(0x10ec0268, "ALC268", patch_alc268),
9806         HDA_CODEC_ENTRY(0x10ec0269, "ALC269", patch_alc269),
9807         HDA_CODEC_ENTRY(0x10ec0270, "ALC270", patch_alc269),
9808         HDA_CODEC_ENTRY(0x10ec0272, "ALC272", patch_alc662),
9809         HDA_CODEC_ENTRY(0x10ec0274, "ALC274", patch_alc269),
9810         HDA_CODEC_ENTRY(0x10ec0275, "ALC275", patch_alc269),
9811         HDA_CODEC_ENTRY(0x10ec0276, "ALC276", patch_alc269),
9812         HDA_CODEC_ENTRY(0x10ec0280, "ALC280", patch_alc269),
9813         HDA_CODEC_ENTRY(0x10ec0282, "ALC282", patch_alc269),
9814         HDA_CODEC_ENTRY(0x10ec0283, "ALC283", patch_alc269),
9815         HDA_CODEC_ENTRY(0x10ec0284, "ALC284", patch_alc269),
9816         HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269),
9817         HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269),
9818         HDA_CODEC_ENTRY(0x10ec0287, "ALC287", patch_alc269),
9819         HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269),
9820         HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269),
9821         HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269),
9822         HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269),
9823         HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269),
9824         HDA_CODEC_ENTRY(0x10ec0294, "ALC294", patch_alc269),
9825         HDA_CODEC_ENTRY(0x10ec0295, "ALC295", patch_alc269),
9826         HDA_CODEC_ENTRY(0x10ec0298, "ALC298", patch_alc269),
9827         HDA_CODEC_ENTRY(0x10ec0299, "ALC299", patch_alc269),
9828         HDA_CODEC_ENTRY(0x10ec0300, "ALC300", patch_alc269),
9829         HDA_CODEC_ENTRY(0x10ec0623, "ALC623", patch_alc269),
9830         HDA_CODEC_REV_ENTRY(0x10ec0861, 0x100340, "ALC660", patch_alc861),
9831         HDA_CODEC_ENTRY(0x10ec0660, "ALC660-VD", patch_alc861vd),
9832         HDA_CODEC_ENTRY(0x10ec0861, "ALC861", patch_alc861),
9833         HDA_CODEC_ENTRY(0x10ec0862, "ALC861-VD", patch_alc861vd),
9834         HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100002, "ALC662 rev2", patch_alc882),
9835         HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100101, "ALC662 rev1", patch_alc662),
9836         HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100300, "ALC662 rev3", patch_alc662),
9837         HDA_CODEC_ENTRY(0x10ec0663, "ALC663", patch_alc662),
9838         HDA_CODEC_ENTRY(0x10ec0665, "ALC665", patch_alc662),
9839         HDA_CODEC_ENTRY(0x10ec0667, "ALC667", patch_alc662),
9840         HDA_CODEC_ENTRY(0x10ec0668, "ALC668", patch_alc662),
9841         HDA_CODEC_ENTRY(0x10ec0670, "ALC670", patch_alc662),
9842         HDA_CODEC_ENTRY(0x10ec0671, "ALC671", patch_alc662),
9843         HDA_CODEC_ENTRY(0x10ec0680, "ALC680", patch_alc680),
9844         HDA_CODEC_ENTRY(0x10ec0700, "ALC700", patch_alc269),
9845         HDA_CODEC_ENTRY(0x10ec0701, "ALC701", patch_alc269),
9846         HDA_CODEC_ENTRY(0x10ec0703, "ALC703", patch_alc269),
9847         HDA_CODEC_ENTRY(0x10ec0711, "ALC711", patch_alc269),
9848         HDA_CODEC_ENTRY(0x10ec0867, "ALC891", patch_alc662),
9849         HDA_CODEC_ENTRY(0x10ec0880, "ALC880", patch_alc880),
9850         HDA_CODEC_ENTRY(0x10ec0882, "ALC882", patch_alc882),
9851         HDA_CODEC_ENTRY(0x10ec0883, "ALC883", patch_alc882),
9852         HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100101, "ALC889A", patch_alc882),
9853         HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100103, "ALC889A", patch_alc882),
9854         HDA_CODEC_ENTRY(0x10ec0885, "ALC885", patch_alc882),
9855         HDA_CODEC_ENTRY(0x10ec0887, "ALC887", patch_alc882),
9856         HDA_CODEC_REV_ENTRY(0x10ec0888, 0x100101, "ALC1200", patch_alc882),
9857         HDA_CODEC_ENTRY(0x10ec0888, "ALC888", patch_alc882),
9858         HDA_CODEC_ENTRY(0x10ec0889, "ALC889", patch_alc882),
9859         HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662),
9860         HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882),
9861         HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882),
9862         HDA_CODEC_ENTRY(0x10ec0b00, "ALCS1200A", patch_alc882),
9863         HDA_CODEC_ENTRY(0x10ec1168, "ALC1220", patch_alc882),
9864         HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882),
9865         {} /* terminator */
9866 };
9867 MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_realtek);
9868
9869 MODULE_LICENSE("GPL");
9870 MODULE_DESCRIPTION("Realtek HD-audio codec");
9871
9872 static struct hda_codec_driver realtek_driver = {
9873         .id = snd_hda_id_realtek,
9874 };
9875
9876 module_hda_codec_driver(realtek_driver);