Merge tag 'xarray-6.6' of git://git.infradead.org/users/willy/xarray
[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 <linux/ctype.h>
22 #include <sound/core.h>
23 #include <sound/jack.h>
24 #include <sound/hda_codec.h>
25 #include "hda_local.h"
26 #include "hda_auto_parser.h"
27 #include "hda_jack.h"
28 #include "hda_generic.h"
29 #include "hda_component.h"
30
31 /* keep halting ALC5505 DSP, for power saving */
32 #define HALT_REALTEK_ALC5505
33
34 /* extra amp-initialization sequence types */
35 enum {
36         ALC_INIT_UNDEFINED,
37         ALC_INIT_NONE,
38         ALC_INIT_DEFAULT,
39 };
40
41 enum {
42         ALC_HEADSET_MODE_UNKNOWN,
43         ALC_HEADSET_MODE_UNPLUGGED,
44         ALC_HEADSET_MODE_HEADSET,
45         ALC_HEADSET_MODE_MIC,
46         ALC_HEADSET_MODE_HEADPHONE,
47 };
48
49 enum {
50         ALC_HEADSET_TYPE_UNKNOWN,
51         ALC_HEADSET_TYPE_CTIA,
52         ALC_HEADSET_TYPE_OMTP,
53 };
54
55 enum {
56         ALC_KEY_MICMUTE_INDEX,
57 };
58
59 struct alc_customize_define {
60         unsigned int  sku_cfg;
61         unsigned char port_connectivity;
62         unsigned char check_sum;
63         unsigned char customization;
64         unsigned char external_amp;
65         unsigned int  enable_pcbeep:1;
66         unsigned int  platform_type:1;
67         unsigned int  swap:1;
68         unsigned int  override:1;
69         unsigned int  fixup:1; /* Means that this sku is set by driver, not read from hw */
70 };
71
72 struct alc_coef_led {
73         unsigned int idx;
74         unsigned int mask;
75         unsigned int on;
76         unsigned int off;
77 };
78
79 struct alc_spec {
80         struct hda_gen_spec gen; /* must be at head */
81
82         /* codec parameterization */
83         struct alc_customize_define cdefine;
84         unsigned int parse_flags; /* flag for snd_hda_parse_pin_defcfg() */
85
86         /* GPIO bits */
87         unsigned int gpio_mask;
88         unsigned int gpio_dir;
89         unsigned int gpio_data;
90         bool gpio_write_delay;  /* add a delay before writing gpio_data */
91
92         /* mute LED for HP laptops, see vref_mute_led_set() */
93         int mute_led_polarity;
94         int micmute_led_polarity;
95         hda_nid_t mute_led_nid;
96         hda_nid_t cap_mute_led_nid;
97
98         unsigned int gpio_mute_led_mask;
99         unsigned int gpio_mic_led_mask;
100         struct alc_coef_led mute_led_coef;
101         struct alc_coef_led mic_led_coef;
102         struct mutex coef_mutex;
103
104         hda_nid_t headset_mic_pin;
105         hda_nid_t headphone_mic_pin;
106         int current_headset_mode;
107         int current_headset_type;
108
109         /* hooks */
110         void (*init_hook)(struct hda_codec *codec);
111 #ifdef CONFIG_PM
112         void (*power_hook)(struct hda_codec *codec);
113 #endif
114         void (*shutup)(struct hda_codec *codec);
115
116         int init_amp;
117         int codec_variant;      /* flag for other variants */
118         unsigned int has_alc5505_dsp:1;
119         unsigned int no_depop_delay:1;
120         unsigned int done_hp_init:1;
121         unsigned int no_shutup_pins:1;
122         unsigned int ultra_low_power:1;
123         unsigned int has_hs_key:1;
124         unsigned int no_internal_mic_pin:1;
125         unsigned int en_3kpull_low:1;
126
127         /* for PLL fix */
128         hda_nid_t pll_nid;
129         unsigned int pll_coef_idx, pll_coef_bit;
130         unsigned int coef0;
131         struct input_dev *kb_dev;
132         u8 alc_mute_keycode_map[1];
133
134         /* component binding */
135         struct component_match *match;
136         struct hda_component comps[HDA_MAX_COMPONENTS];
137 };
138
139 /*
140  * COEF access helper functions
141  */
142
143 static void coef_mutex_lock(struct hda_codec *codec)
144 {
145         struct alc_spec *spec = codec->spec;
146
147         snd_hda_power_up_pm(codec);
148         mutex_lock(&spec->coef_mutex);
149 }
150
151 static void coef_mutex_unlock(struct hda_codec *codec)
152 {
153         struct alc_spec *spec = codec->spec;
154
155         mutex_unlock(&spec->coef_mutex);
156         snd_hda_power_down_pm(codec);
157 }
158
159 static int __alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
160                                  unsigned int coef_idx)
161 {
162         unsigned int val;
163
164         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
165         val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0);
166         return val;
167 }
168
169 static int alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
170                                unsigned int coef_idx)
171 {
172         unsigned int val;
173
174         coef_mutex_lock(codec);
175         val = __alc_read_coefex_idx(codec, nid, coef_idx);
176         coef_mutex_unlock(codec);
177         return val;
178 }
179
180 #define alc_read_coef_idx(codec, coef_idx) \
181         alc_read_coefex_idx(codec, 0x20, coef_idx)
182
183 static void __alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
184                                    unsigned int coef_idx, unsigned int coef_val)
185 {
186         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
187         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PROC_COEF, coef_val);
188 }
189
190 static void alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
191                                  unsigned int coef_idx, unsigned int coef_val)
192 {
193         coef_mutex_lock(codec);
194         __alc_write_coefex_idx(codec, nid, coef_idx, coef_val);
195         coef_mutex_unlock(codec);
196 }
197
198 #define alc_write_coef_idx(codec, coef_idx, coef_val) \
199         alc_write_coefex_idx(codec, 0x20, coef_idx, coef_val)
200
201 static void __alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
202                                     unsigned int coef_idx, unsigned int mask,
203                                     unsigned int bits_set)
204 {
205         unsigned int val = __alc_read_coefex_idx(codec, nid, coef_idx);
206
207         if (val != -1)
208                 __alc_write_coefex_idx(codec, nid, coef_idx,
209                                        (val & ~mask) | bits_set);
210 }
211
212 static void alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
213                                   unsigned int coef_idx, unsigned int mask,
214                                   unsigned int bits_set)
215 {
216         coef_mutex_lock(codec);
217         __alc_update_coefex_idx(codec, nid, coef_idx, mask, bits_set);
218         coef_mutex_unlock(codec);
219 }
220
221 #define alc_update_coef_idx(codec, coef_idx, mask, bits_set)    \
222         alc_update_coefex_idx(codec, 0x20, coef_idx, mask, bits_set)
223
224 /* a special bypass for COEF 0; read the cached value at the second time */
225 static unsigned int alc_get_coef0(struct hda_codec *codec)
226 {
227         struct alc_spec *spec = codec->spec;
228
229         if (!spec->coef0)
230                 spec->coef0 = alc_read_coef_idx(codec, 0);
231         return spec->coef0;
232 }
233
234 /* coef writes/updates batch */
235 struct coef_fw {
236         unsigned char nid;
237         unsigned char idx;
238         unsigned short mask;
239         unsigned short val;
240 };
241
242 #define UPDATE_COEFEX(_nid, _idx, _mask, _val) \
243         { .nid = (_nid), .idx = (_idx), .mask = (_mask), .val = (_val) }
244 #define WRITE_COEFEX(_nid, _idx, _val) UPDATE_COEFEX(_nid, _idx, -1, _val)
245 #define WRITE_COEF(_idx, _val) WRITE_COEFEX(0x20, _idx, _val)
246 #define UPDATE_COEF(_idx, _mask, _val) UPDATE_COEFEX(0x20, _idx, _mask, _val)
247
248 static void alc_process_coef_fw(struct hda_codec *codec,
249                                 const struct coef_fw *fw)
250 {
251         coef_mutex_lock(codec);
252         for (; fw->nid; fw++) {
253                 if (fw->mask == (unsigned short)-1)
254                         __alc_write_coefex_idx(codec, fw->nid, fw->idx, fw->val);
255                 else
256                         __alc_update_coefex_idx(codec, fw->nid, fw->idx,
257                                                 fw->mask, fw->val);
258         }
259         coef_mutex_unlock(codec);
260 }
261
262 /*
263  * GPIO setup tables, used in initialization
264  */
265
266 /* Enable GPIO mask and set output */
267 static void alc_setup_gpio(struct hda_codec *codec, unsigned int mask)
268 {
269         struct alc_spec *spec = codec->spec;
270
271         spec->gpio_mask |= mask;
272         spec->gpio_dir |= mask;
273         spec->gpio_data |= mask;
274 }
275
276 static void alc_write_gpio_data(struct hda_codec *codec)
277 {
278         struct alc_spec *spec = codec->spec;
279
280         snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
281                             spec->gpio_data);
282 }
283
284 static void alc_update_gpio_data(struct hda_codec *codec, unsigned int mask,
285                                  bool on)
286 {
287         struct alc_spec *spec = codec->spec;
288         unsigned int oldval = spec->gpio_data;
289
290         if (on)
291                 spec->gpio_data |= mask;
292         else
293                 spec->gpio_data &= ~mask;
294         if (oldval != spec->gpio_data)
295                 alc_write_gpio_data(codec);
296 }
297
298 static void alc_write_gpio(struct hda_codec *codec)
299 {
300         struct alc_spec *spec = codec->spec;
301
302         if (!spec->gpio_mask)
303                 return;
304
305         snd_hda_codec_write(codec, codec->core.afg, 0,
306                             AC_VERB_SET_GPIO_MASK, spec->gpio_mask);
307         snd_hda_codec_write(codec, codec->core.afg, 0,
308                             AC_VERB_SET_GPIO_DIRECTION, spec->gpio_dir);
309         if (spec->gpio_write_delay)
310                 msleep(1);
311         alc_write_gpio_data(codec);
312 }
313
314 static void alc_fixup_gpio(struct hda_codec *codec, int action,
315                            unsigned int mask)
316 {
317         if (action == HDA_FIXUP_ACT_PRE_PROBE)
318                 alc_setup_gpio(codec, mask);
319 }
320
321 static void alc_fixup_gpio1(struct hda_codec *codec,
322                             const struct hda_fixup *fix, int action)
323 {
324         alc_fixup_gpio(codec, action, 0x01);
325 }
326
327 static void alc_fixup_gpio2(struct hda_codec *codec,
328                             const struct hda_fixup *fix, int action)
329 {
330         alc_fixup_gpio(codec, action, 0x02);
331 }
332
333 static void alc_fixup_gpio3(struct hda_codec *codec,
334                             const struct hda_fixup *fix, int action)
335 {
336         alc_fixup_gpio(codec, action, 0x03);
337 }
338
339 static void alc_fixup_gpio4(struct hda_codec *codec,
340                             const struct hda_fixup *fix, int action)
341 {
342         alc_fixup_gpio(codec, action, 0x04);
343 }
344
345 static void alc_fixup_micmute_led(struct hda_codec *codec,
346                                   const struct hda_fixup *fix, int action)
347 {
348         if (action == HDA_FIXUP_ACT_PRE_PROBE)
349                 snd_hda_gen_add_micmute_led_cdev(codec, NULL);
350 }
351
352 /*
353  * Fix hardware PLL issue
354  * On some codecs, the analog PLL gating control must be off while
355  * the default value is 1.
356  */
357 static void alc_fix_pll(struct hda_codec *codec)
358 {
359         struct alc_spec *spec = codec->spec;
360
361         if (spec->pll_nid)
362                 alc_update_coefex_idx(codec, spec->pll_nid, spec->pll_coef_idx,
363                                       1 << spec->pll_coef_bit, 0);
364 }
365
366 static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
367                              unsigned int coef_idx, unsigned int coef_bit)
368 {
369         struct alc_spec *spec = codec->spec;
370         spec->pll_nid = nid;
371         spec->pll_coef_idx = coef_idx;
372         spec->pll_coef_bit = coef_bit;
373         alc_fix_pll(codec);
374 }
375
376 /* update the master volume per volume-knob's unsol event */
377 static void alc_update_knob_master(struct hda_codec *codec,
378                                    struct hda_jack_callback *jack)
379 {
380         unsigned int val;
381         struct snd_kcontrol *kctl;
382         struct snd_ctl_elem_value *uctl;
383
384         kctl = snd_hda_find_mixer_ctl(codec, "Master Playback Volume");
385         if (!kctl)
386                 return;
387         uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
388         if (!uctl)
389                 return;
390         val = snd_hda_codec_read(codec, jack->nid, 0,
391                                  AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
392         val &= HDA_AMP_VOLMASK;
393         uctl->value.integer.value[0] = val;
394         uctl->value.integer.value[1] = val;
395         kctl->put(kctl, uctl);
396         kfree(uctl);
397 }
398
399 static void alc880_unsol_event(struct hda_codec *codec, unsigned int res)
400 {
401         /* For some reason, the res given from ALC880 is broken.
402            Here we adjust it properly. */
403         snd_hda_jack_unsol_event(codec, res >> 2);
404 }
405
406 /* Change EAPD to verb control */
407 static void alc_fill_eapd_coef(struct hda_codec *codec)
408 {
409         int coef;
410
411         coef = alc_get_coef0(codec);
412
413         switch (codec->core.vendor_id) {
414         case 0x10ec0262:
415                 alc_update_coef_idx(codec, 0x7, 0, 1<<5);
416                 break;
417         case 0x10ec0267:
418         case 0x10ec0268:
419                 alc_update_coef_idx(codec, 0x7, 0, 1<<13);
420                 break;
421         case 0x10ec0269:
422                 if ((coef & 0x00f0) == 0x0010)
423                         alc_update_coef_idx(codec, 0xd, 0, 1<<14);
424                 if ((coef & 0x00f0) == 0x0020)
425                         alc_update_coef_idx(codec, 0x4, 1<<15, 0);
426                 if ((coef & 0x00f0) == 0x0030)
427                         alc_update_coef_idx(codec, 0x10, 1<<9, 0);
428                 break;
429         case 0x10ec0280:
430         case 0x10ec0284:
431         case 0x10ec0290:
432         case 0x10ec0292:
433                 alc_update_coef_idx(codec, 0x4, 1<<15, 0);
434                 break;
435         case 0x10ec0225:
436         case 0x10ec0295:
437         case 0x10ec0299:
438                 alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
439                 fallthrough;
440         case 0x10ec0215:
441         case 0x10ec0230:
442         case 0x10ec0233:
443         case 0x10ec0235:
444         case 0x10ec0236:
445         case 0x10ec0245:
446         case 0x10ec0255:
447         case 0x10ec0256:
448         case 0x19e58326:
449         case 0x10ec0257:
450         case 0x10ec0282:
451         case 0x10ec0283:
452         case 0x10ec0286:
453         case 0x10ec0288:
454         case 0x10ec0285:
455         case 0x10ec0298:
456         case 0x10ec0289:
457         case 0x10ec0300:
458                 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
459                 break;
460         case 0x10ec0275:
461                 alc_update_coef_idx(codec, 0xe, 0, 1<<0);
462                 break;
463         case 0x10ec0287:
464                 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
465                 alc_write_coef_idx(codec, 0x8, 0x4ab7);
466                 break;
467         case 0x10ec0293:
468                 alc_update_coef_idx(codec, 0xa, 1<<13, 0);
469                 break;
470         case 0x10ec0234:
471         case 0x10ec0274:
472         case 0x10ec0294:
473         case 0x10ec0700:
474         case 0x10ec0701:
475         case 0x10ec0703:
476         case 0x10ec0711:
477                 alc_update_coef_idx(codec, 0x10, 1<<15, 0);
478                 break;
479         case 0x10ec0662:
480                 if ((coef & 0x00f0) == 0x0030)
481                         alc_update_coef_idx(codec, 0x4, 1<<10, 0); /* EAPD Ctrl */
482                 break;
483         case 0x10ec0272:
484         case 0x10ec0273:
485         case 0x10ec0663:
486         case 0x10ec0665:
487         case 0x10ec0670:
488         case 0x10ec0671:
489         case 0x10ec0672:
490                 alc_update_coef_idx(codec, 0xd, 0, 1<<14); /* EAPD Ctrl */
491                 break;
492         case 0x10ec0222:
493         case 0x10ec0623:
494                 alc_update_coef_idx(codec, 0x19, 1<<13, 0);
495                 break;
496         case 0x10ec0668:
497                 alc_update_coef_idx(codec, 0x7, 3<<13, 0);
498                 break;
499         case 0x10ec0867:
500                 alc_update_coef_idx(codec, 0x4, 1<<10, 0);
501                 break;
502         case 0x10ec0888:
503                 if ((coef & 0x00f0) == 0x0020 || (coef & 0x00f0) == 0x0030)
504                         alc_update_coef_idx(codec, 0x7, 1<<5, 0);
505                 break;
506         case 0x10ec0892:
507         case 0x10ec0897:
508                 alc_update_coef_idx(codec, 0x7, 1<<5, 0);
509                 break;
510         case 0x10ec0899:
511         case 0x10ec0900:
512         case 0x10ec0b00:
513         case 0x10ec1168:
514         case 0x10ec1220:
515                 alc_update_coef_idx(codec, 0x7, 1<<1, 0);
516                 break;
517         }
518 }
519
520 /* additional initialization for ALC888 variants */
521 static void alc888_coef_init(struct hda_codec *codec)
522 {
523         switch (alc_get_coef0(codec) & 0x00f0) {
524         /* alc888-VA */
525         case 0x00:
526         /* alc888-VB */
527         case 0x10:
528                 alc_update_coef_idx(codec, 7, 0, 0x2030); /* Turn EAPD to High */
529                 break;
530         }
531 }
532
533 /* turn on/off EAPD control (only if available) */
534 static void set_eapd(struct hda_codec *codec, hda_nid_t nid, int on)
535 {
536         if (get_wcaps_type(get_wcaps(codec, nid)) != AC_WID_PIN)
537                 return;
538         if (snd_hda_query_pin_caps(codec, nid) & AC_PINCAP_EAPD)
539                 snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_EAPD_BTLENABLE,
540                                     on ? 2 : 0);
541 }
542
543 /* turn on/off EAPD controls of the codec */
544 static void alc_auto_setup_eapd(struct hda_codec *codec, bool on)
545 {
546         /* We currently only handle front, HP */
547         static const hda_nid_t pins[] = {
548                 0x0f, 0x10, 0x14, 0x15, 0x17, 0
549         };
550         const hda_nid_t *p;
551         for (p = pins; *p; p++)
552                 set_eapd(codec, *p, on);
553 }
554
555 static int find_ext_mic_pin(struct hda_codec *codec);
556
557 static void alc_headset_mic_no_shutup(struct hda_codec *codec)
558 {
559         const struct hda_pincfg *pin;
560         int mic_pin = find_ext_mic_pin(codec);
561         int i;
562
563         /* don't shut up pins when unloading the driver; otherwise it breaks
564          * the default pin setup at the next load of the driver
565          */
566         if (codec->bus->shutdown)
567                 return;
568
569         snd_array_for_each(&codec->init_pins, i, pin) {
570                 /* use read here for syncing after issuing each verb */
571                 if (pin->nid != mic_pin)
572                         snd_hda_codec_read(codec, pin->nid, 0,
573                                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
574         }
575
576         codec->pins_shutup = 1;
577 }
578
579 static void alc_shutup_pins(struct hda_codec *codec)
580 {
581         struct alc_spec *spec = codec->spec;
582
583         switch (codec->core.vendor_id) {
584         case 0x10ec0236:
585         case 0x10ec0256:
586         case 0x19e58326:
587         case 0x10ec0283:
588         case 0x10ec0286:
589         case 0x10ec0288:
590         case 0x10ec0298:
591                 alc_headset_mic_no_shutup(codec);
592                 break;
593         default:
594                 if (!spec->no_shutup_pins)
595                         snd_hda_shutup_pins(codec);
596                 break;
597         }
598 }
599
600 /* generic shutup callback;
601  * just turning off EAPD and a little pause for avoiding pop-noise
602  */
603 static void alc_eapd_shutup(struct hda_codec *codec)
604 {
605         struct alc_spec *spec = codec->spec;
606
607         alc_auto_setup_eapd(codec, false);
608         if (!spec->no_depop_delay)
609                 msleep(200);
610         alc_shutup_pins(codec);
611 }
612
613 /* generic EAPD initialization */
614 static void alc_auto_init_amp(struct hda_codec *codec, int type)
615 {
616         alc_auto_setup_eapd(codec, true);
617         alc_write_gpio(codec);
618         switch (type) {
619         case ALC_INIT_DEFAULT:
620                 switch (codec->core.vendor_id) {
621                 case 0x10ec0260:
622                         alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x2010);
623                         break;
624                 case 0x10ec0880:
625                 case 0x10ec0882:
626                 case 0x10ec0883:
627                 case 0x10ec0885:
628                         alc_update_coef_idx(codec, 7, 0, 0x2030);
629                         break;
630                 case 0x10ec0888:
631                         alc888_coef_init(codec);
632                         break;
633                 }
634                 break;
635         }
636 }
637
638 /* get a primary headphone pin if available */
639 static hda_nid_t alc_get_hp_pin(struct alc_spec *spec)
640 {
641         if (spec->gen.autocfg.hp_pins[0])
642                 return spec->gen.autocfg.hp_pins[0];
643         if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
644                 return spec->gen.autocfg.line_out_pins[0];
645         return 0;
646 }
647
648 /*
649  * Realtek SSID verification
650  */
651
652 /* Could be any non-zero and even value. When used as fixup, tells
653  * the driver to ignore any present sku defines.
654  */
655 #define ALC_FIXUP_SKU_IGNORE (2)
656
657 static void alc_fixup_sku_ignore(struct hda_codec *codec,
658                                  const struct hda_fixup *fix, int action)
659 {
660         struct alc_spec *spec = codec->spec;
661         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
662                 spec->cdefine.fixup = 1;
663                 spec->cdefine.sku_cfg = ALC_FIXUP_SKU_IGNORE;
664         }
665 }
666
667 static void alc_fixup_no_depop_delay(struct hda_codec *codec,
668                                     const struct hda_fixup *fix, int action)
669 {
670         struct alc_spec *spec = codec->spec;
671
672         if (action == HDA_FIXUP_ACT_PROBE) {
673                 spec->no_depop_delay = 1;
674                 codec->depop_delay = 0;
675         }
676 }
677
678 static int alc_auto_parse_customize_define(struct hda_codec *codec)
679 {
680         unsigned int ass, tmp, i;
681         unsigned nid = 0;
682         struct alc_spec *spec = codec->spec;
683
684         spec->cdefine.enable_pcbeep = 1; /* assume always enabled */
685
686         if (spec->cdefine.fixup) {
687                 ass = spec->cdefine.sku_cfg;
688                 if (ass == ALC_FIXUP_SKU_IGNORE)
689                         return -1;
690                 goto do_sku;
691         }
692
693         if (!codec->bus->pci)
694                 return -1;
695         ass = codec->core.subsystem_id & 0xffff;
696         if (ass != codec->bus->pci->subsystem_device && (ass & 1))
697                 goto do_sku;
698
699         nid = 0x1d;
700         if (codec->core.vendor_id == 0x10ec0260)
701                 nid = 0x17;
702         ass = snd_hda_codec_get_pincfg(codec, nid);
703
704         if (!(ass & 1)) {
705                 codec_info(codec, "%s: SKU not ready 0x%08x\n",
706                            codec->core.chip_name, ass);
707                 return -1;
708         }
709
710         /* check sum */
711         tmp = 0;
712         for (i = 1; i < 16; i++) {
713                 if ((ass >> i) & 1)
714                         tmp++;
715         }
716         if (((ass >> 16) & 0xf) != tmp)
717                 return -1;
718
719         spec->cdefine.port_connectivity = ass >> 30;
720         spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
721         spec->cdefine.check_sum = (ass >> 16) & 0xf;
722         spec->cdefine.customization = ass >> 8;
723 do_sku:
724         spec->cdefine.sku_cfg = ass;
725         spec->cdefine.external_amp = (ass & 0x38) >> 3;
726         spec->cdefine.platform_type = (ass & 0x4) >> 2;
727         spec->cdefine.swap = (ass & 0x2) >> 1;
728         spec->cdefine.override = ass & 0x1;
729
730         codec_dbg(codec, "SKU: Nid=0x%x sku_cfg=0x%08x\n",
731                    nid, spec->cdefine.sku_cfg);
732         codec_dbg(codec, "SKU: port_connectivity=0x%x\n",
733                    spec->cdefine.port_connectivity);
734         codec_dbg(codec, "SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
735         codec_dbg(codec, "SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
736         codec_dbg(codec, "SKU: customization=0x%08x\n", spec->cdefine.customization);
737         codec_dbg(codec, "SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
738         codec_dbg(codec, "SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
739         codec_dbg(codec, "SKU: swap=0x%x\n", spec->cdefine.swap);
740         codec_dbg(codec, "SKU: override=0x%x\n", spec->cdefine.override);
741
742         return 0;
743 }
744
745 /* return the position of NID in the list, or -1 if not found */
746 static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
747 {
748         int i;
749         for (i = 0; i < nums; i++)
750                 if (list[i] == nid)
751                         return i;
752         return -1;
753 }
754 /* return true if the given NID is found in the list */
755 static bool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
756 {
757         return find_idx_in_nid_list(nid, list, nums) >= 0;
758 }
759
760 /* check subsystem ID and set up device-specific initialization;
761  * return 1 if initialized, 0 if invalid SSID
762  */
763 /* 32-bit subsystem ID for BIOS loading in HD Audio codec.
764  *      31 ~ 16 :       Manufacture ID
765  *      15 ~ 8  :       SKU ID
766  *      7  ~ 0  :       Assembly ID
767  *      port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
768  */
769 static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports)
770 {
771         unsigned int ass, tmp, i;
772         unsigned nid;
773         struct alc_spec *spec = codec->spec;
774
775         if (spec->cdefine.fixup) {
776                 ass = spec->cdefine.sku_cfg;
777                 if (ass == ALC_FIXUP_SKU_IGNORE)
778                         return 0;
779                 goto do_sku;
780         }
781
782         ass = codec->core.subsystem_id & 0xffff;
783         if (codec->bus->pci &&
784             ass != codec->bus->pci->subsystem_device && (ass & 1))
785                 goto do_sku;
786
787         /* invalid SSID, check the special NID pin defcfg instead */
788         /*
789          * 31~30        : port connectivity
790          * 29~21        : reserve
791          * 20           : PCBEEP input
792          * 19~16        : Check sum (15:1)
793          * 15~1         : Custom
794          * 0            : override
795         */
796         nid = 0x1d;
797         if (codec->core.vendor_id == 0x10ec0260)
798                 nid = 0x17;
799         ass = snd_hda_codec_get_pincfg(codec, nid);
800         codec_dbg(codec,
801                   "realtek: No valid SSID, checking pincfg 0x%08x for NID 0x%x\n",
802                    ass, nid);
803         if (!(ass & 1))
804                 return 0;
805         if ((ass >> 30) != 1)   /* no physical connection */
806                 return 0;
807
808         /* check sum */
809         tmp = 0;
810         for (i = 1; i < 16; i++) {
811                 if ((ass >> i) & 1)
812                         tmp++;
813         }
814         if (((ass >> 16) & 0xf) != tmp)
815                 return 0;
816 do_sku:
817         codec_dbg(codec, "realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
818                    ass & 0xffff, codec->core.vendor_id);
819         /*
820          * 0 : override
821          * 1 :  Swap Jack
822          * 2 : 0 --> Desktop, 1 --> Laptop
823          * 3~5 : External Amplifier control
824          * 7~6 : Reserved
825         */
826         tmp = (ass & 0x38) >> 3;        /* external Amp control */
827         if (spec->init_amp == ALC_INIT_UNDEFINED) {
828                 switch (tmp) {
829                 case 1:
830                         alc_setup_gpio(codec, 0x01);
831                         break;
832                 case 3:
833                         alc_setup_gpio(codec, 0x02);
834                         break;
835                 case 7:
836                         alc_setup_gpio(codec, 0x04);
837                         break;
838                 case 5:
839                 default:
840                         spec->init_amp = ALC_INIT_DEFAULT;
841                         break;
842                 }
843         }
844
845         /* is laptop or Desktop and enable the function "Mute internal speaker
846          * when the external headphone out jack is plugged"
847          */
848         if (!(ass & 0x8000))
849                 return 1;
850         /*
851          * 10~8 : Jack location
852          * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
853          * 14~13: Resvered
854          * 15   : 1 --> enable the function "Mute internal speaker
855          *              when the external headphone out jack is plugged"
856          */
857         if (!alc_get_hp_pin(spec)) {
858                 hda_nid_t nid;
859                 tmp = (ass >> 11) & 0x3;        /* HP to chassis */
860                 nid = ports[tmp];
861                 if (found_in_nid_list(nid, spec->gen.autocfg.line_out_pins,
862                                       spec->gen.autocfg.line_outs))
863                         return 1;
864                 spec->gen.autocfg.hp_pins[0] = nid;
865         }
866         return 1;
867 }
868
869 /* Check the validity of ALC subsystem-id
870  * ports contains an array of 4 pin NIDs for port-A, E, D and I */
871 static void alc_ssid_check(struct hda_codec *codec, const hda_nid_t *ports)
872 {
873         if (!alc_subsystem_id(codec, ports)) {
874                 struct alc_spec *spec = codec->spec;
875                 if (spec->init_amp == ALC_INIT_UNDEFINED) {
876                         codec_dbg(codec,
877                                   "realtek: Enable default setup for auto mode as fallback\n");
878                         spec->init_amp = ALC_INIT_DEFAULT;
879                 }
880         }
881 }
882
883 /*
884  */
885
886 static void alc_fixup_inv_dmic(struct hda_codec *codec,
887                                const struct hda_fixup *fix, int action)
888 {
889         struct alc_spec *spec = codec->spec;
890
891         spec->gen.inv_dmic_split = 1;
892 }
893
894
895 static int alc_build_controls(struct hda_codec *codec)
896 {
897         int err;
898
899         err = snd_hda_gen_build_controls(codec);
900         if (err < 0)
901                 return err;
902
903         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_BUILD);
904         return 0;
905 }
906
907
908 /*
909  * Common callbacks
910  */
911
912 static void alc_pre_init(struct hda_codec *codec)
913 {
914         alc_fill_eapd_coef(codec);
915 }
916
917 #define is_s3_resume(codec) \
918         ((codec)->core.dev.power.power_state.event == PM_EVENT_RESUME)
919 #define is_s4_resume(codec) \
920         ((codec)->core.dev.power.power_state.event == PM_EVENT_RESTORE)
921
922 static int alc_init(struct hda_codec *codec)
923 {
924         struct alc_spec *spec = codec->spec;
925
926         /* hibernation resume needs the full chip initialization */
927         if (is_s4_resume(codec))
928                 alc_pre_init(codec);
929
930         if (spec->init_hook)
931                 spec->init_hook(codec);
932
933         spec->gen.skip_verbs = 1; /* applied in below */
934         snd_hda_gen_init(codec);
935         alc_fix_pll(codec);
936         alc_auto_init_amp(codec, spec->init_amp);
937         snd_hda_apply_verbs(codec); /* apply verbs here after own init */
938
939         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);
940
941         return 0;
942 }
943
944 #define alc_free        snd_hda_gen_free
945
946 #ifdef CONFIG_PM
947 static inline void alc_shutup(struct hda_codec *codec)
948 {
949         struct alc_spec *spec = codec->spec;
950
951         if (!snd_hda_get_bool_hint(codec, "shutup"))
952                 return; /* disabled explicitly by hints */
953
954         if (spec && spec->shutup)
955                 spec->shutup(codec);
956         else
957                 alc_shutup_pins(codec);
958 }
959
960 static void alc_power_eapd(struct hda_codec *codec)
961 {
962         alc_auto_setup_eapd(codec, false);
963 }
964
965 static int alc_suspend(struct hda_codec *codec)
966 {
967         struct alc_spec *spec = codec->spec;
968         alc_shutup(codec);
969         if (spec && spec->power_hook)
970                 spec->power_hook(codec);
971         return 0;
972 }
973
974 static int alc_resume(struct hda_codec *codec)
975 {
976         struct alc_spec *spec = codec->spec;
977
978         if (!spec->no_depop_delay)
979                 msleep(150); /* to avoid pop noise */
980         codec->patch_ops.init(codec);
981         snd_hda_regmap_sync(codec);
982         hda_call_check_power_status(codec, 0x01);
983         return 0;
984 }
985 #endif
986
987 /*
988  */
989 static const struct hda_codec_ops alc_patch_ops = {
990         .build_controls = alc_build_controls,
991         .build_pcms = snd_hda_gen_build_pcms,
992         .init = alc_init,
993         .free = alc_free,
994         .unsol_event = snd_hda_jack_unsol_event,
995 #ifdef CONFIG_PM
996         .resume = alc_resume,
997         .suspend = alc_suspend,
998         .check_power_status = snd_hda_gen_check_power_status,
999 #endif
1000 };
1001
1002
1003 #define alc_codec_rename(codec, name) snd_hda_codec_set_name(codec, name)
1004
1005 /*
1006  * Rename codecs appropriately from COEF value or subvendor id
1007  */
1008 struct alc_codec_rename_table {
1009         unsigned int vendor_id;
1010         unsigned short coef_mask;
1011         unsigned short coef_bits;
1012         const char *name;
1013 };
1014
1015 struct alc_codec_rename_pci_table {
1016         unsigned int codec_vendor_id;
1017         unsigned short pci_subvendor;
1018         unsigned short pci_subdevice;
1019         const char *name;
1020 };
1021
1022 static const struct alc_codec_rename_table rename_tbl[] = {
1023         { 0x10ec0221, 0xf00f, 0x1003, "ALC231" },
1024         { 0x10ec0269, 0xfff0, 0x3010, "ALC277" },
1025         { 0x10ec0269, 0xf0f0, 0x2010, "ALC259" },
1026         { 0x10ec0269, 0xf0f0, 0x3010, "ALC258" },
1027         { 0x10ec0269, 0x00f0, 0x0010, "ALC269VB" },
1028         { 0x10ec0269, 0xffff, 0xa023, "ALC259" },
1029         { 0x10ec0269, 0xffff, 0x6023, "ALC281X" },
1030         { 0x10ec0269, 0x00f0, 0x0020, "ALC269VC" },
1031         { 0x10ec0269, 0x00f0, 0x0030, "ALC269VD" },
1032         { 0x10ec0662, 0xffff, 0x4020, "ALC656" },
1033         { 0x10ec0887, 0x00f0, 0x0030, "ALC887-VD" },
1034         { 0x10ec0888, 0x00f0, 0x0030, "ALC888-VD" },
1035         { 0x10ec0888, 0xf0f0, 0x3020, "ALC886" },
1036         { 0x10ec0899, 0x2000, 0x2000, "ALC899" },
1037         { 0x10ec0892, 0xffff, 0x8020, "ALC661" },
1038         { 0x10ec0892, 0xffff, 0x8011, "ALC661" },
1039         { 0x10ec0892, 0xffff, 0x4011, "ALC656" },
1040         { } /* terminator */
1041 };
1042
1043 static const struct alc_codec_rename_pci_table rename_pci_tbl[] = {
1044         { 0x10ec0280, 0x1028, 0, "ALC3220" },
1045         { 0x10ec0282, 0x1028, 0, "ALC3221" },
1046         { 0x10ec0283, 0x1028, 0, "ALC3223" },
1047         { 0x10ec0288, 0x1028, 0, "ALC3263" },
1048         { 0x10ec0292, 0x1028, 0, "ALC3226" },
1049         { 0x10ec0293, 0x1028, 0, "ALC3235" },
1050         { 0x10ec0255, 0x1028, 0, "ALC3234" },
1051         { 0x10ec0668, 0x1028, 0, "ALC3661" },
1052         { 0x10ec0275, 0x1028, 0, "ALC3260" },
1053         { 0x10ec0899, 0x1028, 0, "ALC3861" },
1054         { 0x10ec0298, 0x1028, 0, "ALC3266" },
1055         { 0x10ec0236, 0x1028, 0, "ALC3204" },
1056         { 0x10ec0256, 0x1028, 0, "ALC3246" },
1057         { 0x10ec0225, 0x1028, 0, "ALC3253" },
1058         { 0x10ec0295, 0x1028, 0, "ALC3254" },
1059         { 0x10ec0299, 0x1028, 0, "ALC3271" },
1060         { 0x10ec0670, 0x1025, 0, "ALC669X" },
1061         { 0x10ec0676, 0x1025, 0, "ALC679X" },
1062         { 0x10ec0282, 0x1043, 0, "ALC3229" },
1063         { 0x10ec0233, 0x1043, 0, "ALC3236" },
1064         { 0x10ec0280, 0x103c, 0, "ALC3228" },
1065         { 0x10ec0282, 0x103c, 0, "ALC3227" },
1066         { 0x10ec0286, 0x103c, 0, "ALC3242" },
1067         { 0x10ec0290, 0x103c, 0, "ALC3241" },
1068         { 0x10ec0668, 0x103c, 0, "ALC3662" },
1069         { 0x10ec0283, 0x17aa, 0, "ALC3239" },
1070         { 0x10ec0292, 0x17aa, 0, "ALC3232" },
1071         { } /* terminator */
1072 };
1073
1074 static int alc_codec_rename_from_preset(struct hda_codec *codec)
1075 {
1076         const struct alc_codec_rename_table *p;
1077         const struct alc_codec_rename_pci_table *q;
1078
1079         for (p = rename_tbl; p->vendor_id; p++) {
1080                 if (p->vendor_id != codec->core.vendor_id)
1081                         continue;
1082                 if ((alc_get_coef0(codec) & p->coef_mask) == p->coef_bits)
1083                         return alc_codec_rename(codec, p->name);
1084         }
1085
1086         if (!codec->bus->pci)
1087                 return 0;
1088         for (q = rename_pci_tbl; q->codec_vendor_id; q++) {
1089                 if (q->codec_vendor_id != codec->core.vendor_id)
1090                         continue;
1091                 if (q->pci_subvendor != codec->bus->pci->subsystem_vendor)
1092                         continue;
1093                 if (!q->pci_subdevice ||
1094                     q->pci_subdevice == codec->bus->pci->subsystem_device)
1095                         return alc_codec_rename(codec, q->name);
1096         }
1097
1098         return 0;
1099 }
1100
1101
1102 /*
1103  * Digital-beep handlers
1104  */
1105 #ifdef CONFIG_SND_HDA_INPUT_BEEP
1106
1107 /* additional beep mixers; private_value will be overwritten */
1108 static const struct snd_kcontrol_new alc_beep_mixer[] = {
1109         HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
1110         HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
1111 };
1112
1113 /* set up and create beep controls */
1114 static int set_beep_amp(struct alc_spec *spec, hda_nid_t nid,
1115                         int idx, int dir)
1116 {
1117         struct snd_kcontrol_new *knew;
1118         unsigned int beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir);
1119         int i;
1120
1121         for (i = 0; i < ARRAY_SIZE(alc_beep_mixer); i++) {
1122                 knew = snd_hda_gen_add_kctl(&spec->gen, NULL,
1123                                             &alc_beep_mixer[i]);
1124                 if (!knew)
1125                         return -ENOMEM;
1126                 knew->private_value = beep_amp;
1127         }
1128         return 0;
1129 }
1130
1131 static const struct snd_pci_quirk beep_allow_list[] = {
1132         SND_PCI_QUIRK(0x1043, 0x103c, "ASUS", 1),
1133         SND_PCI_QUIRK(0x1043, 0x115d, "ASUS", 1),
1134         SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
1135         SND_PCI_QUIRK(0x1043, 0x8376, "EeePC", 1),
1136         SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),
1137         SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1),
1138         SND_PCI_QUIRK(0x1043, 0x834a, "EeePC", 1),
1139         SND_PCI_QUIRK(0x1458, 0xa002, "GA-MA790X", 1),
1140         SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
1141         /* denylist -- no beep available */
1142         SND_PCI_QUIRK(0x17aa, 0x309e, "Lenovo ThinkCentre M73", 0),
1143         SND_PCI_QUIRK(0x17aa, 0x30a3, "Lenovo ThinkCentre M93", 0),
1144         {}
1145 };
1146
1147 static inline int has_cdefine_beep(struct hda_codec *codec)
1148 {
1149         struct alc_spec *spec = codec->spec;
1150         const struct snd_pci_quirk *q;
1151         q = snd_pci_quirk_lookup(codec->bus->pci, beep_allow_list);
1152         if (q)
1153                 return q->value;
1154         return spec->cdefine.enable_pcbeep;
1155 }
1156 #else
1157 #define set_beep_amp(spec, nid, idx, dir)       0
1158 #define has_cdefine_beep(codec)         0
1159 #endif
1160
1161 /* parse the BIOS configuration and set up the alc_spec */
1162 /* return 1 if successful, 0 if the proper config is not found,
1163  * or a negative error code
1164  */
1165 static int alc_parse_auto_config(struct hda_codec *codec,
1166                                  const hda_nid_t *ignore_nids,
1167                                  const hda_nid_t *ssid_nids)
1168 {
1169         struct alc_spec *spec = codec->spec;
1170         struct auto_pin_cfg *cfg = &spec->gen.autocfg;
1171         int err;
1172
1173         err = snd_hda_parse_pin_defcfg(codec, cfg, ignore_nids,
1174                                        spec->parse_flags);
1175         if (err < 0)
1176                 return err;
1177
1178         if (ssid_nids)
1179                 alc_ssid_check(codec, ssid_nids);
1180
1181         err = snd_hda_gen_parse_auto_config(codec, cfg);
1182         if (err < 0)
1183                 return err;
1184
1185         return 1;
1186 }
1187
1188 /* common preparation job for alc_spec */
1189 static int alc_alloc_spec(struct hda_codec *codec, hda_nid_t mixer_nid)
1190 {
1191         struct alc_spec *spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1192         int err;
1193
1194         if (!spec)
1195                 return -ENOMEM;
1196         codec->spec = spec;
1197         snd_hda_gen_spec_init(&spec->gen);
1198         spec->gen.mixer_nid = mixer_nid;
1199         spec->gen.own_eapd_ctl = 1;
1200         codec->single_adc_amp = 1;
1201         /* FIXME: do we need this for all Realtek codec models? */
1202         codec->spdif_status_reset = 1;
1203         codec->forced_resume = 1;
1204         codec->patch_ops = alc_patch_ops;
1205         mutex_init(&spec->coef_mutex);
1206
1207         err = alc_codec_rename_from_preset(codec);
1208         if (err < 0) {
1209                 kfree(spec);
1210                 return err;
1211         }
1212         return 0;
1213 }
1214
1215 static int alc880_parse_auto_config(struct hda_codec *codec)
1216 {
1217         static const hda_nid_t alc880_ignore[] = { 0x1d, 0 };
1218         static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 };
1219         return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids);
1220 }
1221
1222 /*
1223  * ALC880 fix-ups
1224  */
1225 enum {
1226         ALC880_FIXUP_GPIO1,
1227         ALC880_FIXUP_GPIO2,
1228         ALC880_FIXUP_MEDION_RIM,
1229         ALC880_FIXUP_LG,
1230         ALC880_FIXUP_LG_LW25,
1231         ALC880_FIXUP_W810,
1232         ALC880_FIXUP_EAPD_COEF,
1233         ALC880_FIXUP_TCL_S700,
1234         ALC880_FIXUP_VOL_KNOB,
1235         ALC880_FIXUP_FUJITSU,
1236         ALC880_FIXUP_F1734,
1237         ALC880_FIXUP_UNIWILL,
1238         ALC880_FIXUP_UNIWILL_DIG,
1239         ALC880_FIXUP_Z71V,
1240         ALC880_FIXUP_ASUS_W5A,
1241         ALC880_FIXUP_3ST_BASE,
1242         ALC880_FIXUP_3ST,
1243         ALC880_FIXUP_3ST_DIG,
1244         ALC880_FIXUP_5ST_BASE,
1245         ALC880_FIXUP_5ST,
1246         ALC880_FIXUP_5ST_DIG,
1247         ALC880_FIXUP_6ST_BASE,
1248         ALC880_FIXUP_6ST,
1249         ALC880_FIXUP_6ST_DIG,
1250         ALC880_FIXUP_6ST_AUTOMUTE,
1251 };
1252
1253 /* enable the volume-knob widget support on NID 0x21 */
1254 static void alc880_fixup_vol_knob(struct hda_codec *codec,
1255                                   const struct hda_fixup *fix, int action)
1256 {
1257         if (action == HDA_FIXUP_ACT_PROBE)
1258                 snd_hda_jack_detect_enable_callback(codec, 0x21,
1259                                                     alc_update_knob_master);
1260 }
1261
1262 static const struct hda_fixup alc880_fixups[] = {
1263         [ALC880_FIXUP_GPIO1] = {
1264                 .type = HDA_FIXUP_FUNC,
1265                 .v.func = alc_fixup_gpio1,
1266         },
1267         [ALC880_FIXUP_GPIO2] = {
1268                 .type = HDA_FIXUP_FUNC,
1269                 .v.func = alc_fixup_gpio2,
1270         },
1271         [ALC880_FIXUP_MEDION_RIM] = {
1272                 .type = HDA_FIXUP_VERBS,
1273                 .v.verbs = (const struct hda_verb[]) {
1274                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1275                         { 0x20, AC_VERB_SET_PROC_COEF,  0x3060 },
1276                         { }
1277                 },
1278                 .chained = true,
1279                 .chain_id = ALC880_FIXUP_GPIO2,
1280         },
1281         [ALC880_FIXUP_LG] = {
1282                 .type = HDA_FIXUP_PINS,
1283                 .v.pins = (const struct hda_pintbl[]) {
1284                         /* disable bogus unused pins */
1285                         { 0x16, 0x411111f0 },
1286                         { 0x18, 0x411111f0 },
1287                         { 0x1a, 0x411111f0 },
1288                         { }
1289                 }
1290         },
1291         [ALC880_FIXUP_LG_LW25] = {
1292                 .type = HDA_FIXUP_PINS,
1293                 .v.pins = (const struct hda_pintbl[]) {
1294                         { 0x1a, 0x0181344f }, /* line-in */
1295                         { 0x1b, 0x0321403f }, /* headphone */
1296                         { }
1297                 }
1298         },
1299         [ALC880_FIXUP_W810] = {
1300                 .type = HDA_FIXUP_PINS,
1301                 .v.pins = (const struct hda_pintbl[]) {
1302                         /* disable bogus unused pins */
1303                         { 0x17, 0x411111f0 },
1304                         { }
1305                 },
1306                 .chained = true,
1307                 .chain_id = ALC880_FIXUP_GPIO2,
1308         },
1309         [ALC880_FIXUP_EAPD_COEF] = {
1310                 .type = HDA_FIXUP_VERBS,
1311                 .v.verbs = (const struct hda_verb[]) {
1312                         /* change to EAPD mode */
1313                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1314                         { 0x20, AC_VERB_SET_PROC_COEF,  0x3060 },
1315                         {}
1316                 },
1317         },
1318         [ALC880_FIXUP_TCL_S700] = {
1319                 .type = HDA_FIXUP_VERBS,
1320                 .v.verbs = (const struct hda_verb[]) {
1321                         /* change to EAPD mode */
1322                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1323                         { 0x20, AC_VERB_SET_PROC_COEF,  0x3070 },
1324                         {}
1325                 },
1326                 .chained = true,
1327                 .chain_id = ALC880_FIXUP_GPIO2,
1328         },
1329         [ALC880_FIXUP_VOL_KNOB] = {
1330                 .type = HDA_FIXUP_FUNC,
1331                 .v.func = alc880_fixup_vol_knob,
1332         },
1333         [ALC880_FIXUP_FUJITSU] = {
1334                 /* override all pins as BIOS on old Amilo is broken */
1335                 .type = HDA_FIXUP_PINS,
1336                 .v.pins = (const struct hda_pintbl[]) {
1337                         { 0x14, 0x0121401f }, /* HP */
1338                         { 0x15, 0x99030120 }, /* speaker */
1339                         { 0x16, 0x99030130 }, /* bass speaker */
1340                         { 0x17, 0x411111f0 }, /* N/A */
1341                         { 0x18, 0x411111f0 }, /* N/A */
1342                         { 0x19, 0x01a19950 }, /* mic-in */
1343                         { 0x1a, 0x411111f0 }, /* N/A */
1344                         { 0x1b, 0x411111f0 }, /* N/A */
1345                         { 0x1c, 0x411111f0 }, /* N/A */
1346                         { 0x1d, 0x411111f0 }, /* N/A */
1347                         { 0x1e, 0x01454140 }, /* SPDIF out */
1348                         { }
1349                 },
1350                 .chained = true,
1351                 .chain_id = ALC880_FIXUP_VOL_KNOB,
1352         },
1353         [ALC880_FIXUP_F1734] = {
1354                 /* almost compatible with FUJITSU, but no bass and SPDIF */
1355                 .type = HDA_FIXUP_PINS,
1356                 .v.pins = (const struct hda_pintbl[]) {
1357                         { 0x14, 0x0121401f }, /* HP */
1358                         { 0x15, 0x99030120 }, /* speaker */
1359                         { 0x16, 0x411111f0 }, /* N/A */
1360                         { 0x17, 0x411111f0 }, /* N/A */
1361                         { 0x18, 0x411111f0 }, /* N/A */
1362                         { 0x19, 0x01a19950 }, /* mic-in */
1363                         { 0x1a, 0x411111f0 }, /* N/A */
1364                         { 0x1b, 0x411111f0 }, /* N/A */
1365                         { 0x1c, 0x411111f0 }, /* N/A */
1366                         { 0x1d, 0x411111f0 }, /* N/A */
1367                         { 0x1e, 0x411111f0 }, /* N/A */
1368                         { }
1369                 },
1370                 .chained = true,
1371                 .chain_id = ALC880_FIXUP_VOL_KNOB,
1372         },
1373         [ALC880_FIXUP_UNIWILL] = {
1374                 /* need to fix HP and speaker pins to be parsed correctly */
1375                 .type = HDA_FIXUP_PINS,
1376                 .v.pins = (const struct hda_pintbl[]) {
1377                         { 0x14, 0x0121411f }, /* HP */
1378                         { 0x15, 0x99030120 }, /* speaker */
1379                         { 0x16, 0x99030130 }, /* bass speaker */
1380                         { }
1381                 },
1382         },
1383         [ALC880_FIXUP_UNIWILL_DIG] = {
1384                 .type = HDA_FIXUP_PINS,
1385                 .v.pins = (const struct hda_pintbl[]) {
1386                         /* disable bogus unused pins */
1387                         { 0x17, 0x411111f0 },
1388                         { 0x19, 0x411111f0 },
1389                         { 0x1b, 0x411111f0 },
1390                         { 0x1f, 0x411111f0 },
1391                         { }
1392                 }
1393         },
1394         [ALC880_FIXUP_Z71V] = {
1395                 .type = HDA_FIXUP_PINS,
1396                 .v.pins = (const struct hda_pintbl[]) {
1397                         /* set up the whole pins as BIOS is utterly broken */
1398                         { 0x14, 0x99030120 }, /* speaker */
1399                         { 0x15, 0x0121411f }, /* HP */
1400                         { 0x16, 0x411111f0 }, /* N/A */
1401                         { 0x17, 0x411111f0 }, /* N/A */
1402                         { 0x18, 0x01a19950 }, /* mic-in */
1403                         { 0x19, 0x411111f0 }, /* N/A */
1404                         { 0x1a, 0x01813031 }, /* line-in */
1405                         { 0x1b, 0x411111f0 }, /* N/A */
1406                         { 0x1c, 0x411111f0 }, /* N/A */
1407                         { 0x1d, 0x411111f0 }, /* N/A */
1408                         { 0x1e, 0x0144111e }, /* SPDIF */
1409                         { }
1410                 }
1411         },
1412         [ALC880_FIXUP_ASUS_W5A] = {
1413                 .type = HDA_FIXUP_PINS,
1414                 .v.pins = (const struct hda_pintbl[]) {
1415                         /* set up the whole pins as BIOS is utterly broken */
1416                         { 0x14, 0x0121411f }, /* HP */
1417                         { 0x15, 0x411111f0 }, /* N/A */
1418                         { 0x16, 0x411111f0 }, /* N/A */
1419                         { 0x17, 0x411111f0 }, /* N/A */
1420                         { 0x18, 0x90a60160 }, /* mic */
1421                         { 0x19, 0x411111f0 }, /* N/A */
1422                         { 0x1a, 0x411111f0 }, /* N/A */
1423                         { 0x1b, 0x411111f0 }, /* N/A */
1424                         { 0x1c, 0x411111f0 }, /* N/A */
1425                         { 0x1d, 0x411111f0 }, /* N/A */
1426                         { 0x1e, 0xb743111e }, /* SPDIF out */
1427                         { }
1428                 },
1429                 .chained = true,
1430                 .chain_id = ALC880_FIXUP_GPIO1,
1431         },
1432         [ALC880_FIXUP_3ST_BASE] = {
1433                 .type = HDA_FIXUP_PINS,
1434                 .v.pins = (const struct hda_pintbl[]) {
1435                         { 0x14, 0x01014010 }, /* line-out */
1436                         { 0x15, 0x411111f0 }, /* N/A */
1437                         { 0x16, 0x411111f0 }, /* N/A */
1438                         { 0x17, 0x411111f0 }, /* N/A */
1439                         { 0x18, 0x01a19c30 }, /* mic-in */
1440                         { 0x19, 0x0121411f }, /* HP */
1441                         { 0x1a, 0x01813031 }, /* line-in */
1442                         { 0x1b, 0x02a19c40 }, /* front-mic */
1443                         { 0x1c, 0x411111f0 }, /* N/A */
1444                         { 0x1d, 0x411111f0 }, /* N/A */
1445                         /* 0x1e is filled in below */
1446                         { 0x1f, 0x411111f0 }, /* N/A */
1447                         { }
1448                 }
1449         },
1450         [ALC880_FIXUP_3ST] = {
1451                 .type = HDA_FIXUP_PINS,
1452                 .v.pins = (const struct hda_pintbl[]) {
1453                         { 0x1e, 0x411111f0 }, /* N/A */
1454                         { }
1455                 },
1456                 .chained = true,
1457                 .chain_id = ALC880_FIXUP_3ST_BASE,
1458         },
1459         [ALC880_FIXUP_3ST_DIG] = {
1460                 .type = HDA_FIXUP_PINS,
1461                 .v.pins = (const struct hda_pintbl[]) {
1462                         { 0x1e, 0x0144111e }, /* SPDIF */
1463                         { }
1464                 },
1465                 .chained = true,
1466                 .chain_id = ALC880_FIXUP_3ST_BASE,
1467         },
1468         [ALC880_FIXUP_5ST_BASE] = {
1469                 .type = HDA_FIXUP_PINS,
1470                 .v.pins = (const struct hda_pintbl[]) {
1471                         { 0x14, 0x01014010 }, /* front */
1472                         { 0x15, 0x411111f0 }, /* N/A */
1473                         { 0x16, 0x01011411 }, /* CLFE */
1474                         { 0x17, 0x01016412 }, /* surr */
1475                         { 0x18, 0x01a19c30 }, /* mic-in */
1476                         { 0x19, 0x0121411f }, /* HP */
1477                         { 0x1a, 0x01813031 }, /* line-in */
1478                         { 0x1b, 0x02a19c40 }, /* front-mic */
1479                         { 0x1c, 0x411111f0 }, /* N/A */
1480                         { 0x1d, 0x411111f0 }, /* N/A */
1481                         /* 0x1e is filled in below */
1482                         { 0x1f, 0x411111f0 }, /* N/A */
1483                         { }
1484                 }
1485         },
1486         [ALC880_FIXUP_5ST] = {
1487                 .type = HDA_FIXUP_PINS,
1488                 .v.pins = (const struct hda_pintbl[]) {
1489                         { 0x1e, 0x411111f0 }, /* N/A */
1490                         { }
1491                 },
1492                 .chained = true,
1493                 .chain_id = ALC880_FIXUP_5ST_BASE,
1494         },
1495         [ALC880_FIXUP_5ST_DIG] = {
1496                 .type = HDA_FIXUP_PINS,
1497                 .v.pins = (const struct hda_pintbl[]) {
1498                         { 0x1e, 0x0144111e }, /* SPDIF */
1499                         { }
1500                 },
1501                 .chained = true,
1502                 .chain_id = ALC880_FIXUP_5ST_BASE,
1503         },
1504         [ALC880_FIXUP_6ST_BASE] = {
1505                 .type = HDA_FIXUP_PINS,
1506                 .v.pins = (const struct hda_pintbl[]) {
1507                         { 0x14, 0x01014010 }, /* front */
1508                         { 0x15, 0x01016412 }, /* surr */
1509                         { 0x16, 0x01011411 }, /* CLFE */
1510                         { 0x17, 0x01012414 }, /* side */
1511                         { 0x18, 0x01a19c30 }, /* mic-in */
1512                         { 0x19, 0x02a19c40 }, /* front-mic */
1513                         { 0x1a, 0x01813031 }, /* line-in */
1514                         { 0x1b, 0x0121411f }, /* HP */
1515                         { 0x1c, 0x411111f0 }, /* N/A */
1516                         { 0x1d, 0x411111f0 }, /* N/A */
1517                         /* 0x1e is filled in below */
1518                         { 0x1f, 0x411111f0 }, /* N/A */
1519                         { }
1520                 }
1521         },
1522         [ALC880_FIXUP_6ST] = {
1523                 .type = HDA_FIXUP_PINS,
1524                 .v.pins = (const struct hda_pintbl[]) {
1525                         { 0x1e, 0x411111f0 }, /* N/A */
1526                         { }
1527                 },
1528                 .chained = true,
1529                 .chain_id = ALC880_FIXUP_6ST_BASE,
1530         },
1531         [ALC880_FIXUP_6ST_DIG] = {
1532                 .type = HDA_FIXUP_PINS,
1533                 .v.pins = (const struct hda_pintbl[]) {
1534                         { 0x1e, 0x0144111e }, /* SPDIF */
1535                         { }
1536                 },
1537                 .chained = true,
1538                 .chain_id = ALC880_FIXUP_6ST_BASE,
1539         },
1540         [ALC880_FIXUP_6ST_AUTOMUTE] = {
1541                 .type = HDA_FIXUP_PINS,
1542                 .v.pins = (const struct hda_pintbl[]) {
1543                         { 0x1b, 0x0121401f }, /* HP with jack detect */
1544                         { }
1545                 },
1546                 .chained_before = true,
1547                 .chain_id = ALC880_FIXUP_6ST_BASE,
1548         },
1549 };
1550
1551 static const struct snd_pci_quirk alc880_fixup_tbl[] = {
1552         SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_FIXUP_W810),
1553         SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS W5A", ALC880_FIXUP_ASUS_W5A),
1554         SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_FIXUP_Z71V),
1555         SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_FIXUP_GPIO1),
1556         SND_PCI_QUIRK(0x147b, 0x1045, "ABit AA8XE", ALC880_FIXUP_6ST_AUTOMUTE),
1557         SND_PCI_QUIRK(0x1558, 0x5401, "Clevo GPIO2", ALC880_FIXUP_GPIO2),
1558         SND_PCI_QUIRK_VENDOR(0x1558, "Clevo", ALC880_FIXUP_EAPD_COEF),
1559         SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_FIXUP_UNIWILL_DIG),
1560         SND_PCI_QUIRK(0x1584, 0x9054, "Uniwill", ALC880_FIXUP_F1734),
1561         SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_FIXUP_UNIWILL),
1562         SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_FIXUP_VOL_KNOB),
1563         SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_FIXUP_W810),
1564         SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_FIXUP_MEDION_RIM),
1565         SND_PCI_QUIRK(0x1631, 0xe011, "PB 13201056", ALC880_FIXUP_6ST_AUTOMUTE),
1566         SND_PCI_QUIRK(0x1734, 0x107c, "FSC Amilo M1437", ALC880_FIXUP_FUJITSU),
1567         SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FIXUP_FUJITSU),
1568         SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_FIXUP_F1734),
1569         SND_PCI_QUIRK(0x1734, 0x10b0, "FSC Amilo Pi1556", ALC880_FIXUP_FUJITSU),
1570         SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_FIXUP_LG),
1571         SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_FIXUP_LG),
1572         SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_FIXUP_LG),
1573         SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_FIXUP_LG_LW25),
1574         SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_FIXUP_TCL_S700),
1575
1576         /* Below is the copied entries from alc880_quirks.c.
1577          * It's not quite sure whether BIOS sets the correct pin-config table
1578          * on these machines, thus they are kept to be compatible with
1579          * the old static quirks.  Once when it's confirmed to work without
1580          * these overrides, it'd be better to remove.
1581          */
1582         SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_FIXUP_5ST_DIG),
1583         SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_FIXUP_6ST),
1584         SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_FIXUP_3ST_DIG),
1585         SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_FIXUP_6ST_DIG),
1586         SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_FIXUP_6ST_DIG),
1587         SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_FIXUP_6ST_DIG),
1588         SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_FIXUP_3ST_DIG),
1589         SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_FIXUP_3ST),
1590         SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_FIXUP_6ST_DIG),
1591         SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_FIXUP_3ST),
1592         SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_FIXUP_3ST),
1593         SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_FIXUP_5ST),
1594         SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_FIXUP_5ST),
1595         SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_FIXUP_5ST),
1596         SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_FIXUP_6ST_DIG),
1597         SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_FIXUP_6ST_DIG),
1598         SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_FIXUP_6ST_DIG),
1599         SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_FIXUP_6ST_DIG),
1600         SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_FIXUP_5ST_DIG),
1601         SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_FIXUP_5ST_DIG),
1602         SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_FIXUP_5ST_DIG),
1603         SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_FIXUP_6ST_DIG), /* broken BIOS */
1604         SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_FIXUP_6ST_DIG),
1605         SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1606         SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1607         SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1608         SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1609         SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1610         SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1611         SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1612         SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1613         SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1614         SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1615         /* default Intel */
1616         SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_FIXUP_3ST),
1617         SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_FIXUP_5ST_DIG),
1618         SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_FIXUP_6ST_DIG),
1619         {}
1620 };
1621
1622 static const struct hda_model_fixup alc880_fixup_models[] = {
1623         {.id = ALC880_FIXUP_3ST, .name = "3stack"},
1624         {.id = ALC880_FIXUP_3ST_DIG, .name = "3stack-digout"},
1625         {.id = ALC880_FIXUP_5ST, .name = "5stack"},
1626         {.id = ALC880_FIXUP_5ST_DIG, .name = "5stack-digout"},
1627         {.id = ALC880_FIXUP_6ST, .name = "6stack"},
1628         {.id = ALC880_FIXUP_6ST_DIG, .name = "6stack-digout"},
1629         {.id = ALC880_FIXUP_6ST_AUTOMUTE, .name = "6stack-automute"},
1630         {}
1631 };
1632
1633
1634 /*
1635  * OK, here we have finally the patch for ALC880
1636  */
1637 static int patch_alc880(struct hda_codec *codec)
1638 {
1639         struct alc_spec *spec;
1640         int err;
1641
1642         err = alc_alloc_spec(codec, 0x0b);
1643         if (err < 0)
1644                 return err;
1645
1646         spec = codec->spec;
1647         spec->gen.need_dac_fix = 1;
1648         spec->gen.beep_nid = 0x01;
1649
1650         codec->patch_ops.unsol_event = alc880_unsol_event;
1651
1652         alc_pre_init(codec);
1653
1654         snd_hda_pick_fixup(codec, alc880_fixup_models, alc880_fixup_tbl,
1655                        alc880_fixups);
1656         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1657
1658         /* automatic parse from the BIOS config */
1659         err = alc880_parse_auto_config(codec);
1660         if (err < 0)
1661                 goto error;
1662
1663         if (!spec->gen.no_analog) {
1664                 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
1665                 if (err < 0)
1666                         goto error;
1667         }
1668
1669         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1670
1671         return 0;
1672
1673  error:
1674         alc_free(codec);
1675         return err;
1676 }
1677
1678
1679 /*
1680  * ALC260 support
1681  */
1682 static int alc260_parse_auto_config(struct hda_codec *codec)
1683 {
1684         static const hda_nid_t alc260_ignore[] = { 0x17, 0 };
1685         static const hda_nid_t alc260_ssids[] = { 0x10, 0x15, 0x0f, 0 };
1686         return alc_parse_auto_config(codec, alc260_ignore, alc260_ssids);
1687 }
1688
1689 /*
1690  * Pin config fixes
1691  */
1692 enum {
1693         ALC260_FIXUP_HP_DC5750,
1694         ALC260_FIXUP_HP_PIN_0F,
1695         ALC260_FIXUP_COEF,
1696         ALC260_FIXUP_GPIO1,
1697         ALC260_FIXUP_GPIO1_TOGGLE,
1698         ALC260_FIXUP_REPLACER,
1699         ALC260_FIXUP_HP_B1900,
1700         ALC260_FIXUP_KN1,
1701         ALC260_FIXUP_FSC_S7020,
1702         ALC260_FIXUP_FSC_S7020_JWSE,
1703         ALC260_FIXUP_VAIO_PINS,
1704 };
1705
1706 static void alc260_gpio1_automute(struct hda_codec *codec)
1707 {
1708         struct alc_spec *spec = codec->spec;
1709
1710         alc_update_gpio_data(codec, 0x01, spec->gen.hp_jack_present);
1711 }
1712
1713 static void alc260_fixup_gpio1_toggle(struct hda_codec *codec,
1714                                       const struct hda_fixup *fix, int action)
1715 {
1716         struct alc_spec *spec = codec->spec;
1717         if (action == HDA_FIXUP_ACT_PROBE) {
1718                 /* although the machine has only one output pin, we need to
1719                  * toggle GPIO1 according to the jack state
1720                  */
1721                 spec->gen.automute_hook = alc260_gpio1_automute;
1722                 spec->gen.detect_hp = 1;
1723                 spec->gen.automute_speaker = 1;
1724                 spec->gen.autocfg.hp_pins[0] = 0x0f; /* copy it for automute */
1725                 snd_hda_jack_detect_enable_callback(codec, 0x0f,
1726                                                     snd_hda_gen_hp_automute);
1727                 alc_setup_gpio(codec, 0x01);
1728         }
1729 }
1730
1731 static void alc260_fixup_kn1(struct hda_codec *codec,
1732                              const struct hda_fixup *fix, int action)
1733 {
1734         struct alc_spec *spec = codec->spec;
1735         static const struct hda_pintbl pincfgs[] = {
1736                 { 0x0f, 0x02214000 }, /* HP/speaker */
1737                 { 0x12, 0x90a60160 }, /* int mic */
1738                 { 0x13, 0x02a19000 }, /* ext mic */
1739                 { 0x18, 0x01446000 }, /* SPDIF out */
1740                 /* disable bogus I/O pins */
1741                 { 0x10, 0x411111f0 },
1742                 { 0x11, 0x411111f0 },
1743                 { 0x14, 0x411111f0 },
1744                 { 0x15, 0x411111f0 },
1745                 { 0x16, 0x411111f0 },
1746                 { 0x17, 0x411111f0 },
1747                 { 0x19, 0x411111f0 },
1748                 { }
1749         };
1750
1751         switch (action) {
1752         case HDA_FIXUP_ACT_PRE_PROBE:
1753                 snd_hda_apply_pincfgs(codec, pincfgs);
1754                 spec->init_amp = ALC_INIT_NONE;
1755                 break;
1756         }
1757 }
1758
1759 static void alc260_fixup_fsc_s7020(struct hda_codec *codec,
1760                                    const struct hda_fixup *fix, int action)
1761 {
1762         struct alc_spec *spec = codec->spec;
1763         if (action == HDA_FIXUP_ACT_PRE_PROBE)
1764                 spec->init_amp = ALC_INIT_NONE;
1765 }
1766
1767 static void alc260_fixup_fsc_s7020_jwse(struct hda_codec *codec,
1768                                    const struct hda_fixup *fix, int action)
1769 {
1770         struct alc_spec *spec = codec->spec;
1771         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1772                 spec->gen.add_jack_modes = 1;
1773                 spec->gen.hp_mic = 1;
1774         }
1775 }
1776
1777 static const struct hda_fixup alc260_fixups[] = {
1778         [ALC260_FIXUP_HP_DC5750] = {
1779                 .type = HDA_FIXUP_PINS,
1780                 .v.pins = (const struct hda_pintbl[]) {
1781                         { 0x11, 0x90130110 }, /* speaker */
1782                         { }
1783                 }
1784         },
1785         [ALC260_FIXUP_HP_PIN_0F] = {
1786                 .type = HDA_FIXUP_PINS,
1787                 .v.pins = (const struct hda_pintbl[]) {
1788                         { 0x0f, 0x01214000 }, /* HP */
1789                         { }
1790                 }
1791         },
1792         [ALC260_FIXUP_COEF] = {
1793                 .type = HDA_FIXUP_VERBS,
1794                 .v.verbs = (const struct hda_verb[]) {
1795                         { 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1796                         { 0x1a, AC_VERB_SET_PROC_COEF,  0x3040 },
1797                         { }
1798                 },
1799         },
1800         [ALC260_FIXUP_GPIO1] = {
1801                 .type = HDA_FIXUP_FUNC,
1802                 .v.func = alc_fixup_gpio1,
1803         },
1804         [ALC260_FIXUP_GPIO1_TOGGLE] = {
1805                 .type = HDA_FIXUP_FUNC,
1806                 .v.func = alc260_fixup_gpio1_toggle,
1807                 .chained = true,
1808                 .chain_id = ALC260_FIXUP_HP_PIN_0F,
1809         },
1810         [ALC260_FIXUP_REPLACER] = {
1811                 .type = HDA_FIXUP_VERBS,
1812                 .v.verbs = (const struct hda_verb[]) {
1813                         { 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1814                         { 0x1a, AC_VERB_SET_PROC_COEF,  0x3050 },
1815                         { }
1816                 },
1817                 .chained = true,
1818                 .chain_id = ALC260_FIXUP_GPIO1_TOGGLE,
1819         },
1820         [ALC260_FIXUP_HP_B1900] = {
1821                 .type = HDA_FIXUP_FUNC,
1822                 .v.func = alc260_fixup_gpio1_toggle,
1823                 .chained = true,
1824                 .chain_id = ALC260_FIXUP_COEF,
1825         },
1826         [ALC260_FIXUP_KN1] = {
1827                 .type = HDA_FIXUP_FUNC,
1828                 .v.func = alc260_fixup_kn1,
1829         },
1830         [ALC260_FIXUP_FSC_S7020] = {
1831                 .type = HDA_FIXUP_FUNC,
1832                 .v.func = alc260_fixup_fsc_s7020,
1833         },
1834         [ALC260_FIXUP_FSC_S7020_JWSE] = {
1835                 .type = HDA_FIXUP_FUNC,
1836                 .v.func = alc260_fixup_fsc_s7020_jwse,
1837                 .chained = true,
1838                 .chain_id = ALC260_FIXUP_FSC_S7020,
1839         },
1840         [ALC260_FIXUP_VAIO_PINS] = {
1841                 .type = HDA_FIXUP_PINS,
1842                 .v.pins = (const struct hda_pintbl[]) {
1843                         /* Pin configs are missing completely on some VAIOs */
1844                         { 0x0f, 0x01211020 },
1845                         { 0x10, 0x0001003f },
1846                         { 0x11, 0x411111f0 },
1847                         { 0x12, 0x01a15930 },
1848                         { 0x13, 0x411111f0 },
1849                         { 0x14, 0x411111f0 },
1850                         { 0x15, 0x411111f0 },
1851                         { 0x16, 0x411111f0 },
1852                         { 0x17, 0x411111f0 },
1853                         { 0x18, 0x411111f0 },
1854                         { 0x19, 0x411111f0 },
1855                         { }
1856                 }
1857         },
1858 };
1859
1860 static const struct snd_pci_quirk alc260_fixup_tbl[] = {
1861         SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_FIXUP_GPIO1),
1862         SND_PCI_QUIRK(0x1025, 0x007f, "Acer Aspire 9500", ALC260_FIXUP_COEF),
1863         SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_FIXUP_GPIO1),
1864         SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750),
1865         SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900),
1866         SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_FIXUP_VAIO_PINS),
1867         SND_PCI_QUIRK(0x104d, 0x81e2, "Sony VAIO TX", ALC260_FIXUP_HP_PIN_0F),
1868         SND_PCI_QUIRK(0x10cf, 0x1326, "FSC LifeBook S7020", ALC260_FIXUP_FSC_S7020),
1869         SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1),
1870         SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1),
1871         SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_FIXUP_REPLACER),
1872         SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_FIXUP_COEF),
1873         {}
1874 };
1875
1876 static const struct hda_model_fixup alc260_fixup_models[] = {
1877         {.id = ALC260_FIXUP_GPIO1, .name = "gpio1"},
1878         {.id = ALC260_FIXUP_COEF, .name = "coef"},
1879         {.id = ALC260_FIXUP_FSC_S7020, .name = "fujitsu"},
1880         {.id = ALC260_FIXUP_FSC_S7020_JWSE, .name = "fujitsu-jwse"},
1881         {}
1882 };
1883
1884 /*
1885  */
1886 static int patch_alc260(struct hda_codec *codec)
1887 {
1888         struct alc_spec *spec;
1889         int err;
1890
1891         err = alc_alloc_spec(codec, 0x07);
1892         if (err < 0)
1893                 return err;
1894
1895         spec = codec->spec;
1896         /* as quite a few machines require HP amp for speaker outputs,
1897          * it's easier to enable it unconditionally; even if it's unneeded,
1898          * it's almost harmless.
1899          */
1900         spec->gen.prefer_hp_amp = 1;
1901         spec->gen.beep_nid = 0x01;
1902
1903         spec->shutup = alc_eapd_shutup;
1904
1905         alc_pre_init(codec);
1906
1907         snd_hda_pick_fixup(codec, alc260_fixup_models, alc260_fixup_tbl,
1908                            alc260_fixups);
1909         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1910
1911         /* automatic parse from the BIOS config */
1912         err = alc260_parse_auto_config(codec);
1913         if (err < 0)
1914                 goto error;
1915
1916         if (!spec->gen.no_analog) {
1917                 err = set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
1918                 if (err < 0)
1919                         goto error;
1920         }
1921
1922         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1923
1924         return 0;
1925
1926  error:
1927         alc_free(codec);
1928         return err;
1929 }
1930
1931
1932 /*
1933  * ALC882/883/885/888/889 support
1934  *
1935  * ALC882 is almost identical with ALC880 but has cleaner and more flexible
1936  * configuration.  Each pin widget can choose any input DACs and a mixer.
1937  * Each ADC is connected from a mixer of all inputs.  This makes possible
1938  * 6-channel independent captures.
1939  *
1940  * In addition, an independent DAC for the multi-playback (not used in this
1941  * driver yet).
1942  */
1943
1944 /*
1945  * Pin config fixes
1946  */
1947 enum {
1948         ALC882_FIXUP_ABIT_AW9D_MAX,
1949         ALC882_FIXUP_LENOVO_Y530,
1950         ALC882_FIXUP_PB_M5210,
1951         ALC882_FIXUP_ACER_ASPIRE_7736,
1952         ALC882_FIXUP_ASUS_W90V,
1953         ALC889_FIXUP_CD,
1954         ALC889_FIXUP_FRONT_HP_NO_PRESENCE,
1955         ALC889_FIXUP_VAIO_TT,
1956         ALC888_FIXUP_EEE1601,
1957         ALC886_FIXUP_EAPD,
1958         ALC882_FIXUP_EAPD,
1959         ALC883_FIXUP_EAPD,
1960         ALC883_FIXUP_ACER_EAPD,
1961         ALC882_FIXUP_GPIO1,
1962         ALC882_FIXUP_GPIO2,
1963         ALC882_FIXUP_GPIO3,
1964         ALC889_FIXUP_COEF,
1965         ALC882_FIXUP_ASUS_W2JC,
1966         ALC882_FIXUP_ACER_ASPIRE_4930G,
1967         ALC882_FIXUP_ACER_ASPIRE_8930G,
1968         ALC882_FIXUP_ASPIRE_8930G_VERBS,
1969         ALC885_FIXUP_MACPRO_GPIO,
1970         ALC889_FIXUP_DAC_ROUTE,
1971         ALC889_FIXUP_MBP_VREF,
1972         ALC889_FIXUP_IMAC91_VREF,
1973         ALC889_FIXUP_MBA11_VREF,
1974         ALC889_FIXUP_MBA21_VREF,
1975         ALC889_FIXUP_MP11_VREF,
1976         ALC889_FIXUP_MP41_VREF,
1977         ALC882_FIXUP_INV_DMIC,
1978         ALC882_FIXUP_NO_PRIMARY_HP,
1979         ALC887_FIXUP_ASUS_BASS,
1980         ALC887_FIXUP_BASS_CHMAP,
1981         ALC1220_FIXUP_GB_DUAL_CODECS,
1982         ALC1220_FIXUP_GB_X570,
1983         ALC1220_FIXUP_CLEVO_P950,
1984         ALC1220_FIXUP_CLEVO_PB51ED,
1985         ALC1220_FIXUP_CLEVO_PB51ED_PINS,
1986         ALC887_FIXUP_ASUS_AUDIO,
1987         ALC887_FIXUP_ASUS_HMIC,
1988         ALCS1200A_FIXUP_MIC_VREF,
1989 };
1990
1991 static void alc889_fixup_coef(struct hda_codec *codec,
1992                               const struct hda_fixup *fix, int action)
1993 {
1994         if (action != HDA_FIXUP_ACT_INIT)
1995                 return;
1996         alc_update_coef_idx(codec, 7, 0, 0x2030);
1997 }
1998
1999 /* set up GPIO at initialization */
2000 static void alc885_fixup_macpro_gpio(struct hda_codec *codec,
2001                                      const struct hda_fixup *fix, int action)
2002 {
2003         struct alc_spec *spec = codec->spec;
2004
2005         spec->gpio_write_delay = true;
2006         alc_fixup_gpio3(codec, fix, action);
2007 }
2008
2009 /* Fix the connection of some pins for ALC889:
2010  * At least, Acer Aspire 5935 shows the connections to DAC3/4 don't
2011  * work correctly (bko#42740)
2012  */
2013 static void alc889_fixup_dac_route(struct hda_codec *codec,
2014                                    const struct hda_fixup *fix, int action)
2015 {
2016         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2017                 /* fake the connections during parsing the tree */
2018                 static const hda_nid_t conn1[] = { 0x0c, 0x0d };
2019                 static const hda_nid_t conn2[] = { 0x0e, 0x0f };
2020                 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2021                 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
2022                 snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn2), conn2);
2023                 snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn2), conn2);
2024         } else if (action == HDA_FIXUP_ACT_PROBE) {
2025                 /* restore the connections */
2026                 static const hda_nid_t conn[] = { 0x0c, 0x0d, 0x0e, 0x0f, 0x26 };
2027                 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
2028                 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn), conn);
2029                 snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn), conn);
2030                 snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn), conn);
2031         }
2032 }
2033
2034 /* Set VREF on HP pin */
2035 static void alc889_fixup_mbp_vref(struct hda_codec *codec,
2036                                   const struct hda_fixup *fix, int action)
2037 {
2038         static const hda_nid_t nids[] = { 0x14, 0x15, 0x19 };
2039         struct alc_spec *spec = codec->spec;
2040         int i;
2041
2042         if (action != HDA_FIXUP_ACT_INIT)
2043                 return;
2044         for (i = 0; i < ARRAY_SIZE(nids); i++) {
2045                 unsigned int val = snd_hda_codec_get_pincfg(codec, nids[i]);
2046                 if (get_defcfg_device(val) != AC_JACK_HP_OUT)
2047                         continue;
2048                 val = snd_hda_codec_get_pin_target(codec, nids[i]);
2049                 val |= AC_PINCTL_VREF_80;
2050                 snd_hda_set_pin_ctl(codec, nids[i], val);
2051                 spec->gen.keep_vref_in_automute = 1;
2052                 break;
2053         }
2054 }
2055
2056 static void alc889_fixup_mac_pins(struct hda_codec *codec,
2057                                   const hda_nid_t *nids, int num_nids)
2058 {
2059         struct alc_spec *spec = codec->spec;
2060         int i;
2061
2062         for (i = 0; i < num_nids; i++) {
2063                 unsigned int val;
2064                 val = snd_hda_codec_get_pin_target(codec, nids[i]);
2065                 val |= AC_PINCTL_VREF_50;
2066                 snd_hda_set_pin_ctl(codec, nids[i], val);
2067         }
2068         spec->gen.keep_vref_in_automute = 1;
2069 }
2070
2071 /* Set VREF on speaker pins on imac91 */
2072 static void alc889_fixup_imac91_vref(struct hda_codec *codec,
2073                                      const struct hda_fixup *fix, int action)
2074 {
2075         static const hda_nid_t nids[] = { 0x18, 0x1a };
2076
2077         if (action == HDA_FIXUP_ACT_INIT)
2078                 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2079 }
2080
2081 /* Set VREF on speaker pins on mba11 */
2082 static void alc889_fixup_mba11_vref(struct hda_codec *codec,
2083                                     const struct hda_fixup *fix, int action)
2084 {
2085         static const hda_nid_t nids[] = { 0x18 };
2086
2087         if (action == HDA_FIXUP_ACT_INIT)
2088                 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2089 }
2090
2091 /* Set VREF on speaker pins on mba21 */
2092 static void alc889_fixup_mba21_vref(struct hda_codec *codec,
2093                                     const struct hda_fixup *fix, int action)
2094 {
2095         static const hda_nid_t nids[] = { 0x18, 0x19 };
2096
2097         if (action == HDA_FIXUP_ACT_INIT)
2098                 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2099 }
2100
2101 /* Don't take HP output as primary
2102  * Strangely, the speaker output doesn't work on Vaio Z and some Vaio
2103  * all-in-one desktop PCs (for example VGC-LN51JGB) through DAC 0x05
2104  */
2105 static void alc882_fixup_no_primary_hp(struct hda_codec *codec,
2106                                        const struct hda_fixup *fix, int action)
2107 {
2108         struct alc_spec *spec = codec->spec;
2109         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2110                 spec->gen.no_primary_hp = 1;
2111                 spec->gen.no_multi_io = 1;
2112         }
2113 }
2114
2115 static void alc_fixup_bass_chmap(struct hda_codec *codec,
2116                                  const struct hda_fixup *fix, int action);
2117
2118 /* For dual-codec configuration, we need to disable some features to avoid
2119  * conflicts of kctls and PCM streams
2120  */
2121 static void alc_fixup_dual_codecs(struct hda_codec *codec,
2122                                   const struct hda_fixup *fix, int action)
2123 {
2124         struct alc_spec *spec = codec->spec;
2125
2126         if (action != HDA_FIXUP_ACT_PRE_PROBE)
2127                 return;
2128         /* disable vmaster */
2129         spec->gen.suppress_vmaster = 1;
2130         /* auto-mute and auto-mic switch don't work with multiple codecs */
2131         spec->gen.suppress_auto_mute = 1;
2132         spec->gen.suppress_auto_mic = 1;
2133         /* disable aamix as well */
2134         spec->gen.mixer_nid = 0;
2135         /* add location prefix to avoid conflicts */
2136         codec->force_pin_prefix = 1;
2137 }
2138
2139 static void rename_ctl(struct hda_codec *codec, const char *oldname,
2140                        const char *newname)
2141 {
2142         struct snd_kcontrol *kctl;
2143
2144         kctl = snd_hda_find_mixer_ctl(codec, oldname);
2145         if (kctl)
2146                 snd_ctl_rename(codec->card, kctl, newname);
2147 }
2148
2149 static void alc1220_fixup_gb_dual_codecs(struct hda_codec *codec,
2150                                          const struct hda_fixup *fix,
2151                                          int action)
2152 {
2153         alc_fixup_dual_codecs(codec, fix, action);
2154         switch (action) {
2155         case HDA_FIXUP_ACT_PRE_PROBE:
2156                 /* override card longname to provide a unique UCM profile */
2157                 strcpy(codec->card->longname, "HDAudio-Gigabyte-ALC1220DualCodecs");
2158                 break;
2159         case HDA_FIXUP_ACT_BUILD:
2160                 /* rename Capture controls depending on the codec */
2161                 rename_ctl(codec, "Capture Volume",
2162                            codec->addr == 0 ?
2163                            "Rear-Panel Capture Volume" :
2164                            "Front-Panel Capture Volume");
2165                 rename_ctl(codec, "Capture Switch",
2166                            codec->addr == 0 ?
2167                            "Rear-Panel Capture Switch" :
2168                            "Front-Panel Capture Switch");
2169                 break;
2170         }
2171 }
2172
2173 static void alc1220_fixup_gb_x570(struct hda_codec *codec,
2174                                      const struct hda_fixup *fix,
2175                                      int action)
2176 {
2177         static const hda_nid_t conn1[] = { 0x0c };
2178         static const struct coef_fw gb_x570_coefs[] = {
2179                 WRITE_COEF(0x07, 0x03c0),
2180                 WRITE_COEF(0x1a, 0x01c1),
2181                 WRITE_COEF(0x1b, 0x0202),
2182                 WRITE_COEF(0x43, 0x3005),
2183                 {}
2184         };
2185
2186         switch (action) {
2187         case HDA_FIXUP_ACT_PRE_PROBE:
2188                 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2189                 snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
2190                 break;
2191         case HDA_FIXUP_ACT_INIT:
2192                 alc_process_coef_fw(codec, gb_x570_coefs);
2193                 break;
2194         }
2195 }
2196
2197 static void alc1220_fixup_clevo_p950(struct hda_codec *codec,
2198                                      const struct hda_fixup *fix,
2199                                      int action)
2200 {
2201         static const hda_nid_t conn1[] = { 0x0c };
2202
2203         if (action != HDA_FIXUP_ACT_PRE_PROBE)
2204                 return;
2205
2206         alc_update_coef_idx(codec, 0x7, 0, 0x3c3);
2207         /* We therefore want to make sure 0x14 (front headphone) and
2208          * 0x1b (speakers) use the stereo DAC 0x02
2209          */
2210         snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2211         snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
2212 }
2213
2214 static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
2215                                 const struct hda_fixup *fix, int action);
2216
2217 static void alc1220_fixup_clevo_pb51ed(struct hda_codec *codec,
2218                                      const struct hda_fixup *fix,
2219                                      int action)
2220 {
2221         alc1220_fixup_clevo_p950(codec, fix, action);
2222         alc_fixup_headset_mode_no_hp_mic(codec, fix, action);
2223 }
2224
2225 static void alc887_asus_hp_automute_hook(struct hda_codec *codec,
2226                                          struct hda_jack_callback *jack)
2227 {
2228         struct alc_spec *spec = codec->spec;
2229         unsigned int vref;
2230
2231         snd_hda_gen_hp_automute(codec, jack);
2232
2233         if (spec->gen.hp_jack_present)
2234                 vref = AC_PINCTL_VREF_80;
2235         else
2236                 vref = AC_PINCTL_VREF_HIZ;
2237         snd_hda_set_pin_ctl(codec, 0x19, PIN_HP | vref);
2238 }
2239
2240 static void alc887_fixup_asus_jack(struct hda_codec *codec,
2241                                      const struct hda_fixup *fix, int action)
2242 {
2243         struct alc_spec *spec = codec->spec;
2244         if (action != HDA_FIXUP_ACT_PROBE)
2245                 return;
2246         snd_hda_set_pin_ctl_cache(codec, 0x1b, PIN_HP);
2247         spec->gen.hp_automute_hook = alc887_asus_hp_automute_hook;
2248 }
2249
2250 static const struct hda_fixup alc882_fixups[] = {
2251         [ALC882_FIXUP_ABIT_AW9D_MAX] = {
2252                 .type = HDA_FIXUP_PINS,
2253                 .v.pins = (const struct hda_pintbl[]) {
2254                         { 0x15, 0x01080104 }, /* side */
2255                         { 0x16, 0x01011012 }, /* rear */
2256                         { 0x17, 0x01016011 }, /* clfe */
2257                         { }
2258                 }
2259         },
2260         [ALC882_FIXUP_LENOVO_Y530] = {
2261                 .type = HDA_FIXUP_PINS,
2262                 .v.pins = (const struct hda_pintbl[]) {
2263                         { 0x15, 0x99130112 }, /* rear int speakers */
2264                         { 0x16, 0x99130111 }, /* subwoofer */
2265                         { }
2266                 }
2267         },
2268         [ALC882_FIXUP_PB_M5210] = {
2269                 .type = HDA_FIXUP_PINCTLS,
2270                 .v.pins = (const struct hda_pintbl[]) {
2271                         { 0x19, PIN_VREF50 },
2272                         {}
2273                 }
2274         },
2275         [ALC882_FIXUP_ACER_ASPIRE_7736] = {
2276                 .type = HDA_FIXUP_FUNC,
2277                 .v.func = alc_fixup_sku_ignore,
2278         },
2279         [ALC882_FIXUP_ASUS_W90V] = {
2280                 .type = HDA_FIXUP_PINS,
2281                 .v.pins = (const struct hda_pintbl[]) {
2282                         { 0x16, 0x99130110 }, /* fix sequence for CLFE */
2283                         { }
2284                 }
2285         },
2286         [ALC889_FIXUP_CD] = {
2287                 .type = HDA_FIXUP_PINS,
2288                 .v.pins = (const struct hda_pintbl[]) {
2289                         { 0x1c, 0x993301f0 }, /* CD */
2290                         { }
2291                 }
2292         },
2293         [ALC889_FIXUP_FRONT_HP_NO_PRESENCE] = {
2294                 .type = HDA_FIXUP_PINS,
2295                 .v.pins = (const struct hda_pintbl[]) {
2296                         { 0x1b, 0x02214120 }, /* Front HP jack is flaky, disable jack detect */
2297                         { }
2298                 },
2299                 .chained = true,
2300                 .chain_id = ALC889_FIXUP_CD,
2301         },
2302         [ALC889_FIXUP_VAIO_TT] = {
2303                 .type = HDA_FIXUP_PINS,
2304                 .v.pins = (const struct hda_pintbl[]) {
2305                         { 0x17, 0x90170111 }, /* hidden surround speaker */
2306                         { }
2307                 }
2308         },
2309         [ALC888_FIXUP_EEE1601] = {
2310                 .type = HDA_FIXUP_VERBS,
2311                 .v.verbs = (const struct hda_verb[]) {
2312                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2313                         { 0x20, AC_VERB_SET_PROC_COEF,  0x0838 },
2314                         { }
2315                 }
2316         },
2317         [ALC886_FIXUP_EAPD] = {
2318                 .type = HDA_FIXUP_VERBS,
2319                 .v.verbs = (const struct hda_verb[]) {
2320                         /* change to EAPD mode */
2321                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2322                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0068 },
2323                         { }
2324                 }
2325         },
2326         [ALC882_FIXUP_EAPD] = {
2327                 .type = HDA_FIXUP_VERBS,
2328                 .v.verbs = (const struct hda_verb[]) {
2329                         /* change to EAPD mode */
2330                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2331                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
2332                         { }
2333                 }
2334         },
2335         [ALC883_FIXUP_EAPD] = {
2336                 .type = HDA_FIXUP_VERBS,
2337                 .v.verbs = (const struct hda_verb[]) {
2338                         /* change to EAPD mode */
2339                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2340                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2341                         { }
2342                 }
2343         },
2344         [ALC883_FIXUP_ACER_EAPD] = {
2345                 .type = HDA_FIXUP_VERBS,
2346                 .v.verbs = (const struct hda_verb[]) {
2347                         /* eanable EAPD on Acer laptops */
2348                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2349                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2350                         { }
2351                 }
2352         },
2353         [ALC882_FIXUP_GPIO1] = {
2354                 .type = HDA_FIXUP_FUNC,
2355                 .v.func = alc_fixup_gpio1,
2356         },
2357         [ALC882_FIXUP_GPIO2] = {
2358                 .type = HDA_FIXUP_FUNC,
2359                 .v.func = alc_fixup_gpio2,
2360         },
2361         [ALC882_FIXUP_GPIO3] = {
2362                 .type = HDA_FIXUP_FUNC,
2363                 .v.func = alc_fixup_gpio3,
2364         },
2365         [ALC882_FIXUP_ASUS_W2JC] = {
2366                 .type = HDA_FIXUP_FUNC,
2367                 .v.func = alc_fixup_gpio1,
2368                 .chained = true,
2369                 .chain_id = ALC882_FIXUP_EAPD,
2370         },
2371         [ALC889_FIXUP_COEF] = {
2372                 .type = HDA_FIXUP_FUNC,
2373                 .v.func = alc889_fixup_coef,
2374         },
2375         [ALC882_FIXUP_ACER_ASPIRE_4930G] = {
2376                 .type = HDA_FIXUP_PINS,
2377                 .v.pins = (const struct hda_pintbl[]) {
2378                         { 0x16, 0x99130111 }, /* CLFE speaker */
2379                         { 0x17, 0x99130112 }, /* surround speaker */
2380                         { }
2381                 },
2382                 .chained = true,
2383                 .chain_id = ALC882_FIXUP_GPIO1,
2384         },
2385         [ALC882_FIXUP_ACER_ASPIRE_8930G] = {
2386                 .type = HDA_FIXUP_PINS,
2387                 .v.pins = (const struct hda_pintbl[]) {
2388                         { 0x16, 0x99130111 }, /* CLFE speaker */
2389                         { 0x1b, 0x99130112 }, /* surround speaker */
2390                         { }
2391                 },
2392                 .chained = true,
2393                 .chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS,
2394         },
2395         [ALC882_FIXUP_ASPIRE_8930G_VERBS] = {
2396                 /* additional init verbs for Acer Aspire 8930G */
2397                 .type = HDA_FIXUP_VERBS,
2398                 .v.verbs = (const struct hda_verb[]) {
2399                         /* Enable all DACs */
2400                         /* DAC DISABLE/MUTE 1? */
2401                         /*  setting bits 1-5 disables DAC nids 0x02-0x06
2402                          *  apparently. Init=0x38 */
2403                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x03 },
2404                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2405                         /* DAC DISABLE/MUTE 2? */
2406                         /*  some bit here disables the other DACs.
2407                          *  Init=0x4900 */
2408                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x08 },
2409                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2410                         /* DMIC fix
2411                          * This laptop has a stereo digital microphone.
2412                          * The mics are only 1cm apart which makes the stereo
2413                          * useless. However, either the mic or the ALC889
2414                          * makes the signal become a difference/sum signal
2415                          * instead of standard stereo, which is annoying.
2416                          * So instead we flip this bit which makes the
2417                          * codec replicate the sum signal to both channels,
2418                          * turning it into a normal mono mic.
2419                          */
2420                         /* DMIC_CONTROL? Init value = 0x0001 */
2421                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2422                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0003 },
2423                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2424                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2425                         { }
2426                 },
2427                 .chained = true,
2428                 .chain_id = ALC882_FIXUP_GPIO1,
2429         },
2430         [ALC885_FIXUP_MACPRO_GPIO] = {
2431                 .type = HDA_FIXUP_FUNC,
2432                 .v.func = alc885_fixup_macpro_gpio,
2433         },
2434         [ALC889_FIXUP_DAC_ROUTE] = {
2435                 .type = HDA_FIXUP_FUNC,
2436                 .v.func = alc889_fixup_dac_route,
2437         },
2438         [ALC889_FIXUP_MBP_VREF] = {
2439                 .type = HDA_FIXUP_FUNC,
2440                 .v.func = alc889_fixup_mbp_vref,
2441                 .chained = true,
2442                 .chain_id = ALC882_FIXUP_GPIO1,
2443         },
2444         [ALC889_FIXUP_IMAC91_VREF] = {
2445                 .type = HDA_FIXUP_FUNC,
2446                 .v.func = alc889_fixup_imac91_vref,
2447                 .chained = true,
2448                 .chain_id = ALC882_FIXUP_GPIO1,
2449         },
2450         [ALC889_FIXUP_MBA11_VREF] = {
2451                 .type = HDA_FIXUP_FUNC,
2452                 .v.func = alc889_fixup_mba11_vref,
2453                 .chained = true,
2454                 .chain_id = ALC889_FIXUP_MBP_VREF,
2455         },
2456         [ALC889_FIXUP_MBA21_VREF] = {
2457                 .type = HDA_FIXUP_FUNC,
2458                 .v.func = alc889_fixup_mba21_vref,
2459                 .chained = true,
2460                 .chain_id = ALC889_FIXUP_MBP_VREF,
2461         },
2462         [ALC889_FIXUP_MP11_VREF] = {
2463                 .type = HDA_FIXUP_FUNC,
2464                 .v.func = alc889_fixup_mba11_vref,
2465                 .chained = true,
2466                 .chain_id = ALC885_FIXUP_MACPRO_GPIO,
2467         },
2468         [ALC889_FIXUP_MP41_VREF] = {
2469                 .type = HDA_FIXUP_FUNC,
2470                 .v.func = alc889_fixup_mbp_vref,
2471                 .chained = true,
2472                 .chain_id = ALC885_FIXUP_MACPRO_GPIO,
2473         },
2474         [ALC882_FIXUP_INV_DMIC] = {
2475                 .type = HDA_FIXUP_FUNC,
2476                 .v.func = alc_fixup_inv_dmic,
2477         },
2478         [ALC882_FIXUP_NO_PRIMARY_HP] = {
2479                 .type = HDA_FIXUP_FUNC,
2480                 .v.func = alc882_fixup_no_primary_hp,
2481         },
2482         [ALC887_FIXUP_ASUS_BASS] = {
2483                 .type = HDA_FIXUP_PINS,
2484                 .v.pins = (const struct hda_pintbl[]) {
2485                         {0x16, 0x99130130}, /* bass speaker */
2486                         {}
2487                 },
2488                 .chained = true,
2489                 .chain_id = ALC887_FIXUP_BASS_CHMAP,
2490         },
2491         [ALC887_FIXUP_BASS_CHMAP] = {
2492                 .type = HDA_FIXUP_FUNC,
2493                 .v.func = alc_fixup_bass_chmap,
2494         },
2495         [ALC1220_FIXUP_GB_DUAL_CODECS] = {
2496                 .type = HDA_FIXUP_FUNC,
2497                 .v.func = alc1220_fixup_gb_dual_codecs,
2498         },
2499         [ALC1220_FIXUP_GB_X570] = {
2500                 .type = HDA_FIXUP_FUNC,
2501                 .v.func = alc1220_fixup_gb_x570,
2502         },
2503         [ALC1220_FIXUP_CLEVO_P950] = {
2504                 .type = HDA_FIXUP_FUNC,
2505                 .v.func = alc1220_fixup_clevo_p950,
2506         },
2507         [ALC1220_FIXUP_CLEVO_PB51ED] = {
2508                 .type = HDA_FIXUP_FUNC,
2509                 .v.func = alc1220_fixup_clevo_pb51ed,
2510         },
2511         [ALC1220_FIXUP_CLEVO_PB51ED_PINS] = {
2512                 .type = HDA_FIXUP_PINS,
2513                 .v.pins = (const struct hda_pintbl[]) {
2514                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
2515                         {}
2516                 },
2517                 .chained = true,
2518                 .chain_id = ALC1220_FIXUP_CLEVO_PB51ED,
2519         },
2520         [ALC887_FIXUP_ASUS_AUDIO] = {
2521                 .type = HDA_FIXUP_PINS,
2522                 .v.pins = (const struct hda_pintbl[]) {
2523                         { 0x15, 0x02a14150 }, /* use as headset mic, without its own jack detect */
2524                         { 0x19, 0x22219420 },
2525                         {}
2526                 },
2527         },
2528         [ALC887_FIXUP_ASUS_HMIC] = {
2529                 .type = HDA_FIXUP_FUNC,
2530                 .v.func = alc887_fixup_asus_jack,
2531                 .chained = true,
2532                 .chain_id = ALC887_FIXUP_ASUS_AUDIO,
2533         },
2534         [ALCS1200A_FIXUP_MIC_VREF] = {
2535                 .type = HDA_FIXUP_PINCTLS,
2536                 .v.pins = (const struct hda_pintbl[]) {
2537                         { 0x18, PIN_VREF50 }, /* rear mic */
2538                         { 0x19, PIN_VREF50 }, /* front mic */
2539                         {}
2540                 }
2541         },
2542 };
2543
2544 static const struct snd_pci_quirk alc882_fixup_tbl[] = {
2545         SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),
2546         SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2547         SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2548         SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),
2549         SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2550         SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),
2551         SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD),
2552         SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
2553                       ALC882_FIXUP_ACER_ASPIRE_4930G),
2554         SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
2555                       ALC882_FIXUP_ACER_ASPIRE_4930G),
2556         SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
2557                       ALC882_FIXUP_ACER_ASPIRE_8930G),
2558         SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
2559                       ALC882_FIXUP_ACER_ASPIRE_8930G),
2560         SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
2561                       ALC882_FIXUP_ACER_ASPIRE_4930G),
2562         SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
2563         SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
2564                       ALC882_FIXUP_ACER_ASPIRE_4930G),
2565         SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
2566                       ALC882_FIXUP_ACER_ASPIRE_4930G),
2567         SND_PCI_QUIRK(0x1025, 0x021e, "Acer Aspire 5739G",
2568                       ALC882_FIXUP_ACER_ASPIRE_4930G),
2569         SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
2570         SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G),
2571         SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
2572         SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
2573         SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
2574         SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC),
2575         SND_PCI_QUIRK(0x1043, 0x2390, "Asus D700SA", ALC887_FIXUP_ASUS_HMIC),
2576         SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601),
2577         SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS),
2578         SND_PCI_QUIRK(0x1043, 0x8691, "ASUS ROG Ranger VIII", ALC882_FIXUP_GPIO3),
2579         SND_PCI_QUIRK(0x1043, 0x8797, "ASUS TUF B550M-PLUS", ALCS1200A_FIXUP_MIC_VREF),
2580         SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),
2581         SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP),
2582         SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
2583         SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP),
2584         SND_PCI_QUIRK(0x104d, 0x9060, "Sony Vaio VPCL14M1R", ALC882_FIXUP_NO_PRIMARY_HP),
2585
2586         /* All Apple entries are in codec SSIDs */
2587         SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF),
2588         SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC889_FIXUP_MBP_VREF),
2589         SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
2590         SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC889_FIXUP_MP11_VREF),
2591         SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO),
2592         SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO),
2593         SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC889_FIXUP_MBP_VREF),
2594         SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF),
2595         SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD),
2596         SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBA11_VREF),
2597         SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBA21_VREF),
2598         SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF),
2599         SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
2600         SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO),
2601         SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),
2602         SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),
2603         SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),
2604         SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 4,1/5,1", ALC889_FIXUP_MP41_VREF),
2605         SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
2606         SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
2607         SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
2608         SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF),
2609
2610         SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
2611         SND_PCI_QUIRK(0x13fe, 0x1009, "Advantech MIT-W101", ALC886_FIXUP_EAPD),
2612         SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),
2613         SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
2614         SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_GB_X570),
2615         SND_PCI_QUIRK(0x1458, 0xa0ce, "Gigabyte X570 Aorus Xtreme", ALC1220_FIXUP_GB_X570),
2616         SND_PCI_QUIRK(0x1458, 0xa0d5, "Gigabyte X570S Aorus Master", ALC1220_FIXUP_GB_X570),
2617         SND_PCI_QUIRK(0x1462, 0x11f7, "MSI-GE63", ALC1220_FIXUP_CLEVO_P950),
2618         SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950),
2619         SND_PCI_QUIRK(0x1462, 0x1229, "MSI-GP73", ALC1220_FIXUP_CLEVO_P950),
2620         SND_PCI_QUIRK(0x1462, 0x1275, "MSI-GL63", ALC1220_FIXUP_CLEVO_P950),
2621         SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950),
2622         SND_PCI_QUIRK(0x1462, 0x1293, "MSI-GP65", ALC1220_FIXUP_CLEVO_P950),
2623         SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
2624         SND_PCI_QUIRK(0x1462, 0xcc34, "MSI Godlike X570", ALC1220_FIXUP_GB_DUAL_CODECS),
2625         SND_PCI_QUIRK(0x1462, 0xda57, "MSI Z270-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
2626         SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
2627         SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
2628         SND_PCI_QUIRK(0x1558, 0x3702, "Clevo X370SN[VW]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2629         SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2630         SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2631         SND_PCI_QUIRK(0x1558, 0x65d2, "Clevo PB51R[CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2632         SND_PCI_QUIRK(0x1558, 0x65e1, "Clevo PB51[ED][DF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2633         SND_PCI_QUIRK(0x1558, 0x65e5, "Clevo PC50D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2634         SND_PCI_QUIRK(0x1558, 0x65f1, "Clevo PC50HS", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2635         SND_PCI_QUIRK(0x1558, 0x65f5, "Clevo PD50PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2636         SND_PCI_QUIRK(0x1558, 0x66a2, "Clevo PE60RNE", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2637         SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2638         SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2639         SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2640         SND_PCI_QUIRK(0x1558, 0x67f1, "Clevo PC70H[PRS]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2641         SND_PCI_QUIRK(0x1558, 0x67f5, "Clevo PD70PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2642         SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2643         SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170SM", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2644         SND_PCI_QUIRK(0x1558, 0x7715, "Clevo X170KM-G", ALC1220_FIXUP_CLEVO_PB51ED),
2645         SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
2646         SND_PCI_QUIRK(0x1558, 0x9506, "Clevo P955HQ", ALC1220_FIXUP_CLEVO_P950),
2647         SND_PCI_QUIRK(0x1558, 0x950a, "Clevo P955H[PR]", ALC1220_FIXUP_CLEVO_P950),
2648         SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),
2649         SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950),
2650         SND_PCI_QUIRK(0x1558, 0x95e3, "Clevo P955[ER]T", ALC1220_FIXUP_CLEVO_P950),
2651         SND_PCI_QUIRK(0x1558, 0x95e4, "Clevo P955ER", ALC1220_FIXUP_CLEVO_P950),
2652         SND_PCI_QUIRK(0x1558, 0x95e5, "Clevo P955EE6", ALC1220_FIXUP_CLEVO_P950),
2653         SND_PCI_QUIRK(0x1558, 0x95e6, "Clevo P950R[CDF]", ALC1220_FIXUP_CLEVO_P950),
2654         SND_PCI_QUIRK(0x1558, 0x96e1, "Clevo P960[ER][CDFN]-K", ALC1220_FIXUP_CLEVO_P950),
2655         SND_PCI_QUIRK(0x1558, 0x97e1, "Clevo P970[ER][CDFN]", ALC1220_FIXUP_CLEVO_P950),
2656         SND_PCI_QUIRK(0x1558, 0x97e2, "Clevo P970RC-M", ALC1220_FIXUP_CLEVO_P950),
2657         SND_PCI_QUIRK(0x1558, 0xd502, "Clevo PD50SNE", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2658         SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
2659         SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
2660         SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
2661         SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF),
2662         {}
2663 };
2664
2665 static const struct hda_model_fixup alc882_fixup_models[] = {
2666         {.id = ALC882_FIXUP_ABIT_AW9D_MAX, .name = "abit-aw9d"},
2667         {.id = ALC882_FIXUP_LENOVO_Y530, .name = "lenovo-y530"},
2668         {.id = ALC882_FIXUP_ACER_ASPIRE_7736, .name = "acer-aspire-7736"},
2669         {.id = ALC882_FIXUP_ASUS_W90V, .name = "asus-w90v"},
2670         {.id = ALC889_FIXUP_CD, .name = "cd"},
2671         {.id = ALC889_FIXUP_FRONT_HP_NO_PRESENCE, .name = "no-front-hp"},
2672         {.id = ALC889_FIXUP_VAIO_TT, .name = "vaio-tt"},
2673         {.id = ALC888_FIXUP_EEE1601, .name = "eee1601"},
2674         {.id = ALC882_FIXUP_EAPD, .name = "alc882-eapd"},
2675         {.id = ALC883_FIXUP_EAPD, .name = "alc883-eapd"},
2676         {.id = ALC882_FIXUP_GPIO1, .name = "gpio1"},
2677         {.id = ALC882_FIXUP_GPIO2, .name = "gpio2"},
2678         {.id = ALC882_FIXUP_GPIO3, .name = "gpio3"},
2679         {.id = ALC889_FIXUP_COEF, .name = "alc889-coef"},
2680         {.id = ALC882_FIXUP_ASUS_W2JC, .name = "asus-w2jc"},
2681         {.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"},
2682         {.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"},
2683         {.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"},
2684         {.id = ALC885_FIXUP_MACPRO_GPIO, .name = "macpro-gpio"},
2685         {.id = ALC889_FIXUP_DAC_ROUTE, .name = "dac-route"},
2686         {.id = ALC889_FIXUP_MBP_VREF, .name = "mbp-vref"},
2687         {.id = ALC889_FIXUP_IMAC91_VREF, .name = "imac91-vref"},
2688         {.id = ALC889_FIXUP_MBA11_VREF, .name = "mba11-vref"},
2689         {.id = ALC889_FIXUP_MBA21_VREF, .name = "mba21-vref"},
2690         {.id = ALC889_FIXUP_MP11_VREF, .name = "mp11-vref"},
2691         {.id = ALC889_FIXUP_MP41_VREF, .name = "mp41-vref"},
2692         {.id = ALC882_FIXUP_INV_DMIC, .name = "inv-dmic"},
2693         {.id = ALC882_FIXUP_NO_PRIMARY_HP, .name = "no-primary-hp"},
2694         {.id = ALC887_FIXUP_ASUS_BASS, .name = "asus-bass"},
2695         {.id = ALC1220_FIXUP_GB_DUAL_CODECS, .name = "dual-codecs"},
2696         {.id = ALC1220_FIXUP_GB_X570, .name = "gb-x570"},
2697         {.id = ALC1220_FIXUP_CLEVO_P950, .name = "clevo-p950"},
2698         {}
2699 };
2700
2701 static const struct snd_hda_pin_quirk alc882_pin_fixup_tbl[] = {
2702         SND_HDA_PIN_QUIRK(0x10ec1220, 0x1043, "ASUS", ALC1220_FIXUP_CLEVO_P950,
2703                 {0x14, 0x01014010},
2704                 {0x15, 0x01011012},
2705                 {0x16, 0x01016011},
2706                 {0x18, 0x01a19040},
2707                 {0x19, 0x02a19050},
2708                 {0x1a, 0x0181304f},
2709                 {0x1b, 0x0221401f},
2710                 {0x1e, 0x01456130}),
2711         SND_HDA_PIN_QUIRK(0x10ec1220, 0x1462, "MS-7C35", ALC1220_FIXUP_CLEVO_P950,
2712                 {0x14, 0x01015010},
2713                 {0x15, 0x01011012},
2714                 {0x16, 0x01011011},
2715                 {0x18, 0x01a11040},
2716                 {0x19, 0x02a19050},
2717                 {0x1a, 0x0181104f},
2718                 {0x1b, 0x0221401f},
2719                 {0x1e, 0x01451130}),
2720         {}
2721 };
2722
2723 /*
2724  * BIOS auto configuration
2725  */
2726 /* almost identical with ALC880 parser... */
2727 static int alc882_parse_auto_config(struct hda_codec *codec)
2728 {
2729         static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };
2730         static const hda_nid_t alc882_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2731         return alc_parse_auto_config(codec, alc882_ignore, alc882_ssids);
2732 }
2733
2734 /*
2735  */
2736 static int patch_alc882(struct hda_codec *codec)
2737 {
2738         struct alc_spec *spec;
2739         int err;
2740
2741         err = alc_alloc_spec(codec, 0x0b);
2742         if (err < 0)
2743                 return err;
2744
2745         spec = codec->spec;
2746
2747         switch (codec->core.vendor_id) {
2748         case 0x10ec0882:
2749         case 0x10ec0885:
2750         case 0x10ec0900:
2751         case 0x10ec0b00:
2752         case 0x10ec1220:
2753                 break;
2754         default:
2755                 /* ALC883 and variants */
2756                 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2757                 break;
2758         }
2759
2760         alc_pre_init(codec);
2761
2762         snd_hda_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl,
2763                        alc882_fixups);
2764         snd_hda_pick_pin_fixup(codec, alc882_pin_fixup_tbl, alc882_fixups, true);
2765         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2766
2767         alc_auto_parse_customize_define(codec);
2768
2769         if (has_cdefine_beep(codec))
2770                 spec->gen.beep_nid = 0x01;
2771
2772         /* automatic parse from the BIOS config */
2773         err = alc882_parse_auto_config(codec);
2774         if (err < 0)
2775                 goto error;
2776
2777         if (!spec->gen.no_analog && spec->gen.beep_nid) {
2778                 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2779                 if (err < 0)
2780                         goto error;
2781         }
2782
2783         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2784
2785         return 0;
2786
2787  error:
2788         alc_free(codec);
2789         return err;
2790 }
2791
2792
2793 /*
2794  * ALC262 support
2795  */
2796 static int alc262_parse_auto_config(struct hda_codec *codec)
2797 {
2798         static const hda_nid_t alc262_ignore[] = { 0x1d, 0 };
2799         static const hda_nid_t alc262_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2800         return alc_parse_auto_config(codec, alc262_ignore, alc262_ssids);
2801 }
2802
2803 /*
2804  * Pin config fixes
2805  */
2806 enum {
2807         ALC262_FIXUP_FSC_H270,
2808         ALC262_FIXUP_FSC_S7110,
2809         ALC262_FIXUP_HP_Z200,
2810         ALC262_FIXUP_TYAN,
2811         ALC262_FIXUP_LENOVO_3000,
2812         ALC262_FIXUP_BENQ,
2813         ALC262_FIXUP_BENQ_T31,
2814         ALC262_FIXUP_INV_DMIC,
2815         ALC262_FIXUP_INTEL_BAYLEYBAY,
2816 };
2817
2818 static const struct hda_fixup alc262_fixups[] = {
2819         [ALC262_FIXUP_FSC_H270] = {
2820                 .type = HDA_FIXUP_PINS,
2821                 .v.pins = (const struct hda_pintbl[]) {
2822                         { 0x14, 0x99130110 }, /* speaker */
2823                         { 0x15, 0x0221142f }, /* front HP */
2824                         { 0x1b, 0x0121141f }, /* rear HP */
2825                         { }
2826                 }
2827         },
2828         [ALC262_FIXUP_FSC_S7110] = {
2829                 .type = HDA_FIXUP_PINS,
2830                 .v.pins = (const struct hda_pintbl[]) {
2831                         { 0x15, 0x90170110 }, /* speaker */
2832                         { }
2833                 },
2834                 .chained = true,
2835                 .chain_id = ALC262_FIXUP_BENQ,
2836         },
2837         [ALC262_FIXUP_HP_Z200] = {
2838                 .type = HDA_FIXUP_PINS,
2839                 .v.pins = (const struct hda_pintbl[]) {
2840                         { 0x16, 0x99130120 }, /* internal speaker */
2841                         { }
2842                 }
2843         },
2844         [ALC262_FIXUP_TYAN] = {
2845                 .type = HDA_FIXUP_PINS,
2846                 .v.pins = (const struct hda_pintbl[]) {
2847                         { 0x14, 0x1993e1f0 }, /* int AUX */
2848                         { }
2849                 }
2850         },
2851         [ALC262_FIXUP_LENOVO_3000] = {
2852                 .type = HDA_FIXUP_PINCTLS,
2853                 .v.pins = (const struct hda_pintbl[]) {
2854                         { 0x19, PIN_VREF50 },
2855                         {}
2856                 },
2857                 .chained = true,
2858                 .chain_id = ALC262_FIXUP_BENQ,
2859         },
2860         [ALC262_FIXUP_BENQ] = {
2861                 .type = HDA_FIXUP_VERBS,
2862                 .v.verbs = (const struct hda_verb[]) {
2863                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2864                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2865                         {}
2866                 }
2867         },
2868         [ALC262_FIXUP_BENQ_T31] = {
2869                 .type = HDA_FIXUP_VERBS,
2870                 .v.verbs = (const struct hda_verb[]) {
2871                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2872                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2873                         {}
2874                 }
2875         },
2876         [ALC262_FIXUP_INV_DMIC] = {
2877                 .type = HDA_FIXUP_FUNC,
2878                 .v.func = alc_fixup_inv_dmic,
2879         },
2880         [ALC262_FIXUP_INTEL_BAYLEYBAY] = {
2881                 .type = HDA_FIXUP_FUNC,
2882                 .v.func = alc_fixup_no_depop_delay,
2883         },
2884 };
2885
2886 static const struct snd_pci_quirk alc262_fixup_tbl[] = {
2887         SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", ALC262_FIXUP_HP_Z200),
2888         SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu Lifebook S7110", ALC262_FIXUP_FSC_S7110),
2889         SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ),
2890         SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN),
2891         SND_PCI_QUIRK(0x1734, 0x1141, "FSC ESPRIMO U9210", ALC262_FIXUP_FSC_H270),
2892         SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270),
2893         SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000),
2894         SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ),
2895         SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_FIXUP_BENQ_T31),
2896         SND_PCI_QUIRK(0x8086, 0x7270, "BayleyBay", ALC262_FIXUP_INTEL_BAYLEYBAY),
2897         {}
2898 };
2899
2900 static const struct hda_model_fixup alc262_fixup_models[] = {
2901         {.id = ALC262_FIXUP_INV_DMIC, .name = "inv-dmic"},
2902         {.id = ALC262_FIXUP_FSC_H270, .name = "fsc-h270"},
2903         {.id = ALC262_FIXUP_FSC_S7110, .name = "fsc-s7110"},
2904         {.id = ALC262_FIXUP_HP_Z200, .name = "hp-z200"},
2905         {.id = ALC262_FIXUP_TYAN, .name = "tyan"},
2906         {.id = ALC262_FIXUP_LENOVO_3000, .name = "lenovo-3000"},
2907         {.id = ALC262_FIXUP_BENQ, .name = "benq"},
2908         {.id = ALC262_FIXUP_BENQ_T31, .name = "benq-t31"},
2909         {.id = ALC262_FIXUP_INTEL_BAYLEYBAY, .name = "bayleybay"},
2910         {}
2911 };
2912
2913 /*
2914  */
2915 static int patch_alc262(struct hda_codec *codec)
2916 {
2917         struct alc_spec *spec;
2918         int err;
2919
2920         err = alc_alloc_spec(codec, 0x0b);
2921         if (err < 0)
2922                 return err;
2923
2924         spec = codec->spec;
2925         spec->gen.shared_mic_vref_pin = 0x18;
2926
2927         spec->shutup = alc_eapd_shutup;
2928
2929 #if 0
2930         /* pshou 07/11/05  set a zero PCM sample to DAC when FIFO is
2931          * under-run
2932          */
2933         alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x80);
2934 #endif
2935         alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2936
2937         alc_pre_init(codec);
2938
2939         snd_hda_pick_fixup(codec, alc262_fixup_models, alc262_fixup_tbl,
2940                        alc262_fixups);
2941         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2942
2943         alc_auto_parse_customize_define(codec);
2944
2945         if (has_cdefine_beep(codec))
2946                 spec->gen.beep_nid = 0x01;
2947
2948         /* automatic parse from the BIOS config */
2949         err = alc262_parse_auto_config(codec);
2950         if (err < 0)
2951                 goto error;
2952
2953         if (!spec->gen.no_analog && spec->gen.beep_nid) {
2954                 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2955                 if (err < 0)
2956                         goto error;
2957         }
2958
2959         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2960
2961         return 0;
2962
2963  error:
2964         alc_free(codec);
2965         return err;
2966 }
2967
2968 /*
2969  *  ALC268
2970  */
2971 /* bind Beep switches of both NID 0x0f and 0x10 */
2972 static int alc268_beep_switch_put(struct snd_kcontrol *kcontrol,
2973                                   struct snd_ctl_elem_value *ucontrol)
2974 {
2975         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2976         unsigned long pval;
2977         int err;
2978
2979         mutex_lock(&codec->control_mutex);
2980         pval = kcontrol->private_value;
2981         kcontrol->private_value = (pval & ~0xff) | 0x0f;
2982         err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2983         if (err >= 0) {
2984                 kcontrol->private_value = (pval & ~0xff) | 0x10;
2985                 err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2986         }
2987         kcontrol->private_value = pval;
2988         mutex_unlock(&codec->control_mutex);
2989         return err;
2990 }
2991
2992 static const struct snd_kcontrol_new alc268_beep_mixer[] = {
2993         HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
2994         {
2995                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
2996                 .name = "Beep Playback Switch",
2997                 .subdevice = HDA_SUBDEV_AMP_FLAG,
2998                 .info = snd_hda_mixer_amp_switch_info,
2999                 .get = snd_hda_mixer_amp_switch_get,
3000                 .put = alc268_beep_switch_put,
3001                 .private_value = HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT)
3002         },
3003 };
3004
3005 /* set PCBEEP vol = 0, mute connections */
3006 static const struct hda_verb alc268_beep_init_verbs[] = {
3007         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3008         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3009         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3010         { }
3011 };
3012
3013 enum {
3014         ALC268_FIXUP_INV_DMIC,
3015         ALC268_FIXUP_HP_EAPD,
3016         ALC268_FIXUP_SPDIF,
3017 };
3018
3019 static const struct hda_fixup alc268_fixups[] = {
3020         [ALC268_FIXUP_INV_DMIC] = {
3021                 .type = HDA_FIXUP_FUNC,
3022                 .v.func = alc_fixup_inv_dmic,
3023         },
3024         [ALC268_FIXUP_HP_EAPD] = {
3025                 .type = HDA_FIXUP_VERBS,
3026                 .v.verbs = (const struct hda_verb[]) {
3027                         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 0},
3028                         {}
3029                 }
3030         },
3031         [ALC268_FIXUP_SPDIF] = {
3032                 .type = HDA_FIXUP_PINS,
3033                 .v.pins = (const struct hda_pintbl[]) {
3034                         { 0x1e, 0x014b1180 }, /* enable SPDIF out */
3035                         {}
3036                 }
3037         },
3038 };
3039
3040 static const struct hda_model_fixup alc268_fixup_models[] = {
3041         {.id = ALC268_FIXUP_INV_DMIC, .name = "inv-dmic"},
3042         {.id = ALC268_FIXUP_HP_EAPD, .name = "hp-eapd"},
3043         {.id = ALC268_FIXUP_SPDIF, .name = "spdif"},
3044         {}
3045 };
3046
3047 static const struct snd_pci_quirk alc268_fixup_tbl[] = {
3048         SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF),
3049         SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC),
3050         /* below is codec SSID since multiple Toshiba laptops have the
3051          * same PCI SSID 1179:ff00
3052          */
3053         SND_PCI_QUIRK(0x1179, 0xff06, "Toshiba P200", ALC268_FIXUP_HP_EAPD),
3054         {}
3055 };
3056
3057 /*
3058  * BIOS auto configuration
3059  */
3060 static int alc268_parse_auto_config(struct hda_codec *codec)
3061 {
3062         static const hda_nid_t alc268_ssids[] = { 0x15, 0x1b, 0x14, 0 };
3063         return alc_parse_auto_config(codec, NULL, alc268_ssids);
3064 }
3065
3066 /*
3067  */
3068 static int patch_alc268(struct hda_codec *codec)
3069 {
3070         struct alc_spec *spec;
3071         int i, err;
3072
3073         /* ALC268 has no aa-loopback mixer */
3074         err = alc_alloc_spec(codec, 0);
3075         if (err < 0)
3076                 return err;
3077
3078         spec = codec->spec;
3079         if (has_cdefine_beep(codec))
3080                 spec->gen.beep_nid = 0x01;
3081
3082         spec->shutup = alc_eapd_shutup;
3083
3084         alc_pre_init(codec);
3085
3086         snd_hda_pick_fixup(codec, alc268_fixup_models, alc268_fixup_tbl, alc268_fixups);
3087         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
3088
3089         /* automatic parse from the BIOS config */
3090         err = alc268_parse_auto_config(codec);
3091         if (err < 0)
3092                 goto error;
3093
3094         if (err > 0 && !spec->gen.no_analog &&
3095             spec->gen.autocfg.speaker_pins[0] != 0x1d) {
3096                 for (i = 0; i < ARRAY_SIZE(alc268_beep_mixer); i++) {
3097                         if (!snd_hda_gen_add_kctl(&spec->gen, NULL,
3098                                                   &alc268_beep_mixer[i])) {
3099                                 err = -ENOMEM;
3100                                 goto error;
3101                         }
3102                 }
3103                 snd_hda_add_verbs(codec, alc268_beep_init_verbs);
3104                 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
3105                         /* override the amp caps for beep generator */
3106                         snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
3107                                           (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
3108                                           (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
3109                                           (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
3110                                           (0 << AC_AMPCAP_MUTE_SHIFT));
3111         }
3112
3113         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
3114
3115         return 0;
3116
3117  error:
3118         alc_free(codec);
3119         return err;
3120 }
3121
3122 /*
3123  * ALC269
3124  */
3125
3126 static const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
3127         .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
3128 };
3129
3130 static const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
3131         .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
3132 };
3133
3134 /* different alc269-variants */
3135 enum {
3136         ALC269_TYPE_ALC269VA,
3137         ALC269_TYPE_ALC269VB,
3138         ALC269_TYPE_ALC269VC,
3139         ALC269_TYPE_ALC269VD,
3140         ALC269_TYPE_ALC280,
3141         ALC269_TYPE_ALC282,
3142         ALC269_TYPE_ALC283,
3143         ALC269_TYPE_ALC284,
3144         ALC269_TYPE_ALC293,
3145         ALC269_TYPE_ALC286,
3146         ALC269_TYPE_ALC298,
3147         ALC269_TYPE_ALC255,
3148         ALC269_TYPE_ALC256,
3149         ALC269_TYPE_ALC257,
3150         ALC269_TYPE_ALC215,
3151         ALC269_TYPE_ALC225,
3152         ALC269_TYPE_ALC245,
3153         ALC269_TYPE_ALC287,
3154         ALC269_TYPE_ALC294,
3155         ALC269_TYPE_ALC300,
3156         ALC269_TYPE_ALC623,
3157         ALC269_TYPE_ALC700,
3158 };
3159
3160 /*
3161  * BIOS auto configuration
3162  */
3163 static int alc269_parse_auto_config(struct hda_codec *codec)
3164 {
3165         static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };
3166         static const hda_nid_t alc269_ssids[] = { 0, 0x1b, 0x14, 0x21 };
3167         static const hda_nid_t alc269va_ssids[] = { 0x15, 0x1b, 0x14, 0 };
3168         struct alc_spec *spec = codec->spec;
3169         const hda_nid_t *ssids;
3170
3171         switch (spec->codec_variant) {
3172         case ALC269_TYPE_ALC269VA:
3173         case ALC269_TYPE_ALC269VC:
3174         case ALC269_TYPE_ALC280:
3175         case ALC269_TYPE_ALC284:
3176         case ALC269_TYPE_ALC293:
3177                 ssids = alc269va_ssids;
3178                 break;
3179         case ALC269_TYPE_ALC269VB:
3180         case ALC269_TYPE_ALC269VD:
3181         case ALC269_TYPE_ALC282:
3182         case ALC269_TYPE_ALC283:
3183         case ALC269_TYPE_ALC286:
3184         case ALC269_TYPE_ALC298:
3185         case ALC269_TYPE_ALC255:
3186         case ALC269_TYPE_ALC256:
3187         case ALC269_TYPE_ALC257:
3188         case ALC269_TYPE_ALC215:
3189         case ALC269_TYPE_ALC225:
3190         case ALC269_TYPE_ALC245:
3191         case ALC269_TYPE_ALC287:
3192         case ALC269_TYPE_ALC294:
3193         case ALC269_TYPE_ALC300:
3194         case ALC269_TYPE_ALC623:
3195         case ALC269_TYPE_ALC700:
3196                 ssids = alc269_ssids;
3197                 break;
3198         default:
3199                 ssids = alc269_ssids;
3200                 break;
3201         }
3202
3203         return alc_parse_auto_config(codec, alc269_ignore, ssids);
3204 }
3205
3206 static const struct hda_jack_keymap alc_headset_btn_keymap[] = {
3207         { SND_JACK_BTN_0, KEY_PLAYPAUSE },
3208         { SND_JACK_BTN_1, KEY_VOICECOMMAND },
3209         { SND_JACK_BTN_2, KEY_VOLUMEUP },
3210         { SND_JACK_BTN_3, KEY_VOLUMEDOWN },
3211         {}
3212 };
3213
3214 static void alc_headset_btn_callback(struct hda_codec *codec,
3215                                      struct hda_jack_callback *jack)
3216 {
3217         int report = 0;
3218
3219         if (jack->unsol_res & (7 << 13))
3220                 report |= SND_JACK_BTN_0;
3221
3222         if (jack->unsol_res  & (1 << 16 | 3 << 8))
3223                 report |= SND_JACK_BTN_1;
3224
3225         /* Volume up key */
3226         if (jack->unsol_res & (7 << 23))
3227                 report |= SND_JACK_BTN_2;
3228
3229         /* Volume down key */
3230         if (jack->unsol_res & (7 << 10))
3231                 report |= SND_JACK_BTN_3;
3232
3233         snd_hda_jack_set_button_state(codec, jack->nid, report);
3234 }
3235
3236 static void alc_disable_headset_jack_key(struct hda_codec *codec)
3237 {
3238         struct alc_spec *spec = codec->spec;
3239
3240         if (!spec->has_hs_key)
3241                 return;
3242
3243         switch (codec->core.vendor_id) {
3244         case 0x10ec0215:
3245         case 0x10ec0225:
3246         case 0x10ec0285:
3247         case 0x10ec0287:
3248         case 0x10ec0295:
3249         case 0x10ec0289:
3250         case 0x10ec0299:
3251                 alc_write_coef_idx(codec, 0x48, 0x0);
3252                 alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3253                 alc_update_coef_idx(codec, 0x44, 0x0045 << 8, 0x0);
3254                 break;
3255         case 0x10ec0230:
3256         case 0x10ec0236:
3257         case 0x10ec0256:
3258         case 0x19e58326:
3259                 alc_write_coef_idx(codec, 0x48, 0x0);
3260                 alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3261                 break;
3262         }
3263 }
3264
3265 static void alc_enable_headset_jack_key(struct hda_codec *codec)
3266 {
3267         struct alc_spec *spec = codec->spec;
3268
3269         if (!spec->has_hs_key)
3270                 return;
3271
3272         switch (codec->core.vendor_id) {
3273         case 0x10ec0215:
3274         case 0x10ec0225:
3275         case 0x10ec0285:
3276         case 0x10ec0287:
3277         case 0x10ec0295:
3278         case 0x10ec0289:
3279         case 0x10ec0299:
3280                 alc_write_coef_idx(codec, 0x48, 0xd011);
3281                 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3282                 alc_update_coef_idx(codec, 0x44, 0x007f << 8, 0x0045 << 8);
3283                 break;
3284         case 0x10ec0230:
3285         case 0x10ec0236:
3286         case 0x10ec0256:
3287         case 0x19e58326:
3288                 alc_write_coef_idx(codec, 0x48, 0xd011);
3289                 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3290                 break;
3291         }
3292 }
3293
3294 static void alc_fixup_headset_jack(struct hda_codec *codec,
3295                                     const struct hda_fixup *fix, int action)
3296 {
3297         struct alc_spec *spec = codec->spec;
3298         hda_nid_t hp_pin;
3299
3300         switch (action) {
3301         case HDA_FIXUP_ACT_PRE_PROBE:
3302                 spec->has_hs_key = 1;
3303                 snd_hda_jack_detect_enable_callback(codec, 0x55,
3304                                                     alc_headset_btn_callback);
3305                 break;
3306         case HDA_FIXUP_ACT_BUILD:
3307                 hp_pin = alc_get_hp_pin(spec);
3308                 if (!hp_pin || snd_hda_jack_bind_keymap(codec, 0x55,
3309                                                         alc_headset_btn_keymap,
3310                                                         hp_pin))
3311                         snd_hda_jack_add_kctl(codec, 0x55, "Headset Jack",
3312                                               false, SND_JACK_HEADSET,
3313                                               alc_headset_btn_keymap);
3314
3315                 alc_enable_headset_jack_key(codec);
3316                 break;
3317         }
3318 }
3319
3320 static void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)
3321 {
3322         alc_update_coef_idx(codec, 0x04, 1 << 11, power_up ? (1 << 11) : 0);
3323 }
3324
3325 static void alc269_shutup(struct hda_codec *codec)
3326 {
3327         struct alc_spec *spec = codec->spec;
3328
3329         if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3330                 alc269vb_toggle_power_output(codec, 0);
3331         if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3332                         (alc_get_coef0(codec) & 0x00ff) == 0x018) {
3333                 msleep(150);
3334         }
3335         alc_shutup_pins(codec);
3336 }
3337
3338 static const struct coef_fw alc282_coefs[] = {
3339         WRITE_COEF(0x03, 0x0002), /* Power Down Control */
3340         UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
3341         WRITE_COEF(0x07, 0x0200), /* DMIC control */
3342         UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3343         UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3344         WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3345         WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3346         WRITE_COEF(0x0e, 0x6e00), /* LDO1/2/3, DAC/ADC */
3347         UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3348         UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3349         WRITE_COEF(0x6f, 0x0), /* Class D test 4 */
3350         UPDATE_COEF(0x0c, 0xfe00, 0), /* IO power down directly */
3351         WRITE_COEF(0x34, 0xa0c0), /* ANC */
3352         UPDATE_COEF(0x16, 0x0008, 0), /* AGC MUX */
3353         UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3354         UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3355         WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3356         WRITE_COEF(0x63, 0x2902), /* PLL */
3357         WRITE_COEF(0x68, 0xa080), /* capless control 2 */
3358         WRITE_COEF(0x69, 0x3400), /* capless control 3 */
3359         WRITE_COEF(0x6a, 0x2f3e), /* capless control 4 */
3360         WRITE_COEF(0x6b, 0x0), /* capless control 5 */
3361         UPDATE_COEF(0x6d, 0x0fff, 0x0900), /* class D test 2 */
3362         WRITE_COEF(0x6e, 0x110a), /* class D test 3 */
3363         UPDATE_COEF(0x70, 0x00f8, 0x00d8), /* class D test 5 */
3364         WRITE_COEF(0x71, 0x0014), /* class D test 6 */
3365         WRITE_COEF(0x72, 0xc2ba), /* classD OCP */
3366         UPDATE_COEF(0x77, 0x0f80, 0), /* classD pure DC test */
3367         WRITE_COEF(0x6c, 0xfc06), /* Class D amp control */
3368         {}
3369 };
3370
3371 static void alc282_restore_default_value(struct hda_codec *codec)
3372 {
3373         alc_process_coef_fw(codec, alc282_coefs);
3374 }
3375
3376 static void alc282_init(struct hda_codec *codec)
3377 {
3378         struct alc_spec *spec = codec->spec;
3379         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3380         bool hp_pin_sense;
3381         int coef78;
3382
3383         alc282_restore_default_value(codec);
3384
3385         if (!hp_pin)
3386                 return;
3387         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3388         coef78 = alc_read_coef_idx(codec, 0x78);
3389
3390         /* Index 0x78 Direct Drive HP AMP LPM Control 1 */
3391         /* Headphone capless set to high power mode */
3392         alc_write_coef_idx(codec, 0x78, 0x9004);
3393
3394         if (hp_pin_sense)
3395                 msleep(2);
3396
3397         snd_hda_codec_write(codec, hp_pin, 0,
3398                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3399
3400         if (hp_pin_sense)
3401                 msleep(85);
3402
3403         snd_hda_codec_write(codec, hp_pin, 0,
3404                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3405
3406         if (hp_pin_sense)
3407                 msleep(100);
3408
3409         /* Headphone capless set to normal mode */
3410         alc_write_coef_idx(codec, 0x78, coef78);
3411 }
3412
3413 static void alc282_shutup(struct hda_codec *codec)
3414 {
3415         struct alc_spec *spec = codec->spec;
3416         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3417         bool hp_pin_sense;
3418         int coef78;
3419
3420         if (!hp_pin) {
3421                 alc269_shutup(codec);
3422                 return;
3423         }
3424
3425         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3426         coef78 = alc_read_coef_idx(codec, 0x78);
3427         alc_write_coef_idx(codec, 0x78, 0x9004);
3428
3429         if (hp_pin_sense)
3430                 msleep(2);
3431
3432         snd_hda_codec_write(codec, hp_pin, 0,
3433                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3434
3435         if (hp_pin_sense)
3436                 msleep(85);
3437
3438         if (!spec->no_shutup_pins)
3439                 snd_hda_codec_write(codec, hp_pin, 0,
3440                                     AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3441
3442         if (hp_pin_sense)
3443                 msleep(100);
3444
3445         alc_auto_setup_eapd(codec, false);
3446         alc_shutup_pins(codec);
3447         alc_write_coef_idx(codec, 0x78, coef78);
3448 }
3449
3450 static const struct coef_fw alc283_coefs[] = {
3451         WRITE_COEF(0x03, 0x0002), /* Power Down Control */
3452         UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
3453         WRITE_COEF(0x07, 0x0200), /* DMIC control */
3454         UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3455         UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3456         WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3457         WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3458         WRITE_COEF(0x0e, 0x6fc0), /* LDO1/2/3, DAC/ADC */
3459         UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3460         UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3461         WRITE_COEF(0x3a, 0x0), /* Class D test 4 */
3462         UPDATE_COEF(0x0c, 0xfe00, 0x0), /* IO power down directly */
3463         WRITE_COEF(0x22, 0xa0c0), /* ANC */
3464         UPDATE_COEFEX(0x53, 0x01, 0x000f, 0x0008), /* AGC MUX */
3465         UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3466         UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3467         WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3468         WRITE_COEF(0x2e, 0x2902), /* PLL */
3469         WRITE_COEF(0x33, 0xa080), /* capless control 2 */
3470         WRITE_COEF(0x34, 0x3400), /* capless control 3 */
3471         WRITE_COEF(0x35, 0x2f3e), /* capless control 4 */
3472         WRITE_COEF(0x36, 0x0), /* capless control 5 */
3473         UPDATE_COEF(0x38, 0x0fff, 0x0900), /* class D test 2 */
3474         WRITE_COEF(0x39, 0x110a), /* class D test 3 */
3475         UPDATE_COEF(0x3b, 0x00f8, 0x00d8), /* class D test 5 */
3476         WRITE_COEF(0x3c, 0x0014), /* class D test 6 */
3477         WRITE_COEF(0x3d, 0xc2ba), /* classD OCP */
3478         UPDATE_COEF(0x42, 0x0f80, 0x0), /* classD pure DC test */
3479         WRITE_COEF(0x49, 0x0), /* test mode */
3480         UPDATE_COEF(0x40, 0xf800, 0x9800), /* Class D DC enable */
3481         UPDATE_COEF(0x42, 0xf000, 0x2000), /* DC offset */
3482         WRITE_COEF(0x37, 0xfc06), /* Class D amp control */
3483         UPDATE_COEF(0x1b, 0x8000, 0), /* HP JD control */
3484         {}
3485 };
3486
3487 static void alc283_restore_default_value(struct hda_codec *codec)
3488 {
3489         alc_process_coef_fw(codec, alc283_coefs);
3490 }
3491
3492 static void alc283_init(struct hda_codec *codec)
3493 {
3494         struct alc_spec *spec = codec->spec;
3495         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3496         bool hp_pin_sense;
3497
3498         alc283_restore_default_value(codec);
3499
3500         if (!hp_pin)
3501                 return;
3502
3503         msleep(30);
3504         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3505
3506         /* Index 0x43 Direct Drive HP AMP LPM Control 1 */
3507         /* Headphone capless set to high power mode */
3508         alc_write_coef_idx(codec, 0x43, 0x9004);
3509
3510         snd_hda_codec_write(codec, hp_pin, 0,
3511                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3512
3513         if (hp_pin_sense)
3514                 msleep(85);
3515
3516         snd_hda_codec_write(codec, hp_pin, 0,
3517                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3518
3519         if (hp_pin_sense)
3520                 msleep(85);
3521         /* Index 0x46 Combo jack auto switch control 2 */
3522         /* 3k pull low control for Headset jack. */
3523         alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3524         /* Headphone capless set to normal mode */
3525         alc_write_coef_idx(codec, 0x43, 0x9614);
3526 }
3527
3528 static void alc283_shutup(struct hda_codec *codec)
3529 {
3530         struct alc_spec *spec = codec->spec;
3531         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3532         bool hp_pin_sense;
3533
3534         if (!hp_pin) {
3535                 alc269_shutup(codec);
3536                 return;
3537         }
3538
3539         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3540
3541         alc_write_coef_idx(codec, 0x43, 0x9004);
3542
3543         /*depop hp during suspend*/
3544         alc_write_coef_idx(codec, 0x06, 0x2100);
3545
3546         snd_hda_codec_write(codec, hp_pin, 0,
3547                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3548
3549         if (hp_pin_sense)
3550                 msleep(100);
3551
3552         if (!spec->no_shutup_pins)
3553                 snd_hda_codec_write(codec, hp_pin, 0,
3554                                     AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3555
3556         alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
3557
3558         if (hp_pin_sense)
3559                 msleep(100);
3560         alc_auto_setup_eapd(codec, false);
3561         alc_shutup_pins(codec);
3562         alc_write_coef_idx(codec, 0x43, 0x9614);
3563 }
3564
3565 static void alc256_init(struct hda_codec *codec)
3566 {
3567         struct alc_spec *spec = codec->spec;
3568         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3569         bool hp_pin_sense;
3570
3571         if (spec->ultra_low_power) {
3572                 alc_update_coef_idx(codec, 0x03, 1<<1, 1<<1);
3573                 alc_update_coef_idx(codec, 0x08, 3<<2, 3<<2);
3574                 alc_update_coef_idx(codec, 0x08, 7<<4, 0);
3575                 alc_update_coef_idx(codec, 0x3b, 1<<15, 0);
3576                 alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3577                 msleep(30);
3578         }
3579
3580         if (!hp_pin)
3581                 hp_pin = 0x21;
3582
3583         msleep(30);
3584
3585         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3586
3587         if (hp_pin_sense)
3588                 msleep(2);
3589
3590         alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3591
3592         snd_hda_codec_write(codec, hp_pin, 0,
3593                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3594
3595         if (hp_pin_sense || spec->ultra_low_power)
3596                 msleep(85);
3597
3598         snd_hda_codec_write(codec, hp_pin, 0,
3599                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3600
3601         if (hp_pin_sense || spec->ultra_low_power)
3602                 msleep(100);
3603
3604         alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3605         alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
3606         alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */
3607         alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15);
3608         /*
3609          * Expose headphone mic (or possibly Line In on some machines) instead
3610          * of PC Beep on 1Ah, and disable 1Ah loopback for all outputs. See
3611          * Documentation/sound/hd-audio/realtek-pc-beep.rst for details of
3612          * this register.
3613          */
3614         alc_write_coef_idx(codec, 0x36, 0x5757);
3615 }
3616
3617 static void alc256_shutup(struct hda_codec *codec)
3618 {
3619         struct alc_spec *spec = codec->spec;
3620         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3621         bool hp_pin_sense;
3622
3623         if (!hp_pin)
3624                 hp_pin = 0x21;
3625
3626         alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3627         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3628
3629         if (hp_pin_sense)
3630                 msleep(2);
3631
3632         snd_hda_codec_write(codec, hp_pin, 0,
3633                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3634
3635         if (hp_pin_sense || spec->ultra_low_power)
3636                 msleep(85);
3637
3638         /* 3k pull low control for Headset jack. */
3639         /* NOTE: call this before clearing the pin, otherwise codec stalls */
3640         /* If disable 3k pulldown control for alc257, the Mic detection will not work correctly
3641          * when booting with headset plugged. So skip setting it for the codec alc257
3642          */
3643         if (spec->en_3kpull_low)
3644                 alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
3645
3646         if (!spec->no_shutup_pins)
3647                 snd_hda_codec_write(codec, hp_pin, 0,
3648                                     AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3649
3650         if (hp_pin_sense || spec->ultra_low_power)
3651                 msleep(100);
3652
3653         alc_auto_setup_eapd(codec, false);
3654         alc_shutup_pins(codec);
3655         if (spec->ultra_low_power) {
3656                 msleep(50);
3657                 alc_update_coef_idx(codec, 0x03, 1<<1, 0);
3658                 alc_update_coef_idx(codec, 0x08, 7<<4, 7<<4);
3659                 alc_update_coef_idx(codec, 0x08, 3<<2, 0);
3660                 alc_update_coef_idx(codec, 0x3b, 1<<15, 1<<15);
3661                 alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3662                 msleep(30);
3663         }
3664 }
3665
3666 static void alc285_hp_init(struct hda_codec *codec)
3667 {
3668         struct alc_spec *spec = codec->spec;
3669         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3670         int i, val;
3671         int coef38, coef0d, coef36;
3672
3673         alc_update_coef_idx(codec, 0x4a, 1<<15, 1<<15); /* Reset HP JD */
3674         coef38 = alc_read_coef_idx(codec, 0x38); /* Amp control */
3675         coef0d = alc_read_coef_idx(codec, 0x0d); /* Digital Misc control */
3676         coef36 = alc_read_coef_idx(codec, 0x36); /* Passthrough Control */
3677         alc_update_coef_idx(codec, 0x38, 1<<4, 0x0);
3678         alc_update_coef_idx(codec, 0x0d, 0x110, 0x0);
3679
3680         alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
3681
3682         if (hp_pin)
3683                 snd_hda_codec_write(codec, hp_pin, 0,
3684                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3685
3686         msleep(130);
3687         alc_update_coef_idx(codec, 0x36, 1<<14, 1<<14);
3688         alc_update_coef_idx(codec, 0x36, 1<<13, 0x0);
3689
3690         if (hp_pin)
3691                 snd_hda_codec_write(codec, hp_pin, 0,
3692                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3693         msleep(10);
3694         alc_write_coef_idx(codec, 0x67, 0x0); /* Set HP depop to manual mode */
3695         alc_write_coefex_idx(codec, 0x58, 0x00, 0x7880);
3696         alc_write_coefex_idx(codec, 0x58, 0x0f, 0xf049);
3697         alc_update_coefex_idx(codec, 0x58, 0x03, 0x00f0, 0x00c0);
3698
3699         alc_write_coefex_idx(codec, 0x58, 0x00, 0xf888); /* HP depop procedure start */
3700         val = alc_read_coefex_idx(codec, 0x58, 0x00);
3701         for (i = 0; i < 20 && val & 0x8000; i++) {
3702                 msleep(50);
3703                 val = alc_read_coefex_idx(codec, 0x58, 0x00);
3704         } /* Wait for depop procedure finish  */
3705
3706         alc_write_coefex_idx(codec, 0x58, 0x00, val); /* write back the result */
3707         alc_update_coef_idx(codec, 0x38, 1<<4, coef38);
3708         alc_update_coef_idx(codec, 0x0d, 0x110, coef0d);
3709         alc_update_coef_idx(codec, 0x36, 3<<13, coef36);
3710
3711         msleep(50);
3712         alc_update_coef_idx(codec, 0x4a, 1<<15, 0);
3713 }
3714
3715 static void alc225_init(struct hda_codec *codec)
3716 {
3717         struct alc_spec *spec = codec->spec;
3718         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3719         bool hp1_pin_sense, hp2_pin_sense;
3720
3721         if (spec->ultra_low_power) {
3722                 alc_update_coef_idx(codec, 0x08, 0x0f << 2, 3<<2);
3723                 alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3724                 alc_update_coef_idx(codec, 0x33, 1<<11, 0);
3725                 msleep(30);
3726         }
3727
3728         if (spec->codec_variant != ALC269_TYPE_ALC287 &&
3729                 spec->codec_variant != ALC269_TYPE_ALC245)
3730                 /* required only at boot or S3 and S4 resume time */
3731                 if (!spec->done_hp_init ||
3732                         is_s3_resume(codec) ||
3733                         is_s4_resume(codec)) {
3734                         alc285_hp_init(codec);
3735                         spec->done_hp_init = true;
3736                 }
3737
3738         if (!hp_pin)
3739                 hp_pin = 0x21;
3740         msleep(30);
3741
3742         hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3743         hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3744
3745         if (hp1_pin_sense || hp2_pin_sense)
3746                 msleep(2);
3747
3748         alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3749
3750         if (hp1_pin_sense || spec->ultra_low_power)
3751                 snd_hda_codec_write(codec, hp_pin, 0,
3752                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3753         if (hp2_pin_sense)
3754                 snd_hda_codec_write(codec, 0x16, 0,
3755                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3756
3757         if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3758                 msleep(85);
3759
3760         if (hp1_pin_sense || spec->ultra_low_power)
3761                 snd_hda_codec_write(codec, hp_pin, 0,
3762                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3763         if (hp2_pin_sense)
3764                 snd_hda_codec_write(codec, 0x16, 0,
3765                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3766
3767         if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3768                 msleep(100);
3769
3770         alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3771         alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
3772 }
3773
3774 static void alc225_shutup(struct hda_codec *codec)
3775 {
3776         struct alc_spec *spec = codec->spec;
3777         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3778         bool hp1_pin_sense, hp2_pin_sense;
3779
3780         if (!hp_pin)
3781                 hp_pin = 0x21;
3782
3783         alc_disable_headset_jack_key(codec);
3784         /* 3k pull low control for Headset jack. */
3785         alc_update_coef_idx(codec, 0x4a, 0, 3 << 10);
3786
3787         hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3788         hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3789
3790         if (hp1_pin_sense || hp2_pin_sense)
3791                 msleep(2);
3792
3793         if (hp1_pin_sense || spec->ultra_low_power)
3794                 snd_hda_codec_write(codec, hp_pin, 0,
3795                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3796         if (hp2_pin_sense)
3797                 snd_hda_codec_write(codec, 0x16, 0,
3798                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3799
3800         if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3801                 msleep(85);
3802
3803         if (hp1_pin_sense || spec->ultra_low_power)
3804                 snd_hda_codec_write(codec, hp_pin, 0,
3805                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3806         if (hp2_pin_sense)
3807                 snd_hda_codec_write(codec, 0x16, 0,
3808                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3809
3810         if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3811                 msleep(100);
3812
3813         alc_auto_setup_eapd(codec, false);
3814         alc_shutup_pins(codec);
3815         if (spec->ultra_low_power) {
3816                 msleep(50);
3817                 alc_update_coef_idx(codec, 0x08, 0x0f << 2, 0x0c << 2);
3818                 alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3819                 alc_update_coef_idx(codec, 0x33, 1<<11, 1<<11);
3820                 alc_update_coef_idx(codec, 0x4a, 3<<4, 2<<4);
3821                 msleep(30);
3822         }
3823
3824         alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3825         alc_enable_headset_jack_key(codec);
3826 }
3827
3828 static void alc_default_init(struct hda_codec *codec)
3829 {
3830         struct alc_spec *spec = codec->spec;
3831         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3832         bool hp_pin_sense;
3833
3834         if (!hp_pin)
3835                 return;
3836
3837         msleep(30);
3838
3839         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3840
3841         if (hp_pin_sense)
3842                 msleep(2);
3843
3844         snd_hda_codec_write(codec, hp_pin, 0,
3845                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3846
3847         if (hp_pin_sense)
3848                 msleep(85);
3849
3850         snd_hda_codec_write(codec, hp_pin, 0,
3851                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3852
3853         if (hp_pin_sense)
3854                 msleep(100);
3855 }
3856
3857 static void alc_default_shutup(struct hda_codec *codec)
3858 {
3859         struct alc_spec *spec = codec->spec;
3860         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3861         bool hp_pin_sense;
3862
3863         if (!hp_pin) {
3864                 alc269_shutup(codec);
3865                 return;
3866         }
3867
3868         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3869
3870         if (hp_pin_sense)
3871                 msleep(2);
3872
3873         snd_hda_codec_write(codec, hp_pin, 0,
3874                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3875
3876         if (hp_pin_sense)
3877                 msleep(85);
3878
3879         if (!spec->no_shutup_pins)
3880                 snd_hda_codec_write(codec, hp_pin, 0,
3881                                     AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3882
3883         if (hp_pin_sense)
3884                 msleep(100);
3885
3886         alc_auto_setup_eapd(codec, false);
3887         alc_shutup_pins(codec);
3888 }
3889
3890 static void alc294_hp_init(struct hda_codec *codec)
3891 {
3892         struct alc_spec *spec = codec->spec;
3893         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3894         int i, val;
3895
3896         if (!hp_pin)
3897                 return;
3898
3899         snd_hda_codec_write(codec, hp_pin, 0,
3900                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3901
3902         msleep(100);
3903
3904         if (!spec->no_shutup_pins)
3905                 snd_hda_codec_write(codec, hp_pin, 0,
3906                                     AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3907
3908         alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */
3909         alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */
3910
3911         /* Wait for depop procedure finish  */
3912         val = alc_read_coefex_idx(codec, 0x58, 0x01);
3913         for (i = 0; i < 20 && val & 0x0080; i++) {
3914                 msleep(50);
3915                 val = alc_read_coefex_idx(codec, 0x58, 0x01);
3916         }
3917         /* Set HP depop to auto mode */
3918         alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b);
3919         msleep(50);
3920 }
3921
3922 static void alc294_init(struct hda_codec *codec)
3923 {
3924         struct alc_spec *spec = codec->spec;
3925
3926         /* required only at boot or S4 resume time */
3927         if (!spec->done_hp_init ||
3928             codec->core.dev.power.power_state.event == PM_EVENT_RESTORE) {
3929                 alc294_hp_init(codec);
3930                 spec->done_hp_init = true;
3931         }
3932         alc_default_init(codec);
3933 }
3934
3935 static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg,
3936                              unsigned int val)
3937 {
3938         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3939         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val & 0xffff); /* LSB */
3940         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val >> 16); /* MSB */
3941 }
3942
3943 static int alc5505_coef_get(struct hda_codec *codec, unsigned int index_reg)
3944 {
3945         unsigned int val;
3946
3947         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3948         val = snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3949                 & 0xffff;
3950         val |= snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3951                 << 16;
3952         return val;
3953 }
3954
3955 static void alc5505_dsp_halt(struct hda_codec *codec)
3956 {
3957         unsigned int val;
3958
3959         alc5505_coef_set(codec, 0x3000, 0x000c); /* DSP CPU stop */
3960         alc5505_coef_set(codec, 0x880c, 0x0008); /* DDR enter self refresh */
3961         alc5505_coef_set(codec, 0x61c0, 0x11110080); /* Clock control for PLL and CPU */
3962         alc5505_coef_set(codec, 0x6230, 0xfc0d4011); /* Disable Input OP */
3963         alc5505_coef_set(codec, 0x61b4, 0x040a2b03); /* Stop PLL2 */
3964         alc5505_coef_set(codec, 0x61b0, 0x00005b17); /* Stop PLL1 */
3965         alc5505_coef_set(codec, 0x61b8, 0x04133303); /* Stop PLL3 */
3966         val = alc5505_coef_get(codec, 0x6220);
3967         alc5505_coef_set(codec, 0x6220, (val | 0x3000)); /* switch Ringbuffer clock to DBUS clock */
3968 }
3969
3970 static void alc5505_dsp_back_from_halt(struct hda_codec *codec)
3971 {
3972         alc5505_coef_set(codec, 0x61b8, 0x04133302);
3973         alc5505_coef_set(codec, 0x61b0, 0x00005b16);
3974         alc5505_coef_set(codec, 0x61b4, 0x040a2b02);
3975         alc5505_coef_set(codec, 0x6230, 0xf80d4011);
3976         alc5505_coef_set(codec, 0x6220, 0x2002010f);
3977         alc5505_coef_set(codec, 0x880c, 0x00000004);
3978 }
3979
3980 static void alc5505_dsp_init(struct hda_codec *codec)
3981 {
3982         unsigned int val;
3983
3984         alc5505_dsp_halt(codec);
3985         alc5505_dsp_back_from_halt(codec);
3986         alc5505_coef_set(codec, 0x61b0, 0x5b14); /* PLL1 control */
3987         alc5505_coef_set(codec, 0x61b0, 0x5b16);
3988         alc5505_coef_set(codec, 0x61b4, 0x04132b00); /* PLL2 control */
3989         alc5505_coef_set(codec, 0x61b4, 0x04132b02);
3990         alc5505_coef_set(codec, 0x61b8, 0x041f3300); /* PLL3 control*/
3991         alc5505_coef_set(codec, 0x61b8, 0x041f3302);
3992         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_CODEC_RESET, 0); /* Function reset */
3993         alc5505_coef_set(codec, 0x61b8, 0x041b3302);
3994         alc5505_coef_set(codec, 0x61b8, 0x04173302);
3995         alc5505_coef_set(codec, 0x61b8, 0x04163302);
3996         alc5505_coef_set(codec, 0x8800, 0x348b328b); /* DRAM control */
3997         alc5505_coef_set(codec, 0x8808, 0x00020022); /* DRAM control */
3998         alc5505_coef_set(codec, 0x8818, 0x00000400); /* DRAM control */
3999
4000         val = alc5505_coef_get(codec, 0x6200) >> 16; /* Read revision ID */
4001         if (val <= 3)
4002                 alc5505_coef_set(codec, 0x6220, 0x2002010f); /* I/O PAD Configuration */
4003         else
4004                 alc5505_coef_set(codec, 0x6220, 0x6002018f);
4005
4006         alc5505_coef_set(codec, 0x61ac, 0x055525f0); /**/
4007         alc5505_coef_set(codec, 0x61c0, 0x12230080); /* Clock control */
4008         alc5505_coef_set(codec, 0x61b4, 0x040e2b02); /* PLL2 control */
4009         alc5505_coef_set(codec, 0x61bc, 0x010234f8); /* OSC Control */
4010         alc5505_coef_set(codec, 0x880c, 0x00000004); /* DRAM Function control */
4011         alc5505_coef_set(codec, 0x880c, 0x00000003);
4012         alc5505_coef_set(codec, 0x880c, 0x00000010);
4013
4014 #ifdef HALT_REALTEK_ALC5505
4015         alc5505_dsp_halt(codec);
4016 #endif
4017 }
4018
4019 #ifdef HALT_REALTEK_ALC5505
4020 #define alc5505_dsp_suspend(codec)      do { } while (0) /* NOP */
4021 #define alc5505_dsp_resume(codec)       do { } while (0) /* NOP */
4022 #else
4023 #define alc5505_dsp_suspend(codec)      alc5505_dsp_halt(codec)
4024 #define alc5505_dsp_resume(codec)       alc5505_dsp_back_from_halt(codec)
4025 #endif
4026
4027 #ifdef CONFIG_PM
4028 static int alc269_suspend(struct hda_codec *codec)
4029 {
4030         struct alc_spec *spec = codec->spec;
4031
4032         if (spec->has_alc5505_dsp)
4033                 alc5505_dsp_suspend(codec);
4034
4035         return alc_suspend(codec);
4036 }
4037
4038 static int alc269_resume(struct hda_codec *codec)
4039 {
4040         struct alc_spec *spec = codec->spec;
4041
4042         if (spec->codec_variant == ALC269_TYPE_ALC269VB)
4043                 alc269vb_toggle_power_output(codec, 0);
4044         if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
4045                         (alc_get_coef0(codec) & 0x00ff) == 0x018) {
4046                 msleep(150);
4047         }
4048
4049         codec->patch_ops.init(codec);
4050
4051         if (spec->codec_variant == ALC269_TYPE_ALC269VB)
4052                 alc269vb_toggle_power_output(codec, 1);
4053         if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
4054                         (alc_get_coef0(codec) & 0x00ff) == 0x017) {
4055                 msleep(200);
4056         }
4057
4058         snd_hda_regmap_sync(codec);
4059         hda_call_check_power_status(codec, 0x01);
4060
4061         /* on some machine, the BIOS will clear the codec gpio data when enter
4062          * suspend, and won't restore the data after resume, so we restore it
4063          * in the driver.
4064          */
4065         if (spec->gpio_data)
4066                 alc_write_gpio_data(codec);
4067
4068         if (spec->has_alc5505_dsp)
4069                 alc5505_dsp_resume(codec);
4070
4071         return 0;
4072 }
4073 #endif /* CONFIG_PM */
4074
4075 static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,
4076                                                  const struct hda_fixup *fix, int action)
4077 {
4078         struct alc_spec *spec = codec->spec;
4079
4080         if (action == HDA_FIXUP_ACT_PRE_PROBE)
4081                 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
4082 }
4083
4084 static void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec,
4085                                                  const struct hda_fixup *fix,
4086                                                  int action)
4087 {
4088         unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21);
4089         unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19);
4090
4091         if (cfg_headphone && cfg_headset_mic == 0x411111f0)
4092                 snd_hda_codec_set_pincfg(codec, 0x19,
4093                         (cfg_headphone & ~AC_DEFCFG_DEVICE) |
4094                         (AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT));
4095 }
4096
4097 static void alc269_fixup_hweq(struct hda_codec *codec,
4098                                const struct hda_fixup *fix, int action)
4099 {
4100         if (action == HDA_FIXUP_ACT_INIT)
4101                 alc_update_coef_idx(codec, 0x1e, 0, 0x80);
4102 }
4103
4104 static void alc269_fixup_headset_mic(struct hda_codec *codec,
4105                                        const struct hda_fixup *fix, int action)
4106 {
4107         struct alc_spec *spec = codec->spec;
4108
4109         if (action == HDA_FIXUP_ACT_PRE_PROBE)
4110                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4111 }
4112
4113 static void alc271_fixup_dmic(struct hda_codec *codec,
4114                               const struct hda_fixup *fix, int action)
4115 {
4116         static const struct hda_verb verbs[] = {
4117                 {0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
4118                 {0x20, AC_VERB_SET_PROC_COEF, 0x4000},
4119                 {}
4120         };
4121         unsigned int cfg;
4122
4123         if (strcmp(codec->core.chip_name, "ALC271X") &&
4124             strcmp(codec->core.chip_name, "ALC269VB"))
4125                 return;
4126         cfg = snd_hda_codec_get_pincfg(codec, 0x12);
4127         if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
4128                 snd_hda_sequence_write(codec, verbs);
4129 }
4130
4131 /* Fix the speaker amp after resume, etc */
4132 static void alc269vb_fixup_aspire_e1_coef(struct hda_codec *codec,
4133                                           const struct hda_fixup *fix,
4134                                           int action)
4135 {
4136         if (action == HDA_FIXUP_ACT_INIT)
4137                 alc_update_coef_idx(codec, 0x0d, 0x6000, 0x6000);
4138 }
4139
4140 static void alc269_fixup_pcm_44k(struct hda_codec *codec,
4141                                  const struct hda_fixup *fix, int action)
4142 {
4143         struct alc_spec *spec = codec->spec;
4144
4145         if (action != HDA_FIXUP_ACT_PROBE)
4146                 return;
4147
4148         /* Due to a hardware problem on Lenovo Ideadpad, we need to
4149          * fix the sample rate of analog I/O to 44.1kHz
4150          */
4151         spec->gen.stream_analog_playback = &alc269_44k_pcm_analog_playback;
4152         spec->gen.stream_analog_capture = &alc269_44k_pcm_analog_capture;
4153 }
4154
4155 static void alc269_fixup_stereo_dmic(struct hda_codec *codec,
4156                                      const struct hda_fixup *fix, int action)
4157 {
4158         /* The digital-mic unit sends PDM (differential signal) instead of
4159          * the standard PCM, thus you can't record a valid mono stream as is.
4160          * Below is a workaround specific to ALC269 to control the dmic
4161          * signal source as mono.
4162          */
4163         if (action == HDA_FIXUP_ACT_INIT)
4164                 alc_update_coef_idx(codec, 0x07, 0, 0x80);
4165 }
4166
4167 static void alc269_quanta_automute(struct hda_codec *codec)
4168 {
4169         snd_hda_gen_update_outputs(codec);
4170
4171         alc_write_coef_idx(codec, 0x0c, 0x680);
4172         alc_write_coef_idx(codec, 0x0c, 0x480);
4173 }
4174
4175 static void alc269_fixup_quanta_mute(struct hda_codec *codec,
4176                                      const struct hda_fixup *fix, int action)
4177 {
4178         struct alc_spec *spec = codec->spec;
4179         if (action != HDA_FIXUP_ACT_PROBE)
4180                 return;
4181         spec->gen.automute_hook = alc269_quanta_automute;
4182 }
4183
4184 static void alc269_x101_hp_automute_hook(struct hda_codec *codec,
4185                                          struct hda_jack_callback *jack)
4186 {
4187         struct alc_spec *spec = codec->spec;
4188         int vref;
4189         msleep(200);
4190         snd_hda_gen_hp_automute(codec, jack);
4191
4192         vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
4193         msleep(100);
4194         snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4195                             vref);
4196         msleep(500);
4197         snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4198                             vref);
4199 }
4200
4201 /*
4202  * Magic sequence to make Huawei Matebook X right speaker working (bko#197801)
4203  */
4204 struct hda_alc298_mbxinit {
4205         unsigned char value_0x23;
4206         unsigned char value_0x25;
4207 };
4208
4209 static void alc298_huawei_mbx_stereo_seq(struct hda_codec *codec,
4210                                          const struct hda_alc298_mbxinit *initval,
4211                                          bool first)
4212 {
4213         snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x0);
4214         alc_write_coef_idx(codec, 0x26, 0xb000);
4215
4216         if (first)
4217                 snd_hda_codec_write(codec, 0x21, 0, AC_VERB_GET_PIN_SENSE, 0x0);
4218
4219         snd_hda_codec_write(codec, 0x6, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
4220         alc_write_coef_idx(codec, 0x26, 0xf000);
4221         alc_write_coef_idx(codec, 0x23, initval->value_0x23);
4222
4223         if (initval->value_0x23 != 0x1e)
4224                 alc_write_coef_idx(codec, 0x25, initval->value_0x25);
4225
4226         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
4227         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
4228 }
4229
4230 static void alc298_fixup_huawei_mbx_stereo(struct hda_codec *codec,
4231                                            const struct hda_fixup *fix,
4232                                            int action)
4233 {
4234         /* Initialization magic */
4235         static const struct hda_alc298_mbxinit dac_init[] = {
4236                 {0x0c, 0x00}, {0x0d, 0x00}, {0x0e, 0x00}, {0x0f, 0x00},
4237                 {0x10, 0x00}, {0x1a, 0x40}, {0x1b, 0x82}, {0x1c, 0x00},
4238                 {0x1d, 0x00}, {0x1e, 0x00}, {0x1f, 0x00},
4239                 {0x20, 0xc2}, {0x21, 0xc8}, {0x22, 0x26}, {0x23, 0x24},
4240                 {0x27, 0xff}, {0x28, 0xff}, {0x29, 0xff}, {0x2a, 0x8f},
4241                 {0x2b, 0x02}, {0x2c, 0x48}, {0x2d, 0x34}, {0x2e, 0x00},
4242                 {0x2f, 0x00},
4243                 {0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00},
4244                 {0x34, 0x00}, {0x35, 0x01}, {0x36, 0x93}, {0x37, 0x0c},
4245                 {0x38, 0x00}, {0x39, 0x00}, {0x3a, 0xf8}, {0x38, 0x80},
4246                 {}
4247         };
4248         const struct hda_alc298_mbxinit *seq;
4249
4250         if (action != HDA_FIXUP_ACT_INIT)
4251                 return;
4252
4253         /* Start */
4254         snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x00);
4255         snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
4256         alc_write_coef_idx(codec, 0x26, 0xf000);
4257         alc_write_coef_idx(codec, 0x22, 0x31);
4258         alc_write_coef_idx(codec, 0x23, 0x0b);
4259         alc_write_coef_idx(codec, 0x25, 0x00);
4260         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
4261         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
4262
4263         for (seq = dac_init; seq->value_0x23; seq++)
4264                 alc298_huawei_mbx_stereo_seq(codec, seq, seq == dac_init);
4265 }
4266
4267 static void alc269_fixup_x101_headset_mic(struct hda_codec *codec,
4268                                      const struct hda_fixup *fix, int action)
4269 {
4270         struct alc_spec *spec = codec->spec;
4271         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4272                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4273                 spec->gen.hp_automute_hook = alc269_x101_hp_automute_hook;
4274         }
4275 }
4276
4277 static void alc_update_vref_led(struct hda_codec *codec, hda_nid_t pin,
4278                                 bool polarity, bool on)
4279 {
4280         unsigned int pinval;
4281
4282         if (!pin)
4283                 return;
4284         if (polarity)
4285                 on = !on;
4286         pinval = snd_hda_codec_get_pin_target(codec, pin);
4287         pinval &= ~AC_PINCTL_VREFEN;
4288         pinval |= on ? AC_PINCTL_VREF_80 : AC_PINCTL_VREF_HIZ;
4289         /* temporarily power up/down for setting VREF */
4290         snd_hda_power_up_pm(codec);
4291         snd_hda_set_pin_ctl_cache(codec, pin, pinval);
4292         snd_hda_power_down_pm(codec);
4293 }
4294
4295 /* update mute-LED according to the speaker mute state via mic VREF pin */
4296 static int vref_mute_led_set(struct led_classdev *led_cdev,
4297                              enum led_brightness brightness)
4298 {
4299         struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4300         struct alc_spec *spec = codec->spec;
4301
4302         alc_update_vref_led(codec, spec->mute_led_nid,
4303                             spec->mute_led_polarity, brightness);
4304         return 0;
4305 }
4306
4307 /* Make sure the led works even in runtime suspend */
4308 static unsigned int led_power_filter(struct hda_codec *codec,
4309                                                   hda_nid_t nid,
4310                                                   unsigned int power_state)
4311 {
4312         struct alc_spec *spec = codec->spec;
4313
4314         if (power_state != AC_PWRST_D3 || nid == 0 ||
4315             (nid != spec->mute_led_nid && nid != spec->cap_mute_led_nid))
4316                 return power_state;
4317
4318         /* Set pin ctl again, it might have just been set to 0 */
4319         snd_hda_set_pin_ctl(codec, nid,
4320                             snd_hda_codec_get_pin_target(codec, nid));
4321
4322         return snd_hda_gen_path_power_filter(codec, nid, power_state);
4323 }
4324
4325 static void alc269_fixup_hp_mute_led(struct hda_codec *codec,
4326                                      const struct hda_fixup *fix, int action)
4327 {
4328         struct alc_spec *spec = codec->spec;
4329         const struct dmi_device *dev = NULL;
4330
4331         if (action != HDA_FIXUP_ACT_PRE_PROBE)
4332                 return;
4333
4334         while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
4335                 int pol, pin;
4336                 if (sscanf(dev->name, "HP_Mute_LED_%d_%x", &pol, &pin) != 2)
4337                         continue;
4338                 if (pin < 0x0a || pin >= 0x10)
4339                         break;
4340                 spec->mute_led_polarity = pol;
4341                 spec->mute_led_nid = pin - 0x0a + 0x18;
4342                 snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
4343                 codec->power_filter = led_power_filter;
4344                 codec_dbg(codec,
4345                           "Detected mute LED for %x:%d\n", spec->mute_led_nid,
4346                            spec->mute_led_polarity);
4347                 break;
4348         }
4349 }
4350
4351 static void alc269_fixup_hp_mute_led_micx(struct hda_codec *codec,
4352                                           const struct hda_fixup *fix,
4353                                           int action, hda_nid_t pin)
4354 {
4355         struct alc_spec *spec = codec->spec;
4356
4357         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4358                 spec->mute_led_polarity = 0;
4359                 spec->mute_led_nid = pin;
4360                 snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
4361                 codec->power_filter = led_power_filter;
4362         }
4363 }
4364
4365 static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec,
4366                                 const struct hda_fixup *fix, int action)
4367 {
4368         alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x18);
4369 }
4370
4371 static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,
4372                                 const struct hda_fixup *fix, int action)
4373 {
4374         alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x19);
4375 }
4376
4377 static void alc269_fixup_hp_mute_led_mic3(struct hda_codec *codec,
4378                                 const struct hda_fixup *fix, int action)
4379 {
4380         alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1b);
4381 }
4382
4383 /* update LED status via GPIO */
4384 static void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask,
4385                                 int polarity, bool enabled)
4386 {
4387         if (polarity)
4388                 enabled = !enabled;
4389         alc_update_gpio_data(codec, mask, !enabled); /* muted -> LED on */
4390 }
4391
4392 /* turn on/off mute LED via GPIO per vmaster hook */
4393 static int gpio_mute_led_set(struct led_classdev *led_cdev,
4394                              enum led_brightness brightness)
4395 {
4396         struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4397         struct alc_spec *spec = codec->spec;
4398
4399         alc_update_gpio_led(codec, spec->gpio_mute_led_mask,
4400                             spec->mute_led_polarity, !brightness);
4401         return 0;
4402 }
4403
4404 /* turn on/off mic-mute LED via GPIO per capture hook */
4405 static int micmute_led_set(struct led_classdev *led_cdev,
4406                            enum led_brightness brightness)
4407 {
4408         struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4409         struct alc_spec *spec = codec->spec;
4410
4411         alc_update_gpio_led(codec, spec->gpio_mic_led_mask,
4412                             spec->micmute_led_polarity, !brightness);
4413         return 0;
4414 }
4415
4416 /* setup mute and mic-mute GPIO bits, add hooks appropriately */
4417 static void alc_fixup_hp_gpio_led(struct hda_codec *codec,
4418                                   int action,
4419                                   unsigned int mute_mask,
4420                                   unsigned int micmute_mask)
4421 {
4422         struct alc_spec *spec = codec->spec;
4423
4424         alc_fixup_gpio(codec, action, mute_mask | micmute_mask);
4425
4426         if (action != HDA_FIXUP_ACT_PRE_PROBE)
4427                 return;
4428         if (mute_mask) {
4429                 spec->gpio_mute_led_mask = mute_mask;
4430                 snd_hda_gen_add_mute_led_cdev(codec, gpio_mute_led_set);
4431         }
4432         if (micmute_mask) {
4433                 spec->gpio_mic_led_mask = micmute_mask;
4434                 snd_hda_gen_add_micmute_led_cdev(codec, micmute_led_set);
4435         }
4436 }
4437
4438 static void alc236_fixup_hp_gpio_led(struct hda_codec *codec,
4439                                 const struct hda_fixup *fix, int action)
4440 {
4441         alc_fixup_hp_gpio_led(codec, action, 0x02, 0x01);
4442 }
4443
4444 static void alc269_fixup_hp_gpio_led(struct hda_codec *codec,
4445                                 const struct hda_fixup *fix, int action)
4446 {
4447         alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
4448 }
4449
4450 static void alc285_fixup_hp_gpio_led(struct hda_codec *codec,
4451                                 const struct hda_fixup *fix, int action)
4452 {
4453         alc_fixup_hp_gpio_led(codec, action, 0x04, 0x01);
4454 }
4455
4456 static void alc286_fixup_hp_gpio_led(struct hda_codec *codec,
4457                                 const struct hda_fixup *fix, int action)
4458 {
4459         alc_fixup_hp_gpio_led(codec, action, 0x02, 0x20);
4460 }
4461
4462 static void alc287_fixup_hp_gpio_led(struct hda_codec *codec,
4463                                 const struct hda_fixup *fix, int action)
4464 {
4465         alc_fixup_hp_gpio_led(codec, action, 0x10, 0);
4466 }
4467
4468 static void alc245_fixup_hp_gpio_led(struct hda_codec *codec,
4469                                 const struct hda_fixup *fix, int action)
4470 {
4471         struct alc_spec *spec = codec->spec;
4472
4473         if (action == HDA_FIXUP_ACT_PRE_PROBE)
4474                 spec->micmute_led_polarity = 1;
4475         alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4476 }
4477
4478 /* turn on/off mic-mute LED per capture hook via VREF change */
4479 static int vref_micmute_led_set(struct led_classdev *led_cdev,
4480                                 enum led_brightness brightness)
4481 {
4482         struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4483         struct alc_spec *spec = codec->spec;
4484
4485         alc_update_vref_led(codec, spec->cap_mute_led_nid,
4486                             spec->micmute_led_polarity, brightness);
4487         return 0;
4488 }
4489
4490 static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec,
4491                                 const struct hda_fixup *fix, int action)
4492 {
4493         struct alc_spec *spec = codec->spec;
4494
4495         alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
4496         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4497                 /* Like hp_gpio_mic1_led, but also needs GPIO4 low to
4498                  * enable headphone amp
4499                  */
4500                 spec->gpio_mask |= 0x10;
4501                 spec->gpio_dir |= 0x10;
4502                 spec->cap_mute_led_nid = 0x18;
4503                 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4504                 codec->power_filter = led_power_filter;
4505         }
4506 }
4507
4508 static void alc280_fixup_hp_gpio4(struct hda_codec *codec,
4509                                    const struct hda_fixup *fix, int action)
4510 {
4511         struct alc_spec *spec = codec->spec;
4512
4513         alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
4514         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4515                 spec->cap_mute_led_nid = 0x18;
4516                 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4517                 codec->power_filter = led_power_filter;
4518         }
4519 }
4520
4521 /* HP Spectre x360 14 model needs a unique workaround for enabling the amp;
4522  * it needs to toggle the GPIO0 once on and off at each time (bko#210633)
4523  */
4524 static void alc245_fixup_hp_x360_amp(struct hda_codec *codec,
4525                                      const struct hda_fixup *fix, int action)
4526 {
4527         struct alc_spec *spec = codec->spec;
4528
4529         switch (action) {
4530         case HDA_FIXUP_ACT_PRE_PROBE:
4531                 spec->gpio_mask |= 0x01;
4532                 spec->gpio_dir |= 0x01;
4533                 break;
4534         case HDA_FIXUP_ACT_INIT:
4535                 /* need to toggle GPIO to enable the amp */
4536                 alc_update_gpio_data(codec, 0x01, true);
4537                 msleep(100);
4538                 alc_update_gpio_data(codec, 0x01, false);
4539                 break;
4540         }
4541 }
4542
4543 /* toggle GPIO2 at each time stream is started; we use PREPARE state instead */
4544 static void alc274_hp_envy_pcm_hook(struct hda_pcm_stream *hinfo,
4545                                     struct hda_codec *codec,
4546                                     struct snd_pcm_substream *substream,
4547                                     int action)
4548 {
4549         switch (action) {
4550         case HDA_GEN_PCM_ACT_PREPARE:
4551                 alc_update_gpio_data(codec, 0x04, true);
4552                 break;
4553         case HDA_GEN_PCM_ACT_CLEANUP:
4554                 alc_update_gpio_data(codec, 0x04, false);
4555                 break;
4556         }
4557 }
4558
4559 static void alc274_fixup_hp_envy_gpio(struct hda_codec *codec,
4560                                       const struct hda_fixup *fix,
4561                                       int action)
4562 {
4563         struct alc_spec *spec = codec->spec;
4564
4565         if (action == HDA_FIXUP_ACT_PROBE) {
4566                 spec->gpio_mask |= 0x04;
4567                 spec->gpio_dir |= 0x04;
4568                 spec->gen.pcm_playback_hook = alc274_hp_envy_pcm_hook;
4569         }
4570 }
4571
4572 static void alc_update_coef_led(struct hda_codec *codec,
4573                                 struct alc_coef_led *led,
4574                                 bool polarity, bool on)
4575 {
4576         if (polarity)
4577                 on = !on;
4578         /* temporarily power up/down for setting COEF bit */
4579         alc_update_coef_idx(codec, led->idx, led->mask,
4580                             on ? led->on : led->off);
4581 }
4582
4583 /* update mute-LED according to the speaker mute state via COEF bit */
4584 static int coef_mute_led_set(struct led_classdev *led_cdev,
4585                              enum led_brightness brightness)
4586 {
4587         struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4588         struct alc_spec *spec = codec->spec;
4589
4590         alc_update_coef_led(codec, &spec->mute_led_coef,
4591                             spec->mute_led_polarity, brightness);
4592         return 0;
4593 }
4594
4595 static void alc285_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4596                                           const struct hda_fixup *fix,
4597                                           int action)
4598 {
4599         struct alc_spec *spec = codec->spec;
4600
4601         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4602                 spec->mute_led_polarity = 0;
4603                 spec->mute_led_coef.idx = 0x0b;
4604                 spec->mute_led_coef.mask = 1 << 3;
4605                 spec->mute_led_coef.on = 1 << 3;
4606                 spec->mute_led_coef.off = 0;
4607                 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4608         }
4609 }
4610
4611 static void alc236_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4612                                           const struct hda_fixup *fix,
4613                                           int action)
4614 {
4615         struct alc_spec *spec = codec->spec;
4616
4617         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4618                 spec->mute_led_polarity = 0;
4619                 spec->mute_led_coef.idx = 0x34;
4620                 spec->mute_led_coef.mask = 1 << 5;
4621                 spec->mute_led_coef.on = 0;
4622                 spec->mute_led_coef.off = 1 << 5;
4623                 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4624         }
4625 }
4626
4627 static void alc236_fixup_hp_mute_led_coefbit2(struct hda_codec *codec,
4628                                           const struct hda_fixup *fix, int action)
4629 {
4630         struct alc_spec *spec = codec->spec;
4631
4632         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4633                 spec->mute_led_polarity = 0;
4634                 spec->mute_led_coef.idx = 0x07;
4635                 spec->mute_led_coef.mask = 1;
4636                 spec->mute_led_coef.on = 1;
4637                 spec->mute_led_coef.off = 0;
4638                 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4639         }
4640 }
4641
4642 static void alc245_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4643                                           const struct hda_fixup *fix,
4644                                           int action)
4645 {
4646         struct alc_spec *spec = codec->spec;
4647
4648         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4649                 spec->mute_led_polarity = 0;
4650                 spec->mute_led_coef.idx = 0x0b;
4651                 spec->mute_led_coef.mask = 3 << 2;
4652                 spec->mute_led_coef.on = 2 << 2;
4653                 spec->mute_led_coef.off = 1 << 2;
4654                 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4655         }
4656 }
4657
4658 /* turn on/off mic-mute LED per capture hook by coef bit */
4659 static int coef_micmute_led_set(struct led_classdev *led_cdev,
4660                                 enum led_brightness brightness)
4661 {
4662         struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4663         struct alc_spec *spec = codec->spec;
4664
4665         alc_update_coef_led(codec, &spec->mic_led_coef,
4666                             spec->micmute_led_polarity, brightness);
4667         return 0;
4668 }
4669
4670 static void alc285_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4671                                 const struct hda_fixup *fix, int action)
4672 {
4673         struct alc_spec *spec = codec->spec;
4674
4675         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4676                 spec->mic_led_coef.idx = 0x19;
4677                 spec->mic_led_coef.mask = 1 << 13;
4678                 spec->mic_led_coef.on = 1 << 13;
4679                 spec->mic_led_coef.off = 0;
4680                 snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
4681         }
4682 }
4683
4684 static void alc285_fixup_hp_gpio_micmute_led(struct hda_codec *codec,
4685                                 const struct hda_fixup *fix, int action)
4686 {
4687         struct alc_spec *spec = codec->spec;
4688
4689         if (action == HDA_FIXUP_ACT_PRE_PROBE)
4690                 spec->micmute_led_polarity = 1;
4691         alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4692 }
4693
4694 static void alc236_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4695                                 const struct hda_fixup *fix, int action)
4696 {
4697         struct alc_spec *spec = codec->spec;
4698
4699         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4700                 spec->mic_led_coef.idx = 0x35;
4701                 spec->mic_led_coef.mask = 3 << 2;
4702                 spec->mic_led_coef.on = 2 << 2;
4703                 spec->mic_led_coef.off = 1 << 2;
4704                 snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
4705         }
4706 }
4707
4708 static void alc285_fixup_hp_mute_led(struct hda_codec *codec,
4709                                 const struct hda_fixup *fix, int action)
4710 {
4711         alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
4712         alc285_fixup_hp_coef_micmute_led(codec, fix, action);
4713 }
4714
4715 static void alc285_fixup_hp_spectre_x360_mute_led(struct hda_codec *codec,
4716                                 const struct hda_fixup *fix, int action)
4717 {
4718         alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
4719         alc285_fixup_hp_gpio_micmute_led(codec, fix, action);
4720 }
4721
4722 static void alc236_fixup_hp_mute_led(struct hda_codec *codec,
4723                                 const struct hda_fixup *fix, int action)
4724 {
4725         alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
4726         alc236_fixup_hp_coef_micmute_led(codec, fix, action);
4727 }
4728
4729 static void alc236_fixup_hp_micmute_led_vref(struct hda_codec *codec,
4730                                 const struct hda_fixup *fix, int action)
4731 {
4732         struct alc_spec *spec = codec->spec;
4733
4734         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4735                 spec->cap_mute_led_nid = 0x1a;
4736                 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4737                 codec->power_filter = led_power_filter;
4738         }
4739 }
4740
4741 static void alc236_fixup_hp_mute_led_micmute_vref(struct hda_codec *codec,
4742                                 const struct hda_fixup *fix, int action)
4743 {
4744         alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
4745         alc236_fixup_hp_micmute_led_vref(codec, fix, action);
4746 }
4747
4748 static inline void alc298_samsung_write_coef_pack(struct hda_codec *codec,
4749                                                   const unsigned short coefs[2])
4750 {
4751         alc_write_coef_idx(codec, 0x23, coefs[0]);
4752         alc_write_coef_idx(codec, 0x25, coefs[1]);
4753         alc_write_coef_idx(codec, 0x26, 0xb011);
4754 }
4755
4756 struct alc298_samsung_amp_desc {
4757         unsigned char nid;
4758         unsigned short init_seq[2][2];
4759 };
4760
4761 static void alc298_fixup_samsung_amp(struct hda_codec *codec,
4762                                      const struct hda_fixup *fix, int action)
4763 {
4764         int i, j;
4765         static const unsigned short init_seq[][2] = {
4766                 { 0x19, 0x00 }, { 0x20, 0xc0 }, { 0x22, 0x44 }, { 0x23, 0x08 },
4767                 { 0x24, 0x85 }, { 0x25, 0x41 }, { 0x35, 0x40 }, { 0x36, 0x01 },
4768                 { 0x38, 0x81 }, { 0x3a, 0x03 }, { 0x3b, 0x81 }, { 0x40, 0x3e },
4769                 { 0x41, 0x07 }, { 0x400, 0x1 }
4770         };
4771         static const struct alc298_samsung_amp_desc amps[] = {
4772                 { 0x3a, { { 0x18, 0x1 }, { 0x26, 0x0 } } },
4773                 { 0x39, { { 0x18, 0x2 }, { 0x26, 0x1 } } }
4774         };
4775
4776         if (action != HDA_FIXUP_ACT_INIT)
4777                 return;
4778
4779         for (i = 0; i < ARRAY_SIZE(amps); i++) {
4780                 alc_write_coef_idx(codec, 0x22, amps[i].nid);
4781
4782                 for (j = 0; j < ARRAY_SIZE(amps[i].init_seq); j++)
4783                         alc298_samsung_write_coef_pack(codec, amps[i].init_seq[j]);
4784
4785                 for (j = 0; j < ARRAY_SIZE(init_seq); j++)
4786                         alc298_samsung_write_coef_pack(codec, init_seq[j]);
4787         }
4788 }
4789
4790 #if IS_REACHABLE(CONFIG_INPUT)
4791 static void gpio2_mic_hotkey_event(struct hda_codec *codec,
4792                                    struct hda_jack_callback *event)
4793 {
4794         struct alc_spec *spec = codec->spec;
4795
4796         /* GPIO2 just toggles on a keypress/keyrelease cycle. Therefore
4797            send both key on and key off event for every interrupt. */
4798         input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1);
4799         input_sync(spec->kb_dev);
4800         input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0);
4801         input_sync(spec->kb_dev);
4802 }
4803
4804 static int alc_register_micmute_input_device(struct hda_codec *codec)
4805 {
4806         struct alc_spec *spec = codec->spec;
4807         int i;
4808
4809         spec->kb_dev = input_allocate_device();
4810         if (!spec->kb_dev) {
4811                 codec_err(codec, "Out of memory (input_allocate_device)\n");
4812                 return -ENOMEM;
4813         }
4814
4815         spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE;
4816
4817         spec->kb_dev->name = "Microphone Mute Button";
4818         spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);
4819         spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]);
4820         spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map);
4821         spec->kb_dev->keycode = spec->alc_mute_keycode_map;
4822         for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++)
4823                 set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit);
4824
4825         if (input_register_device(spec->kb_dev)) {
4826                 codec_err(codec, "input_register_device failed\n");
4827                 input_free_device(spec->kb_dev);
4828                 spec->kb_dev = NULL;
4829                 return -ENOMEM;
4830         }
4831
4832         return 0;
4833 }
4834
4835 /* GPIO1 = set according to SKU external amp
4836  * GPIO2 = mic mute hotkey
4837  * GPIO3 = mute LED
4838  * GPIO4 = mic mute LED
4839  */
4840 static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
4841                                              const struct hda_fixup *fix, int action)
4842 {
4843         struct alc_spec *spec = codec->spec;
4844
4845         alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
4846         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4847                 spec->init_amp = ALC_INIT_DEFAULT;
4848                 if (alc_register_micmute_input_device(codec) != 0)
4849                         return;
4850
4851                 spec->gpio_mask |= 0x06;
4852                 spec->gpio_dir |= 0x02;
4853                 spec->gpio_data |= 0x02;
4854                 snd_hda_codec_write_cache(codec, codec->core.afg, 0,
4855                                           AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x04);
4856                 snd_hda_jack_detect_enable_callback(codec, codec->core.afg,
4857                                                     gpio2_mic_hotkey_event);
4858                 return;
4859         }
4860
4861         if (!spec->kb_dev)
4862                 return;
4863
4864         switch (action) {
4865         case HDA_FIXUP_ACT_FREE:
4866                 input_unregister_device(spec->kb_dev);
4867                 spec->kb_dev = NULL;
4868         }
4869 }
4870
4871 /* Line2 = mic mute hotkey
4872  * GPIO2 = mic mute LED
4873  */
4874 static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,
4875                                              const struct hda_fixup *fix, int action)
4876 {
4877         struct alc_spec *spec = codec->spec;
4878
4879         alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4880         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4881                 spec->init_amp = ALC_INIT_DEFAULT;
4882                 if (alc_register_micmute_input_device(codec) != 0)
4883                         return;
4884
4885                 snd_hda_jack_detect_enable_callback(codec, 0x1b,
4886                                                     gpio2_mic_hotkey_event);
4887                 return;
4888         }
4889
4890         if (!spec->kb_dev)
4891                 return;
4892
4893         switch (action) {
4894         case HDA_FIXUP_ACT_FREE:
4895                 input_unregister_device(spec->kb_dev);
4896                 spec->kb_dev = NULL;
4897         }
4898 }
4899 #else /* INPUT */
4900 #define alc280_fixup_hp_gpio2_mic_hotkey        NULL
4901 #define alc233_fixup_lenovo_line2_mic_hotkey    NULL
4902 #endif /* INPUT */
4903
4904 static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,
4905                                 const struct hda_fixup *fix, int action)
4906 {
4907         struct alc_spec *spec = codec->spec;
4908
4909         alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1a);
4910         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4911                 spec->cap_mute_led_nid = 0x18;
4912                 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4913         }
4914 }
4915
4916 static const struct coef_fw alc225_pre_hsmode[] = {
4917         UPDATE_COEF(0x4a, 1<<8, 0),
4918         UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
4919         UPDATE_COEF(0x63, 3<<14, 3<<14),
4920         UPDATE_COEF(0x4a, 3<<4, 2<<4),
4921         UPDATE_COEF(0x4a, 3<<10, 3<<10),
4922         UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10),
4923         UPDATE_COEF(0x4a, 3<<10, 0),
4924         {}
4925 };
4926
4927 static void alc_headset_mode_unplugged(struct hda_codec *codec)
4928 {
4929         struct alc_spec *spec = codec->spec;
4930         static const struct coef_fw coef0255[] = {
4931                 WRITE_COEF(0x1b, 0x0c0b), /* LDO and MISC control */
4932                 WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4933                 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4934                 WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4935                 WRITE_COEFEX(0x57, 0x03, 0x8aa6), /* Direct Drive HP Amp control */
4936                 {}
4937         };
4938         static const struct coef_fw coef0256[] = {
4939                 WRITE_COEF(0x1b, 0x0c4b), /* LDO and MISC control */
4940                 WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4941                 WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4942                 WRITE_COEFEX(0x57, 0x03, 0x09a3), /* Direct Drive HP Amp control */
4943                 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4944                 {}
4945         };
4946         static const struct coef_fw coef0233[] = {
4947                 WRITE_COEF(0x1b, 0x0c0b),
4948                 WRITE_COEF(0x45, 0xc429),
4949                 UPDATE_COEF(0x35, 0x4000, 0),
4950                 WRITE_COEF(0x06, 0x2104),
4951                 WRITE_COEF(0x1a, 0x0001),
4952                 WRITE_COEF(0x26, 0x0004),
4953                 WRITE_COEF(0x32, 0x42a3),
4954                 {}
4955         };
4956         static const struct coef_fw coef0288[] = {
4957                 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
4958                 UPDATE_COEF(0x50, 0x2000, 0x2000),
4959                 UPDATE_COEF(0x56, 0x0006, 0x0006),
4960                 UPDATE_COEF(0x66, 0x0008, 0),
4961                 UPDATE_COEF(0x67, 0x2000, 0),
4962                 {}
4963         };
4964         static const struct coef_fw coef0298[] = {
4965                 UPDATE_COEF(0x19, 0x1300, 0x0300),
4966                 {}
4967         };
4968         static const struct coef_fw coef0292[] = {
4969                 WRITE_COEF(0x76, 0x000e),
4970                 WRITE_COEF(0x6c, 0x2400),
4971                 WRITE_COEF(0x18, 0x7308),
4972                 WRITE_COEF(0x6b, 0xc429),
4973                 {}
4974         };
4975         static const struct coef_fw coef0293[] = {
4976                 UPDATE_COEF(0x10, 7<<8, 6<<8), /* SET Line1 JD to 0 */
4977                 UPDATE_COEFEX(0x57, 0x05, 1<<15|1<<13, 0x0), /* SET charge pump by verb */
4978                 UPDATE_COEFEX(0x57, 0x03, 1<<10, 1<<10), /* SET EN_OSW to 1 */
4979                 UPDATE_COEF(0x1a, 1<<3, 1<<3), /* Combo JD gating with LINE1-VREFO */
4980                 WRITE_COEF(0x45, 0xc429), /* Set to TRS type */
4981                 UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
4982                 {}
4983         };
4984         static const struct coef_fw coef0668[] = {
4985                 WRITE_COEF(0x15, 0x0d40),
4986                 WRITE_COEF(0xb7, 0x802b),
4987                 {}
4988         };
4989         static const struct coef_fw coef0225[] = {
4990                 UPDATE_COEF(0x63, 3<<14, 0),
4991                 {}
4992         };
4993         static const struct coef_fw coef0274[] = {
4994                 UPDATE_COEF(0x4a, 0x0100, 0),
4995                 UPDATE_COEFEX(0x57, 0x05, 0x4000, 0),
4996                 UPDATE_COEF(0x6b, 0xf000, 0x5000),
4997                 UPDATE_COEF(0x4a, 0x0010, 0),
4998                 UPDATE_COEF(0x4a, 0x0c00, 0x0c00),
4999                 WRITE_COEF(0x45, 0x5289),
5000                 UPDATE_COEF(0x4a, 0x0c00, 0),
5001                 {}
5002         };
5003
5004         if (spec->no_internal_mic_pin) {
5005                 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
5006                 return;
5007         }
5008
5009         switch (codec->core.vendor_id) {
5010         case 0x10ec0255:
5011                 alc_process_coef_fw(codec, coef0255);
5012                 break;
5013         case 0x10ec0230:
5014         case 0x10ec0236:
5015         case 0x10ec0256:
5016         case 0x19e58326:
5017                 alc_process_coef_fw(codec, coef0256);
5018                 break;
5019         case 0x10ec0234:
5020         case 0x10ec0274:
5021         case 0x10ec0294:
5022                 alc_process_coef_fw(codec, coef0274);
5023                 break;
5024         case 0x10ec0233:
5025         case 0x10ec0283:
5026                 alc_process_coef_fw(codec, coef0233);
5027                 break;
5028         case 0x10ec0286:
5029         case 0x10ec0288:
5030                 alc_process_coef_fw(codec, coef0288);
5031                 break;
5032         case 0x10ec0298:
5033                 alc_process_coef_fw(codec, coef0298);
5034                 alc_process_coef_fw(codec, coef0288);
5035                 break;
5036         case 0x10ec0292:
5037                 alc_process_coef_fw(codec, coef0292);
5038                 break;
5039         case 0x10ec0293:
5040                 alc_process_coef_fw(codec, coef0293);
5041                 break;
5042         case 0x10ec0668:
5043                 alc_process_coef_fw(codec, coef0668);
5044                 break;
5045         case 0x10ec0215:
5046         case 0x10ec0225:
5047         case 0x10ec0285:
5048         case 0x10ec0295:
5049         case 0x10ec0289:
5050         case 0x10ec0299:
5051                 alc_process_coef_fw(codec, alc225_pre_hsmode);
5052                 alc_process_coef_fw(codec, coef0225);
5053                 break;
5054         case 0x10ec0867:
5055                 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5056                 break;
5057         }
5058         codec_dbg(codec, "Headset jack set to unplugged mode.\n");
5059 }
5060
5061
5062 static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
5063                                     hda_nid_t mic_pin)
5064 {
5065         static const struct coef_fw coef0255[] = {
5066                 WRITE_COEFEX(0x57, 0x03, 0x8aa6),
5067                 WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
5068                 {}
5069         };
5070         static const struct coef_fw coef0256[] = {
5071                 UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14), /* Direct Drive HP Amp control(Set to verb control)*/
5072                 WRITE_COEFEX(0x57, 0x03, 0x09a3),
5073                 WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
5074                 {}
5075         };
5076         static const struct coef_fw coef0233[] = {
5077                 UPDATE_COEF(0x35, 0, 1<<14),
5078                 WRITE_COEF(0x06, 0x2100),
5079                 WRITE_COEF(0x1a, 0x0021),
5080                 WRITE_COEF(0x26, 0x008c),
5081                 {}
5082         };
5083         static const struct coef_fw coef0288[] = {
5084                 UPDATE_COEF(0x4f, 0x00c0, 0),
5085                 UPDATE_COEF(0x50, 0x2000, 0),
5086                 UPDATE_COEF(0x56, 0x0006, 0),
5087                 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
5088                 UPDATE_COEF(0x66, 0x0008, 0x0008),
5089                 UPDATE_COEF(0x67, 0x2000, 0x2000),
5090                 {}
5091         };
5092         static const struct coef_fw coef0292[] = {
5093                 WRITE_COEF(0x19, 0xa208),
5094                 WRITE_COEF(0x2e, 0xacf0),
5095                 {}
5096         };
5097         static const struct coef_fw coef0293[] = {
5098                 UPDATE_COEFEX(0x57, 0x05, 0, 1<<15|1<<13), /* SET charge pump by verb */
5099                 UPDATE_COEFEX(0x57, 0x03, 1<<10, 0), /* SET EN_OSW to 0 */
5100                 UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
5101                 {}
5102         };
5103         static const struct coef_fw coef0688[] = {
5104                 WRITE_COEF(0xb7, 0x802b),
5105                 WRITE_COEF(0xb5, 0x1040),
5106                 UPDATE_COEF(0xc3, 0, 1<<12),
5107                 {}
5108         };
5109         static const struct coef_fw coef0225[] = {
5110                 UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14),
5111                 UPDATE_COEF(0x4a, 3<<4, 2<<4),
5112                 UPDATE_COEF(0x63, 3<<14, 0),
5113                 {}
5114         };
5115         static const struct coef_fw coef0274[] = {
5116                 UPDATE_COEFEX(0x57, 0x05, 0x4000, 0x4000),
5117                 UPDATE_COEF(0x4a, 0x0010, 0),
5118                 UPDATE_COEF(0x6b, 0xf000, 0),
5119                 {}
5120         };
5121
5122         switch (codec->core.vendor_id) {
5123         case 0x10ec0255:
5124                 alc_write_coef_idx(codec, 0x45, 0xc489);
5125                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5126                 alc_process_coef_fw(codec, coef0255);
5127                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5128                 break;
5129         case 0x10ec0230:
5130         case 0x10ec0236:
5131         case 0x10ec0256:
5132         case 0x19e58326:
5133                 alc_write_coef_idx(codec, 0x45, 0xc489);
5134                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5135                 alc_process_coef_fw(codec, coef0256);
5136                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5137                 break;
5138         case 0x10ec0234:
5139         case 0x10ec0274:
5140         case 0x10ec0294:
5141                 alc_write_coef_idx(codec, 0x45, 0x4689);
5142                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5143                 alc_process_coef_fw(codec, coef0274);
5144                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5145                 break;
5146         case 0x10ec0233:
5147         case 0x10ec0283:
5148                 alc_write_coef_idx(codec, 0x45, 0xc429);
5149                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5150                 alc_process_coef_fw(codec, coef0233);
5151                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5152                 break;
5153         case 0x10ec0286:
5154         case 0x10ec0288:
5155         case 0x10ec0298:
5156                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5157                 alc_process_coef_fw(codec, coef0288);
5158                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5159                 break;
5160         case 0x10ec0292:
5161                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5162                 alc_process_coef_fw(codec, coef0292);
5163                 break;
5164         case 0x10ec0293:
5165                 /* Set to TRS mode */
5166                 alc_write_coef_idx(codec, 0x45, 0xc429);
5167                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5168                 alc_process_coef_fw(codec, coef0293);
5169                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5170                 break;
5171         case 0x10ec0867:
5172                 alc_update_coefex_idx(codec, 0x57, 0x5, 0, 1<<14);
5173                 fallthrough;
5174         case 0x10ec0221:
5175         case 0x10ec0662:
5176                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5177                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5178                 break;
5179         case 0x10ec0668:
5180                 alc_write_coef_idx(codec, 0x11, 0x0001);
5181                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5182                 alc_process_coef_fw(codec, coef0688);
5183                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5184                 break;
5185         case 0x10ec0215:
5186         case 0x10ec0225:
5187         case 0x10ec0285:
5188         case 0x10ec0295:
5189         case 0x10ec0289:
5190         case 0x10ec0299:
5191                 alc_process_coef_fw(codec, alc225_pre_hsmode);
5192                 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x31<<10);
5193                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5194                 alc_process_coef_fw(codec, coef0225);
5195                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5196                 break;
5197         }
5198         codec_dbg(codec, "Headset jack set to mic-in mode.\n");
5199 }
5200
5201 static void alc_headset_mode_default(struct hda_codec *codec)
5202 {
5203         static const struct coef_fw coef0225[] = {
5204                 UPDATE_COEF(0x45, 0x3f<<10, 0x30<<10),
5205                 UPDATE_COEF(0x45, 0x3f<<10, 0x31<<10),
5206                 UPDATE_COEF(0x49, 3<<8, 0<<8),
5207                 UPDATE_COEF(0x4a, 3<<4, 3<<4),
5208                 UPDATE_COEF(0x63, 3<<14, 0),
5209                 UPDATE_COEF(0x67, 0xf000, 0x3000),
5210                 {}
5211         };
5212         static const struct coef_fw coef0255[] = {
5213                 WRITE_COEF(0x45, 0xc089),
5214                 WRITE_COEF(0x45, 0xc489),
5215                 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5216                 WRITE_COEF(0x49, 0x0049),
5217                 {}
5218         };
5219         static const struct coef_fw coef0256[] = {
5220                 WRITE_COEF(0x45, 0xc489),
5221                 WRITE_COEFEX(0x57, 0x03, 0x0da3),
5222                 WRITE_COEF(0x49, 0x0049),
5223                 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
5224                 WRITE_COEF(0x06, 0x6100),
5225                 {}
5226         };
5227         static const struct coef_fw coef0233[] = {
5228                 WRITE_COEF(0x06, 0x2100),
5229                 WRITE_COEF(0x32, 0x4ea3),
5230                 {}
5231         };
5232         static const struct coef_fw coef0288[] = {
5233                 UPDATE_COEF(0x4f, 0xfcc0, 0xc400), /* Set to TRS type */
5234                 UPDATE_COEF(0x50, 0x2000, 0x2000),
5235                 UPDATE_COEF(0x56, 0x0006, 0x0006),
5236                 UPDATE_COEF(0x66, 0x0008, 0),
5237                 UPDATE_COEF(0x67, 0x2000, 0),
5238                 {}
5239         };
5240         static const struct coef_fw coef0292[] = {
5241                 WRITE_COEF(0x76, 0x000e),
5242                 WRITE_COEF(0x6c, 0x2400),
5243                 WRITE_COEF(0x6b, 0xc429),
5244                 WRITE_COEF(0x18, 0x7308),
5245                 {}
5246         };
5247         static const struct coef_fw coef0293[] = {
5248                 UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
5249                 WRITE_COEF(0x45, 0xC429), /* Set to TRS type */
5250                 UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
5251                 {}
5252         };
5253         static const struct coef_fw coef0688[] = {
5254                 WRITE_COEF(0x11, 0x0041),
5255                 WRITE_COEF(0x15, 0x0d40),
5256                 WRITE_COEF(0xb7, 0x802b),
5257                 {}
5258         };
5259         static const struct coef_fw coef0274[] = {
5260                 WRITE_COEF(0x45, 0x4289),
5261                 UPDATE_COEF(0x4a, 0x0010, 0x0010),
5262                 UPDATE_COEF(0x6b, 0x0f00, 0),
5263                 UPDATE_COEF(0x49, 0x0300, 0x0300),
5264                 {}
5265         };
5266
5267         switch (codec->core.vendor_id) {
5268         case 0x10ec0215:
5269         case 0x10ec0225:
5270         case 0x10ec0285:
5271         case 0x10ec0295:
5272         case 0x10ec0289:
5273         case 0x10ec0299:
5274                 alc_process_coef_fw(codec, alc225_pre_hsmode);
5275                 alc_process_coef_fw(codec, coef0225);
5276                 break;
5277         case 0x10ec0255:
5278                 alc_process_coef_fw(codec, coef0255);
5279                 break;
5280         case 0x10ec0230:
5281         case 0x10ec0236:
5282         case 0x10ec0256:
5283         case 0x19e58326:
5284                 alc_write_coef_idx(codec, 0x1b, 0x0e4b);
5285                 alc_write_coef_idx(codec, 0x45, 0xc089);
5286                 msleep(50);
5287                 alc_process_coef_fw(codec, coef0256);
5288                 break;
5289         case 0x10ec0234:
5290         case 0x10ec0274:
5291         case 0x10ec0294:
5292                 alc_process_coef_fw(codec, coef0274);
5293                 break;
5294         case 0x10ec0233:
5295         case 0x10ec0283:
5296                 alc_process_coef_fw(codec, coef0233);
5297                 break;
5298         case 0x10ec0286:
5299         case 0x10ec0288:
5300         case 0x10ec0298:
5301                 alc_process_coef_fw(codec, coef0288);
5302                 break;
5303         case 0x10ec0292:
5304                 alc_process_coef_fw(codec, coef0292);
5305                 break;
5306         case 0x10ec0293:
5307                 alc_process_coef_fw(codec, coef0293);
5308                 break;
5309         case 0x10ec0668:
5310                 alc_process_coef_fw(codec, coef0688);
5311                 break;
5312         case 0x10ec0867:
5313                 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5314                 break;
5315         }
5316         codec_dbg(codec, "Headset jack set to headphone (default) mode.\n");
5317 }
5318
5319 /* Iphone type */
5320 static void alc_headset_mode_ctia(struct hda_codec *codec)
5321 {
5322         int val;
5323
5324         static const struct coef_fw coef0255[] = {
5325                 WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
5326                 WRITE_COEF(0x1b, 0x0c2b),
5327                 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5328                 {}
5329         };
5330         static const struct coef_fw coef0256[] = {
5331                 WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
5332                 WRITE_COEF(0x1b, 0x0e6b),
5333                 {}
5334         };
5335         static const struct coef_fw coef0233[] = {
5336                 WRITE_COEF(0x45, 0xd429),
5337                 WRITE_COEF(0x1b, 0x0c2b),
5338                 WRITE_COEF(0x32, 0x4ea3),
5339                 {}
5340         };
5341         static const struct coef_fw coef0288[] = {
5342                 UPDATE_COEF(0x50, 0x2000, 0x2000),
5343                 UPDATE_COEF(0x56, 0x0006, 0x0006),
5344                 UPDATE_COEF(0x66, 0x0008, 0),
5345                 UPDATE_COEF(0x67, 0x2000, 0),
5346                 {}
5347         };
5348         static const struct coef_fw coef0292[] = {
5349                 WRITE_COEF(0x6b, 0xd429),
5350                 WRITE_COEF(0x76, 0x0008),
5351                 WRITE_COEF(0x18, 0x7388),
5352                 {}
5353         };
5354         static const struct coef_fw coef0293[] = {
5355                 WRITE_COEF(0x45, 0xd429), /* Set to ctia type */
5356                 UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
5357                 {}
5358         };
5359         static const struct coef_fw coef0688[] = {
5360                 WRITE_COEF(0x11, 0x0001),
5361                 WRITE_COEF(0x15, 0x0d60),
5362                 WRITE_COEF(0xc3, 0x0000),
5363                 {}
5364         };
5365         static const struct coef_fw coef0225_1[] = {
5366                 UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
5367                 UPDATE_COEF(0x63, 3<<14, 2<<14),
5368                 {}
5369         };
5370         static const struct coef_fw coef0225_2[] = {
5371                 UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
5372                 UPDATE_COEF(0x63, 3<<14, 1<<14),
5373                 {}
5374         };
5375
5376         switch (codec->core.vendor_id) {
5377         case 0x10ec0255:
5378                 alc_process_coef_fw(codec, coef0255);
5379                 break;
5380         case 0x10ec0230:
5381         case 0x10ec0236:
5382         case 0x10ec0256:
5383         case 0x19e58326:
5384                 alc_process_coef_fw(codec, coef0256);
5385                 break;
5386         case 0x10ec0234:
5387         case 0x10ec0274:
5388         case 0x10ec0294:
5389                 alc_write_coef_idx(codec, 0x45, 0xd689);
5390                 break;
5391         case 0x10ec0233:
5392         case 0x10ec0283:
5393                 alc_process_coef_fw(codec, coef0233);
5394                 break;
5395         case 0x10ec0298:
5396                 val = alc_read_coef_idx(codec, 0x50);
5397                 if (val & (1 << 12)) {
5398                         alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
5399                         alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5400                         msleep(300);
5401                 } else {
5402                         alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5403                         alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5404                         msleep(300);
5405                 }
5406                 break;
5407         case 0x10ec0286:
5408         case 0x10ec0288:
5409                 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5410                 msleep(300);
5411                 alc_process_coef_fw(codec, coef0288);
5412                 break;
5413         case 0x10ec0292:
5414                 alc_process_coef_fw(codec, coef0292);
5415                 break;
5416         case 0x10ec0293:
5417                 alc_process_coef_fw(codec, coef0293);
5418                 break;
5419         case 0x10ec0668:
5420                 alc_process_coef_fw(codec, coef0688);
5421                 break;
5422         case 0x10ec0215:
5423         case 0x10ec0225:
5424         case 0x10ec0285:
5425         case 0x10ec0295:
5426         case 0x10ec0289:
5427         case 0x10ec0299:
5428                 val = alc_read_coef_idx(codec, 0x45);
5429                 if (val & (1 << 9))
5430                         alc_process_coef_fw(codec, coef0225_2);
5431                 else
5432                         alc_process_coef_fw(codec, coef0225_1);
5433                 break;
5434         case 0x10ec0867:
5435                 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5436                 break;
5437         }
5438         codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n");
5439 }
5440
5441 /* Nokia type */
5442 static void alc_headset_mode_omtp(struct hda_codec *codec)
5443 {
5444         static const struct coef_fw coef0255[] = {
5445                 WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
5446                 WRITE_COEF(0x1b, 0x0c2b),
5447                 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5448                 {}
5449         };
5450         static const struct coef_fw coef0256[] = {
5451                 WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
5452                 WRITE_COEF(0x1b, 0x0e6b),
5453                 {}
5454         };
5455         static const struct coef_fw coef0233[] = {
5456                 WRITE_COEF(0x45, 0xe429),
5457                 WRITE_COEF(0x1b, 0x0c2b),
5458                 WRITE_COEF(0x32, 0x4ea3),
5459                 {}
5460         };
5461         static const struct coef_fw coef0288[] = {
5462                 UPDATE_COEF(0x50, 0x2000, 0x2000),
5463                 UPDATE_COEF(0x56, 0x0006, 0x0006),
5464                 UPDATE_COEF(0x66, 0x0008, 0),
5465                 UPDATE_COEF(0x67, 0x2000, 0),
5466                 {}
5467         };
5468         static const struct coef_fw coef0292[] = {
5469                 WRITE_COEF(0x6b, 0xe429),
5470                 WRITE_COEF(0x76, 0x0008),
5471                 WRITE_COEF(0x18, 0x7388),
5472                 {}
5473         };
5474         static const struct coef_fw coef0293[] = {
5475                 WRITE_COEF(0x45, 0xe429), /* Set to omtp type */
5476                 UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
5477                 {}
5478         };
5479         static const struct coef_fw coef0688[] = {
5480                 WRITE_COEF(0x11, 0x0001),
5481                 WRITE_COEF(0x15, 0x0d50),
5482                 WRITE_COEF(0xc3, 0x0000),
5483                 {}
5484         };
5485         static const struct coef_fw coef0225[] = {
5486                 UPDATE_COEF(0x45, 0x3f<<10, 0x39<<10),
5487                 UPDATE_COEF(0x63, 3<<14, 2<<14),
5488                 {}
5489         };
5490
5491         switch (codec->core.vendor_id) {
5492         case 0x10ec0255:
5493                 alc_process_coef_fw(codec, coef0255);
5494                 break;
5495         case 0x10ec0230:
5496         case 0x10ec0236:
5497         case 0x10ec0256:
5498         case 0x19e58326:
5499                 alc_process_coef_fw(codec, coef0256);
5500                 break;
5501         case 0x10ec0234:
5502         case 0x10ec0274:
5503         case 0x10ec0294:
5504                 alc_write_coef_idx(codec, 0x45, 0xe689);
5505                 break;
5506         case 0x10ec0233:
5507         case 0x10ec0283:
5508                 alc_process_coef_fw(codec, coef0233);
5509                 break;
5510         case 0x10ec0298:
5511                 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);/* Headset output enable */
5512                 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5513                 msleep(300);
5514                 break;
5515         case 0x10ec0286:
5516         case 0x10ec0288:
5517                 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5518                 msleep(300);
5519                 alc_process_coef_fw(codec, coef0288);
5520                 break;
5521         case 0x10ec0292:
5522                 alc_process_coef_fw(codec, coef0292);
5523                 break;
5524         case 0x10ec0293:
5525                 alc_process_coef_fw(codec, coef0293);
5526                 break;
5527         case 0x10ec0668:
5528                 alc_process_coef_fw(codec, coef0688);
5529                 break;
5530         case 0x10ec0215:
5531         case 0x10ec0225:
5532         case 0x10ec0285:
5533         case 0x10ec0295:
5534         case 0x10ec0289:
5535         case 0x10ec0299:
5536                 alc_process_coef_fw(codec, coef0225);
5537                 break;
5538         }
5539         codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n");
5540 }
5541
5542 static void alc_determine_headset_type(struct hda_codec *codec)
5543 {
5544         int val;
5545         bool is_ctia = false;
5546         struct alc_spec *spec = codec->spec;
5547         static const struct coef_fw coef0255[] = {
5548                 WRITE_COEF(0x45, 0xd089), /* combo jack auto switch control(Check type)*/
5549                 WRITE_COEF(0x49, 0x0149), /* combo jack auto switch control(Vref
5550  conteol) */
5551                 {}
5552         };
5553         static const struct coef_fw coef0288[] = {
5554                 UPDATE_COEF(0x4f, 0xfcc0, 0xd400), /* Check Type */
5555                 {}
5556         };
5557         static const struct coef_fw coef0298[] = {
5558                 UPDATE_COEF(0x50, 0x2000, 0x2000),
5559                 UPDATE_COEF(0x56, 0x0006, 0x0006),
5560                 UPDATE_COEF(0x66, 0x0008, 0),
5561                 UPDATE_COEF(0x67, 0x2000, 0),
5562                 UPDATE_COEF(0x19, 0x1300, 0x1300),
5563                 {}
5564         };
5565         static const struct coef_fw coef0293[] = {
5566                 UPDATE_COEF(0x4a, 0x000f, 0x0008), /* Combo Jack auto detect */
5567                 WRITE_COEF(0x45, 0xD429), /* Set to ctia type */
5568                 {}
5569         };
5570         static const struct coef_fw coef0688[] = {
5571                 WRITE_COEF(0x11, 0x0001),
5572                 WRITE_COEF(0xb7, 0x802b),
5573                 WRITE_COEF(0x15, 0x0d60),
5574                 WRITE_COEF(0xc3, 0x0c00),
5575                 {}
5576         };
5577         static const struct coef_fw coef0274[] = {
5578                 UPDATE_COEF(0x4a, 0x0010, 0),
5579                 UPDATE_COEF(0x4a, 0x8000, 0),
5580                 WRITE_COEF(0x45, 0xd289),
5581                 UPDATE_COEF(0x49, 0x0300, 0x0300),
5582                 {}
5583         };
5584
5585         if (spec->no_internal_mic_pin) {
5586                 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
5587                 return;
5588         }
5589
5590         switch (codec->core.vendor_id) {
5591         case 0x10ec0255:
5592                 alc_process_coef_fw(codec, coef0255);
5593                 msleep(300);
5594                 val = alc_read_coef_idx(codec, 0x46);
5595                 is_ctia = (val & 0x0070) == 0x0070;
5596                 break;
5597         case 0x10ec0230:
5598         case 0x10ec0236:
5599         case 0x10ec0256:
5600         case 0x19e58326:
5601                 alc_write_coef_idx(codec, 0x1b, 0x0e4b);
5602                 alc_write_coef_idx(codec, 0x06, 0x6104);
5603                 alc_write_coefex_idx(codec, 0x57, 0x3, 0x09a3);
5604
5605                 snd_hda_codec_write(codec, 0x21, 0,
5606                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5607                 msleep(80);
5608                 snd_hda_codec_write(codec, 0x21, 0,
5609                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5610
5611                 alc_process_coef_fw(codec, coef0255);
5612                 msleep(300);
5613                 val = alc_read_coef_idx(codec, 0x46);
5614                 is_ctia = (val & 0x0070) == 0x0070;
5615
5616                 alc_write_coefex_idx(codec, 0x57, 0x3, 0x0da3);
5617                 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5618
5619                 snd_hda_codec_write(codec, 0x21, 0,
5620                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5621                 msleep(80);
5622                 snd_hda_codec_write(codec, 0x21, 0,
5623                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5624                 break;
5625         case 0x10ec0234:
5626         case 0x10ec0274:
5627         case 0x10ec0294:
5628                 alc_process_coef_fw(codec, coef0274);
5629                 msleep(850);
5630                 val = alc_read_coef_idx(codec, 0x46);
5631                 is_ctia = (val & 0x00f0) == 0x00f0;
5632                 break;
5633         case 0x10ec0233:
5634         case 0x10ec0283:
5635                 alc_write_coef_idx(codec, 0x45, 0xd029);
5636                 msleep(300);
5637                 val = alc_read_coef_idx(codec, 0x46);
5638                 is_ctia = (val & 0x0070) == 0x0070;
5639                 break;
5640         case 0x10ec0298:
5641                 snd_hda_codec_write(codec, 0x21, 0,
5642                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5643                 msleep(100);
5644                 snd_hda_codec_write(codec, 0x21, 0,
5645                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5646                 msleep(200);
5647
5648                 val = alc_read_coef_idx(codec, 0x50);
5649                 if (val & (1 << 12)) {
5650                         alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
5651                         alc_process_coef_fw(codec, coef0288);
5652                         msleep(350);
5653                         val = alc_read_coef_idx(codec, 0x50);
5654                         is_ctia = (val & 0x0070) == 0x0070;
5655                 } else {
5656                         alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5657                         alc_process_coef_fw(codec, coef0288);
5658                         msleep(350);
5659                         val = alc_read_coef_idx(codec, 0x50);
5660                         is_ctia = (val & 0x0070) == 0x0070;
5661                 }
5662                 alc_process_coef_fw(codec, coef0298);
5663                 snd_hda_codec_write(codec, 0x21, 0,
5664                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
5665                 msleep(75);
5666                 snd_hda_codec_write(codec, 0x21, 0,
5667                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5668                 break;
5669         case 0x10ec0286:
5670         case 0x10ec0288:
5671                 alc_process_coef_fw(codec, coef0288);
5672                 msleep(350);
5673                 val = alc_read_coef_idx(codec, 0x50);
5674                 is_ctia = (val & 0x0070) == 0x0070;
5675                 break;
5676         case 0x10ec0292:
5677                 alc_write_coef_idx(codec, 0x6b, 0xd429);
5678                 msleep(300);
5679                 val = alc_read_coef_idx(codec, 0x6c);
5680                 is_ctia = (val & 0x001c) == 0x001c;
5681                 break;
5682         case 0x10ec0293:
5683                 alc_process_coef_fw(codec, coef0293);
5684                 msleep(300);
5685                 val = alc_read_coef_idx(codec, 0x46);
5686                 is_ctia = (val & 0x0070) == 0x0070;
5687                 break;
5688         case 0x10ec0668:
5689                 alc_process_coef_fw(codec, coef0688);
5690                 msleep(300);
5691                 val = alc_read_coef_idx(codec, 0xbe);
5692                 is_ctia = (val & 0x1c02) == 0x1c02;
5693                 break;
5694         case 0x10ec0215:
5695         case 0x10ec0225:
5696         case 0x10ec0285:
5697         case 0x10ec0295:
5698         case 0x10ec0289:
5699         case 0x10ec0299:
5700                 snd_hda_codec_write(codec, 0x21, 0,
5701                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5702                 msleep(80);
5703                 snd_hda_codec_write(codec, 0x21, 0,
5704                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5705
5706                 alc_process_coef_fw(codec, alc225_pre_hsmode);
5707                 alc_update_coef_idx(codec, 0x67, 0xf000, 0x1000);
5708                 val = alc_read_coef_idx(codec, 0x45);
5709                 if (val & (1 << 9)) {
5710                         alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5711                         alc_update_coef_idx(codec, 0x49, 3<<8, 2<<8);
5712                         msleep(800);
5713                         val = alc_read_coef_idx(codec, 0x46);
5714                         is_ctia = (val & 0x00f0) == 0x00f0;
5715                 } else {
5716                         alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5717                         alc_update_coef_idx(codec, 0x49, 3<<8, 1<<8);
5718                         msleep(800);
5719                         val = alc_read_coef_idx(codec, 0x46);
5720                         is_ctia = (val & 0x00f0) == 0x00f0;
5721                 }
5722                 alc_update_coef_idx(codec, 0x4a, 7<<6, 7<<6);
5723                 alc_update_coef_idx(codec, 0x4a, 3<<4, 3<<4);
5724                 alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
5725
5726                 snd_hda_codec_write(codec, 0x21, 0,
5727                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5728                 msleep(80);
5729                 snd_hda_codec_write(codec, 0x21, 0,
5730                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5731                 break;
5732         case 0x10ec0867:
5733                 is_ctia = true;
5734                 break;
5735         }
5736
5737         codec_dbg(codec, "Headset jack detected iPhone-style headset: %s\n",
5738                     is_ctia ? "yes" : "no");
5739         spec->current_headset_type = is_ctia ? ALC_HEADSET_TYPE_CTIA : ALC_HEADSET_TYPE_OMTP;
5740 }
5741
5742 static void alc_update_headset_mode(struct hda_codec *codec)
5743 {
5744         struct alc_spec *spec = codec->spec;
5745
5746         hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]];
5747         hda_nid_t hp_pin = alc_get_hp_pin(spec);
5748
5749         int new_headset_mode;
5750
5751         if (!snd_hda_jack_detect(codec, hp_pin))
5752                 new_headset_mode = ALC_HEADSET_MODE_UNPLUGGED;
5753         else if (mux_pin == spec->headset_mic_pin)
5754                 new_headset_mode = ALC_HEADSET_MODE_HEADSET;
5755         else if (mux_pin == spec->headphone_mic_pin)
5756                 new_headset_mode = ALC_HEADSET_MODE_MIC;
5757         else
5758                 new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;
5759
5760         if (new_headset_mode == spec->current_headset_mode) {
5761                 snd_hda_gen_update_outputs(codec);
5762                 return;
5763         }
5764
5765         switch (new_headset_mode) {
5766         case ALC_HEADSET_MODE_UNPLUGGED:
5767                 alc_headset_mode_unplugged(codec);
5768                 spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5769                 spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5770                 spec->gen.hp_jack_present = false;
5771                 break;
5772         case ALC_HEADSET_MODE_HEADSET:
5773                 if (spec->current_headset_type == ALC_HEADSET_TYPE_UNKNOWN)
5774                         alc_determine_headset_type(codec);
5775                 if (spec->current_headset_type == ALC_HEADSET_TYPE_CTIA)
5776                         alc_headset_mode_ctia(codec);
5777                 else if (spec->current_headset_type == ALC_HEADSET_TYPE_OMTP)
5778                         alc_headset_mode_omtp(codec);
5779                 spec->gen.hp_jack_present = true;
5780                 break;
5781         case ALC_HEADSET_MODE_MIC:
5782                 alc_headset_mode_mic_in(codec, hp_pin, spec->headphone_mic_pin);
5783                 spec->gen.hp_jack_present = false;
5784                 break;
5785         case ALC_HEADSET_MODE_HEADPHONE:
5786                 alc_headset_mode_default(codec);
5787                 spec->gen.hp_jack_present = true;
5788                 break;
5789         }
5790         if (new_headset_mode != ALC_HEADSET_MODE_MIC) {
5791                 snd_hda_set_pin_ctl_cache(codec, hp_pin,
5792                                           AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
5793                 if (spec->headphone_mic_pin && spec->headphone_mic_pin != hp_pin)
5794                         snd_hda_set_pin_ctl_cache(codec, spec->headphone_mic_pin,
5795                                                   PIN_VREFHIZ);
5796         }
5797         spec->current_headset_mode = new_headset_mode;
5798
5799         snd_hda_gen_update_outputs(codec);
5800 }
5801
5802 static void alc_update_headset_mode_hook(struct hda_codec *codec,
5803                                          struct snd_kcontrol *kcontrol,
5804                                          struct snd_ctl_elem_value *ucontrol)
5805 {
5806         alc_update_headset_mode(codec);
5807 }
5808
5809 static void alc_update_headset_jack_cb(struct hda_codec *codec,
5810                                        struct hda_jack_callback *jack)
5811 {
5812         snd_hda_gen_hp_automute(codec, jack);
5813         alc_update_headset_mode(codec);
5814 }
5815
5816 static void alc_probe_headset_mode(struct hda_codec *codec)
5817 {
5818         int i;
5819         struct alc_spec *spec = codec->spec;
5820         struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5821
5822         /* Find mic pins */
5823         for (i = 0; i < cfg->num_inputs; i++) {
5824                 if (cfg->inputs[i].is_headset_mic && !spec->headset_mic_pin)
5825                         spec->headset_mic_pin = cfg->inputs[i].pin;
5826                 if (cfg->inputs[i].is_headphone_mic && !spec->headphone_mic_pin)
5827                         spec->headphone_mic_pin = cfg->inputs[i].pin;
5828         }
5829
5830         WARN_ON(spec->gen.cap_sync_hook);
5831         spec->gen.cap_sync_hook = alc_update_headset_mode_hook;
5832         spec->gen.automute_hook = alc_update_headset_mode;
5833         spec->gen.hp_automute_hook = alc_update_headset_jack_cb;
5834 }
5835
5836 static void alc_fixup_headset_mode(struct hda_codec *codec,
5837                                 const struct hda_fixup *fix, int action)
5838 {
5839         struct alc_spec *spec = codec->spec;
5840
5841         switch (action) {
5842         case HDA_FIXUP_ACT_PRE_PROBE:
5843                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC | HDA_PINCFG_HEADPHONE_MIC;
5844                 break;
5845         case HDA_FIXUP_ACT_PROBE:
5846                 alc_probe_headset_mode(codec);
5847                 break;
5848         case HDA_FIXUP_ACT_INIT:
5849                 if (is_s3_resume(codec) || is_s4_resume(codec)) {
5850                         spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5851                         spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5852                 }
5853                 alc_update_headset_mode(codec);
5854                 break;
5855         }
5856 }
5857
5858 static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
5859                                 const struct hda_fixup *fix, int action)
5860 {
5861         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5862                 struct alc_spec *spec = codec->spec;
5863                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5864         }
5865         else
5866                 alc_fixup_headset_mode(codec, fix, action);
5867 }
5868
5869 static void alc255_set_default_jack_type(struct hda_codec *codec)
5870 {
5871         /* Set to iphone type */
5872         static const struct coef_fw alc255fw[] = {
5873                 WRITE_COEF(0x1b, 0x880b),
5874                 WRITE_COEF(0x45, 0xd089),
5875                 WRITE_COEF(0x1b, 0x080b),
5876                 WRITE_COEF(0x46, 0x0004),
5877                 WRITE_COEF(0x1b, 0x0c0b),
5878                 {}
5879         };
5880         static const struct coef_fw alc256fw[] = {
5881                 WRITE_COEF(0x1b, 0x884b),
5882                 WRITE_COEF(0x45, 0xd089),
5883                 WRITE_COEF(0x1b, 0x084b),
5884                 WRITE_COEF(0x46, 0x0004),
5885                 WRITE_COEF(0x1b, 0x0c4b),
5886                 {}
5887         };
5888         switch (codec->core.vendor_id) {
5889         case 0x10ec0255:
5890                 alc_process_coef_fw(codec, alc255fw);
5891                 break;
5892         case 0x10ec0230:
5893         case 0x10ec0236:
5894         case 0x10ec0256:
5895         case 0x19e58326:
5896                 alc_process_coef_fw(codec, alc256fw);
5897                 break;
5898         }
5899         msleep(30);
5900 }
5901
5902 static void alc_fixup_headset_mode_alc255(struct hda_codec *codec,
5903                                 const struct hda_fixup *fix, int action)
5904 {
5905         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5906                 alc255_set_default_jack_type(codec);
5907         }
5908         alc_fixup_headset_mode(codec, fix, action);
5909 }
5910
5911 static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,
5912                                 const struct hda_fixup *fix, int action)
5913 {
5914         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5915                 struct alc_spec *spec = codec->spec;
5916                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5917                 alc255_set_default_jack_type(codec);
5918         }
5919         else
5920                 alc_fixup_headset_mode(codec, fix, action);
5921 }
5922
5923 static void alc288_update_headset_jack_cb(struct hda_codec *codec,
5924                                        struct hda_jack_callback *jack)
5925 {
5926         struct alc_spec *spec = codec->spec;
5927
5928         alc_update_headset_jack_cb(codec, jack);
5929         /* Headset Mic enable or disable, only for Dell Dino */
5930         alc_update_gpio_data(codec, 0x40, spec->gen.hp_jack_present);
5931 }
5932
5933 static void alc_fixup_headset_mode_dell_alc288(struct hda_codec *codec,
5934                                 const struct hda_fixup *fix, int action)
5935 {
5936         alc_fixup_headset_mode(codec, fix, action);
5937         if (action == HDA_FIXUP_ACT_PROBE) {
5938                 struct alc_spec *spec = codec->spec;
5939                 /* toggled via hp_automute_hook */
5940                 spec->gpio_mask |= 0x40;
5941                 spec->gpio_dir |= 0x40;
5942                 spec->gen.hp_automute_hook = alc288_update_headset_jack_cb;
5943         }
5944 }
5945
5946 static void alc_fixup_auto_mute_via_amp(struct hda_codec *codec,
5947                                         const struct hda_fixup *fix, int action)
5948 {
5949         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5950                 struct alc_spec *spec = codec->spec;
5951                 spec->gen.auto_mute_via_amp = 1;
5952         }
5953 }
5954
5955 static void alc_fixup_no_shutup(struct hda_codec *codec,
5956                                 const struct hda_fixup *fix, int action)
5957 {
5958         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5959                 struct alc_spec *spec = codec->spec;
5960                 spec->no_shutup_pins = 1;
5961         }
5962 }
5963
5964 static void alc_fixup_disable_aamix(struct hda_codec *codec,
5965                                     const struct hda_fixup *fix, int action)
5966 {
5967         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5968                 struct alc_spec *spec = codec->spec;
5969                 /* Disable AA-loopback as it causes white noise */
5970                 spec->gen.mixer_nid = 0;
5971         }
5972 }
5973
5974 /* fixup for Thinkpad docks: add dock pins, avoid HP parser fixup */
5975 static void alc_fixup_tpt440_dock(struct hda_codec *codec,
5976                                   const struct hda_fixup *fix, int action)
5977 {
5978         static const struct hda_pintbl pincfgs[] = {
5979                 { 0x16, 0x21211010 }, /* dock headphone */
5980                 { 0x19, 0x21a11010 }, /* dock mic */
5981                 { }
5982         };
5983         struct alc_spec *spec = codec->spec;
5984
5985         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5986                 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
5987                 codec->power_save_node = 0; /* avoid click noises */
5988                 snd_hda_apply_pincfgs(codec, pincfgs);
5989         }
5990 }
5991
5992 static void alc_fixup_tpt470_dock(struct hda_codec *codec,
5993                                   const struct hda_fixup *fix, int action)
5994 {
5995         static const struct hda_pintbl pincfgs[] = {
5996                 { 0x17, 0x21211010 }, /* dock headphone */
5997                 { 0x19, 0x21a11010 }, /* dock mic */
5998                 { }
5999         };
6000         struct alc_spec *spec = codec->spec;
6001
6002         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6003                 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
6004                 snd_hda_apply_pincfgs(codec, pincfgs);
6005         } else if (action == HDA_FIXUP_ACT_INIT) {
6006                 /* Enable DOCK device */
6007                 snd_hda_codec_write(codec, 0x17, 0,
6008                             AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
6009                 /* Enable DOCK device */
6010                 snd_hda_codec_write(codec, 0x19, 0,
6011                             AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
6012         }
6013 }
6014
6015 static void alc_fixup_tpt470_dacs(struct hda_codec *codec,
6016                                   const struct hda_fixup *fix, int action)
6017 {
6018         /* Assure the speaker pin to be coupled with DAC NID 0x03; otherwise
6019          * the speaker output becomes too low by some reason on Thinkpads with
6020          * ALC298 codec
6021          */
6022         static const hda_nid_t preferred_pairs[] = {
6023                 0x14, 0x03, 0x17, 0x02, 0x21, 0x02,
6024                 0
6025         };
6026         struct alc_spec *spec = codec->spec;
6027
6028         if (action == HDA_FIXUP_ACT_PRE_PROBE)
6029                 spec->gen.preferred_dacs = preferred_pairs;
6030 }
6031
6032 static void alc295_fixup_asus_dacs(struct hda_codec *codec,
6033                                    const struct hda_fixup *fix, int action)
6034 {
6035         static const hda_nid_t preferred_pairs[] = {
6036                 0x17, 0x02, 0x21, 0x03, 0
6037         };
6038         struct alc_spec *spec = codec->spec;
6039
6040         if (action == HDA_FIXUP_ACT_PRE_PROBE)
6041                 spec->gen.preferred_dacs = preferred_pairs;
6042 }
6043
6044 static void alc_shutup_dell_xps13(struct hda_codec *codec)
6045 {
6046         struct alc_spec *spec = codec->spec;
6047         int hp_pin = alc_get_hp_pin(spec);
6048
6049         /* Prevent pop noises when headphones are plugged in */
6050         snd_hda_codec_write(codec, hp_pin, 0,
6051                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
6052         msleep(20);
6053 }
6054
6055 static void alc_fixup_dell_xps13(struct hda_codec *codec,
6056                                 const struct hda_fixup *fix, int action)
6057 {
6058         struct alc_spec *spec = codec->spec;
6059         struct hda_input_mux *imux = &spec->gen.input_mux;
6060         int i;
6061
6062         switch (action) {
6063         case HDA_FIXUP_ACT_PRE_PROBE:
6064                 /* mic pin 0x19 must be initialized with Vref Hi-Z, otherwise
6065                  * it causes a click noise at start up
6066                  */
6067                 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
6068                 spec->shutup = alc_shutup_dell_xps13;
6069                 break;
6070         case HDA_FIXUP_ACT_PROBE:
6071                 /* Make the internal mic the default input source. */
6072                 for (i = 0; i < imux->num_items; i++) {
6073                         if (spec->gen.imux_pins[i] == 0x12) {
6074                                 spec->gen.cur_mux[0] = i;
6075                                 break;
6076                         }
6077                 }
6078                 break;
6079         }
6080 }
6081
6082 static void alc_fixup_headset_mode_alc662(struct hda_codec *codec,
6083                                 const struct hda_fixup *fix, int action)
6084 {
6085         struct alc_spec *spec = codec->spec;
6086
6087         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6088                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
6089                 spec->gen.hp_mic = 1; /* Mic-in is same pin as headphone */
6090
6091                 /* Disable boost for mic-in permanently. (This code is only called
6092                    from quirks that guarantee that the headphone is at NID 0x1b.) */
6093                 snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000);
6094                 snd_hda_override_wcaps(codec, 0x1b, get_wcaps(codec, 0x1b) & ~AC_WCAP_IN_AMP);
6095         } else
6096                 alc_fixup_headset_mode(codec, fix, action);
6097 }
6098
6099 static void alc_fixup_headset_mode_alc668(struct hda_codec *codec,
6100                                 const struct hda_fixup *fix, int action)
6101 {
6102         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6103                 alc_write_coef_idx(codec, 0xc4, 0x8000);
6104                 alc_update_coef_idx(codec, 0xc2, ~0xfe, 0);
6105                 snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
6106         }
6107         alc_fixup_headset_mode(codec, fix, action);
6108 }
6109
6110 /* Returns the nid of the external mic input pin, or 0 if it cannot be found. */
6111 static int find_ext_mic_pin(struct hda_codec *codec)
6112 {
6113         struct alc_spec *spec = codec->spec;
6114         struct auto_pin_cfg *cfg = &spec->gen.autocfg;
6115         hda_nid_t nid;
6116         unsigned int defcfg;
6117         int i;
6118
6119         for (i = 0; i < cfg->num_inputs; i++) {
6120                 if (cfg->inputs[i].type != AUTO_PIN_MIC)
6121                         continue;
6122                 nid = cfg->inputs[i].pin;
6123                 defcfg = snd_hda_codec_get_pincfg(codec, nid);
6124                 if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT)
6125                         continue;
6126                 return nid;
6127         }
6128
6129         return 0;
6130 }
6131
6132 static void alc271_hp_gate_mic_jack(struct hda_codec *codec,
6133                                     const struct hda_fixup *fix,
6134                                     int action)
6135 {
6136         struct alc_spec *spec = codec->spec;
6137
6138         if (action == HDA_FIXUP_ACT_PROBE) {
6139                 int mic_pin = find_ext_mic_pin(codec);
6140                 int hp_pin = alc_get_hp_pin(spec);
6141
6142                 if (snd_BUG_ON(!mic_pin || !hp_pin))
6143                         return;
6144                 snd_hda_jack_set_gating_jack(codec, mic_pin, hp_pin);
6145         }
6146 }
6147
6148 static void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec,
6149                                              const struct hda_fixup *fix,
6150                                              int action)
6151 {
6152         struct alc_spec *spec = codec->spec;
6153         struct auto_pin_cfg *cfg = &spec->gen.autocfg;
6154         int i;
6155
6156         /* The mic boosts on level 2 and 3 are too noisy
6157            on the internal mic input.
6158            Therefore limit the boost to 0 or 1. */
6159
6160         if (action != HDA_FIXUP_ACT_PROBE)
6161                 return;
6162
6163         for (i = 0; i < cfg->num_inputs; i++) {
6164                 hda_nid_t nid = cfg->inputs[i].pin;
6165                 unsigned int defcfg;
6166                 if (cfg->inputs[i].type != AUTO_PIN_MIC)
6167                         continue;
6168                 defcfg = snd_hda_codec_get_pincfg(codec, nid);
6169                 if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
6170                         continue;
6171
6172                 snd_hda_override_amp_caps(codec, nid, HDA_INPUT,
6173                                           (0x00 << AC_AMPCAP_OFFSET_SHIFT) |
6174                                           (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) |
6175                                           (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) |
6176                                           (0 << AC_AMPCAP_MUTE_SHIFT));
6177         }
6178 }
6179
6180 static void alc283_hp_automute_hook(struct hda_codec *codec,
6181                                     struct hda_jack_callback *jack)
6182 {
6183         struct alc_spec *spec = codec->spec;
6184         int vref;
6185
6186         msleep(200);
6187         snd_hda_gen_hp_automute(codec, jack);
6188
6189         vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
6190
6191         msleep(600);
6192         snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
6193                             vref);
6194 }
6195
6196 static void alc283_fixup_chromebook(struct hda_codec *codec,
6197                                     const struct hda_fixup *fix, int action)
6198 {
6199         struct alc_spec *spec = codec->spec;
6200
6201         switch (action) {
6202         case HDA_FIXUP_ACT_PRE_PROBE:
6203                 snd_hda_override_wcaps(codec, 0x03, 0);
6204                 /* Disable AA-loopback as it causes white noise */
6205                 spec->gen.mixer_nid = 0;
6206                 break;
6207         case HDA_FIXUP_ACT_INIT:
6208                 /* MIC2-VREF control */
6209                 /* Set to manual mode */
6210                 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
6211                 /* Enable Line1 input control by verb */
6212                 alc_update_coef_idx(codec, 0x1a, 0, 1 << 4);
6213                 break;
6214         }
6215 }
6216
6217 static void alc283_fixup_sense_combo_jack(struct hda_codec *codec,
6218                                     const struct hda_fixup *fix, int action)
6219 {
6220         struct alc_spec *spec = codec->spec;
6221
6222         switch (action) {
6223         case HDA_FIXUP_ACT_PRE_PROBE:
6224                 spec->gen.hp_automute_hook = alc283_hp_automute_hook;
6225                 break;
6226         case HDA_FIXUP_ACT_INIT:
6227                 /* MIC2-VREF control */
6228                 /* Set to manual mode */
6229                 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
6230                 break;
6231         }
6232 }
6233
6234 /* mute tablet speaker pin (0x14) via dock plugging in addition */
6235 static void asus_tx300_automute(struct hda_codec *codec)
6236 {
6237         struct alc_spec *spec = codec->spec;
6238         snd_hda_gen_update_outputs(codec);
6239         if (snd_hda_jack_detect(codec, 0x1b))
6240                 spec->gen.mute_bits |= (1ULL << 0x14);
6241 }
6242
6243 static void alc282_fixup_asus_tx300(struct hda_codec *codec,
6244                                     const struct hda_fixup *fix, int action)
6245 {
6246         struct alc_spec *spec = codec->spec;
6247         static const struct hda_pintbl dock_pins[] = {
6248                 { 0x1b, 0x21114000 }, /* dock speaker pin */
6249                 {}
6250         };
6251
6252         switch (action) {
6253         case HDA_FIXUP_ACT_PRE_PROBE:
6254                 spec->init_amp = ALC_INIT_DEFAULT;
6255                 /* TX300 needs to set up GPIO2 for the speaker amp */
6256                 alc_setup_gpio(codec, 0x04);
6257                 snd_hda_apply_pincfgs(codec, dock_pins);
6258                 spec->gen.auto_mute_via_amp = 1;
6259                 spec->gen.automute_hook = asus_tx300_automute;
6260                 snd_hda_jack_detect_enable_callback(codec, 0x1b,
6261                                                     snd_hda_gen_hp_automute);
6262                 break;
6263         case HDA_FIXUP_ACT_PROBE:
6264                 spec->init_amp = ALC_INIT_DEFAULT;
6265                 break;
6266         case HDA_FIXUP_ACT_BUILD:
6267                 /* this is a bit tricky; give more sane names for the main
6268                  * (tablet) speaker and the dock speaker, respectively
6269                  */
6270                 rename_ctl(codec, "Speaker Playback Switch",
6271                            "Dock Speaker Playback Switch");
6272                 rename_ctl(codec, "Bass Speaker Playback Switch",
6273                            "Speaker Playback Switch");
6274                 break;
6275         }
6276 }
6277
6278 static void alc290_fixup_mono_speakers(struct hda_codec *codec,
6279                                        const struct hda_fixup *fix, int action)
6280 {
6281         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6282                 /* DAC node 0x03 is giving mono output. We therefore want to
6283                    make sure 0x14 (front speaker) and 0x15 (headphones) use the
6284                    stereo DAC, while leaving 0x17 (bass speaker) for node 0x03. */
6285                 static const hda_nid_t conn1[] = { 0x0c };
6286                 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
6287                 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
6288         }
6289 }
6290
6291 static void alc298_fixup_speaker_volume(struct hda_codec *codec,
6292                                         const struct hda_fixup *fix, int action)
6293 {
6294         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6295                 /* The speaker is routed to the Node 0x06 by a mistake, as a result
6296                    we can't adjust the speaker's volume since this node does not has
6297                    Amp-out capability. we change the speaker's route to:
6298                    Node 0x02 (Audio Output) -> Node 0x0c (Audio Mixer) -> Node 0x17 (
6299                    Pin Complex), since Node 0x02 has Amp-out caps, we can adjust
6300                    speaker's volume now. */
6301
6302                 static const hda_nid_t conn1[] = { 0x0c };
6303                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn1), conn1);
6304         }
6305 }
6306
6307 /* disable DAC3 (0x06) selection on NID 0x17 as it has no volume amp control */
6308 static void alc295_fixup_disable_dac3(struct hda_codec *codec,
6309                                       const struct hda_fixup *fix, int action)
6310 {
6311         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6312                 static const hda_nid_t conn[] = { 0x02, 0x03 };
6313                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6314         }
6315 }
6316
6317 /* force NID 0x17 (Bass Speaker) to DAC1 to share it with the main speaker */
6318 static void alc285_fixup_speaker2_to_dac1(struct hda_codec *codec,
6319                                           const struct hda_fixup *fix, int action)
6320 {
6321         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6322                 static const hda_nid_t conn[] = { 0x02 };
6323                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6324         }
6325 }
6326
6327 /* Hook to update amp GPIO4 for automute */
6328 static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,
6329                                           struct hda_jack_callback *jack)
6330 {
6331         struct alc_spec *spec = codec->spec;
6332
6333         snd_hda_gen_hp_automute(codec, jack);
6334         /* mute_led_polarity is set to 0, so we pass inverted value here */
6335         alc_update_gpio_led(codec, 0x10, spec->mute_led_polarity,
6336                             !spec->gen.hp_jack_present);
6337 }
6338
6339 /* Manage GPIOs for HP EliteBook Folio 9480m.
6340  *
6341  * GPIO4 is the headphone amplifier power control
6342  * GPIO3 is the audio output mute indicator LED
6343  */
6344
6345 static void alc280_fixup_hp_9480m(struct hda_codec *codec,
6346                                   const struct hda_fixup *fix,
6347                                   int action)
6348 {
6349         struct alc_spec *spec = codec->spec;
6350
6351         alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
6352         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6353                 /* amp at GPIO4; toggled via alc280_hp_gpio4_automute_hook() */
6354                 spec->gpio_mask |= 0x10;
6355                 spec->gpio_dir |= 0x10;
6356                 spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook;
6357         }
6358 }
6359
6360 static void alc275_fixup_gpio4_off(struct hda_codec *codec,
6361                                    const struct hda_fixup *fix,
6362                                    int action)
6363 {
6364         struct alc_spec *spec = codec->spec;
6365
6366         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6367                 spec->gpio_mask |= 0x04;
6368                 spec->gpio_dir |= 0x04;
6369                 /* set data bit low */
6370         }
6371 }
6372
6373 /* Quirk for Thinkpad X1 7th and 8th Gen
6374  * The following fixed routing needed
6375  * DAC1 (NID 0x02) -> Speaker (NID 0x14); some eq applied secretly
6376  * DAC2 (NID 0x03) -> Bass (NID 0x17) & Headphone (NID 0x21); sharing a DAC
6377  * DAC3 (NID 0x06) -> Unused, due to the lack of volume amp
6378  */
6379 static void alc285_fixup_thinkpad_x1_gen7(struct hda_codec *codec,
6380                                           const struct hda_fixup *fix, int action)
6381 {
6382         static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */
6383         static const hda_nid_t preferred_pairs[] = {
6384                 0x14, 0x02, 0x17, 0x03, 0x21, 0x03, 0
6385         };
6386         struct alc_spec *spec = codec->spec;
6387
6388         switch (action) {
6389         case HDA_FIXUP_ACT_PRE_PROBE:
6390                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6391                 spec->gen.preferred_dacs = preferred_pairs;
6392                 break;
6393         case HDA_FIXUP_ACT_BUILD:
6394                 /* The generic parser creates somewhat unintuitive volume ctls
6395                  * with the fixed routing above, and the shared DAC2 may be
6396                  * confusing for PA.
6397                  * Rename those to unique names so that PA doesn't touch them
6398                  * and use only Master volume.
6399                  */
6400                 rename_ctl(codec, "Front Playback Volume", "DAC1 Playback Volume");
6401                 rename_ctl(codec, "Bass Speaker Playback Volume", "DAC2 Playback Volume");
6402                 break;
6403         }
6404 }
6405
6406 static void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec,
6407                                          const struct hda_fixup *fix,
6408                                          int action)
6409 {
6410         alc_fixup_dual_codecs(codec, fix, action);
6411         switch (action) {
6412         case HDA_FIXUP_ACT_PRE_PROBE:
6413                 /* override card longname to provide a unique UCM profile */
6414                 strcpy(codec->card->longname, "HDAudio-Lenovo-DualCodecs");
6415                 break;
6416         case HDA_FIXUP_ACT_BUILD:
6417                 /* rename Capture controls depending on the codec */
6418                 rename_ctl(codec, "Capture Volume",
6419                            codec->addr == 0 ?
6420                            "Rear-Panel Capture Volume" :
6421                            "Front-Panel Capture Volume");
6422                 rename_ctl(codec, "Capture Switch",
6423                            codec->addr == 0 ?
6424                            "Rear-Panel Capture Switch" :
6425                            "Front-Panel Capture Switch");
6426                 break;
6427         }
6428 }
6429
6430 static void alc225_fixup_s3_pop_noise(struct hda_codec *codec,
6431                                       const struct hda_fixup *fix, int action)
6432 {
6433         if (action != HDA_FIXUP_ACT_PRE_PROBE)
6434                 return;
6435
6436         codec->power_save_node = 1;
6437 }
6438
6439 /* Forcibly assign NID 0x03 to HP/LO while NID 0x02 to SPK for EQ */
6440 static void alc274_fixup_bind_dacs(struct hda_codec *codec,
6441                                     const struct hda_fixup *fix, int action)
6442 {
6443         struct alc_spec *spec = codec->spec;
6444         static const hda_nid_t preferred_pairs[] = {
6445                 0x21, 0x03, 0x1b, 0x03, 0x16, 0x02,
6446                 0
6447         };
6448
6449         if (action != HDA_FIXUP_ACT_PRE_PROBE)
6450                 return;
6451
6452         spec->gen.preferred_dacs = preferred_pairs;
6453         spec->gen.auto_mute_via_amp = 1;
6454         codec->power_save_node = 0;
6455 }
6456
6457 /* avoid DAC 0x06 for bass speaker 0x17; it has no volume control */
6458 static void alc289_fixup_asus_ga401(struct hda_codec *codec,
6459                                     const struct hda_fixup *fix, int action)
6460 {
6461         static const hda_nid_t preferred_pairs[] = {
6462                 0x14, 0x02, 0x17, 0x02, 0x21, 0x03, 0
6463         };
6464         struct alc_spec *spec = codec->spec;
6465
6466         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6467                 spec->gen.preferred_dacs = preferred_pairs;
6468                 spec->gen.obey_preferred_dacs = 1;
6469         }
6470 }
6471
6472 /* The DAC of NID 0x3 will introduce click/pop noise on headphones, so invalidate it */
6473 static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
6474                               const struct hda_fixup *fix, int action)
6475 {
6476         if (action != HDA_FIXUP_ACT_PRE_PROBE)
6477                 return;
6478
6479         snd_hda_override_wcaps(codec, 0x03, 0);
6480 }
6481
6482 static void alc_combo_jack_hp_jd_restart(struct hda_codec *codec)
6483 {
6484         switch (codec->core.vendor_id) {
6485         case 0x10ec0274:
6486         case 0x10ec0294:
6487         case 0x10ec0225:
6488         case 0x10ec0295:
6489         case 0x10ec0299:
6490                 alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */
6491                 alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
6492                 break;
6493         case 0x10ec0230:
6494         case 0x10ec0235:
6495         case 0x10ec0236:
6496         case 0x10ec0255:
6497         case 0x10ec0256:
6498         case 0x19e58326:
6499                 alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */
6500                 alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
6501                 break;
6502         }
6503 }
6504
6505 static void alc295_fixup_chromebook(struct hda_codec *codec,
6506                                     const struct hda_fixup *fix, int action)
6507 {
6508         struct alc_spec *spec = codec->spec;
6509
6510         switch (action) {
6511         case HDA_FIXUP_ACT_PRE_PROBE:
6512                 spec->ultra_low_power = true;
6513                 break;
6514         case HDA_FIXUP_ACT_INIT:
6515                 alc_combo_jack_hp_jd_restart(codec);
6516                 break;
6517         }
6518 }
6519
6520 static void alc_fixup_disable_mic_vref(struct hda_codec *codec,
6521                                   const struct hda_fixup *fix, int action)
6522 {
6523         if (action == HDA_FIXUP_ACT_PRE_PROBE)
6524                 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
6525 }
6526
6527
6528 static void alc294_gx502_toggle_output(struct hda_codec *codec,
6529                                         struct hda_jack_callback *cb)
6530 {
6531         /* The Windows driver sets the codec up in a very different way where
6532          * it appears to leave 0x10 = 0x8a20 set. For Linux we need to toggle it
6533          */
6534         if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
6535                 alc_write_coef_idx(codec, 0x10, 0x8a20);
6536         else
6537                 alc_write_coef_idx(codec, 0x10, 0x0a20);
6538 }
6539
6540 static void alc294_fixup_gx502_hp(struct hda_codec *codec,
6541                                         const struct hda_fixup *fix, int action)
6542 {
6543         /* Pin 0x21: headphones/headset mic */
6544         if (!is_jack_detectable(codec, 0x21))
6545                 return;
6546
6547         switch (action) {
6548         case HDA_FIXUP_ACT_PRE_PROBE:
6549                 snd_hda_jack_detect_enable_callback(codec, 0x21,
6550                                 alc294_gx502_toggle_output);
6551                 break;
6552         case HDA_FIXUP_ACT_INIT:
6553                 /* Make sure to start in a correct state, i.e. if
6554                  * headphones have been plugged in before powering up the system
6555                  */
6556                 alc294_gx502_toggle_output(codec, NULL);
6557                 break;
6558         }
6559 }
6560
6561 static void alc294_gu502_toggle_output(struct hda_codec *codec,
6562                                        struct hda_jack_callback *cb)
6563 {
6564         /* Windows sets 0x10 to 0x8420 for Node 0x20 which is
6565          * responsible from changes between speakers and headphones
6566          */
6567         if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
6568                 alc_write_coef_idx(codec, 0x10, 0x8420);
6569         else
6570                 alc_write_coef_idx(codec, 0x10, 0x0a20);
6571 }
6572
6573 static void alc294_fixup_gu502_hp(struct hda_codec *codec,
6574                                   const struct hda_fixup *fix, int action)
6575 {
6576         if (!is_jack_detectable(codec, 0x21))
6577                 return;
6578
6579         switch (action) {
6580         case HDA_FIXUP_ACT_PRE_PROBE:
6581                 snd_hda_jack_detect_enable_callback(codec, 0x21,
6582                                 alc294_gu502_toggle_output);
6583                 break;
6584         case HDA_FIXUP_ACT_INIT:
6585                 alc294_gu502_toggle_output(codec, NULL);
6586                 break;
6587         }
6588 }
6589
6590 static void  alc285_fixup_hp_gpio_amp_init(struct hda_codec *codec,
6591                               const struct hda_fixup *fix, int action)
6592 {
6593         if (action != HDA_FIXUP_ACT_INIT)
6594                 return;
6595
6596         msleep(100);
6597         alc_write_coef_idx(codec, 0x65, 0x0);
6598 }
6599
6600 static void alc274_fixup_hp_headset_mic(struct hda_codec *codec,
6601                                     const struct hda_fixup *fix, int action)
6602 {
6603         switch (action) {
6604         case HDA_FIXUP_ACT_INIT:
6605                 alc_combo_jack_hp_jd_restart(codec);
6606                 break;
6607         }
6608 }
6609
6610 static void alc_fixup_no_int_mic(struct hda_codec *codec,
6611                                     const struct hda_fixup *fix, int action)
6612 {
6613         struct alc_spec *spec = codec->spec;
6614
6615         switch (action) {
6616         case HDA_FIXUP_ACT_PRE_PROBE:
6617                 /* Mic RING SLEEVE swap for combo jack */
6618                 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
6619                 spec->no_internal_mic_pin = true;
6620                 break;
6621         case HDA_FIXUP_ACT_INIT:
6622                 alc_combo_jack_hp_jd_restart(codec);
6623                 break;
6624         }
6625 }
6626
6627 /* GPIO1 = amplifier on/off
6628  * GPIO3 = mic mute LED
6629  */
6630 static void alc285_fixup_hp_spectre_x360_eb1(struct hda_codec *codec,
6631                                           const struct hda_fixup *fix, int action)
6632 {
6633         static const hda_nid_t conn[] = { 0x02 };
6634
6635         struct alc_spec *spec = codec->spec;
6636         static const struct hda_pintbl pincfgs[] = {
6637                 { 0x14, 0x90170110 },  /* front/high speakers */
6638                 { 0x17, 0x90170130 },  /* back/bass speakers */
6639                 { }
6640         };
6641
6642         //enable micmute led
6643         alc_fixup_hp_gpio_led(codec, action, 0x00, 0x04);
6644
6645         switch (action) {
6646         case HDA_FIXUP_ACT_PRE_PROBE:
6647                 spec->micmute_led_polarity = 1;
6648                 /* needed for amp of back speakers */
6649                 spec->gpio_mask |= 0x01;
6650                 spec->gpio_dir |= 0x01;
6651                 snd_hda_apply_pincfgs(codec, pincfgs);
6652                 /* share DAC to have unified volume control */
6653                 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
6654                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6655                 break;
6656         case HDA_FIXUP_ACT_INIT:
6657                 /* need to toggle GPIO to enable the amp of back speakers */
6658                 alc_update_gpio_data(codec, 0x01, true);
6659                 msleep(100);
6660                 alc_update_gpio_data(codec, 0x01, false);
6661                 break;
6662         }
6663 }
6664
6665 static void alc285_fixup_hp_spectre_x360(struct hda_codec *codec,
6666                                           const struct hda_fixup *fix, int action)
6667 {
6668         static const hda_nid_t conn[] = { 0x02 };
6669         static const struct hda_pintbl pincfgs[] = {
6670                 { 0x14, 0x90170110 },  /* rear speaker */
6671                 { }
6672         };
6673
6674         switch (action) {
6675         case HDA_FIXUP_ACT_PRE_PROBE:
6676                 snd_hda_apply_pincfgs(codec, pincfgs);
6677                 /* force front speaker to DAC1 */
6678                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6679                 break;
6680         }
6681 }
6682
6683 /* for hda_fixup_thinkpad_acpi() */
6684 #include "thinkpad_helper.c"
6685
6686 static void alc_fixup_thinkpad_acpi(struct hda_codec *codec,
6687                                     const struct hda_fixup *fix, int action)
6688 {
6689         alc_fixup_no_shutup(codec, fix, action); /* reduce click noise */
6690         hda_fixup_thinkpad_acpi(codec, fix, action);
6691 }
6692
6693 /* Fixup for Lenovo Legion 15IMHg05 speaker output on headset removal. */
6694 static void alc287_fixup_legion_15imhg05_speakers(struct hda_codec *codec,
6695                                                   const struct hda_fixup *fix,
6696                                                   int action)
6697 {
6698         struct alc_spec *spec = codec->spec;
6699
6700         switch (action) {
6701         case HDA_FIXUP_ACT_PRE_PROBE:
6702                 spec->gen.suppress_auto_mute = 1;
6703                 break;
6704         }
6705 }
6706
6707 static int comp_bind(struct device *dev)
6708 {
6709         struct hda_codec *cdc = dev_to_hda_codec(dev);
6710         struct alc_spec *spec = cdc->spec;
6711
6712         return component_bind_all(dev, spec->comps);
6713 }
6714
6715 static void comp_unbind(struct device *dev)
6716 {
6717         struct hda_codec *cdc = dev_to_hda_codec(dev);
6718         struct alc_spec *spec = cdc->spec;
6719
6720         component_unbind_all(dev, spec->comps);
6721 }
6722
6723 static const struct component_master_ops comp_master_ops = {
6724         .bind = comp_bind,
6725         .unbind = comp_unbind,
6726 };
6727
6728 static void comp_generic_playback_hook(struct hda_pcm_stream *hinfo, struct hda_codec *cdc,
6729                                        struct snd_pcm_substream *sub, int action)
6730 {
6731         struct alc_spec *spec = cdc->spec;
6732         int i;
6733
6734         for (i = 0; i < HDA_MAX_COMPONENTS; i++) {
6735                 if (spec->comps[i].dev && spec->comps[i].pre_playback_hook)
6736                         spec->comps[i].pre_playback_hook(spec->comps[i].dev, action);
6737         }
6738         for (i = 0; i < HDA_MAX_COMPONENTS; i++) {
6739                 if (spec->comps[i].dev && spec->comps[i].playback_hook)
6740                         spec->comps[i].playback_hook(spec->comps[i].dev, action);
6741         }
6742         for (i = 0; i < HDA_MAX_COMPONENTS; i++) {
6743                 if (spec->comps[i].dev && spec->comps[i].post_playback_hook)
6744                         spec->comps[i].post_playback_hook(spec->comps[i].dev, action);
6745         }
6746 }
6747
6748 struct scodec_dev_name {
6749         const char *bus;
6750         const char *hid;
6751         int index;
6752 };
6753
6754 /* match the device name in a slightly relaxed manner */
6755 static int comp_match_cs35l41_dev_name(struct device *dev, void *data)
6756 {
6757         struct scodec_dev_name *p = data;
6758         const char *d = dev_name(dev);
6759         int n = strlen(p->bus);
6760         char tmp[32];
6761
6762         /* check the bus name */
6763         if (strncmp(d, p->bus, n))
6764                 return 0;
6765         /* skip the bus number */
6766         if (isdigit(d[n]))
6767                 n++;
6768         /* the rest must be exact matching */
6769         snprintf(tmp, sizeof(tmp), "-%s:00-cs35l41-hda.%d", p->hid, p->index);
6770         return !strcmp(d + n, tmp);
6771 }
6772
6773 static int comp_match_tas2781_dev_name(struct device *dev,
6774         void *data)
6775 {
6776         struct scodec_dev_name *p = data;
6777         const char *d = dev_name(dev);
6778         int n = strlen(p->bus);
6779         char tmp[32];
6780
6781         /* check the bus name */
6782         if (strncmp(d, p->bus, n))
6783                 return 0;
6784         /* skip the bus number */
6785         if (isdigit(d[n]))
6786                 n++;
6787         /* the rest must be exact matching */
6788         snprintf(tmp, sizeof(tmp), "-%s:00", p->hid);
6789
6790         return !strcmp(d + n, tmp);
6791 }
6792
6793 static void cs35l41_generic_fixup(struct hda_codec *cdc, int action, const char *bus,
6794                                   const char *hid, int count)
6795 {
6796         struct device *dev = hda_codec_dev(cdc);
6797         struct alc_spec *spec = cdc->spec;
6798         struct scodec_dev_name *rec;
6799         int ret, i;
6800
6801         switch (action) {
6802         case HDA_FIXUP_ACT_PRE_PROBE:
6803                 for (i = 0; i < count; i++) {
6804                         rec = devm_kmalloc(dev, sizeof(*rec), GFP_KERNEL);
6805                         if (!rec)
6806                                 return;
6807                         rec->bus = bus;
6808                         rec->hid = hid;
6809                         rec->index = i;
6810                         spec->comps[i].codec = cdc;
6811                         component_match_add(dev, &spec->match,
6812                                             comp_match_cs35l41_dev_name, rec);
6813                 }
6814                 ret = component_master_add_with_match(dev, &comp_master_ops, spec->match);
6815                 if (ret)
6816                         codec_err(cdc, "Fail to register component aggregator %d\n", ret);
6817                 else
6818                         spec->gen.pcm_playback_hook = comp_generic_playback_hook;
6819                 break;
6820         case HDA_FIXUP_ACT_FREE:
6821                 component_master_del(dev, &comp_master_ops);
6822                 break;
6823         }
6824 }
6825
6826 static void tas2781_generic_fixup(struct hda_codec *cdc, int action,
6827         const char *bus, const char *hid)
6828 {
6829         struct device *dev = hda_codec_dev(cdc);
6830         struct alc_spec *spec = cdc->spec;
6831         struct scodec_dev_name *rec;
6832         int ret;
6833
6834         switch (action) {
6835         case HDA_FIXUP_ACT_PRE_PROBE:
6836                 rec = devm_kmalloc(dev, sizeof(*rec), GFP_KERNEL);
6837                 if (!rec)
6838                         return;
6839                 rec->bus = bus;
6840                 rec->hid = hid;
6841                 rec->index = 0;
6842                 spec->comps[0].codec = cdc;
6843                 component_match_add(dev, &spec->match,
6844                         comp_match_tas2781_dev_name, rec);
6845                 ret = component_master_add_with_match(dev, &comp_master_ops,
6846                         spec->match);
6847                 if (ret)
6848                         codec_err(cdc,
6849                                 "Fail to register component aggregator %d\n",
6850                                 ret);
6851                 else
6852                         spec->gen.pcm_playback_hook =
6853                                 comp_generic_playback_hook;
6854                 break;
6855         case HDA_FIXUP_ACT_FREE:
6856                 component_master_del(dev, &comp_master_ops);
6857                 break;
6858         }
6859 }
6860
6861 static void cs35l41_fixup_i2c_two(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
6862 {
6863         cs35l41_generic_fixup(cdc, action, "i2c", "CSC3551", 2);
6864 }
6865
6866 static void cs35l41_fixup_spi_two(struct hda_codec *codec, const struct hda_fixup *fix, int action)
6867 {
6868         cs35l41_generic_fixup(codec, action, "spi", "CSC3551", 2);
6869 }
6870
6871 static void cs35l41_fixup_spi_four(struct hda_codec *codec, const struct hda_fixup *fix, int action)
6872 {
6873         cs35l41_generic_fixup(codec, action, "spi", "CSC3551", 4);
6874 }
6875
6876 static void alc287_fixup_legion_16achg6_speakers(struct hda_codec *cdc, const struct hda_fixup *fix,
6877                                                  int action)
6878 {
6879         cs35l41_generic_fixup(cdc, action, "i2c", "CLSA0100", 2);
6880 }
6881
6882 static void alc287_fixup_legion_16ithg6_speakers(struct hda_codec *cdc, const struct hda_fixup *fix,
6883                                                  int action)
6884 {
6885         cs35l41_generic_fixup(cdc, action, "i2c", "CLSA0101", 2);
6886 }
6887
6888 static void tas2781_fixup_i2c(struct hda_codec *cdc,
6889         const struct hda_fixup *fix, int action)
6890 {
6891          tas2781_generic_fixup(cdc, action, "i2c", "TIAS2781");
6892 }
6893
6894 /* for alc295_fixup_hp_top_speakers */
6895 #include "hp_x360_helper.c"
6896
6897 /* for alc285_fixup_ideapad_s740_coef() */
6898 #include "ideapad_s740_helper.c"
6899
6900 static const struct coef_fw alc256_fixup_set_coef_defaults_coefs[] = {
6901         WRITE_COEF(0x10, 0x0020), WRITE_COEF(0x24, 0x0000),
6902         WRITE_COEF(0x26, 0x0000), WRITE_COEF(0x29, 0x3000),
6903         WRITE_COEF(0x37, 0xfe05), WRITE_COEF(0x45, 0x5089),
6904         {}
6905 };
6906
6907 static void alc256_fixup_set_coef_defaults(struct hda_codec *codec,
6908                                            const struct hda_fixup *fix,
6909                                            int action)
6910 {
6911         /*
6912          * A certain other OS sets these coeffs to different values. On at least
6913          * one TongFang barebone these settings might survive even a cold
6914          * reboot. So to restore a clean slate the values are explicitly reset
6915          * to default here. Without this, the external microphone is always in a
6916          * plugged-in state, while the internal microphone is always in an
6917          * unplugged state, breaking the ability to use the internal microphone.
6918          */
6919         alc_process_coef_fw(codec, alc256_fixup_set_coef_defaults_coefs);
6920 }
6921
6922 static const struct coef_fw alc233_fixup_no_audio_jack_coefs[] = {
6923         WRITE_COEF(0x1a, 0x9003), WRITE_COEF(0x1b, 0x0e2b), WRITE_COEF(0x37, 0xfe06),
6924         WRITE_COEF(0x38, 0x4981), WRITE_COEF(0x45, 0xd489), WRITE_COEF(0x46, 0x0074),
6925         WRITE_COEF(0x49, 0x0149),
6926         {}
6927 };
6928
6929 static void alc233_fixup_no_audio_jack(struct hda_codec *codec,
6930                                        const struct hda_fixup *fix,
6931                                        int action)
6932 {
6933         /*
6934          * The audio jack input and output is not detected on the ASRock NUC Box
6935          * 1100 series when cold booting without this fix. Warm rebooting from a
6936          * certain other OS makes the audio functional, as COEF settings are
6937          * preserved in this case. This fix sets these altered COEF values as
6938          * the default.
6939          */
6940         alc_process_coef_fw(codec, alc233_fixup_no_audio_jack_coefs);
6941 }
6942
6943 static void alc256_fixup_mic_no_presence_and_resume(struct hda_codec *codec,
6944                                                     const struct hda_fixup *fix,
6945                                                     int action)
6946 {
6947         /*
6948          * The Clevo NJ51CU comes either with the ALC293 or the ALC256 codec,
6949          * but uses the 0x8686 subproduct id in both cases. The ALC256 codec
6950          * needs an additional quirk for sound working after suspend and resume.
6951          */
6952         if (codec->core.vendor_id == 0x10ec0256) {
6953                 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
6954                 snd_hda_codec_set_pincfg(codec, 0x19, 0x04a11120);
6955         } else {
6956                 snd_hda_codec_set_pincfg(codec, 0x1a, 0x04a1113c);
6957         }
6958 }
6959
6960 static void alc_fixup_dell4_mic_no_presence_quiet(struct hda_codec *codec,
6961                                                   const struct hda_fixup *fix,
6962                                                   int action)
6963 {
6964         struct alc_spec *spec = codec->spec;
6965         struct hda_input_mux *imux = &spec->gen.input_mux;
6966         int i;
6967
6968         alc269_fixup_limit_int_mic_boost(codec, fix, action);
6969
6970         switch (action) {
6971         case HDA_FIXUP_ACT_PRE_PROBE:
6972                 /**
6973                  * Set the vref of pin 0x19 (Headset Mic) and pin 0x1b (Headphone Mic)
6974                  * to Hi-Z to avoid pop noises at startup and when plugging and
6975                  * unplugging headphones.
6976                  */
6977                 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
6978                 snd_hda_codec_set_pin_target(codec, 0x1b, PIN_VREFHIZ);
6979                 break;
6980         case HDA_FIXUP_ACT_PROBE:
6981                 /**
6982                  * Make the internal mic (0x12) the default input source to
6983                  * prevent pop noises on cold boot.
6984                  */
6985                 for (i = 0; i < imux->num_items; i++) {
6986                         if (spec->gen.imux_pins[i] == 0x12) {
6987                                 spec->gen.cur_mux[0] = i;
6988                                 break;
6989                         }
6990                 }
6991                 break;
6992         }
6993 }
6994
6995 static void alc287_fixup_yoga9_14iap7_bass_spk_pin(struct hda_codec *codec,
6996                                           const struct hda_fixup *fix, int action)
6997 {
6998         /*
6999          * The Pin Complex 0x17 for the bass speakers is wrongly reported as
7000          * unconnected.
7001          */
7002         static const struct hda_pintbl pincfgs[] = {
7003                 { 0x17, 0x90170121 },
7004                 { }
7005         };
7006         /*
7007          * Avoid DAC 0x06 and 0x08, as they have no volume controls.
7008          * DAC 0x02 and 0x03 would be fine.
7009          */
7010         static const hda_nid_t conn[] = { 0x02, 0x03 };
7011         /*
7012          * Prefer both speakerbar (0x14) and bass speakers (0x17) connected to DAC 0x02.
7013          * Headphones (0x21) are connected to DAC 0x03.
7014          */
7015         static const hda_nid_t preferred_pairs[] = {
7016                 0x14, 0x02,
7017                 0x17, 0x02,
7018                 0x21, 0x03,
7019                 0
7020         };
7021         struct alc_spec *spec = codec->spec;
7022
7023         switch (action) {
7024         case HDA_FIXUP_ACT_PRE_PROBE:
7025                 snd_hda_apply_pincfgs(codec, pincfgs);
7026                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
7027                 spec->gen.preferred_dacs = preferred_pairs;
7028                 break;
7029         }
7030 }
7031
7032 static void alc295_fixup_dell_inspiron_top_speakers(struct hda_codec *codec,
7033                                           const struct hda_fixup *fix, int action)
7034 {
7035         static const struct hda_pintbl pincfgs[] = {
7036                 { 0x14, 0x90170151 },
7037                 { 0x17, 0x90170150 },
7038                 { }
7039         };
7040         static const hda_nid_t conn[] = { 0x02, 0x03 };
7041         static const hda_nid_t preferred_pairs[] = {
7042                 0x14, 0x02,
7043                 0x17, 0x03,
7044                 0x21, 0x02,
7045                 0
7046         };
7047         struct alc_spec *spec = codec->spec;
7048
7049         alc_fixup_no_shutup(codec, fix, action);
7050
7051         switch (action) {
7052         case HDA_FIXUP_ACT_PRE_PROBE:
7053                 snd_hda_apply_pincfgs(codec, pincfgs);
7054                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
7055                 spec->gen.preferred_dacs = preferred_pairs;
7056                 break;
7057         }
7058 }
7059
7060 /* Forcibly assign NID 0x03 to HP while NID 0x02 to SPK */
7061 static void alc287_fixup_bind_dacs(struct hda_codec *codec,
7062                                     const struct hda_fixup *fix, int action)
7063 {
7064         struct alc_spec *spec = codec->spec;
7065         static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */
7066         static const hda_nid_t preferred_pairs[] = {
7067                 0x17, 0x02, 0x21, 0x03, 0
7068         };
7069
7070         if (action != HDA_FIXUP_ACT_PRE_PROBE)
7071                 return;
7072
7073         snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
7074         spec->gen.preferred_dacs = preferred_pairs;
7075         spec->gen.auto_mute_via_amp = 1;
7076         snd_hda_codec_write_cache(codec, 0x14, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
7077                             0x0); /* Make sure 0x14 was disable */
7078 }
7079
7080
7081 enum {
7082         ALC269_FIXUP_GPIO2,
7083         ALC269_FIXUP_SONY_VAIO,
7084         ALC275_FIXUP_SONY_VAIO_GPIO2,
7085         ALC269_FIXUP_DELL_M101Z,
7086         ALC269_FIXUP_SKU_IGNORE,
7087         ALC269_FIXUP_ASUS_G73JW,
7088         ALC269_FIXUP_ASUS_N7601ZM_PINS,
7089         ALC269_FIXUP_ASUS_N7601ZM,
7090         ALC269_FIXUP_LENOVO_EAPD,
7091         ALC275_FIXUP_SONY_HWEQ,
7092         ALC275_FIXUP_SONY_DISABLE_AAMIX,
7093         ALC271_FIXUP_DMIC,
7094         ALC269_FIXUP_PCM_44K,
7095         ALC269_FIXUP_STEREO_DMIC,
7096         ALC269_FIXUP_HEADSET_MIC,
7097         ALC269_FIXUP_QUANTA_MUTE,
7098         ALC269_FIXUP_LIFEBOOK,
7099         ALC269_FIXUP_LIFEBOOK_EXTMIC,
7100         ALC269_FIXUP_LIFEBOOK_HP_PIN,
7101         ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT,
7102         ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC,
7103         ALC269_FIXUP_AMIC,
7104         ALC269_FIXUP_DMIC,
7105         ALC269VB_FIXUP_AMIC,
7106         ALC269VB_FIXUP_DMIC,
7107         ALC269_FIXUP_HP_MUTE_LED,
7108         ALC269_FIXUP_HP_MUTE_LED_MIC1,
7109         ALC269_FIXUP_HP_MUTE_LED_MIC2,
7110         ALC269_FIXUP_HP_MUTE_LED_MIC3,
7111         ALC269_FIXUP_HP_GPIO_LED,
7112         ALC269_FIXUP_HP_GPIO_MIC1_LED,
7113         ALC269_FIXUP_HP_LINE1_MIC1_LED,
7114         ALC269_FIXUP_INV_DMIC,
7115         ALC269_FIXUP_LENOVO_DOCK,
7116         ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST,
7117         ALC269_FIXUP_NO_SHUTUP,
7118         ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
7119         ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
7120         ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
7121         ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
7122         ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
7123         ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
7124         ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET,
7125         ALC269_FIXUP_HEADSET_MODE,
7126         ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
7127         ALC269_FIXUP_ASPIRE_HEADSET_MIC,
7128         ALC269_FIXUP_ASUS_X101_FUNC,
7129         ALC269_FIXUP_ASUS_X101_VERB,
7130         ALC269_FIXUP_ASUS_X101,
7131         ALC271_FIXUP_AMIC_MIC2,
7132         ALC271_FIXUP_HP_GATE_MIC_JACK,
7133         ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572,
7134         ALC269_FIXUP_ACER_AC700,
7135         ALC269_FIXUP_LIMIT_INT_MIC_BOOST,
7136         ALC269VB_FIXUP_ASUS_ZENBOOK,
7137         ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,
7138         ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE,
7139         ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,
7140         ALC269VB_FIXUP_ORDISSIMO_EVE2,
7141         ALC283_FIXUP_CHROME_BOOK,
7142         ALC283_FIXUP_SENSE_COMBO_JACK,
7143         ALC282_FIXUP_ASUS_TX300,
7144         ALC283_FIXUP_INT_MIC,
7145         ALC290_FIXUP_MONO_SPEAKERS,
7146         ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
7147         ALC290_FIXUP_SUBWOOFER,
7148         ALC290_FIXUP_SUBWOOFER_HSJACK,
7149         ALC269_FIXUP_THINKPAD_ACPI,
7150         ALC269_FIXUP_DMIC_THINKPAD_ACPI,
7151         ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
7152         ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
7153         ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7154         ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
7155         ALC255_FIXUP_HEADSET_MODE,
7156         ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
7157         ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
7158         ALC292_FIXUP_TPT440_DOCK,
7159         ALC292_FIXUP_TPT440,
7160         ALC283_FIXUP_HEADSET_MIC,
7161         ALC255_FIXUP_MIC_MUTE_LED,
7162         ALC282_FIXUP_ASPIRE_V5_PINS,
7163         ALC269VB_FIXUP_ASPIRE_E1_COEF,
7164         ALC280_FIXUP_HP_GPIO4,
7165         ALC286_FIXUP_HP_GPIO_LED,
7166         ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
7167         ALC280_FIXUP_HP_DOCK_PINS,
7168         ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,
7169         ALC280_FIXUP_HP_9480M,
7170         ALC245_FIXUP_HP_X360_AMP,
7171         ALC285_FIXUP_HP_SPECTRE_X360_EB1,
7172         ALC288_FIXUP_DELL_HEADSET_MODE,
7173         ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
7174         ALC288_FIXUP_DELL_XPS_13,
7175         ALC288_FIXUP_DISABLE_AAMIX,
7176         ALC292_FIXUP_DELL_E7X_AAMIX,
7177         ALC292_FIXUP_DELL_E7X,
7178         ALC292_FIXUP_DISABLE_AAMIX,
7179         ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK,
7180         ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
7181         ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
7182         ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
7183         ALC275_FIXUP_DELL_XPS,
7184         ALC293_FIXUP_LENOVO_SPK_NOISE,
7185         ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
7186         ALC255_FIXUP_DELL_SPK_NOISE,
7187         ALC225_FIXUP_DISABLE_MIC_VREF,
7188         ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
7189         ALC295_FIXUP_DISABLE_DAC3,
7190         ALC285_FIXUP_SPEAKER2_TO_DAC1,
7191         ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1,
7192         ALC285_FIXUP_ASUS_HEADSET_MIC,
7193         ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS,
7194         ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1,
7195         ALC285_FIXUP_ASUS_I2C_HEADSET_MIC,
7196         ALC280_FIXUP_HP_HEADSET_MIC,
7197         ALC221_FIXUP_HP_FRONT_MIC,
7198         ALC292_FIXUP_TPT460,
7199         ALC298_FIXUP_SPK_VOLUME,
7200         ALC298_FIXUP_LENOVO_SPK_VOLUME,
7201         ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER,
7202         ALC269_FIXUP_ATIV_BOOK_8,
7203         ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE,
7204         ALC221_FIXUP_HP_MIC_NO_PRESENCE,
7205         ALC256_FIXUP_ASUS_HEADSET_MODE,
7206         ALC256_FIXUP_ASUS_MIC,
7207         ALC256_FIXUP_ASUS_AIO_GPIO2,
7208         ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,
7209         ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,
7210         ALC233_FIXUP_LENOVO_MULTI_CODECS,
7211         ALC233_FIXUP_ACER_HEADSET_MIC,
7212         ALC294_FIXUP_LENOVO_MIC_LOCATION,
7213         ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE,
7214         ALC225_FIXUP_S3_POP_NOISE,
7215         ALC700_FIXUP_INTEL_REFERENCE,
7216         ALC274_FIXUP_DELL_BIND_DACS,
7217         ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
7218         ALC298_FIXUP_TPT470_DOCK_FIX,
7219         ALC298_FIXUP_TPT470_DOCK,
7220         ALC255_FIXUP_DUMMY_LINEOUT_VERB,
7221         ALC255_FIXUP_DELL_HEADSET_MIC,
7222         ALC256_FIXUP_HUAWEI_MACH_WX9_PINS,
7223         ALC298_FIXUP_HUAWEI_MBX_STEREO,
7224         ALC295_FIXUP_HP_X360,
7225         ALC221_FIXUP_HP_HEADSET_MIC,
7226         ALC285_FIXUP_LENOVO_HEADPHONE_NOISE,
7227         ALC295_FIXUP_HP_AUTO_MUTE,
7228         ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
7229         ALC294_FIXUP_ASUS_MIC,
7230         ALC294_FIXUP_ASUS_HEADSET_MIC,
7231         ALC294_FIXUP_ASUS_SPK,
7232         ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
7233         ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
7234         ALC255_FIXUP_ACER_HEADSET_MIC,
7235         ALC295_FIXUP_CHROME_BOOK,
7236         ALC225_FIXUP_HEADSET_JACK,
7237         ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE,
7238         ALC225_FIXUP_WYSE_AUTO_MUTE,
7239         ALC225_FIXUP_WYSE_DISABLE_MIC_VREF,
7240         ALC286_FIXUP_ACER_AIO_HEADSET_MIC,
7241         ALC256_FIXUP_ASUS_HEADSET_MIC,
7242         ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
7243         ALC299_FIXUP_PREDATOR_SPK,
7244         ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE,
7245         ALC289_FIXUP_DELL_SPK2,
7246         ALC289_FIXUP_DUAL_SPK,
7247         ALC294_FIXUP_SPK2_TO_DAC1,
7248         ALC294_FIXUP_ASUS_DUAL_SPK,
7249         ALC285_FIXUP_THINKPAD_X1_GEN7,
7250         ALC285_FIXUP_THINKPAD_HEADSET_JACK,
7251         ALC294_FIXUP_ASUS_ALLY,
7252         ALC294_FIXUP_ASUS_ALLY_PINS,
7253         ALC294_FIXUP_ASUS_ALLY_VERBS,
7254         ALC294_FIXUP_ASUS_ALLY_SPEAKER,
7255         ALC294_FIXUP_ASUS_HPE,
7256         ALC294_FIXUP_ASUS_COEF_1B,
7257         ALC294_FIXUP_ASUS_GX502_HP,
7258         ALC294_FIXUP_ASUS_GX502_PINS,
7259         ALC294_FIXUP_ASUS_GX502_VERBS,
7260         ALC294_FIXUP_ASUS_GU502_HP,
7261         ALC294_FIXUP_ASUS_GU502_PINS,
7262         ALC294_FIXUP_ASUS_GU502_VERBS,
7263         ALC294_FIXUP_ASUS_G513_PINS,
7264         ALC285_FIXUP_ASUS_G533Z_PINS,
7265         ALC285_FIXUP_HP_GPIO_LED,
7266         ALC285_FIXUP_HP_MUTE_LED,
7267         ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED,
7268         ALC236_FIXUP_HP_MUTE_LED_COEFBIT2,
7269         ALC236_FIXUP_HP_GPIO_LED,
7270         ALC236_FIXUP_HP_MUTE_LED,
7271         ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
7272         ALC298_FIXUP_SAMSUNG_AMP,
7273         ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
7274         ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
7275         ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
7276         ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS,
7277         ALC269VC_FIXUP_ACER_HEADSET_MIC,
7278         ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE,
7279         ALC289_FIXUP_ASUS_GA401,
7280         ALC289_FIXUP_ASUS_GA502,
7281         ALC256_FIXUP_ACER_MIC_NO_PRESENCE,
7282         ALC285_FIXUP_HP_GPIO_AMP_INIT,
7283         ALC269_FIXUP_CZC_B20,
7284         ALC269_FIXUP_CZC_TMI,
7285         ALC269_FIXUP_CZC_L101,
7286         ALC269_FIXUP_LEMOTE_A1802,
7287         ALC269_FIXUP_LEMOTE_A190X,
7288         ALC256_FIXUP_INTEL_NUC8_RUGGED,
7289         ALC233_FIXUP_INTEL_NUC8_DMIC,
7290         ALC233_FIXUP_INTEL_NUC8_BOOST,
7291         ALC256_FIXUP_INTEL_NUC10,
7292         ALC255_FIXUP_XIAOMI_HEADSET_MIC,
7293         ALC274_FIXUP_HP_MIC,
7294         ALC274_FIXUP_HP_HEADSET_MIC,
7295         ALC274_FIXUP_HP_ENVY_GPIO,
7296         ALC256_FIXUP_ASUS_HPE,
7297         ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
7298         ALC287_FIXUP_HP_GPIO_LED,
7299         ALC256_FIXUP_HP_HEADSET_MIC,
7300         ALC245_FIXUP_HP_GPIO_LED,
7301         ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
7302         ALC282_FIXUP_ACER_DISABLE_LINEOUT,
7303         ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST,
7304         ALC256_FIXUP_ACER_HEADSET_MIC,
7305         ALC285_FIXUP_IDEAPAD_S740_COEF,
7306         ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST,
7307         ALC295_FIXUP_ASUS_DACS,
7308         ALC295_FIXUP_HP_OMEN,
7309         ALC285_FIXUP_HP_SPECTRE_X360,
7310         ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP,
7311         ALC623_FIXUP_LENOVO_THINKSTATION_P340,
7312         ALC255_FIXUP_ACER_HEADPHONE_AND_MIC,
7313         ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST,
7314         ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS,
7315         ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
7316         ALC287_FIXUP_YOGA7_14ITL_SPEAKERS,
7317         ALC298_FIXUP_LENOVO_C940_DUET7,
7318         ALC287_FIXUP_13S_GEN2_SPEAKERS,
7319         ALC256_FIXUP_SET_COEF_DEFAULTS,
7320         ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
7321         ALC233_FIXUP_NO_AUDIO_JACK,
7322         ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME,
7323         ALC285_FIXUP_LEGION_Y9000X_SPEAKERS,
7324         ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
7325         ALC287_FIXUP_LEGION_16ACHG6,
7326         ALC287_FIXUP_CS35L41_I2C_2,
7327         ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED,
7328         ALC245_FIXUP_CS35L41_SPI_2,
7329         ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED,
7330         ALC245_FIXUP_CS35L41_SPI_4,
7331         ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED,
7332         ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED,
7333         ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE,
7334         ALC287_FIXUP_LEGION_16ITHG6,
7335         ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK,
7336         ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN,
7337         ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS,
7338         ALC236_FIXUP_DELL_DUAL_CODECS,
7339         ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI,
7340         ALC287_FIXUP_TAS2781_I2C,
7341         ALC245_FIXUP_HP_MUTE_LED_COEFBIT,
7342         ALC245_FIXUP_HP_X360_MUTE_LEDS,
7343         ALC287_FIXUP_THINKPAD_I2S_SPK,
7344 };
7345
7346 /* A special fixup for Lenovo C940 and Yoga Duet 7;
7347  * both have the very same PCI SSID, and we need to apply different fixups
7348  * depending on the codec ID
7349  */
7350 static void alc298_fixup_lenovo_c940_duet7(struct hda_codec *codec,
7351                                            const struct hda_fixup *fix,
7352                                            int action)
7353 {
7354         int id;
7355
7356         if (codec->core.vendor_id == 0x10ec0298)
7357                 id = ALC298_FIXUP_LENOVO_SPK_VOLUME; /* C940 */
7358         else
7359                 id = ALC287_FIXUP_YOGA7_14ITL_SPEAKERS; /* Duet 7 */
7360         __snd_hda_apply_fixup(codec, id, action, 0);
7361 }
7362
7363 static const struct hda_fixup alc269_fixups[] = {
7364         [ALC269_FIXUP_GPIO2] = {
7365                 .type = HDA_FIXUP_FUNC,
7366                 .v.func = alc_fixup_gpio2,
7367         },
7368         [ALC269_FIXUP_SONY_VAIO] = {
7369                 .type = HDA_FIXUP_PINCTLS,
7370                 .v.pins = (const struct hda_pintbl[]) {
7371                         {0x19, PIN_VREFGRD},
7372                         {}
7373                 }
7374         },
7375         [ALC275_FIXUP_SONY_VAIO_GPIO2] = {
7376                 .type = HDA_FIXUP_FUNC,
7377                 .v.func = alc275_fixup_gpio4_off,
7378                 .chained = true,
7379                 .chain_id = ALC269_FIXUP_SONY_VAIO
7380         },
7381         [ALC269_FIXUP_DELL_M101Z] = {
7382                 .type = HDA_FIXUP_VERBS,
7383                 .v.verbs = (const struct hda_verb[]) {
7384                         /* Enables internal speaker */
7385                         {0x20, AC_VERB_SET_COEF_INDEX, 13},
7386                         {0x20, AC_VERB_SET_PROC_COEF, 0x4040},
7387                         {}
7388                 }
7389         },
7390         [ALC269_FIXUP_SKU_IGNORE] = {
7391                 .type = HDA_FIXUP_FUNC,
7392                 .v.func = alc_fixup_sku_ignore,
7393         },
7394         [ALC269_FIXUP_ASUS_G73JW] = {
7395                 .type = HDA_FIXUP_PINS,
7396                 .v.pins = (const struct hda_pintbl[]) {
7397                         { 0x17, 0x99130111 }, /* subwoofer */
7398                         { }
7399                 }
7400         },
7401         [ALC269_FIXUP_ASUS_N7601ZM_PINS] = {
7402                 .type = HDA_FIXUP_PINS,
7403                 .v.pins = (const struct hda_pintbl[]) {
7404                         { 0x19, 0x03A11050 },
7405                         { 0x1a, 0x03A11C30 },
7406                         { 0x21, 0x03211420 },
7407                         { }
7408                 }
7409         },
7410         [ALC269_FIXUP_ASUS_N7601ZM] = {
7411                 .type = HDA_FIXUP_VERBS,
7412                 .v.verbs = (const struct hda_verb[]) {
7413                         {0x20, AC_VERB_SET_COEF_INDEX, 0x62},
7414                         {0x20, AC_VERB_SET_PROC_COEF, 0xa007},
7415                         {0x20, AC_VERB_SET_COEF_INDEX, 0x10},
7416                         {0x20, AC_VERB_SET_PROC_COEF, 0x8420},
7417                         {0x20, AC_VERB_SET_COEF_INDEX, 0x0f},
7418                         {0x20, AC_VERB_SET_PROC_COEF, 0x7774},
7419                         { }
7420                 },
7421                 .chained = true,
7422                 .chain_id = ALC269_FIXUP_ASUS_N7601ZM_PINS,
7423         },
7424         [ALC269_FIXUP_LENOVO_EAPD] = {
7425                 .type = HDA_FIXUP_VERBS,
7426                 .v.verbs = (const struct hda_verb[]) {
7427                         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
7428                         {}
7429                 }
7430         },
7431         [ALC275_FIXUP_SONY_HWEQ] = {
7432                 .type = HDA_FIXUP_FUNC,
7433                 .v.func = alc269_fixup_hweq,
7434                 .chained = true,
7435                 .chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
7436         },
7437         [ALC275_FIXUP_SONY_DISABLE_AAMIX] = {
7438                 .type = HDA_FIXUP_FUNC,
7439                 .v.func = alc_fixup_disable_aamix,
7440                 .chained = true,
7441                 .chain_id = ALC269_FIXUP_SONY_VAIO
7442         },
7443         [ALC271_FIXUP_DMIC] = {
7444                 .type = HDA_FIXUP_FUNC,
7445                 .v.func = alc271_fixup_dmic,
7446         },
7447         [ALC269_FIXUP_PCM_44K] = {
7448                 .type = HDA_FIXUP_FUNC,
7449                 .v.func = alc269_fixup_pcm_44k,
7450                 .chained = true,
7451                 .chain_id = ALC269_FIXUP_QUANTA_MUTE
7452         },
7453         [ALC269_FIXUP_STEREO_DMIC] = {
7454                 .type = HDA_FIXUP_FUNC,
7455                 .v.func = alc269_fixup_stereo_dmic,
7456         },
7457         [ALC269_FIXUP_HEADSET_MIC] = {
7458                 .type = HDA_FIXUP_FUNC,
7459                 .v.func = alc269_fixup_headset_mic,
7460         },
7461         [ALC269_FIXUP_QUANTA_MUTE] = {
7462                 .type = HDA_FIXUP_FUNC,
7463                 .v.func = alc269_fixup_quanta_mute,
7464         },
7465         [ALC269_FIXUP_LIFEBOOK] = {
7466                 .type = HDA_FIXUP_PINS,
7467                 .v.pins = (const struct hda_pintbl[]) {
7468                         { 0x1a, 0x2101103f }, /* dock line-out */
7469                         { 0x1b, 0x23a11040 }, /* dock mic-in */
7470                         { }
7471                 },
7472                 .chained = true,
7473                 .chain_id = ALC269_FIXUP_QUANTA_MUTE
7474         },
7475         [ALC269_FIXUP_LIFEBOOK_EXTMIC] = {
7476                 .type = HDA_FIXUP_PINS,
7477                 .v.pins = (const struct hda_pintbl[]) {
7478                         { 0x19, 0x01a1903c }, /* headset mic, with jack detect */
7479                         { }
7480                 },
7481         },
7482         [ALC269_FIXUP_LIFEBOOK_HP_PIN] = {
7483                 .type = HDA_FIXUP_PINS,
7484                 .v.pins = (const struct hda_pintbl[]) {
7485                         { 0x21, 0x0221102f }, /* HP out */
7486                         { }
7487                 },
7488         },
7489         [ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT] = {
7490                 .type = HDA_FIXUP_FUNC,
7491                 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
7492         },
7493         [ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = {
7494                 .type = HDA_FIXUP_FUNC,
7495                 .v.func = alc269_fixup_pincfg_U7x7_headset_mic,
7496         },
7497         [ALC269_FIXUP_AMIC] = {
7498                 .type = HDA_FIXUP_PINS,
7499                 .v.pins = (const struct hda_pintbl[]) {
7500                         { 0x14, 0x99130110 }, /* speaker */
7501                         { 0x15, 0x0121401f }, /* HP out */
7502                         { 0x18, 0x01a19c20 }, /* mic */
7503                         { 0x19, 0x99a3092f }, /* int-mic */
7504                         { }
7505                 },
7506         },
7507         [ALC269_FIXUP_DMIC] = {
7508                 .type = HDA_FIXUP_PINS,
7509                 .v.pins = (const struct hda_pintbl[]) {
7510                         { 0x12, 0x99a3092f }, /* int-mic */
7511                         { 0x14, 0x99130110 }, /* speaker */
7512                         { 0x15, 0x0121401f }, /* HP out */
7513                         { 0x18, 0x01a19c20 }, /* mic */
7514                         { }
7515                 },
7516         },
7517         [ALC269VB_FIXUP_AMIC] = {
7518                 .type = HDA_FIXUP_PINS,
7519                 .v.pins = (const struct hda_pintbl[]) {
7520                         { 0x14, 0x99130110 }, /* speaker */
7521                         { 0x18, 0x01a19c20 }, /* mic */
7522                         { 0x19, 0x99a3092f }, /* int-mic */
7523                         { 0x21, 0x0121401f }, /* HP out */
7524                         { }
7525                 },
7526         },
7527         [ALC269VB_FIXUP_DMIC] = {
7528                 .type = HDA_FIXUP_PINS,
7529                 .v.pins = (const struct hda_pintbl[]) {
7530                         { 0x12, 0x99a3092f }, /* int-mic */
7531                         { 0x14, 0x99130110 }, /* speaker */
7532                         { 0x18, 0x01a19c20 }, /* mic */
7533                         { 0x21, 0x0121401f }, /* HP out */
7534                         { }
7535                 },
7536         },
7537         [ALC269_FIXUP_HP_MUTE_LED] = {
7538                 .type = HDA_FIXUP_FUNC,
7539                 .v.func = alc269_fixup_hp_mute_led,
7540         },
7541         [ALC269_FIXUP_HP_MUTE_LED_MIC1] = {
7542                 .type = HDA_FIXUP_FUNC,
7543                 .v.func = alc269_fixup_hp_mute_led_mic1,
7544         },
7545         [ALC269_FIXUP_HP_MUTE_LED_MIC2] = {
7546                 .type = HDA_FIXUP_FUNC,
7547                 .v.func = alc269_fixup_hp_mute_led_mic2,
7548         },
7549         [ALC269_FIXUP_HP_MUTE_LED_MIC3] = {
7550                 .type = HDA_FIXUP_FUNC,
7551                 .v.func = alc269_fixup_hp_mute_led_mic3,
7552                 .chained = true,
7553                 .chain_id = ALC295_FIXUP_HP_AUTO_MUTE
7554         },
7555         [ALC269_FIXUP_HP_GPIO_LED] = {
7556                 .type = HDA_FIXUP_FUNC,
7557                 .v.func = alc269_fixup_hp_gpio_led,
7558         },
7559         [ALC269_FIXUP_HP_GPIO_MIC1_LED] = {
7560                 .type = HDA_FIXUP_FUNC,
7561                 .v.func = alc269_fixup_hp_gpio_mic1_led,
7562         },
7563         [ALC269_FIXUP_HP_LINE1_MIC1_LED] = {
7564                 .type = HDA_FIXUP_FUNC,
7565                 .v.func = alc269_fixup_hp_line1_mic1_led,
7566         },
7567         [ALC269_FIXUP_INV_DMIC] = {
7568                 .type = HDA_FIXUP_FUNC,
7569                 .v.func = alc_fixup_inv_dmic,
7570         },
7571         [ALC269_FIXUP_NO_SHUTUP] = {
7572                 .type = HDA_FIXUP_FUNC,
7573                 .v.func = alc_fixup_no_shutup,
7574         },
7575         [ALC269_FIXUP_LENOVO_DOCK] = {
7576                 .type = HDA_FIXUP_PINS,
7577                 .v.pins = (const struct hda_pintbl[]) {
7578                         { 0x19, 0x23a11040 }, /* dock mic */
7579                         { 0x1b, 0x2121103f }, /* dock headphone */
7580                         { }
7581                 },
7582                 .chained = true,
7583                 .chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT
7584         },
7585         [ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST] = {
7586                 .type = HDA_FIXUP_FUNC,
7587                 .v.func = alc269_fixup_limit_int_mic_boost,
7588                 .chained = true,
7589                 .chain_id = ALC269_FIXUP_LENOVO_DOCK,
7590         },
7591         [ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = {
7592                 .type = HDA_FIXUP_FUNC,
7593                 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
7594                 .chained = true,
7595                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
7596         },
7597         [ALC269_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7598                 .type = HDA_FIXUP_PINS,
7599                 .v.pins = (const struct hda_pintbl[]) {
7600                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7601                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7602                         { }
7603                 },
7604                 .chained = true,
7605                 .chain_id = ALC269_FIXUP_HEADSET_MODE
7606         },
7607         [ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {
7608                 .type = HDA_FIXUP_PINS,
7609                 .v.pins = (const struct hda_pintbl[]) {
7610                         { 0x16, 0x21014020 }, /* dock line out */
7611                         { 0x19, 0x21a19030 }, /* dock mic */
7612                         { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7613                         { }
7614                 },
7615                 .chained = true,
7616                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7617         },
7618         [ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = {
7619                 .type = HDA_FIXUP_PINS,
7620                 .v.pins = (const struct hda_pintbl[]) {
7621                         { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7622                         { }
7623                 },
7624                 .chained = true,
7625                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7626         },
7627         [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = {
7628                 .type = HDA_FIXUP_PINS,
7629                 .v.pins = (const struct hda_pintbl[]) {
7630                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7631                         { 0x1b, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7632                         { }
7633                 },
7634                 .chained = true,
7635                 .chain_id = ALC269_FIXUP_HEADSET_MODE
7636         },
7637         [ALC269_FIXUP_HEADSET_MODE] = {
7638                 .type = HDA_FIXUP_FUNC,
7639                 .v.func = alc_fixup_headset_mode,
7640                 .chained = true,
7641                 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
7642         },
7643         [ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
7644                 .type = HDA_FIXUP_FUNC,
7645                 .v.func = alc_fixup_headset_mode_no_hp_mic,
7646         },
7647         [ALC269_FIXUP_ASPIRE_HEADSET_MIC] = {
7648                 .type = HDA_FIXUP_PINS,
7649                 .v.pins = (const struct hda_pintbl[]) {
7650                         { 0x19, 0x01a1913c }, /* headset mic w/o jack detect */
7651                         { }
7652                 },
7653                 .chained = true,
7654                 .chain_id = ALC269_FIXUP_HEADSET_MODE,
7655         },
7656         [ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {
7657                 .type = HDA_FIXUP_PINS,
7658                 .v.pins = (const struct hda_pintbl[]) {
7659                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7660                         { }
7661                 },
7662                 .chained = true,
7663                 .chain_id = ALC269_FIXUP_HEADSET_MIC
7664         },
7665         [ALC256_FIXUP_HUAWEI_MACH_WX9_PINS] = {
7666                 .type = HDA_FIXUP_PINS,
7667                 .v.pins = (const struct hda_pintbl[]) {
7668                         {0x12, 0x90a60130},
7669                         {0x13, 0x40000000},
7670                         {0x14, 0x90170110},
7671                         {0x18, 0x411111f0},
7672                         {0x19, 0x04a11040},
7673                         {0x1a, 0x411111f0},
7674                         {0x1b, 0x90170112},
7675                         {0x1d, 0x40759a05},
7676                         {0x1e, 0x411111f0},
7677                         {0x21, 0x04211020},
7678                         { }
7679                 },
7680                 .chained = true,
7681                 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
7682         },
7683         [ALC298_FIXUP_HUAWEI_MBX_STEREO] = {
7684                 .type = HDA_FIXUP_FUNC,
7685                 .v.func = alc298_fixup_huawei_mbx_stereo,
7686                 .chained = true,
7687                 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
7688         },
7689         [ALC269_FIXUP_ASUS_X101_FUNC] = {
7690                 .type = HDA_FIXUP_FUNC,
7691                 .v.func = alc269_fixup_x101_headset_mic,
7692         },
7693         [ALC269_FIXUP_ASUS_X101_VERB] = {
7694                 .type = HDA_FIXUP_VERBS,
7695                 .v.verbs = (const struct hda_verb[]) {
7696                         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
7697                         {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
7698                         {0x20, AC_VERB_SET_PROC_COEF,  0x0310},
7699                         { }
7700                 },
7701                 .chained = true,
7702                 .chain_id = ALC269_FIXUP_ASUS_X101_FUNC
7703         },
7704         [ALC269_FIXUP_ASUS_X101] = {
7705                 .type = HDA_FIXUP_PINS,
7706                 .v.pins = (const struct hda_pintbl[]) {
7707                         { 0x18, 0x04a1182c }, /* Headset mic */
7708                         { }
7709                 },
7710                 .chained = true,
7711                 .chain_id = ALC269_FIXUP_ASUS_X101_VERB
7712         },
7713         [ALC271_FIXUP_AMIC_MIC2] = {
7714                 .type = HDA_FIXUP_PINS,
7715                 .v.pins = (const struct hda_pintbl[]) {
7716                         { 0x14, 0x99130110 }, /* speaker */
7717                         { 0x19, 0x01a19c20 }, /* mic */
7718                         { 0x1b, 0x99a7012f }, /* int-mic */
7719                         { 0x21, 0x0121401f }, /* HP out */
7720                         { }
7721                 },
7722         },
7723         [ALC271_FIXUP_HP_GATE_MIC_JACK] = {
7724                 .type = HDA_FIXUP_FUNC,
7725                 .v.func = alc271_hp_gate_mic_jack,
7726                 .chained = true,
7727                 .chain_id = ALC271_FIXUP_AMIC_MIC2,
7728         },
7729         [ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572] = {
7730                 .type = HDA_FIXUP_FUNC,
7731                 .v.func = alc269_fixup_limit_int_mic_boost,
7732                 .chained = true,
7733                 .chain_id = ALC271_FIXUP_HP_GATE_MIC_JACK,
7734         },
7735         [ALC269_FIXUP_ACER_AC700] = {
7736                 .type = HDA_FIXUP_PINS,
7737                 .v.pins = (const struct hda_pintbl[]) {
7738                         { 0x12, 0x99a3092f }, /* int-mic */
7739                         { 0x14, 0x99130110 }, /* speaker */
7740                         { 0x18, 0x03a11c20 }, /* mic */
7741                         { 0x1e, 0x0346101e }, /* SPDIF1 */
7742                         { 0x21, 0x0321101f }, /* HP out */
7743                         { }
7744                 },
7745                 .chained = true,
7746                 .chain_id = ALC271_FIXUP_DMIC,
7747         },
7748         [ALC269_FIXUP_LIMIT_INT_MIC_BOOST] = {
7749                 .type = HDA_FIXUP_FUNC,
7750                 .v.func = alc269_fixup_limit_int_mic_boost,
7751                 .chained = true,
7752                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
7753         },
7754         [ALC269VB_FIXUP_ASUS_ZENBOOK] = {
7755                 .type = HDA_FIXUP_FUNC,
7756                 .v.func = alc269_fixup_limit_int_mic_boost,
7757                 .chained = true,
7758                 .chain_id = ALC269VB_FIXUP_DMIC,
7759         },
7760         [ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A] = {
7761                 .type = HDA_FIXUP_VERBS,
7762                 .v.verbs = (const struct hda_verb[]) {
7763                         /* class-D output amp +5dB */
7764                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x12 },
7765                         { 0x20, AC_VERB_SET_PROC_COEF, 0x2800 },
7766                         {}
7767                 },
7768                 .chained = true,
7769                 .chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,
7770         },
7771         [ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7772                 .type = HDA_FIXUP_PINS,
7773                 .v.pins = (const struct hda_pintbl[]) {
7774                         { 0x18, 0x01a110f0 },  /* use as headset mic */
7775                         { }
7776                 },
7777                 .chained = true,
7778                 .chain_id = ALC269_FIXUP_HEADSET_MIC
7779         },
7780         [ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {
7781                 .type = HDA_FIXUP_FUNC,
7782                 .v.func = alc269_fixup_limit_int_mic_boost,
7783                 .chained = true,
7784                 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC1,
7785         },
7786         [ALC269VB_FIXUP_ORDISSIMO_EVE2] = {
7787                 .type = HDA_FIXUP_PINS,
7788                 .v.pins = (const struct hda_pintbl[]) {
7789                         { 0x12, 0x99a3092f }, /* int-mic */
7790                         { 0x18, 0x03a11d20 }, /* mic */
7791                         { 0x19, 0x411111f0 }, /* Unused bogus pin */
7792                         { }
7793                 },
7794         },
7795         [ALC283_FIXUP_CHROME_BOOK] = {
7796                 .type = HDA_FIXUP_FUNC,
7797                 .v.func = alc283_fixup_chromebook,
7798         },
7799         [ALC283_FIXUP_SENSE_COMBO_JACK] = {
7800                 .type = HDA_FIXUP_FUNC,
7801                 .v.func = alc283_fixup_sense_combo_jack,
7802                 .chained = true,
7803                 .chain_id = ALC283_FIXUP_CHROME_BOOK,
7804         },
7805         [ALC282_FIXUP_ASUS_TX300] = {
7806                 .type = HDA_FIXUP_FUNC,
7807                 .v.func = alc282_fixup_asus_tx300,
7808         },
7809         [ALC283_FIXUP_INT_MIC] = {
7810                 .type = HDA_FIXUP_VERBS,
7811                 .v.verbs = (const struct hda_verb[]) {
7812                         {0x20, AC_VERB_SET_COEF_INDEX, 0x1a},
7813                         {0x20, AC_VERB_SET_PROC_COEF, 0x0011},
7814                         { }
7815                 },
7816                 .chained = true,
7817                 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
7818         },
7819         [ALC290_FIXUP_SUBWOOFER_HSJACK] = {
7820                 .type = HDA_FIXUP_PINS,
7821                 .v.pins = (const struct hda_pintbl[]) {
7822                         { 0x17, 0x90170112 }, /* subwoofer */
7823                         { }
7824                 },
7825                 .chained = true,
7826                 .chain_id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
7827         },
7828         [ALC290_FIXUP_SUBWOOFER] = {
7829                 .type = HDA_FIXUP_PINS,
7830                 .v.pins = (const struct hda_pintbl[]) {
7831                         { 0x17, 0x90170112 }, /* subwoofer */
7832                         { }
7833                 },
7834                 .chained = true,
7835                 .chain_id = ALC290_FIXUP_MONO_SPEAKERS,
7836         },
7837         [ALC290_FIXUP_MONO_SPEAKERS] = {
7838                 .type = HDA_FIXUP_FUNC,
7839                 .v.func = alc290_fixup_mono_speakers,
7840         },
7841         [ALC290_FIXUP_MONO_SPEAKERS_HSJACK] = {
7842                 .type = HDA_FIXUP_FUNC,
7843                 .v.func = alc290_fixup_mono_speakers,
7844                 .chained = true,
7845                 .chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
7846         },
7847         [ALC269_FIXUP_THINKPAD_ACPI] = {
7848                 .type = HDA_FIXUP_FUNC,
7849                 .v.func = alc_fixup_thinkpad_acpi,
7850                 .chained = true,
7851                 .chain_id = ALC269_FIXUP_SKU_IGNORE,
7852         },
7853         [ALC269_FIXUP_DMIC_THINKPAD_ACPI] = {
7854                 .type = HDA_FIXUP_FUNC,
7855                 .v.func = alc_fixup_inv_dmic,
7856                 .chained = true,
7857                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
7858         },
7859         [ALC255_FIXUP_ACER_MIC_NO_PRESENCE] = {
7860                 .type = HDA_FIXUP_PINS,
7861                 .v.pins = (const struct hda_pintbl[]) {
7862                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7863                         { }
7864                 },
7865                 .chained = true,
7866                 .chain_id = ALC255_FIXUP_HEADSET_MODE
7867         },
7868         [ALC255_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7869                 .type = HDA_FIXUP_PINS,
7870                 .v.pins = (const struct hda_pintbl[]) {
7871                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7872                         { }
7873                 },
7874                 .chained = true,
7875                 .chain_id = ALC255_FIXUP_HEADSET_MODE
7876         },
7877         [ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7878                 .type = HDA_FIXUP_PINS,
7879                 .v.pins = (const struct hda_pintbl[]) {
7880                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7881                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7882                         { }
7883                 },
7884                 .chained = true,
7885                 .chain_id = ALC255_FIXUP_HEADSET_MODE
7886         },
7887         [ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {
7888                 .type = HDA_FIXUP_PINS,
7889                 .v.pins = (const struct hda_pintbl[]) {
7890                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7891                         { }
7892                 },
7893                 .chained = true,
7894                 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
7895         },
7896         [ALC255_FIXUP_HEADSET_MODE] = {
7897                 .type = HDA_FIXUP_FUNC,
7898                 .v.func = alc_fixup_headset_mode_alc255,
7899                 .chained = true,
7900                 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
7901         },
7902         [ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
7903                 .type = HDA_FIXUP_FUNC,
7904                 .v.func = alc_fixup_headset_mode_alc255_no_hp_mic,
7905         },
7906         [ALC293_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7907                 .type = HDA_FIXUP_PINS,
7908                 .v.pins = (const struct hda_pintbl[]) {
7909                         { 0x18, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7910                         { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7911                         { }
7912                 },
7913                 .chained = true,
7914                 .chain_id = ALC269_FIXUP_HEADSET_MODE
7915         },
7916         [ALC292_FIXUP_TPT440_DOCK] = {
7917                 .type = HDA_FIXUP_FUNC,
7918                 .v.func = alc_fixup_tpt440_dock,
7919                 .chained = true,
7920                 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
7921         },
7922         [ALC292_FIXUP_TPT440] = {
7923                 .type = HDA_FIXUP_FUNC,
7924                 .v.func = alc_fixup_disable_aamix,
7925                 .chained = true,
7926                 .chain_id = ALC292_FIXUP_TPT440_DOCK,
7927         },
7928         [ALC283_FIXUP_HEADSET_MIC] = {
7929                 .type = HDA_FIXUP_PINS,
7930                 .v.pins = (const struct hda_pintbl[]) {
7931                         { 0x19, 0x04a110f0 },
7932                         { },
7933                 },
7934         },
7935         [ALC255_FIXUP_MIC_MUTE_LED] = {
7936                 .type = HDA_FIXUP_FUNC,
7937                 .v.func = alc_fixup_micmute_led,
7938         },
7939         [ALC282_FIXUP_ASPIRE_V5_PINS] = {
7940                 .type = HDA_FIXUP_PINS,
7941                 .v.pins = (const struct hda_pintbl[]) {
7942                         { 0x12, 0x90a60130 },
7943                         { 0x14, 0x90170110 },
7944                         { 0x17, 0x40000008 },
7945                         { 0x18, 0x411111f0 },
7946                         { 0x19, 0x01a1913c },
7947                         { 0x1a, 0x411111f0 },
7948                         { 0x1b, 0x411111f0 },
7949                         { 0x1d, 0x40f89b2d },
7950                         { 0x1e, 0x411111f0 },
7951                         { 0x21, 0x0321101f },
7952                         { },
7953                 },
7954         },
7955         [ALC269VB_FIXUP_ASPIRE_E1_COEF] = {
7956                 .type = HDA_FIXUP_FUNC,
7957                 .v.func = alc269vb_fixup_aspire_e1_coef,
7958         },
7959         [ALC280_FIXUP_HP_GPIO4] = {
7960                 .type = HDA_FIXUP_FUNC,
7961                 .v.func = alc280_fixup_hp_gpio4,
7962         },
7963         [ALC286_FIXUP_HP_GPIO_LED] = {
7964                 .type = HDA_FIXUP_FUNC,
7965                 .v.func = alc286_fixup_hp_gpio_led,
7966         },
7967         [ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY] = {
7968                 .type = HDA_FIXUP_FUNC,
7969                 .v.func = alc280_fixup_hp_gpio2_mic_hotkey,
7970         },
7971         [ALC280_FIXUP_HP_DOCK_PINS] = {
7972                 .type = HDA_FIXUP_PINS,
7973                 .v.pins = (const struct hda_pintbl[]) {
7974                         { 0x1b, 0x21011020 }, /* line-out */
7975                         { 0x1a, 0x01a1903c }, /* headset mic */
7976                         { 0x18, 0x2181103f }, /* line-in */
7977                         { },
7978                 },
7979                 .chained = true,
7980                 .chain_id = ALC280_FIXUP_HP_GPIO4
7981         },
7982         [ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {
7983                 .type = HDA_FIXUP_PINS,
7984                 .v.pins = (const struct hda_pintbl[]) {
7985                         { 0x1b, 0x21011020 }, /* line-out */
7986                         { 0x18, 0x2181103f }, /* line-in */
7987                         { },
7988                 },
7989                 .chained = true,
7990                 .chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED
7991         },
7992         [ALC280_FIXUP_HP_9480M] = {
7993                 .type = HDA_FIXUP_FUNC,
7994                 .v.func = alc280_fixup_hp_9480m,
7995         },
7996         [ALC245_FIXUP_HP_X360_AMP] = {
7997                 .type = HDA_FIXUP_FUNC,
7998                 .v.func = alc245_fixup_hp_x360_amp,
7999                 .chained = true,
8000                 .chain_id = ALC245_FIXUP_HP_GPIO_LED
8001         },
8002         [ALC288_FIXUP_DELL_HEADSET_MODE] = {
8003                 .type = HDA_FIXUP_FUNC,
8004                 .v.func = alc_fixup_headset_mode_dell_alc288,
8005                 .chained = true,
8006                 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
8007         },
8008         [ALC288_FIXUP_DELL1_MIC_NO_PRESENCE] = {
8009                 .type = HDA_FIXUP_PINS,
8010                 .v.pins = (const struct hda_pintbl[]) {
8011                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8012                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
8013                         { }
8014                 },
8015                 .chained = true,
8016                 .chain_id = ALC288_FIXUP_DELL_HEADSET_MODE
8017         },
8018         [ALC288_FIXUP_DISABLE_AAMIX] = {
8019                 .type = HDA_FIXUP_FUNC,
8020                 .v.func = alc_fixup_disable_aamix,
8021                 .chained = true,
8022                 .chain_id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE
8023         },
8024         [ALC288_FIXUP_DELL_XPS_13] = {
8025                 .type = HDA_FIXUP_FUNC,
8026                 .v.func = alc_fixup_dell_xps13,
8027                 .chained = true,
8028                 .chain_id = ALC288_FIXUP_DISABLE_AAMIX
8029         },
8030         [ALC292_FIXUP_DISABLE_AAMIX] = {
8031                 .type = HDA_FIXUP_FUNC,
8032                 .v.func = alc_fixup_disable_aamix,
8033                 .chained = true,
8034                 .chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE
8035         },
8036         [ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = {
8037                 .type = HDA_FIXUP_FUNC,
8038                 .v.func = alc_fixup_disable_aamix,
8039                 .chained = true,
8040                 .chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE
8041         },
8042         [ALC292_FIXUP_DELL_E7X_AAMIX] = {
8043                 .type = HDA_FIXUP_FUNC,
8044                 .v.func = alc_fixup_dell_xps13,
8045                 .chained = true,
8046                 .chain_id = ALC292_FIXUP_DISABLE_AAMIX
8047         },
8048         [ALC292_FIXUP_DELL_E7X] = {
8049                 .type = HDA_FIXUP_FUNC,
8050                 .v.func = alc_fixup_micmute_led,
8051                 /* micmute fixup must be applied at last */
8052                 .chained_before = true,
8053                 .chain_id = ALC292_FIXUP_DELL_E7X_AAMIX,
8054         },
8055         [ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE] = {
8056                 .type = HDA_FIXUP_PINS,
8057                 .v.pins = (const struct hda_pintbl[]) {
8058                         { 0x18, 0x01a1913c }, /* headset mic w/o jack detect */
8059                         { }
8060                 },
8061                 .chained_before = true,
8062                 .chain_id = ALC269_FIXUP_HEADSET_MODE,
8063         },
8064         [ALC298_FIXUP_DELL1_MIC_NO_PRESENCE] = {
8065                 .type = HDA_FIXUP_PINS,
8066                 .v.pins = (const struct hda_pintbl[]) {
8067                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8068                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
8069                         { }
8070                 },
8071                 .chained = true,
8072                 .chain_id = ALC269_FIXUP_HEADSET_MODE
8073         },
8074         [ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE] = {
8075                 .type = HDA_FIXUP_PINS,
8076                 .v.pins = (const struct hda_pintbl[]) {
8077                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8078                         { }
8079                 },
8080                 .chained = true,
8081                 .chain_id = ALC269_FIXUP_HEADSET_MODE
8082         },
8083         [ALC275_FIXUP_DELL_XPS] = {
8084                 .type = HDA_FIXUP_VERBS,
8085                 .v.verbs = (const struct hda_verb[]) {
8086                         /* Enables internal speaker */
8087                         {0x20, AC_VERB_SET_COEF_INDEX, 0x1f},
8088                         {0x20, AC_VERB_SET_PROC_COEF, 0x00c0},
8089                         {0x20, AC_VERB_SET_COEF_INDEX, 0x30},
8090                         {0x20, AC_VERB_SET_PROC_COEF, 0x00b1},
8091                         {}
8092                 }
8093         },
8094         [ALC293_FIXUP_LENOVO_SPK_NOISE] = {
8095                 .type = HDA_FIXUP_FUNC,
8096                 .v.func = alc_fixup_disable_aamix,
8097                 .chained = true,
8098                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
8099         },
8100         [ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = {
8101                 .type = HDA_FIXUP_FUNC,
8102                 .v.func = alc233_fixup_lenovo_line2_mic_hotkey,
8103         },
8104         [ALC233_FIXUP_INTEL_NUC8_DMIC] = {
8105                 .type = HDA_FIXUP_FUNC,
8106                 .v.func = alc_fixup_inv_dmic,
8107                 .chained = true,
8108                 .chain_id = ALC233_FIXUP_INTEL_NUC8_BOOST,
8109         },
8110         [ALC233_FIXUP_INTEL_NUC8_BOOST] = {
8111                 .type = HDA_FIXUP_FUNC,
8112                 .v.func = alc269_fixup_limit_int_mic_boost
8113         },
8114         [ALC255_FIXUP_DELL_SPK_NOISE] = {
8115                 .type = HDA_FIXUP_FUNC,
8116                 .v.func = alc_fixup_disable_aamix,
8117                 .chained = true,
8118                 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
8119         },
8120         [ALC225_FIXUP_DISABLE_MIC_VREF] = {
8121                 .type = HDA_FIXUP_FUNC,
8122                 .v.func = alc_fixup_disable_mic_vref,
8123                 .chained = true,
8124                 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
8125         },
8126         [ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = {
8127                 .type = HDA_FIXUP_VERBS,
8128                 .v.verbs = (const struct hda_verb[]) {
8129                         /* Disable pass-through path for FRONT 14h */
8130                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
8131                         { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
8132                         {}
8133                 },
8134                 .chained = true,
8135                 .chain_id = ALC225_FIXUP_DISABLE_MIC_VREF
8136         },
8137         [ALC280_FIXUP_HP_HEADSET_MIC] = {
8138                 .type = HDA_FIXUP_FUNC,
8139                 .v.func = alc_fixup_disable_aamix,
8140                 .chained = true,
8141                 .chain_id = ALC269_FIXUP_HEADSET_MIC,
8142         },
8143         [ALC221_FIXUP_HP_FRONT_MIC] = {
8144                 .type = HDA_FIXUP_PINS,
8145                 .v.pins = (const struct hda_pintbl[]) {
8146                         { 0x19, 0x02a19020 }, /* Front Mic */
8147                         { }
8148                 },
8149         },
8150         [ALC292_FIXUP_TPT460] = {
8151                 .type = HDA_FIXUP_FUNC,
8152                 .v.func = alc_fixup_tpt440_dock,
8153                 .chained = true,
8154                 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE,
8155         },
8156         [ALC298_FIXUP_SPK_VOLUME] = {
8157                 .type = HDA_FIXUP_FUNC,
8158                 .v.func = alc298_fixup_speaker_volume,
8159                 .chained = true,
8160                 .chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
8161         },
8162         [ALC298_FIXUP_LENOVO_SPK_VOLUME] = {
8163                 .type = HDA_FIXUP_FUNC,
8164                 .v.func = alc298_fixup_speaker_volume,
8165         },
8166         [ALC295_FIXUP_DISABLE_DAC3] = {
8167                 .type = HDA_FIXUP_FUNC,
8168                 .v.func = alc295_fixup_disable_dac3,
8169         },
8170         [ALC285_FIXUP_SPEAKER2_TO_DAC1] = {
8171                 .type = HDA_FIXUP_FUNC,
8172                 .v.func = alc285_fixup_speaker2_to_dac1,
8173                 .chained = true,
8174                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
8175         },
8176         [ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1] = {
8177                 .type = HDA_FIXUP_FUNC,
8178                 .v.func = alc285_fixup_speaker2_to_dac1,
8179                 .chained = true,
8180                 .chain_id = ALC245_FIXUP_CS35L41_SPI_2
8181         },
8182         [ALC285_FIXUP_ASUS_HEADSET_MIC] = {
8183                 .type = HDA_FIXUP_PINS,
8184                 .v.pins = (const struct hda_pintbl[]) {
8185                         { 0x19, 0x03a11050 },
8186                         { 0x1b, 0x03a11c30 },
8187                         { }
8188                 },
8189                 .chained = true,
8190                 .chain_id = ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1
8191         },
8192         [ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS] = {
8193                 .type = HDA_FIXUP_PINS,
8194                 .v.pins = (const struct hda_pintbl[]) {
8195                         { 0x14, 0x90170120 },
8196                         { }
8197                 },
8198                 .chained = true,
8199                 .chain_id = ALC285_FIXUP_ASUS_HEADSET_MIC
8200         },
8201         [ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1] = {
8202                 .type = HDA_FIXUP_FUNC,
8203                 .v.func = alc285_fixup_speaker2_to_dac1,
8204                 .chained = true,
8205                 .chain_id = ALC287_FIXUP_CS35L41_I2C_2
8206         },
8207         [ALC285_FIXUP_ASUS_I2C_HEADSET_MIC] = {
8208                 .type = HDA_FIXUP_PINS,
8209                 .v.pins = (const struct hda_pintbl[]) {
8210                         { 0x19, 0x03a11050 },
8211                         { 0x1b, 0x03a11c30 },
8212                         { }
8213                 },
8214                 .chained = true,
8215                 .chain_id = ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1
8216         },
8217         [ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
8218                 .type = HDA_FIXUP_PINS,
8219                 .v.pins = (const struct hda_pintbl[]) {
8220                         { 0x1b, 0x90170151 },
8221                         { }
8222                 },
8223                 .chained = true,
8224                 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
8225         },
8226         [ALC269_FIXUP_ATIV_BOOK_8] = {
8227                 .type = HDA_FIXUP_FUNC,
8228                 .v.func = alc_fixup_auto_mute_via_amp,
8229                 .chained = true,
8230                 .chain_id = ALC269_FIXUP_NO_SHUTUP
8231         },
8232         [ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE] = {
8233                 .type = HDA_FIXUP_PINS,
8234                 .v.pins = (const struct hda_pintbl[]) {
8235                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8236                         { 0x1a, 0x01813030 }, /* use as headphone mic, without its own jack detect */
8237                         { }
8238                 },
8239                 .chained = true,
8240                 .chain_id = ALC269_FIXUP_HEADSET_MODE
8241         },
8242         [ALC221_FIXUP_HP_MIC_NO_PRESENCE] = {
8243                 .type = HDA_FIXUP_PINS,
8244                 .v.pins = (const struct hda_pintbl[]) {
8245                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8246                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
8247                         { }
8248                 },
8249                 .chained = true,
8250                 .chain_id = ALC269_FIXUP_HEADSET_MODE
8251         },
8252         [ALC256_FIXUP_ASUS_HEADSET_MODE] = {
8253                 .type = HDA_FIXUP_FUNC,
8254                 .v.func = alc_fixup_headset_mode,
8255         },
8256         [ALC256_FIXUP_ASUS_MIC] = {
8257                 .type = HDA_FIXUP_PINS,
8258                 .v.pins = (const struct hda_pintbl[]) {
8259                         { 0x13, 0x90a60160 }, /* use as internal mic */
8260                         { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
8261                         { }
8262                 },
8263                 .chained = true,
8264                 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8265         },
8266         [ALC256_FIXUP_ASUS_AIO_GPIO2] = {
8267                 .type = HDA_FIXUP_FUNC,
8268                 /* Set up GPIO2 for the speaker amp */
8269                 .v.func = alc_fixup_gpio4,
8270         },
8271         [ALC233_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8272                 .type = HDA_FIXUP_PINS,
8273                 .v.pins = (const struct hda_pintbl[]) {
8274                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8275                         { }
8276                 },
8277                 .chained = true,
8278                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8279         },
8280         [ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE] = {
8281                 .type = HDA_FIXUP_VERBS,
8282                 .v.verbs = (const struct hda_verb[]) {
8283                         /* Enables internal speaker */
8284                         {0x20, AC_VERB_SET_COEF_INDEX, 0x40},
8285                         {0x20, AC_VERB_SET_PROC_COEF, 0x8800},
8286                         {}
8287                 },
8288                 .chained = true,
8289                 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
8290         },
8291         [ALC233_FIXUP_LENOVO_MULTI_CODECS] = {
8292                 .type = HDA_FIXUP_FUNC,
8293                 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
8294                 .chained = true,
8295                 .chain_id = ALC269_FIXUP_GPIO2
8296         },
8297         [ALC233_FIXUP_ACER_HEADSET_MIC] = {
8298                 .type = HDA_FIXUP_VERBS,
8299                 .v.verbs = (const struct hda_verb[]) {
8300                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
8301                         { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
8302                         { }
8303                 },
8304                 .chained = true,
8305                 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
8306         },
8307         [ALC294_FIXUP_LENOVO_MIC_LOCATION] = {
8308                 .type = HDA_FIXUP_PINS,
8309                 .v.pins = (const struct hda_pintbl[]) {
8310                         /* Change the mic location from front to right, otherwise there are
8311                            two front mics with the same name, pulseaudio can't handle them.
8312                            This is just a temporary workaround, after applying this fixup,
8313                            there will be one "Front Mic" and one "Mic" in this machine.
8314                          */
8315                         { 0x1a, 0x04a19040 },
8316                         { }
8317                 },
8318         },
8319         [ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE] = {
8320                 .type = HDA_FIXUP_PINS,
8321                 .v.pins = (const struct hda_pintbl[]) {
8322                         { 0x16, 0x0101102f }, /* Rear Headset HP */
8323                         { 0x19, 0x02a1913c }, /* use as Front headset mic, without its own jack detect */
8324                         { 0x1a, 0x01a19030 }, /* Rear Headset MIC */
8325                         { 0x1b, 0x02011020 },
8326                         { }
8327                 },
8328                 .chained = true,
8329                 .chain_id = ALC225_FIXUP_S3_POP_NOISE
8330         },
8331         [ALC225_FIXUP_S3_POP_NOISE] = {
8332                 .type = HDA_FIXUP_FUNC,
8333                 .v.func = alc225_fixup_s3_pop_noise,
8334                 .chained = true,
8335                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8336         },
8337         [ALC700_FIXUP_INTEL_REFERENCE] = {
8338                 .type = HDA_FIXUP_VERBS,
8339                 .v.verbs = (const struct hda_verb[]) {
8340                         /* Enables internal speaker */
8341                         {0x20, AC_VERB_SET_COEF_INDEX, 0x45},
8342                         {0x20, AC_VERB_SET_PROC_COEF, 0x5289},
8343                         {0x20, AC_VERB_SET_COEF_INDEX, 0x4A},
8344                         {0x20, AC_VERB_SET_PROC_COEF, 0x001b},
8345                         {0x58, AC_VERB_SET_COEF_INDEX, 0x00},
8346                         {0x58, AC_VERB_SET_PROC_COEF, 0x3888},
8347                         {0x20, AC_VERB_SET_COEF_INDEX, 0x6f},
8348                         {0x20, AC_VERB_SET_PROC_COEF, 0x2c0b},
8349                         {}
8350                 }
8351         },
8352         [ALC274_FIXUP_DELL_BIND_DACS] = {
8353                 .type = HDA_FIXUP_FUNC,
8354                 .v.func = alc274_fixup_bind_dacs,
8355                 .chained = true,
8356                 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
8357         },
8358         [ALC274_FIXUP_DELL_AIO_LINEOUT_VERB] = {
8359                 .type = HDA_FIXUP_PINS,
8360                 .v.pins = (const struct hda_pintbl[]) {
8361                         { 0x1b, 0x0401102f },
8362                         { }
8363                 },
8364                 .chained = true,
8365                 .chain_id = ALC274_FIXUP_DELL_BIND_DACS
8366         },
8367         [ALC298_FIXUP_TPT470_DOCK_FIX] = {
8368                 .type = HDA_FIXUP_FUNC,
8369                 .v.func = alc_fixup_tpt470_dock,
8370                 .chained = true,
8371                 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE
8372         },
8373         [ALC298_FIXUP_TPT470_DOCK] = {
8374                 .type = HDA_FIXUP_FUNC,
8375                 .v.func = alc_fixup_tpt470_dacs,
8376                 .chained = true,
8377                 .chain_id = ALC298_FIXUP_TPT470_DOCK_FIX
8378         },
8379         [ALC255_FIXUP_DUMMY_LINEOUT_VERB] = {
8380                 .type = HDA_FIXUP_PINS,
8381                 .v.pins = (const struct hda_pintbl[]) {
8382                         { 0x14, 0x0201101f },
8383                         { }
8384                 },
8385                 .chained = true,
8386                 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
8387         },
8388         [ALC255_FIXUP_DELL_HEADSET_MIC] = {
8389                 .type = HDA_FIXUP_PINS,
8390                 .v.pins = (const struct hda_pintbl[]) {
8391                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8392                         { }
8393                 },
8394                 .chained = true,
8395                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8396         },
8397         [ALC295_FIXUP_HP_X360] = {
8398                 .type = HDA_FIXUP_FUNC,
8399                 .v.func = alc295_fixup_hp_top_speakers,
8400                 .chained = true,
8401                 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC3
8402         },
8403         [ALC221_FIXUP_HP_HEADSET_MIC] = {
8404                 .type = HDA_FIXUP_PINS,
8405                 .v.pins = (const struct hda_pintbl[]) {
8406                         { 0x19, 0x0181313f},
8407                         { }
8408                 },
8409                 .chained = true,
8410                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8411         },
8412         [ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = {
8413                 .type = HDA_FIXUP_FUNC,
8414                 .v.func = alc285_fixup_invalidate_dacs,
8415                 .chained = true,
8416                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
8417         },
8418         [ALC295_FIXUP_HP_AUTO_MUTE] = {
8419                 .type = HDA_FIXUP_FUNC,
8420                 .v.func = alc_fixup_auto_mute_via_amp,
8421         },
8422         [ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE] = {
8423                 .type = HDA_FIXUP_PINS,
8424                 .v.pins = (const struct hda_pintbl[]) {
8425                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8426                         { }
8427                 },
8428                 .chained = true,
8429                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8430         },
8431         [ALC294_FIXUP_ASUS_MIC] = {
8432                 .type = HDA_FIXUP_PINS,
8433                 .v.pins = (const struct hda_pintbl[]) {
8434                         { 0x13, 0x90a60160 }, /* use as internal mic */
8435                         { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
8436                         { }
8437                 },
8438                 .chained = true,
8439                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8440         },
8441         [ALC294_FIXUP_ASUS_HEADSET_MIC] = {
8442                 .type = HDA_FIXUP_PINS,
8443                 .v.pins = (const struct hda_pintbl[]) {
8444                         { 0x19, 0x01a1103c }, /* use as headset mic */
8445                         { }
8446                 },
8447                 .chained = true,
8448                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8449         },
8450         [ALC294_FIXUP_ASUS_SPK] = {
8451                 .type = HDA_FIXUP_VERBS,
8452                 .v.verbs = (const struct hda_verb[]) {
8453                         /* Set EAPD high */
8454                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x40 },
8455                         { 0x20, AC_VERB_SET_PROC_COEF, 0x8800 },
8456                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
8457                         { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
8458                         { }
8459                 },
8460                 .chained = true,
8461                 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8462         },
8463         [ALC295_FIXUP_CHROME_BOOK] = {
8464                 .type = HDA_FIXUP_FUNC,
8465                 .v.func = alc295_fixup_chromebook,
8466                 .chained = true,
8467                 .chain_id = ALC225_FIXUP_HEADSET_JACK
8468         },
8469         [ALC225_FIXUP_HEADSET_JACK] = {
8470                 .type = HDA_FIXUP_FUNC,
8471                 .v.func = alc_fixup_headset_jack,
8472         },
8473         [ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
8474                 .type = HDA_FIXUP_PINS,
8475                 .v.pins = (const struct hda_pintbl[]) {
8476                         { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8477                         { }
8478                 },
8479                 .chained = true,
8480                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8481         },
8482         [ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE] = {
8483                 .type = HDA_FIXUP_VERBS,
8484                 .v.verbs = (const struct hda_verb[]) {
8485                         /* Disable PCBEEP-IN passthrough */
8486                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
8487                         { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
8488                         { }
8489                 },
8490                 .chained = true,
8491                 .chain_id = ALC285_FIXUP_LENOVO_HEADPHONE_NOISE
8492         },
8493         [ALC255_FIXUP_ACER_HEADSET_MIC] = {
8494                 .type = HDA_FIXUP_PINS,
8495                 .v.pins = (const struct hda_pintbl[]) {
8496                         { 0x19, 0x03a11130 },
8497                         { 0x1a, 0x90a60140 }, /* use as internal mic */
8498                         { }
8499                 },
8500                 .chained = true,
8501                 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
8502         },
8503         [ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE] = {
8504                 .type = HDA_FIXUP_PINS,
8505                 .v.pins = (const struct hda_pintbl[]) {
8506                         { 0x16, 0x01011020 }, /* Rear Line out */
8507                         { 0x19, 0x01a1913c }, /* use as Front headset mic, without its own jack detect */
8508                         { }
8509                 },
8510                 .chained = true,
8511                 .chain_id = ALC225_FIXUP_WYSE_AUTO_MUTE
8512         },
8513         [ALC225_FIXUP_WYSE_AUTO_MUTE] = {
8514                 .type = HDA_FIXUP_FUNC,
8515                 .v.func = alc_fixup_auto_mute_via_amp,
8516                 .chained = true,
8517                 .chain_id = ALC225_FIXUP_WYSE_DISABLE_MIC_VREF
8518         },
8519         [ALC225_FIXUP_WYSE_DISABLE_MIC_VREF] = {
8520                 .type = HDA_FIXUP_FUNC,
8521                 .v.func = alc_fixup_disable_mic_vref,
8522                 .chained = true,
8523                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8524         },
8525         [ALC286_FIXUP_ACER_AIO_HEADSET_MIC] = {
8526                 .type = HDA_FIXUP_VERBS,
8527                 .v.verbs = (const struct hda_verb[]) {
8528                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x4f },
8529                         { 0x20, AC_VERB_SET_PROC_COEF, 0x5029 },
8530                         { }
8531                 },
8532                 .chained = true,
8533                 .chain_id = ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE
8534         },
8535         [ALC256_FIXUP_ASUS_HEADSET_MIC] = {
8536                 .type = HDA_FIXUP_PINS,
8537                 .v.pins = (const struct hda_pintbl[]) {
8538                         { 0x19, 0x03a11020 }, /* headset mic with jack detect */
8539                         { }
8540                 },
8541                 .chained = true,
8542                 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8543         },
8544         [ALC256_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8545                 .type = HDA_FIXUP_PINS,
8546                 .v.pins = (const struct hda_pintbl[]) {
8547                         { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
8548                         { }
8549                 },
8550                 .chained = true,
8551                 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8552         },
8553         [ALC299_FIXUP_PREDATOR_SPK] = {
8554                 .type = HDA_FIXUP_PINS,
8555                 .v.pins = (const struct hda_pintbl[]) {
8556                         { 0x21, 0x90170150 }, /* use as headset mic, without its own jack detect */
8557                         { }
8558                 }
8559         },
8560         [ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE] = {
8561                 .type = HDA_FIXUP_PINS,
8562                 .v.pins = (const struct hda_pintbl[]) {
8563                         { 0x19, 0x04a11040 },
8564                         { 0x21, 0x04211020 },
8565                         { }
8566                 },
8567                 .chained = true,
8568                 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8569         },
8570         [ALC289_FIXUP_DELL_SPK2] = {
8571                 .type = HDA_FIXUP_PINS,
8572                 .v.pins = (const struct hda_pintbl[]) {
8573                         { 0x17, 0x90170130 }, /* bass spk */
8574                         { }
8575                 },
8576                 .chained = true,
8577                 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
8578         },
8579         [ALC289_FIXUP_DUAL_SPK] = {
8580                 .type = HDA_FIXUP_FUNC,
8581                 .v.func = alc285_fixup_speaker2_to_dac1,
8582                 .chained = true,
8583                 .chain_id = ALC289_FIXUP_DELL_SPK2
8584         },
8585         [ALC294_FIXUP_SPK2_TO_DAC1] = {
8586                 .type = HDA_FIXUP_FUNC,
8587                 .v.func = alc285_fixup_speaker2_to_dac1,
8588                 .chained = true,
8589                 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8590         },
8591         [ALC294_FIXUP_ASUS_DUAL_SPK] = {
8592                 .type = HDA_FIXUP_FUNC,
8593                 /* The GPIO must be pulled to initialize the AMP */
8594                 .v.func = alc_fixup_gpio4,
8595                 .chained = true,
8596                 .chain_id = ALC294_FIXUP_SPK2_TO_DAC1
8597         },
8598         [ALC294_FIXUP_ASUS_ALLY] = {
8599                 .type = HDA_FIXUP_FUNC,
8600                 .v.func = cs35l41_fixup_i2c_two,
8601                 .chained = true,
8602                 .chain_id = ALC294_FIXUP_ASUS_ALLY_PINS
8603         },
8604         [ALC294_FIXUP_ASUS_ALLY_PINS] = {
8605                 .type = HDA_FIXUP_PINS,
8606                 .v.pins = (const struct hda_pintbl[]) {
8607                         { 0x19, 0x03a11050 },
8608                         { 0x1a, 0x03a11c30 },
8609                         { 0x21, 0x03211420 },
8610                         { }
8611                 },
8612                 .chained = true,
8613                 .chain_id = ALC294_FIXUP_ASUS_ALLY_VERBS
8614         },
8615         [ALC294_FIXUP_ASUS_ALLY_VERBS] = {
8616                 .type = HDA_FIXUP_VERBS,
8617                 .v.verbs = (const struct hda_verb[]) {
8618                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
8619                         { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
8620                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x46 },
8621                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0004 },
8622                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x47 },
8623                         { 0x20, AC_VERB_SET_PROC_COEF, 0xa47a },
8624                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x49 },
8625                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0049},
8626                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x4a },
8627                         { 0x20, AC_VERB_SET_PROC_COEF, 0x201b },
8628                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x6b },
8629                         { 0x20, AC_VERB_SET_PROC_COEF, 0x4278},
8630                         { }
8631                 },
8632                 .chained = true,
8633                 .chain_id = ALC294_FIXUP_ASUS_ALLY_SPEAKER
8634         },
8635         [ALC294_FIXUP_ASUS_ALLY_SPEAKER] = {
8636                 .type = HDA_FIXUP_FUNC,
8637                 .v.func = alc285_fixup_speaker2_to_dac1,
8638         },
8639         [ALC285_FIXUP_THINKPAD_X1_GEN7] = {
8640                 .type = HDA_FIXUP_FUNC,
8641                 .v.func = alc285_fixup_thinkpad_x1_gen7,
8642                 .chained = true,
8643                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
8644         },
8645         [ALC285_FIXUP_THINKPAD_HEADSET_JACK] = {
8646                 .type = HDA_FIXUP_FUNC,
8647                 .v.func = alc_fixup_headset_jack,
8648                 .chained = true,
8649                 .chain_id = ALC285_FIXUP_THINKPAD_X1_GEN7
8650         },
8651         [ALC294_FIXUP_ASUS_HPE] = {
8652                 .type = HDA_FIXUP_VERBS,
8653                 .v.verbs = (const struct hda_verb[]) {
8654                         /* Set EAPD high */
8655                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
8656                         { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
8657                         { }
8658                 },
8659                 .chained = true,
8660                 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8661         },
8662         [ALC294_FIXUP_ASUS_GX502_PINS] = {
8663                 .type = HDA_FIXUP_PINS,
8664                 .v.pins = (const struct hda_pintbl[]) {
8665                         { 0x19, 0x03a11050 }, /* front HP mic */
8666                         { 0x1a, 0x01a11830 }, /* rear external mic */
8667                         { 0x21, 0x03211020 }, /* front HP out */
8668                         { }
8669                 },
8670                 .chained = true,
8671                 .chain_id = ALC294_FIXUP_ASUS_GX502_VERBS
8672         },
8673         [ALC294_FIXUP_ASUS_GX502_VERBS] = {
8674                 .type = HDA_FIXUP_VERBS,
8675                 .v.verbs = (const struct hda_verb[]) {
8676                         /* set 0x15 to HP-OUT ctrl */
8677                         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
8678                         /* unmute the 0x15 amp */
8679                         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
8680                         { }
8681                 },
8682                 .chained = true,
8683                 .chain_id = ALC294_FIXUP_ASUS_GX502_HP
8684         },
8685         [ALC294_FIXUP_ASUS_GX502_HP] = {
8686                 .type = HDA_FIXUP_FUNC,
8687                 .v.func = alc294_fixup_gx502_hp,
8688         },
8689         [ALC294_FIXUP_ASUS_GU502_PINS] = {
8690                 .type = HDA_FIXUP_PINS,
8691                 .v.pins = (const struct hda_pintbl[]) {
8692                         { 0x19, 0x01a11050 }, /* rear HP mic */
8693                         { 0x1a, 0x01a11830 }, /* rear external mic */
8694                         { 0x21, 0x012110f0 }, /* rear HP out */
8695                         { }
8696                 },
8697                 .chained = true,
8698                 .chain_id = ALC294_FIXUP_ASUS_GU502_VERBS
8699         },
8700         [ALC294_FIXUP_ASUS_GU502_VERBS] = {
8701                 .type = HDA_FIXUP_VERBS,
8702                 .v.verbs = (const struct hda_verb[]) {
8703                         /* set 0x15 to HP-OUT ctrl */
8704                         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
8705                         /* unmute the 0x15 amp */
8706                         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
8707                         /* set 0x1b to HP-OUT */
8708                         { 0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
8709                         { }
8710                 },
8711                 .chained = true,
8712                 .chain_id = ALC294_FIXUP_ASUS_GU502_HP
8713         },
8714         [ALC294_FIXUP_ASUS_GU502_HP] = {
8715                 .type = HDA_FIXUP_FUNC,
8716                 .v.func = alc294_fixup_gu502_hp,
8717         },
8718          [ALC294_FIXUP_ASUS_G513_PINS] = {
8719                 .type = HDA_FIXUP_PINS,
8720                 .v.pins = (const struct hda_pintbl[]) {
8721                                 { 0x19, 0x03a11050 }, /* front HP mic */
8722                                 { 0x1a, 0x03a11c30 }, /* rear external mic */
8723                                 { 0x21, 0x03211420 }, /* front HP out */
8724                                 { }
8725                 },
8726         },
8727         [ALC285_FIXUP_ASUS_G533Z_PINS] = {
8728                 .type = HDA_FIXUP_PINS,
8729                 .v.pins = (const struct hda_pintbl[]) {
8730                         { 0x14, 0x90170152 }, /* Speaker Surround Playback Switch */
8731                         { 0x19, 0x03a19020 }, /* Mic Boost Volume */
8732                         { 0x1a, 0x03a11c30 }, /* Mic Boost Volume */
8733                         { 0x1e, 0x90170151 }, /* Rear jack, IN OUT EAPD Detect */
8734                         { 0x21, 0x03211420 },
8735                         { }
8736                 },
8737         },
8738         [ALC294_FIXUP_ASUS_COEF_1B] = {
8739                 .type = HDA_FIXUP_VERBS,
8740                 .v.verbs = (const struct hda_verb[]) {
8741                         /* Set bit 10 to correct noisy output after reboot from
8742                          * Windows 10 (due to pop noise reduction?)
8743                          */
8744                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x1b },
8745                         { 0x20, AC_VERB_SET_PROC_COEF, 0x4e4b },
8746                         { }
8747                 },
8748                 .chained = true,
8749                 .chain_id = ALC289_FIXUP_ASUS_GA401,
8750         },
8751         [ALC285_FIXUP_HP_GPIO_LED] = {
8752                 .type = HDA_FIXUP_FUNC,
8753                 .v.func = alc285_fixup_hp_gpio_led,
8754         },
8755         [ALC285_FIXUP_HP_MUTE_LED] = {
8756                 .type = HDA_FIXUP_FUNC,
8757                 .v.func = alc285_fixup_hp_mute_led,
8758         },
8759         [ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED] = {
8760                 .type = HDA_FIXUP_FUNC,
8761                 .v.func = alc285_fixup_hp_spectre_x360_mute_led,
8762         },
8763         [ALC236_FIXUP_HP_MUTE_LED_COEFBIT2] = {
8764             .type = HDA_FIXUP_FUNC,
8765             .v.func = alc236_fixup_hp_mute_led_coefbit2,
8766         },
8767         [ALC236_FIXUP_HP_GPIO_LED] = {
8768                 .type = HDA_FIXUP_FUNC,
8769                 .v.func = alc236_fixup_hp_gpio_led,
8770         },
8771         [ALC236_FIXUP_HP_MUTE_LED] = {
8772                 .type = HDA_FIXUP_FUNC,
8773                 .v.func = alc236_fixup_hp_mute_led,
8774         },
8775         [ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF] = {
8776                 .type = HDA_FIXUP_FUNC,
8777                 .v.func = alc236_fixup_hp_mute_led_micmute_vref,
8778         },
8779         [ALC298_FIXUP_SAMSUNG_AMP] = {
8780                 .type = HDA_FIXUP_FUNC,
8781                 .v.func = alc298_fixup_samsung_amp,
8782                 .chained = true,
8783                 .chain_id = ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET
8784         },
8785         [ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
8786                 .type = HDA_FIXUP_VERBS,
8787                 .v.verbs = (const struct hda_verb[]) {
8788                         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc5 },
8789                         { }
8790                 },
8791         },
8792         [ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
8793                 .type = HDA_FIXUP_VERBS,
8794                 .v.verbs = (const struct hda_verb[]) {
8795                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x08},
8796                         { 0x20, AC_VERB_SET_PROC_COEF, 0x2fcf},
8797                         { }
8798                 },
8799         },
8800         [ALC295_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8801                 .type = HDA_FIXUP_PINS,
8802                 .v.pins = (const struct hda_pintbl[]) {
8803                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8804                         { }
8805                 },
8806                 .chained = true,
8807                 .chain_id = ALC269_FIXUP_HEADSET_MODE
8808         },
8809         [ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS] = {
8810                 .type = HDA_FIXUP_PINS,
8811                 .v.pins = (const struct hda_pintbl[]) {
8812                         { 0x14, 0x90100120 }, /* use as internal speaker */
8813                         { 0x18, 0x02a111f0 }, /* use as headset mic, without its own jack detect */
8814                         { 0x1a, 0x01011020 }, /* use as line out */
8815                         { },
8816                 },
8817                 .chained = true,
8818                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8819         },
8820         [ALC269VC_FIXUP_ACER_HEADSET_MIC] = {
8821                 .type = HDA_FIXUP_PINS,
8822                 .v.pins = (const struct hda_pintbl[]) {
8823                         { 0x18, 0x02a11030 }, /* use as headset mic */
8824                         { }
8825                 },
8826                 .chained = true,
8827                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8828         },
8829         [ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE] = {
8830                 .type = HDA_FIXUP_PINS,
8831                 .v.pins = (const struct hda_pintbl[]) {
8832                         { 0x18, 0x01a11130 }, /* use as headset mic, without its own jack detect */
8833                         { }
8834                 },
8835                 .chained = true,
8836                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8837         },
8838         [ALC289_FIXUP_ASUS_GA401] = {
8839                 .type = HDA_FIXUP_FUNC,
8840                 .v.func = alc289_fixup_asus_ga401,
8841                 .chained = true,
8842                 .chain_id = ALC289_FIXUP_ASUS_GA502,
8843         },
8844         [ALC289_FIXUP_ASUS_GA502] = {
8845                 .type = HDA_FIXUP_PINS,
8846                 .v.pins = (const struct hda_pintbl[]) {
8847                         { 0x19, 0x03a11020 }, /* headset mic with jack detect */
8848                         { }
8849                 },
8850         },
8851         [ALC256_FIXUP_ACER_MIC_NO_PRESENCE] = {
8852                 .type = HDA_FIXUP_PINS,
8853                 .v.pins = (const struct hda_pintbl[]) {
8854                         { 0x19, 0x02a11120 }, /* use as headset mic, without its own jack detect */
8855                         { }
8856                 },
8857                 .chained = true,
8858                 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8859         },
8860         [ALC285_FIXUP_HP_GPIO_AMP_INIT] = {
8861                 .type = HDA_FIXUP_FUNC,
8862                 .v.func = alc285_fixup_hp_gpio_amp_init,
8863                 .chained = true,
8864                 .chain_id = ALC285_FIXUP_HP_GPIO_LED
8865         },
8866         [ALC269_FIXUP_CZC_B20] = {
8867                 .type = HDA_FIXUP_PINS,
8868                 .v.pins = (const struct hda_pintbl[]) {
8869                         { 0x12, 0x411111f0 },
8870                         { 0x14, 0x90170110 }, /* speaker */
8871                         { 0x15, 0x032f1020 }, /* HP out */
8872                         { 0x17, 0x411111f0 },
8873                         { 0x18, 0x03ab1040 }, /* mic */
8874                         { 0x19, 0xb7a7013f },
8875                         { 0x1a, 0x0181305f },
8876                         { 0x1b, 0x411111f0 },
8877                         { 0x1d, 0x411111f0 },
8878                         { 0x1e, 0x411111f0 },
8879                         { }
8880                 },
8881                 .chain_id = ALC269_FIXUP_DMIC,
8882         },
8883         [ALC269_FIXUP_CZC_TMI] = {
8884                 .type = HDA_FIXUP_PINS,
8885                 .v.pins = (const struct hda_pintbl[]) {
8886                         { 0x12, 0x4000c000 },
8887                         { 0x14, 0x90170110 }, /* speaker */
8888                         { 0x15, 0x0421401f }, /* HP out */
8889                         { 0x17, 0x411111f0 },
8890                         { 0x18, 0x04a19020 }, /* mic */
8891                         { 0x19, 0x411111f0 },
8892                         { 0x1a, 0x411111f0 },
8893                         { 0x1b, 0x411111f0 },
8894                         { 0x1d, 0x40448505 },
8895                         { 0x1e, 0x411111f0 },
8896                         { 0x20, 0x8000ffff },
8897                         { }
8898                 },
8899                 .chain_id = ALC269_FIXUP_DMIC,
8900         },
8901         [ALC269_FIXUP_CZC_L101] = {
8902                 .type = HDA_FIXUP_PINS,
8903                 .v.pins = (const struct hda_pintbl[]) {
8904                         { 0x12, 0x40000000 },
8905                         { 0x14, 0x01014010 }, /* speaker */
8906                         { 0x15, 0x411111f0 }, /* HP out */
8907                         { 0x16, 0x411111f0 },
8908                         { 0x18, 0x01a19020 }, /* mic */
8909                         { 0x19, 0x02a19021 },
8910                         { 0x1a, 0x0181302f },
8911                         { 0x1b, 0x0221401f },
8912                         { 0x1c, 0x411111f0 },
8913                         { 0x1d, 0x4044c601 },
8914                         { 0x1e, 0x411111f0 },
8915                         { }
8916                 },
8917                 .chain_id = ALC269_FIXUP_DMIC,
8918         },
8919         [ALC269_FIXUP_LEMOTE_A1802] = {
8920                 .type = HDA_FIXUP_PINS,
8921                 .v.pins = (const struct hda_pintbl[]) {
8922                         { 0x12, 0x40000000 },
8923                         { 0x14, 0x90170110 }, /* speaker */
8924                         { 0x17, 0x411111f0 },
8925                         { 0x18, 0x03a19040 }, /* mic1 */
8926                         { 0x19, 0x90a70130 }, /* mic2 */
8927                         { 0x1a, 0x411111f0 },
8928                         { 0x1b, 0x411111f0 },
8929                         { 0x1d, 0x40489d2d },
8930                         { 0x1e, 0x411111f0 },
8931                         { 0x20, 0x0003ffff },
8932                         { 0x21, 0x03214020 },
8933                         { }
8934                 },
8935                 .chain_id = ALC269_FIXUP_DMIC,
8936         },
8937         [ALC269_FIXUP_LEMOTE_A190X] = {
8938                 .type = HDA_FIXUP_PINS,
8939                 .v.pins = (const struct hda_pintbl[]) {
8940                         { 0x14, 0x99130110 }, /* speaker */
8941                         { 0x15, 0x0121401f }, /* HP out */
8942                         { 0x18, 0x01a19c20 }, /* rear  mic */
8943                         { 0x19, 0x99a3092f }, /* front mic */
8944                         { 0x1b, 0x0201401f }, /* front lineout */
8945                         { }
8946                 },
8947                 .chain_id = ALC269_FIXUP_DMIC,
8948         },
8949         [ALC256_FIXUP_INTEL_NUC8_RUGGED] = {
8950                 .type = HDA_FIXUP_PINS,
8951                 .v.pins = (const struct hda_pintbl[]) {
8952                         { 0x1b, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8953                         { }
8954                 },
8955                 .chained = true,
8956                 .chain_id = ALC269_FIXUP_HEADSET_MODE
8957         },
8958         [ALC256_FIXUP_INTEL_NUC10] = {
8959                 .type = HDA_FIXUP_PINS,
8960                 .v.pins = (const struct hda_pintbl[]) {
8961                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8962                         { }
8963                 },
8964                 .chained = true,
8965                 .chain_id = ALC269_FIXUP_HEADSET_MODE
8966         },
8967         [ALC255_FIXUP_XIAOMI_HEADSET_MIC] = {
8968                 .type = HDA_FIXUP_VERBS,
8969                 .v.verbs = (const struct hda_verb[]) {
8970                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
8971                         { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
8972                         { }
8973                 },
8974                 .chained = true,
8975                 .chain_id = ALC289_FIXUP_ASUS_GA502
8976         },
8977         [ALC274_FIXUP_HP_MIC] = {
8978                 .type = HDA_FIXUP_VERBS,
8979                 .v.verbs = (const struct hda_verb[]) {
8980                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
8981                         { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
8982                         { }
8983                 },
8984         },
8985         [ALC274_FIXUP_HP_HEADSET_MIC] = {
8986                 .type = HDA_FIXUP_FUNC,
8987                 .v.func = alc274_fixup_hp_headset_mic,
8988                 .chained = true,
8989                 .chain_id = ALC274_FIXUP_HP_MIC
8990         },
8991         [ALC274_FIXUP_HP_ENVY_GPIO] = {
8992                 .type = HDA_FIXUP_FUNC,
8993                 .v.func = alc274_fixup_hp_envy_gpio,
8994         },
8995         [ALC256_FIXUP_ASUS_HPE] = {
8996                 .type = HDA_FIXUP_VERBS,
8997                 .v.verbs = (const struct hda_verb[]) {
8998                         /* Set EAPD high */
8999                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
9000                         { 0x20, AC_VERB_SET_PROC_COEF, 0x7778 },
9001                         { }
9002                 },
9003                 .chained = true,
9004                 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
9005         },
9006         [ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK] = {
9007                 .type = HDA_FIXUP_FUNC,
9008                 .v.func = alc_fixup_headset_jack,
9009                 .chained = true,
9010                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
9011         },
9012         [ALC287_FIXUP_HP_GPIO_LED] = {
9013                 .type = HDA_FIXUP_FUNC,
9014                 .v.func = alc287_fixup_hp_gpio_led,
9015         },
9016         [ALC256_FIXUP_HP_HEADSET_MIC] = {
9017                 .type = HDA_FIXUP_FUNC,
9018                 .v.func = alc274_fixup_hp_headset_mic,
9019         },
9020         [ALC236_FIXUP_DELL_AIO_HEADSET_MIC] = {
9021                 .type = HDA_FIXUP_FUNC,
9022                 .v.func = alc_fixup_no_int_mic,
9023                 .chained = true,
9024                 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
9025         },
9026         [ALC282_FIXUP_ACER_DISABLE_LINEOUT] = {
9027                 .type = HDA_FIXUP_PINS,
9028                 .v.pins = (const struct hda_pintbl[]) {
9029                         { 0x1b, 0x411111f0 },
9030                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
9031                         { },
9032                 },
9033                 .chained = true,
9034                 .chain_id = ALC269_FIXUP_HEADSET_MODE
9035         },
9036         [ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST] = {
9037                 .type = HDA_FIXUP_FUNC,
9038                 .v.func = alc269_fixup_limit_int_mic_boost,
9039                 .chained = true,
9040                 .chain_id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
9041         },
9042         [ALC256_FIXUP_ACER_HEADSET_MIC] = {
9043                 .type = HDA_FIXUP_PINS,
9044                 .v.pins = (const struct hda_pintbl[]) {
9045                         { 0x19, 0x02a1113c }, /* use as headset mic, without its own jack detect */
9046                         { 0x1a, 0x90a1092f }, /* use as internal mic */
9047                         { }
9048                 },
9049                 .chained = true,
9050                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
9051         },
9052         [ALC285_FIXUP_IDEAPAD_S740_COEF] = {
9053                 .type = HDA_FIXUP_FUNC,
9054                 .v.func = alc285_fixup_ideapad_s740_coef,
9055                 .chained = true,
9056                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
9057         },
9058         [ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST] = {
9059                 .type = HDA_FIXUP_FUNC,
9060                 .v.func = alc269_fixup_limit_int_mic_boost,
9061                 .chained = true,
9062                 .chain_id = ALC285_FIXUP_HP_MUTE_LED,
9063         },
9064         [ALC295_FIXUP_ASUS_DACS] = {
9065                 .type = HDA_FIXUP_FUNC,
9066                 .v.func = alc295_fixup_asus_dacs,
9067         },
9068         [ALC295_FIXUP_HP_OMEN] = {
9069                 .type = HDA_FIXUP_PINS,
9070                 .v.pins = (const struct hda_pintbl[]) {
9071                         { 0x12, 0xb7a60130 },
9072                         { 0x13, 0x40000000 },
9073                         { 0x14, 0x411111f0 },
9074                         { 0x16, 0x411111f0 },
9075                         { 0x17, 0x90170110 },
9076                         { 0x18, 0x411111f0 },
9077                         { 0x19, 0x02a11030 },
9078                         { 0x1a, 0x411111f0 },
9079                         { 0x1b, 0x04a19030 },
9080                         { 0x1d, 0x40600001 },
9081                         { 0x1e, 0x411111f0 },
9082                         { 0x21, 0x03211020 },
9083                         {}
9084                 },
9085                 .chained = true,
9086                 .chain_id = ALC269_FIXUP_HP_LINE1_MIC1_LED,
9087         },
9088         [ALC285_FIXUP_HP_SPECTRE_X360] = {
9089                 .type = HDA_FIXUP_FUNC,
9090                 .v.func = alc285_fixup_hp_spectre_x360,
9091         },
9092         [ALC285_FIXUP_HP_SPECTRE_X360_EB1] = {
9093                 .type = HDA_FIXUP_FUNC,
9094                 .v.func = alc285_fixup_hp_spectre_x360_eb1
9095         },
9096         [ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP] = {
9097                 .type = HDA_FIXUP_FUNC,
9098                 .v.func = alc285_fixup_ideapad_s740_coef,
9099                 .chained = true,
9100                 .chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,
9101         },
9102         [ALC623_FIXUP_LENOVO_THINKSTATION_P340] = {
9103                 .type = HDA_FIXUP_FUNC,
9104                 .v.func = alc_fixup_no_shutup,
9105                 .chained = true,
9106                 .chain_id = ALC283_FIXUP_HEADSET_MIC,
9107         },
9108         [ALC255_FIXUP_ACER_HEADPHONE_AND_MIC] = {
9109                 .type = HDA_FIXUP_PINS,
9110                 .v.pins = (const struct hda_pintbl[]) {
9111                         { 0x21, 0x03211030 }, /* Change the Headphone location to Left */
9112                         { }
9113                 },
9114                 .chained = true,
9115                 .chain_id = ALC255_FIXUP_XIAOMI_HEADSET_MIC
9116         },
9117         [ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST] = {
9118                 .type = HDA_FIXUP_FUNC,
9119                 .v.func = alc269_fixup_limit_int_mic_boost,
9120                 .chained = true,
9121                 .chain_id = ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
9122         },
9123         [ALC285_FIXUP_LEGION_Y9000X_SPEAKERS] = {
9124                 .type = HDA_FIXUP_FUNC,
9125                 .v.func = alc285_fixup_ideapad_s740_coef,
9126                 .chained = true,
9127                 .chain_id = ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
9128         },
9129         [ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE] = {
9130                 .type = HDA_FIXUP_FUNC,
9131                 .v.func = alc287_fixup_legion_15imhg05_speakers,
9132                 .chained = true,
9133                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
9134         },
9135         [ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS] = {
9136                 .type = HDA_FIXUP_VERBS,
9137                 //.v.verbs = legion_15imhg05_coefs,
9138                 .v.verbs = (const struct hda_verb[]) {
9139                          // set left speaker Legion 7i.
9140                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9141                          { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
9142
9143                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9144                          { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9145                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9146                          { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
9147                          { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9148
9149                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9150                          { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9151                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9152                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9153                          { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9154
9155                          // set right speaker Legion 7i.
9156                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9157                          { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
9158
9159                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9160                          { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9161                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9162                          { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
9163                          { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9164
9165                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9166                          { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9167                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9168                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9169                          { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9170                          {}
9171                 },
9172                 .chained = true,
9173                 .chain_id = ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
9174         },
9175         [ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE] = {
9176                 .type = HDA_FIXUP_FUNC,
9177                 .v.func = alc287_fixup_legion_15imhg05_speakers,
9178                 .chained = true,
9179                 .chain_id = ALC269_FIXUP_HEADSET_MODE,
9180         },
9181         [ALC287_FIXUP_YOGA7_14ITL_SPEAKERS] = {
9182                 .type = HDA_FIXUP_VERBS,
9183                 .v.verbs = (const struct hda_verb[]) {
9184                          // set left speaker Yoga 7i.
9185                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9186                          { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
9187
9188                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9189                          { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9190                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9191                          { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
9192                          { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9193
9194                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9195                          { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9196                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9197                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9198                          { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9199
9200                          // set right speaker Yoga 7i.
9201                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9202                          { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
9203
9204                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9205                          { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9206                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9207                          { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
9208                          { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9209
9210                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9211                          { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9212                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9213                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9214                          { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9215                          {}
9216                 },
9217                 .chained = true,
9218                 .chain_id = ALC269_FIXUP_HEADSET_MODE,
9219         },
9220         [ALC298_FIXUP_LENOVO_C940_DUET7] = {
9221                 .type = HDA_FIXUP_FUNC,
9222                 .v.func = alc298_fixup_lenovo_c940_duet7,
9223         },
9224         [ALC287_FIXUP_13S_GEN2_SPEAKERS] = {
9225                 .type = HDA_FIXUP_VERBS,
9226                 .v.verbs = (const struct hda_verb[]) {
9227                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9228                         { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
9229                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9230                         { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9231                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9232                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9233                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9234                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9235                         { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
9236                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9237                         { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9238                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9239                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9240                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9241                         {}
9242                 },
9243                 .chained = true,
9244                 .chain_id = ALC269_FIXUP_HEADSET_MODE,
9245         },
9246         [ALC256_FIXUP_SET_COEF_DEFAULTS] = {
9247                 .type = HDA_FIXUP_FUNC,
9248                 .v.func = alc256_fixup_set_coef_defaults,
9249         },
9250         [ALC245_FIXUP_HP_GPIO_LED] = {
9251                 .type = HDA_FIXUP_FUNC,
9252                 .v.func = alc245_fixup_hp_gpio_led,
9253         },
9254         [ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
9255                 .type = HDA_FIXUP_PINS,
9256                 .v.pins = (const struct hda_pintbl[]) {
9257                         { 0x19, 0x03a11120 }, /* use as headset mic, without its own jack detect */
9258                         { }
9259                 },
9260                 .chained = true,
9261                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
9262         },
9263         [ALC233_FIXUP_NO_AUDIO_JACK] = {
9264                 .type = HDA_FIXUP_FUNC,
9265                 .v.func = alc233_fixup_no_audio_jack,
9266         },
9267         [ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME] = {
9268                 .type = HDA_FIXUP_FUNC,
9269                 .v.func = alc256_fixup_mic_no_presence_and_resume,
9270                 .chained = true,
9271                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
9272         },
9273         [ALC287_FIXUP_LEGION_16ACHG6] = {
9274                 .type = HDA_FIXUP_FUNC,
9275                 .v.func = alc287_fixup_legion_16achg6_speakers,
9276         },
9277         [ALC287_FIXUP_CS35L41_I2C_2] = {
9278                 .type = HDA_FIXUP_FUNC,
9279                 .v.func = cs35l41_fixup_i2c_two,
9280         },
9281         [ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED] = {
9282                 .type = HDA_FIXUP_FUNC,
9283                 .v.func = cs35l41_fixup_i2c_two,
9284                 .chained = true,
9285                 .chain_id = ALC285_FIXUP_HP_MUTE_LED,
9286         },
9287         [ALC245_FIXUP_CS35L41_SPI_2] = {
9288                 .type = HDA_FIXUP_FUNC,
9289                 .v.func = cs35l41_fixup_spi_two,
9290         },
9291         [ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED] = {
9292                 .type = HDA_FIXUP_FUNC,
9293                 .v.func = cs35l41_fixup_spi_two,
9294                 .chained = true,
9295                 .chain_id = ALC285_FIXUP_HP_GPIO_LED,
9296         },
9297         [ALC245_FIXUP_CS35L41_SPI_4] = {
9298                 .type = HDA_FIXUP_FUNC,
9299                 .v.func = cs35l41_fixup_spi_four,
9300         },
9301         [ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED] = {
9302                 .type = HDA_FIXUP_FUNC,
9303                 .v.func = cs35l41_fixup_spi_four,
9304                 .chained = true,
9305                 .chain_id = ALC285_FIXUP_HP_GPIO_LED,
9306         },
9307         [ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED] = {
9308                 .type = HDA_FIXUP_VERBS,
9309                 .v.verbs = (const struct hda_verb[]) {
9310                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x19 },
9311                          { 0x20, AC_VERB_SET_PROC_COEF, 0x8e11 },
9312                          { }
9313                 },
9314                 .chained = true,
9315                 .chain_id = ALC285_FIXUP_HP_MUTE_LED,
9316         },
9317         [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET] = {
9318                 .type = HDA_FIXUP_FUNC,
9319                 .v.func = alc_fixup_dell4_mic_no_presence_quiet,
9320                 .chained = true,
9321                 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
9322         },
9323         [ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE] = {
9324                 .type = HDA_FIXUP_PINS,
9325                 .v.pins = (const struct hda_pintbl[]) {
9326                         { 0x19, 0x02a1112c }, /* use as headset mic, without its own jack detect */
9327                         { }
9328                 },
9329                 .chained = true,
9330                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
9331         },
9332         [ALC287_FIXUP_LEGION_16ITHG6] = {
9333                 .type = HDA_FIXUP_FUNC,
9334                 .v.func = alc287_fixup_legion_16ithg6_speakers,
9335         },
9336         [ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK] = {
9337                 .type = HDA_FIXUP_VERBS,
9338                 .v.verbs = (const struct hda_verb[]) {
9339                         // enable left speaker
9340                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9341                         { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
9342
9343                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9344                         { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9345                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9346                         { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
9347                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9348
9349                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9350                         { 0x20, AC_VERB_SET_PROC_COEF, 0xf },
9351                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9352                         { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
9353                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9354
9355                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9356                         { 0x20, AC_VERB_SET_PROC_COEF, 0x10 },
9357                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9358                         { 0x20, AC_VERB_SET_PROC_COEF, 0x40 },
9359                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9360
9361                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9362                         { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9363                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9364                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9365                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9366
9367                         // enable right speaker
9368                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9369                         { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
9370
9371                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9372                         { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9373                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9374                         { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
9375                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9376
9377                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9378                         { 0x20, AC_VERB_SET_PROC_COEF, 0xf },
9379                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9380                         { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
9381                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9382
9383                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9384                         { 0x20, AC_VERB_SET_PROC_COEF, 0x10 },
9385                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9386                         { 0x20, AC_VERB_SET_PROC_COEF, 0x44 },
9387                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9388
9389                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9390                         { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9391                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9392                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9393                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9394
9395                         { },
9396                 },
9397         },
9398         [ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN] = {
9399                 .type = HDA_FIXUP_FUNC,
9400                 .v.func = alc287_fixup_yoga9_14iap7_bass_spk_pin,
9401                 .chained = true,
9402                 .chain_id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK,
9403         },
9404         [ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS] = {
9405                 .type = HDA_FIXUP_FUNC,
9406                 .v.func = alc295_fixup_dell_inspiron_top_speakers,
9407                 .chained = true,
9408                 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
9409         },
9410         [ALC236_FIXUP_DELL_DUAL_CODECS] = {
9411                 .type = HDA_FIXUP_PINS,
9412                 .v.func = alc1220_fixup_gb_dual_codecs,
9413                 .chained = true,
9414                 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9415         },
9416         [ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI] = {
9417                 .type = HDA_FIXUP_FUNC,
9418                 .v.func = cs35l41_fixup_i2c_two,
9419                 .chained = true,
9420                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
9421         },
9422         [ALC287_FIXUP_TAS2781_I2C] = {
9423                 .type = HDA_FIXUP_FUNC,
9424                 .v.func = tas2781_fixup_i2c,
9425                 .chained = true,
9426                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
9427         },
9428         [ALC245_FIXUP_HP_MUTE_LED_COEFBIT] = {
9429                 .type = HDA_FIXUP_FUNC,
9430                 .v.func = alc245_fixup_hp_mute_led_coefbit,
9431         },
9432         [ALC245_FIXUP_HP_X360_MUTE_LEDS] = {
9433                 .type = HDA_FIXUP_FUNC,
9434                 .v.func = alc245_fixup_hp_mute_led_coefbit,
9435                 .chained = true,
9436                 .chain_id = ALC245_FIXUP_HP_GPIO_LED
9437         },
9438         [ALC287_FIXUP_THINKPAD_I2S_SPK] = {
9439                 .type = HDA_FIXUP_FUNC,
9440                 .v.func = alc287_fixup_bind_dacs,
9441         },
9442 };
9443
9444 static const struct snd_pci_quirk alc269_fixup_tbl[] = {
9445         SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC),
9446         SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC),
9447         SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC),
9448         SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700),
9449         SND_PCI_QUIRK(0x1025, 0x072d, "Acer Aspire V5-571G", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
9450         SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK),
9451         SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK),
9452         SND_PCI_QUIRK(0x1025, 0x0762, "Acer Aspire E1-472", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
9453         SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
9454         SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),
9455         SND_PCI_QUIRK(0x1025, 0x080d, "Acer Aspire V5-122P", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
9456         SND_PCI_QUIRK(0x1025, 0x0840, "Acer Aspire E1", ALC269VB_FIXUP_ASPIRE_E1_COEF),
9457         SND_PCI_QUIRK(0x1025, 0x101c, "Acer Veriton N2510G", ALC269_FIXUP_LIFEBOOK),
9458         SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE),
9459         SND_PCI_QUIRK(0x1025, 0x1065, "Acer Aspire C20-820", ALC269VC_FIXUP_ACER_HEADSET_MIC),
9460         SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),
9461         SND_PCI_QUIRK(0x1025, 0x1094, "Acer Aspire E5-575T", ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST),
9462         SND_PCI_QUIRK(0x1025, 0x1099, "Acer Aspire E5-523G", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9463         SND_PCI_QUIRK(0x1025, 0x110e, "Acer Aspire ES1-432", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9464         SND_PCI_QUIRK(0x1025, 0x1166, "Acer Veriton N4640G", ALC269_FIXUP_LIFEBOOK),
9465         SND_PCI_QUIRK(0x1025, 0x1167, "Acer Veriton N6640G", ALC269_FIXUP_LIFEBOOK),
9466         SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", ALC299_FIXUP_PREDATOR_SPK),
9467         SND_PCI_QUIRK(0x1025, 0x1247, "Acer vCopperbox", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),
9468         SND_PCI_QUIRK(0x1025, 0x1248, "Acer Veriton N4660G", ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE),
9469         SND_PCI_QUIRK(0x1025, 0x1269, "Acer SWIFT SF314-54", ALC256_FIXUP_ACER_HEADSET_MIC),
9470         SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9471         SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9472         SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9473         SND_PCI_QUIRK(0x1025, 0x129c, "Acer SWIFT SF314-55", ALC256_FIXUP_ACER_HEADSET_MIC),
9474         SND_PCI_QUIRK(0x1025, 0x129d, "Acer SWIFT SF313-51", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
9475         SND_PCI_QUIRK(0x1025, 0x1300, "Acer SWIFT SF314-56", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
9476         SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9477         SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC),
9478         SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),
9479         SND_PCI_QUIRK(0x1025, 0x141f, "Acer Spin SP513-54N", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9480         SND_PCI_QUIRK(0x1025, 0x142b, "Acer Swift SF314-42", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9481         SND_PCI_QUIRK(0x1025, 0x1430, "Acer TravelMate B311R-31", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
9482         SND_PCI_QUIRK(0x1025, 0x1466, "Acer Aspire A515-56", ALC255_FIXUP_ACER_HEADPHONE_AND_MIC),
9483         SND_PCI_QUIRK(0x1025, 0x1534, "Acer Predator PH315-54", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9484         SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
9485         SND_PCI_QUIRK(0x1028, 0x053c, "Dell Latitude E5430", ALC292_FIXUP_DELL_E7X),
9486         SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),
9487         SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X),
9488         SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X),
9489         SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X),
9490         SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X),
9491         SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
9492         SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
9493         SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
9494         SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
9495         SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
9496         SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
9497         SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X),
9498         SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X),
9499         SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
9500         SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9501         SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9502         SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),
9503         SND_PCI_QUIRK(0x1028, 0x0669, "Dell Optiplex 9020m", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
9504         SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
9505         SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
9506         SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9507         SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9508         SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9509         SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9510         SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9511         SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9512         SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9513         SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
9514         SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE),
9515         SND_PCI_QUIRK(0x1028, 0x0738, "Dell Precision 5820", ALC269_FIXUP_NO_SHUTUP),
9516         SND_PCI_QUIRK(0x1028, 0x075c, "Dell XPS 27 7760", ALC298_FIXUP_SPK_VOLUME),
9517         SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME),
9518         SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
9519         SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3),
9520         SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE),
9521         SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
9522         SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
9523         SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
9524         SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
9525         SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB),
9526         SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE),
9527         SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE),
9528         SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
9529         SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
9530         SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
9531         SND_PCI_QUIRK(0x1028, 0x098d, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
9532         SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
9533         SND_PCI_QUIRK(0x1028, 0x0a2e, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
9534         SND_PCI_QUIRK(0x1028, 0x0a30, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
9535         SND_PCI_QUIRK(0x1028, 0x0a38, "Dell Latitude 7520", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET),
9536         SND_PCI_QUIRK(0x1028, 0x0a58, "Dell", ALC255_FIXUP_DELL_HEADSET_MIC),
9537         SND_PCI_QUIRK(0x1028, 0x0a61, "Dell XPS 15 9510", ALC289_FIXUP_DUAL_SPK),
9538         SND_PCI_QUIRK(0x1028, 0x0a62, "Dell Precision 5560", ALC289_FIXUP_DUAL_SPK),
9539         SND_PCI_QUIRK(0x1028, 0x0a9d, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
9540         SND_PCI_QUIRK(0x1028, 0x0a9e, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
9541         SND_PCI_QUIRK(0x1028, 0x0b19, "Dell XPS 15 9520", ALC289_FIXUP_DUAL_SPK),
9542         SND_PCI_QUIRK(0x1028, 0x0b1a, "Dell Precision 5570", ALC289_FIXUP_DUAL_SPK),
9543         SND_PCI_QUIRK(0x1028, 0x0b37, "Dell Inspiron 16 Plus 7620 2-in-1", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS),
9544         SND_PCI_QUIRK(0x1028, 0x0b71, "Dell Inspiron 16 Plus 7620", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS),
9545         SND_PCI_QUIRK(0x1028, 0x0c03, "Dell Precision 5340", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
9546         SND_PCI_QUIRK(0x1028, 0x0c19, "Dell Precision 3340", ALC236_FIXUP_DELL_DUAL_CODECS),
9547         SND_PCI_QUIRK(0x1028, 0x0c1a, "Dell Precision 3340", ALC236_FIXUP_DELL_DUAL_CODECS),
9548         SND_PCI_QUIRK(0x1028, 0x0c1b, "Dell Precision 3440", ALC236_FIXUP_DELL_DUAL_CODECS),
9549         SND_PCI_QUIRK(0x1028, 0x0c1c, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS),
9550         SND_PCI_QUIRK(0x1028, 0x0c1d, "Dell Precision 3440", ALC236_FIXUP_DELL_DUAL_CODECS),
9551         SND_PCI_QUIRK(0x1028, 0x0c1e, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS),
9552         SND_PCI_QUIRK(0x1028, 0x0cbd, "Dell Oasis 13 CS MTL-U", ALC245_FIXUP_CS35L41_SPI_2),
9553         SND_PCI_QUIRK(0x1028, 0x0cbe, "Dell Oasis 13 2-IN-1 MTL-U", ALC245_FIXUP_CS35L41_SPI_2),
9554         SND_PCI_QUIRK(0x1028, 0x0cbf, "Dell Oasis 13 Low Weight MTU-L", ALC245_FIXUP_CS35L41_SPI_2),
9555         SND_PCI_QUIRK(0x1028, 0x0cc1, "Dell Oasis 14 MTL-H/U", ALC245_FIXUP_CS35L41_SPI_2),
9556         SND_PCI_QUIRK(0x1028, 0x0cc2, "Dell Oasis 14 2-in-1 MTL-H/U", ALC245_FIXUP_CS35L41_SPI_2),
9557         SND_PCI_QUIRK(0x1028, 0x0cc3, "Dell Oasis 14 Low Weight MTL-U", ALC245_FIXUP_CS35L41_SPI_2),
9558         SND_PCI_QUIRK(0x1028, 0x0cc4, "Dell Oasis 16 MTL-H/U", ALC245_FIXUP_CS35L41_SPI_2),
9559         SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9560         SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9561         SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
9562         SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
9563         SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
9564         SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9565         SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9566         SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9567         SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9568         SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC),
9569         SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9570         SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9571         SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9572         SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9573         SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9574         SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9575         SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9576         SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9577         SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9578         SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9579         SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9580         SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9581         SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9582         SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
9583         SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
9584         SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9585         SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9586         SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9587         SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9588         SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9589         SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9590         SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9591         SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9592         SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED),
9593         SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9594         SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS),
9595         SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9596         SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS),
9597         SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9598         SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9599         SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9600         SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9601         SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9602         SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9603         SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9604         SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9605         SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9606         SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9607         SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9608         SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9609         SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9610         SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9611         SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),
9612         SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9613         SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9614         SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9615         SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9616         SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9617         SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9618         SND_PCI_QUIRK(0x103c, 0x2b5e, "HP 288 Pro G2 MT", ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE),
9619         SND_PCI_QUIRK(0x103c, 0x802e, "HP Z240 SFF", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9620         SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9621         SND_PCI_QUIRK(0x103c, 0x8077, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
9622         SND_PCI_QUIRK(0x103c, 0x8158, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
9623         SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC295_FIXUP_HP_X360),
9624         SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
9625         SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),
9626         SND_PCI_QUIRK(0x103c, 0x827f, "HP x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9627         SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9628         SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9629         SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9630         SND_PCI_QUIRK(0x103c, 0x841c, "HP Pavilion 15-CK0xx", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9631         SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9632         SND_PCI_QUIRK(0x103c, 0x84da, "HP OMEN dc0019-ur", ALC295_FIXUP_HP_OMEN),
9633         SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9634         SND_PCI_QUIRK(0x103c, 0x8519, "HP Spectre x360 15-df0xxx", ALC285_FIXUP_HP_SPECTRE_X360),
9635         SND_PCI_QUIRK(0x103c, 0x860f, "HP ZBook 15 G6", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9636         SND_PCI_QUIRK(0x103c, 0x861f, "HP Elite Dragonfly G1", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9637         SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),
9638         SND_PCI_QUIRK(0x103c, 0x86c7, "HP Envy AiO 32", ALC274_FIXUP_HP_ENVY_GPIO),
9639         SND_PCI_QUIRK(0x103c, 0x86e7, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9640         SND_PCI_QUIRK(0x103c, 0x86e8, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9641         SND_PCI_QUIRK(0x103c, 0x86f9, "HP Spectre x360 13-aw0xxx", ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED),
9642         SND_PCI_QUIRK(0x103c, 0x8716, "HP Elite Dragonfly G2 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9643         SND_PCI_QUIRK(0x103c, 0x8720, "HP EliteBook x360 1040 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9644         SND_PCI_QUIRK(0x103c, 0x8724, "HP EliteBook 850 G7", ALC285_FIXUP_HP_GPIO_LED),
9645         SND_PCI_QUIRK(0x103c, 0x8728, "HP EliteBook 840 G7", ALC285_FIXUP_HP_GPIO_LED),
9646         SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED),
9647         SND_PCI_QUIRK(0x103c, 0x8730, "HP ProBook 445 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9648         SND_PCI_QUIRK(0x103c, 0x8735, "HP ProBook 435 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9649         SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9650         SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED),
9651         SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED),
9652         SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED),
9653         SND_PCI_QUIRK(0x103c, 0x8780, "HP ZBook Fury 17 G7 Mobile Workstation",
9654                       ALC285_FIXUP_HP_GPIO_AMP_INIT),
9655         SND_PCI_QUIRK(0x103c, 0x8783, "HP ZBook Fury 15 G7 Mobile Workstation",
9656                       ALC285_FIXUP_HP_GPIO_AMP_INIT),
9657         SND_PCI_QUIRK(0x103c, 0x8786, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
9658         SND_PCI_QUIRK(0x103c, 0x8787, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
9659         SND_PCI_QUIRK(0x103c, 0x8788, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
9660         SND_PCI_QUIRK(0x103c, 0x87c8, "HP", ALC287_FIXUP_HP_GPIO_LED),
9661         SND_PCI_QUIRK(0x103c, 0x87e5, "HP ProBook 440 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9662         SND_PCI_QUIRK(0x103c, 0x87e7, "HP ProBook 450 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9663         SND_PCI_QUIRK(0x103c, 0x87f1, "HP ProBook 630 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9664         SND_PCI_QUIRK(0x103c, 0x87f2, "HP ProBook 640 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9665         SND_PCI_QUIRK(0x103c, 0x87f4, "HP", ALC287_FIXUP_HP_GPIO_LED),
9666         SND_PCI_QUIRK(0x103c, 0x87f5, "HP", ALC287_FIXUP_HP_GPIO_LED),
9667         SND_PCI_QUIRK(0x103c, 0x87f6, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
9668         SND_PCI_QUIRK(0x103c, 0x87f7, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
9669         SND_PCI_QUIRK(0x103c, 0x8805, "HP ProBook 650 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9670         SND_PCI_QUIRK(0x103c, 0x880d, "HP EliteBook 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9671         SND_PCI_QUIRK(0x103c, 0x8811, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9672         SND_PCI_QUIRK(0x103c, 0x8812, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9673         SND_PCI_QUIRK(0x103c, 0x881d, "HP 250 G8 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
9674         SND_PCI_QUIRK(0x103c, 0x8846, "HP EliteBook 850 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9675         SND_PCI_QUIRK(0x103c, 0x8847, "HP EliteBook x360 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9676         SND_PCI_QUIRK(0x103c, 0x884b, "HP EliteBook 840 Aero G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9677         SND_PCI_QUIRK(0x103c, 0x884c, "HP EliteBook 840 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9678         SND_PCI_QUIRK(0x103c, 0x8862, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9679         SND_PCI_QUIRK(0x103c, 0x8863, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9680         SND_PCI_QUIRK(0x103c, 0x886d, "HP ZBook Fury 17.3 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9681         SND_PCI_QUIRK(0x103c, 0x8870, "HP ZBook Fury 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9682         SND_PCI_QUIRK(0x103c, 0x8873, "HP ZBook Studio 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9683         SND_PCI_QUIRK(0x103c, 0x887a, "HP Laptop 15s-eq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
9684         SND_PCI_QUIRK(0x103c, 0x888a, "HP ENVY x360 Convertible 15-eu0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS),
9685         SND_PCI_QUIRK(0x103c, 0x888d, "HP ZBook Power 15.6 inch G8 Mobile Workstation PC", ALC236_FIXUP_HP_GPIO_LED),
9686         SND_PCI_QUIRK(0x103c, 0x8895, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED),
9687         SND_PCI_QUIRK(0x103c, 0x8896, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_MUTE_LED),
9688         SND_PCI_QUIRK(0x103c, 0x8898, "HP EliteBook 845 G8 Notebook PC", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9689         SND_PCI_QUIRK(0x103c, 0x88d0, "HP Pavilion 15-eh1xxx (mainboard 88D0)", ALC287_FIXUP_HP_GPIO_LED),
9690         SND_PCI_QUIRK(0x103c, 0x8902, "HP OMEN 16", ALC285_FIXUP_HP_MUTE_LED),
9691         SND_PCI_QUIRK(0x103c, 0x8919, "HP Pavilion Aero Laptop 13-be0xxx", ALC287_FIXUP_HP_GPIO_LED),
9692         SND_PCI_QUIRK(0x103c, 0x896d, "HP ZBook Firefly 16 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9693         SND_PCI_QUIRK(0x103c, 0x896e, "HP EliteBook x360 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9694         SND_PCI_QUIRK(0x103c, 0x8971, "HP EliteBook 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9695         SND_PCI_QUIRK(0x103c, 0x8972, "HP EliteBook 840 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9696         SND_PCI_QUIRK(0x103c, 0x8973, "HP EliteBook 860 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9697         SND_PCI_QUIRK(0x103c, 0x8974, "HP EliteBook 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9698         SND_PCI_QUIRK(0x103c, 0x8975, "HP EliteBook x360 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9699         SND_PCI_QUIRK(0x103c, 0x8981, "HP Elite Dragonfly G3", ALC245_FIXUP_CS35L41_SPI_4),
9700         SND_PCI_QUIRK(0x103c, 0x898e, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),
9701         SND_PCI_QUIRK(0x103c, 0x898f, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),
9702         SND_PCI_QUIRK(0x103c, 0x8991, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9703         SND_PCI_QUIRK(0x103c, 0x8992, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2),
9704         SND_PCI_QUIRK(0x103c, 0x8994, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9705         SND_PCI_QUIRK(0x103c, 0x8995, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2),
9706         SND_PCI_QUIRK(0x103c, 0x89a4, "HP ProBook 440 G9", ALC236_FIXUP_HP_GPIO_LED),
9707         SND_PCI_QUIRK(0x103c, 0x89a6, "HP ProBook 450 G9", ALC236_FIXUP_HP_GPIO_LED),
9708         SND_PCI_QUIRK(0x103c, 0x89aa, "HP EliteBook 630 G9", ALC236_FIXUP_HP_GPIO_LED),
9709         SND_PCI_QUIRK(0x103c, 0x89ac, "HP EliteBook 640 G9", ALC236_FIXUP_HP_GPIO_LED),
9710         SND_PCI_QUIRK(0x103c, 0x89ae, "HP EliteBook 650 G9", ALC236_FIXUP_HP_GPIO_LED),
9711         SND_PCI_QUIRK(0x103c, 0x89c0, "HP ZBook Power 15.6 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9712         SND_PCI_QUIRK(0x103c, 0x89c3, "Zbook Studio G9", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
9713         SND_PCI_QUIRK(0x103c, 0x89c6, "Zbook Fury 17 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9714         SND_PCI_QUIRK(0x103c, 0x89ca, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9715         SND_PCI_QUIRK(0x103c, 0x89d3, "HP EliteBook 645 G9 (MB 89D2)", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9716         SND_PCI_QUIRK(0x103c, 0x8a25, "HP Victus 16-d1xxx (MB 8A25)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),
9717         SND_PCI_QUIRK(0x103c, 0x8a78, "HP Dev One", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9718         SND_PCI_QUIRK(0x103c, 0x8aa0, "HP ProBook 440 G9 (MB 8A9E)", ALC236_FIXUP_HP_GPIO_LED),
9719         SND_PCI_QUIRK(0x103c, 0x8aa3, "HP ProBook 450 G9 (MB 8AA1)", ALC236_FIXUP_HP_GPIO_LED),
9720         SND_PCI_QUIRK(0x103c, 0x8aa8, "HP EliteBook 640 G9 (MB 8AA6)", ALC236_FIXUP_HP_GPIO_LED),
9721         SND_PCI_QUIRK(0x103c, 0x8aab, "HP EliteBook 650 G9 (MB 8AA9)", ALC236_FIXUP_HP_GPIO_LED),
9722         SND_PCI_QUIRK(0x103c, 0x8abb, "HP ZBook Firefly 14 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9723         SND_PCI_QUIRK(0x103c, 0x8ad1, "HP EliteBook 840 14 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9724         SND_PCI_QUIRK(0x103c, 0x8ad2, "HP EliteBook 860 16 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9725         SND_PCI_QUIRK(0x103c, 0x8b42, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9726         SND_PCI_QUIRK(0x103c, 0x8b43, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9727         SND_PCI_QUIRK(0x103c, 0x8b44, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9728         SND_PCI_QUIRK(0x103c, 0x8b45, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9729         SND_PCI_QUIRK(0x103c, 0x8b46, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9730         SND_PCI_QUIRK(0x103c, 0x8b47, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9731         SND_PCI_QUIRK(0x103c, 0x8b5d, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9732         SND_PCI_QUIRK(0x103c, 0x8b5e, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9733         SND_PCI_QUIRK(0x103c, 0x8b63, "HP Elite Dragonfly 13.5 inch G4", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
9734         SND_PCI_QUIRK(0x103c, 0x8b65, "HP ProBook 455 15.6 inch G10 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9735         SND_PCI_QUIRK(0x103c, 0x8b66, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9736         SND_PCI_QUIRK(0x103c, 0x8b70, "HP EliteBook 835 G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9737         SND_PCI_QUIRK(0x103c, 0x8b72, "HP EliteBook 845 G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9738         SND_PCI_QUIRK(0x103c, 0x8b74, "HP EliteBook 845W G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9739         SND_PCI_QUIRK(0x103c, 0x8b77, "HP ElieBook 865 G10", ALC287_FIXUP_CS35L41_I2C_2),
9740         SND_PCI_QUIRK(0x103c, 0x8b7a, "HP", ALC236_FIXUP_HP_GPIO_LED),
9741         SND_PCI_QUIRK(0x103c, 0x8b7d, "HP", ALC236_FIXUP_HP_GPIO_LED),
9742         SND_PCI_QUIRK(0x103c, 0x8b87, "HP", ALC236_FIXUP_HP_GPIO_LED),
9743         SND_PCI_QUIRK(0x103c, 0x8b8a, "HP", ALC236_FIXUP_HP_GPIO_LED),
9744         SND_PCI_QUIRK(0x103c, 0x8b8b, "HP", ALC236_FIXUP_HP_GPIO_LED),
9745         SND_PCI_QUIRK(0x103c, 0x8b8d, "HP", ALC236_FIXUP_HP_GPIO_LED),
9746         SND_PCI_QUIRK(0x103c, 0x8b8f, "HP", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
9747         SND_PCI_QUIRK(0x103c, 0x8b92, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9748         SND_PCI_QUIRK(0x103c, 0x8b96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9749         SND_PCI_QUIRK(0x103c, 0x8b97, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9750         SND_PCI_QUIRK(0x103c, 0x8bf0, "HP", ALC236_FIXUP_HP_GPIO_LED),
9751         SND_PCI_QUIRK(0x103c, 0x8c46, "HP EliteBook 830 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9752         SND_PCI_QUIRK(0x103c, 0x8c47, "HP EliteBook 840 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9753         SND_PCI_QUIRK(0x103c, 0x8c48, "HP EliteBook 860 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9754         SND_PCI_QUIRK(0x103c, 0x8c49, "HP Elite x360 830 2-in-1 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9755         SND_PCI_QUIRK(0x103c, 0x8c70, "HP EliteBook 835 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9756         SND_PCI_QUIRK(0x103c, 0x8c71, "HP EliteBook 845 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9757         SND_PCI_QUIRK(0x103c, 0x8c72, "HP EliteBook 865 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9758         SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
9759         SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
9760         SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9761         SND_PCI_QUIRK(0x1043, 0x10a1, "ASUS UX391UA", ALC294_FIXUP_ASUS_SPK),
9762         SND_PCI_QUIRK(0x1043, 0x10c0, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
9763         SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9764         SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9765         SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9766         SND_PCI_QUIRK(0x1043, 0x125e, "ASUS Q524UQK", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9767         SND_PCI_QUIRK(0x1043, 0x1271, "ASUS X430UN", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
9768         SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
9769         SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
9770         SND_PCI_QUIRK(0x1043, 0x12a3, "Asus N7691ZM", ALC269_FIXUP_ASUS_N7601ZM),
9771         SND_PCI_QUIRK(0x1043, 0x12af, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),
9772         SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
9773         SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
9774         SND_PCI_QUIRK(0x1043, 0x1313, "Asus K42JZ", ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE),
9775         SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
9776         SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
9777         SND_PCI_QUIRK(0x1043, 0x1433, "ASUS GX650P", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
9778         SND_PCI_QUIRK(0x1043, 0x1463, "Asus GA402X", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
9779         SND_PCI_QUIRK(0x1043, 0x1473, "ASUS GU604V", ALC285_FIXUP_ASUS_HEADSET_MIC),
9780         SND_PCI_QUIRK(0x1043, 0x1483, "ASUS GU603V", ALC285_FIXUP_ASUS_HEADSET_MIC),
9781         SND_PCI_QUIRK(0x1043, 0x1493, "ASUS GV601V", ALC285_FIXUP_ASUS_HEADSET_MIC),
9782         SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
9783         SND_PCI_QUIRK(0x1043, 0x1573, "ASUS GZ301V", ALC285_FIXUP_ASUS_HEADSET_MIC),
9784         SND_PCI_QUIRK(0x1043, 0x1662, "ASUS GV301QH", ALC294_FIXUP_ASUS_DUAL_SPK),
9785         SND_PCI_QUIRK(0x1043, 0x1683, "ASUS UM3402YAR", ALC287_FIXUP_CS35L41_I2C_2),
9786         SND_PCI_QUIRK(0x1043, 0x16b2, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
9787         SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
9788         SND_PCI_QUIRK(0x1043, 0x1740, "ASUS UX430UA", ALC295_FIXUP_ASUS_DACS),
9789         SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK),
9790         SND_PCI_QUIRK(0x1043, 0x17f3, "ROG Ally RC71L_RC71L", ALC294_FIXUP_ASUS_ALLY),
9791         SND_PCI_QUIRK(0x1043, 0x1881, "ASUS Zephyrus S/M", ALC294_FIXUP_ASUS_GX502_PINS),
9792         SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC),
9793         SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC),
9794         SND_PCI_QUIRK(0x1043, 0x194e, "ASUS UX563FD", ALC294_FIXUP_ASUS_HPE),
9795         SND_PCI_QUIRK(0x1043, 0x1970, "ASUS UX550VE", ALC289_FIXUP_ASUS_GA401),
9796         SND_PCI_QUIRK(0x1043, 0x1982, "ASUS B1400CEPE", ALC256_FIXUP_ASUS_HPE),
9797         SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE),
9798         SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE),
9799         SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
9800         SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
9801         SND_PCI_QUIRK(0x1043, 0x1a8f, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),
9802         SND_PCI_QUIRK(0x1043, 0x1b11, "ASUS UX431DA", ALC294_FIXUP_ASUS_COEF_1B),
9803         SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC),
9804         SND_PCI_QUIRK(0x1043, 0x1b93, "ASUS G614JVR/JIR", ALC245_FIXUP_CS35L41_SPI_2),
9805         SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9806         SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9807         SND_PCI_QUIRK(0x1043, 0x1c62, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
9808         SND_PCI_QUIRK(0x1043, 0x1c92, "ASUS ROG Strix G15", ALC285_FIXUP_ASUS_G533Z_PINS),
9809         SND_PCI_QUIRK(0x1043, 0x1c9f, "ASUS G614JI", ALC285_FIXUP_ASUS_HEADSET_MIC),
9810         SND_PCI_QUIRK(0x1043, 0x1caf, "ASUS G634JYR/JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
9811         SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
9812         SND_PCI_QUIRK(0x1043, 0x1d1f, "ASUS ROG Strix G17 2023 (G713PV)", ALC287_FIXUP_CS35L41_I2C_2),
9813         SND_PCI_QUIRK(0x1043, 0x1d42, "ASUS Zephyrus G14 2022", ALC289_FIXUP_ASUS_GA401),
9814         SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),
9815         SND_PCI_QUIRK(0x1043, 0x1e02, "ASUS UX3402", ALC245_FIXUP_CS35L41_SPI_2),
9816         SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502),
9817         SND_PCI_QUIRK(0x1043, 0x1e12, "ASUS UM3402", ALC287_FIXUP_CS35L41_I2C_2),
9818         SND_PCI_QUIRK(0x1043, 0x1e51, "ASUS Zephyrus M15", ALC294_FIXUP_ASUS_GU502_PINS),
9819         SND_PCI_QUIRK(0x1043, 0x1e5e, "ASUS ROG Strix G513", ALC294_FIXUP_ASUS_G513_PINS),
9820         SND_PCI_QUIRK(0x1043, 0x1e8e, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA401),
9821         SND_PCI_QUIRK(0x1043, 0x1c52, "ASUS Zephyrus G15 2022", ALC289_FIXUP_ASUS_GA401),
9822         SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),
9823         SND_PCI_QUIRK(0x1043, 0x1f12, "ASUS UM5302", ALC287_FIXUP_CS35L41_I2C_2),
9824         SND_PCI_QUIRK(0x1043, 0x1f92, "ASUS ROG Flow X16", ALC289_FIXUP_ASUS_GA401),
9825         SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
9826         SND_PCI_QUIRK(0x1043, 0x3a20, "ASUS G614JZR", ALC245_FIXUP_CS35L41_SPI_2),
9827         SND_PCI_QUIRK(0x1043, 0x3a30, "ASUS G814JVR/JIR", ALC245_FIXUP_CS35L41_SPI_2),
9828         SND_PCI_QUIRK(0x1043, 0x3a40, "ASUS G814JZR", ALC245_FIXUP_CS35L41_SPI_2),
9829         SND_PCI_QUIRK(0x1043, 0x3a50, "ASUS G834JYR/JZR", ALC245_FIXUP_CS35L41_SPI_2),
9830         SND_PCI_QUIRK(0x1043, 0x3a60, "ASUS G634JYR/JZR", ALC245_FIXUP_CS35L41_SPI_2),
9831         SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
9832         SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
9833         SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
9834         SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
9835         SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
9836         SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
9837         SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
9838         SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
9839         SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),
9840         SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
9841         SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
9842         SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
9843         SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),
9844         SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),
9845         SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),
9846         SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN),
9847         SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
9848         SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE),
9849         SND_PCI_QUIRK(0x10ec, 0x118c, "Medion EE4254 MD62100", ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE),
9850         SND_PCI_QUIRK(0x10ec, 0x1230, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
9851         SND_PCI_QUIRK(0x10ec, 0x124c, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
9852         SND_PCI_QUIRK(0x10ec, 0x1252, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
9853         SND_PCI_QUIRK(0x10ec, 0x1254, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
9854         SND_PCI_QUIRK(0x10ec, 0x12cc, "Intel Reference board", ALC225_FIXUP_HEADSET_JACK),
9855         SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_HEADSET_MODE),
9856         SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
9857         SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_AMP),
9858         SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_AMP),
9859         SND_PCI_QUIRK(0x144d, 0xc189, "Samsung Galaxy Flex Book (NT950QCG-X716)", ALC298_FIXUP_SAMSUNG_AMP),
9860         SND_PCI_QUIRK(0x144d, 0xc18a, "Samsung Galaxy Book Ion (NP930XCJ-K01US)", ALC298_FIXUP_SAMSUNG_AMP),
9861         SND_PCI_QUIRK(0x144d, 0xc1a3, "Samsung Galaxy Book Pro (NP935XDB-KC1SE)", ALC298_FIXUP_SAMSUNG_AMP),
9862         SND_PCI_QUIRK(0x144d, 0xc1a6, "Samsung Galaxy Book Pro 360 (NP930QBD)", ALC298_FIXUP_SAMSUNG_AMP),
9863         SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
9864         SND_PCI_QUIRK(0x144d, 0xc812, "Samsung Notebook Pen S (NT950SBE-X58)", ALC298_FIXUP_SAMSUNG_AMP),
9865         SND_PCI_QUIRK(0x144d, 0xc830, "Samsung Galaxy Book Ion (NT950XCJ-X716A)", ALC298_FIXUP_SAMSUNG_AMP),
9866         SND_PCI_QUIRK(0x144d, 0xc832, "Samsung Galaxy Book Flex Alpha (NP730QCJ)", ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
9867         SND_PCI_QUIRK(0x144d, 0xca03, "Samsung Galaxy Book2 Pro 360 (NP930QED)", ALC298_FIXUP_SAMSUNG_AMP),
9868         SND_PCI_QUIRK(0x144d, 0xc868, "Samsung Galaxy Book2 Pro (NP930XED)", ALC298_FIXUP_SAMSUNG_AMP),
9869         SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
9870         SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
9871         SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
9872         SND_PCI_QUIRK(0x152d, 0x1082, "Quanta NL3", ALC269_FIXUP_LIFEBOOK),
9873         SND_PCI_QUIRK(0x1558, 0x1323, "Clevo N130ZU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9874         SND_PCI_QUIRK(0x1558, 0x1325, "Clevo N15[01][CW]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9875         SND_PCI_QUIRK(0x1558, 0x1401, "Clevo L140[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9876         SND_PCI_QUIRK(0x1558, 0x1403, "Clevo N140CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9877         SND_PCI_QUIRK(0x1558, 0x1404, "Clevo N150CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9878         SND_PCI_QUIRK(0x1558, 0x14a1, "Clevo L141MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9879         SND_PCI_QUIRK(0x1558, 0x4018, "Clevo NV40M[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9880         SND_PCI_QUIRK(0x1558, 0x4019, "Clevo NV40MZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9881         SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9882         SND_PCI_QUIRK(0x1558, 0x4041, "Clevo NV4[15]PZ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9883         SND_PCI_QUIRK(0x1558, 0x40a1, "Clevo NL40GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9884         SND_PCI_QUIRK(0x1558, 0x40c1, "Clevo NL40[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9885         SND_PCI_QUIRK(0x1558, 0x40d1, "Clevo NL41DU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9886         SND_PCI_QUIRK(0x1558, 0x5015, "Clevo NH5[58]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9887         SND_PCI_QUIRK(0x1558, 0x5017, "Clevo NH7[79]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9888         SND_PCI_QUIRK(0x1558, 0x50a3, "Clevo NJ51GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9889         SND_PCI_QUIRK(0x1558, 0x50b3, "Clevo NK50S[BEZ]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9890         SND_PCI_QUIRK(0x1558, 0x50b6, "Clevo NK50S5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9891         SND_PCI_QUIRK(0x1558, 0x50b8, "Clevo NK50SZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9892         SND_PCI_QUIRK(0x1558, 0x50d5, "Clevo NP50D5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9893         SND_PCI_QUIRK(0x1558, 0x50e1, "Clevo NH5[58]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9894         SND_PCI_QUIRK(0x1558, 0x50e2, "Clevo NH7[79]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9895         SND_PCI_QUIRK(0x1558, 0x50f0, "Clevo NH50A[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9896         SND_PCI_QUIRK(0x1558, 0x50f2, "Clevo NH50E[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9897         SND_PCI_QUIRK(0x1558, 0x50f3, "Clevo NH58DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9898         SND_PCI_QUIRK(0x1558, 0x50f5, "Clevo NH55EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9899         SND_PCI_QUIRK(0x1558, 0x50f6, "Clevo NH55DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9900         SND_PCI_QUIRK(0x1558, 0x5101, "Clevo S510WU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9901         SND_PCI_QUIRK(0x1558, 0x5157, "Clevo W517GU1", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9902         SND_PCI_QUIRK(0x1558, 0x51a1, "Clevo NS50MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9903         SND_PCI_QUIRK(0x1558, 0x51b1, "Clevo NS50AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9904         SND_PCI_QUIRK(0x1558, 0x51b3, "Clevo NS70AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9905         SND_PCI_QUIRK(0x1558, 0x5630, "Clevo NP50RNJS", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9906         SND_PCI_QUIRK(0x1558, 0x70a1, "Clevo NB70T[HJK]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9907         SND_PCI_QUIRK(0x1558, 0x70b3, "Clevo NK70SB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9908         SND_PCI_QUIRK(0x1558, 0x70f2, "Clevo NH79EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9909         SND_PCI_QUIRK(0x1558, 0x70f3, "Clevo NH77DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9910         SND_PCI_QUIRK(0x1558, 0x70f4, "Clevo NH77EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9911         SND_PCI_QUIRK(0x1558, 0x70f6, "Clevo NH77DPQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9912         SND_PCI_QUIRK(0x1558, 0x7716, "Clevo NS50PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9913         SND_PCI_QUIRK(0x1558, 0x7717, "Clevo NS70PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9914         SND_PCI_QUIRK(0x1558, 0x7718, "Clevo L140PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9915         SND_PCI_QUIRK(0x1558, 0x7724, "Clevo L140AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9916         SND_PCI_QUIRK(0x1558, 0x8228, "Clevo NR40BU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9917         SND_PCI_QUIRK(0x1558, 0x8520, "Clevo NH50D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9918         SND_PCI_QUIRK(0x1558, 0x8521, "Clevo NH77D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9919         SND_PCI_QUIRK(0x1558, 0x8535, "Clevo NH50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9920         SND_PCI_QUIRK(0x1558, 0x8536, "Clevo NH79D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9921         SND_PCI_QUIRK(0x1558, 0x8550, "Clevo NH[57][0-9][ER][ACDH]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9922         SND_PCI_QUIRK(0x1558, 0x8551, "Clevo NH[57][0-9][ER][ACDH]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9923         SND_PCI_QUIRK(0x1558, 0x8560, "Clevo NH[57][0-9][ER][ACDH]Q", ALC269_FIXUP_HEADSET_MIC),
9924         SND_PCI_QUIRK(0x1558, 0x8561, "Clevo NH[57][0-9][ER][ACDH]Q", ALC269_FIXUP_HEADSET_MIC),
9925         SND_PCI_QUIRK(0x1558, 0x8562, "Clevo NH[57][0-9]RZ[Q]", ALC269_FIXUP_DMIC),
9926         SND_PCI_QUIRK(0x1558, 0x8668, "Clevo NP50B[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9927         SND_PCI_QUIRK(0x1558, 0x866d, "Clevo NP5[05]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9928         SND_PCI_QUIRK(0x1558, 0x867c, "Clevo NP7[01]PNP", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9929         SND_PCI_QUIRK(0x1558, 0x867d, "Clevo NP7[01]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9930         SND_PCI_QUIRK(0x1558, 0x8680, "Clevo NJ50LU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9931         SND_PCI_QUIRK(0x1558, 0x8686, "Clevo NH50[CZ]U", ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME),
9932         SND_PCI_QUIRK(0x1558, 0x8a20, "Clevo NH55DCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9933         SND_PCI_QUIRK(0x1558, 0x8a51, "Clevo NH70RCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9934         SND_PCI_QUIRK(0x1558, 0x8d50, "Clevo NH55RCQ-M", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9935         SND_PCI_QUIRK(0x1558, 0x951d, "Clevo N950T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9936         SND_PCI_QUIRK(0x1558, 0x9600, "Clevo N960K[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9937         SND_PCI_QUIRK(0x1558, 0x961d, "Clevo N960S[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9938         SND_PCI_QUIRK(0x1558, 0x971d, "Clevo N970T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9939         SND_PCI_QUIRK(0x1558, 0xa500, "Clevo NL5[03]RU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9940         SND_PCI_QUIRK(0x1558, 0xa600, "Clevo NL50NU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9941         SND_PCI_QUIRK(0x1558, 0xa650, "Clevo NP[567]0SN[CD]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9942         SND_PCI_QUIRK(0x1558, 0xa671, "Clevo NP70SN[CDE]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9943         SND_PCI_QUIRK(0x1558, 0xb018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9944         SND_PCI_QUIRK(0x1558, 0xb019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9945         SND_PCI_QUIRK(0x1558, 0xb022, "Clevo NH77D[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9946         SND_PCI_QUIRK(0x1558, 0xc018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9947         SND_PCI_QUIRK(0x1558, 0xc019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9948         SND_PCI_QUIRK(0x1558, 0xc022, "Clevo NH77[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9949         SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
9950         SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
9951         SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
9952         SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
9953         SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
9954         SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
9955         SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
9956         SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
9957         SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST),
9958         SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
9959         SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
9960         SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
9961         SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
9962         SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440),
9963         SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK),
9964         SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK),
9965         SND_PCI_QUIRK(0x17aa, 0x2211, "Thinkpad W541", ALC292_FIXUP_TPT440_DOCK),
9966         SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),
9967         SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK),
9968         SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9969         SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK),
9970         SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
9971         SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
9972         SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9973         SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9974         SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460),
9975         SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),
9976         SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK),
9977         SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9978         SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9979         SND_PCI_QUIRK(0x17aa, 0x2249, "Thinkpad", ALC292_FIXUP_TPT460),
9980         SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9981         SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9982         SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
9983         SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9984         SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
9985         SND_PCI_QUIRK(0x17aa, 0x22be, "Thinkpad X1 Carbon 8th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
9986         SND_PCI_QUIRK(0x17aa, 0x22c1, "Thinkpad P1 Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
9987         SND_PCI_QUIRK(0x17aa, 0x22c2, "Thinkpad X1 Extreme Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
9988         SND_PCI_QUIRK(0x17aa, 0x22f1, "Thinkpad", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI),
9989         SND_PCI_QUIRK(0x17aa, 0x22f2, "Thinkpad", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI),
9990         SND_PCI_QUIRK(0x17aa, 0x22f3, "Thinkpad", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI),
9991         SND_PCI_QUIRK(0x17aa, 0x2316, "Thinkpad P1 Gen 6", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI),
9992         SND_PCI_QUIRK(0x17aa, 0x2317, "Thinkpad P1 Gen 6", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI),
9993         SND_PCI_QUIRK(0x17aa, 0x2318, "Thinkpad Z13 Gen2", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI),
9994         SND_PCI_QUIRK(0x17aa, 0x2319, "Thinkpad Z16 Gen2", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI),
9995         SND_PCI_QUIRK(0x17aa, 0x231a, "Thinkpad Z16 Gen2", ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI),
9996         SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
9997         SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
9998         SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
9999         SND_PCI_QUIRK(0x17aa, 0x3111, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
10000         SND_PCI_QUIRK(0x17aa, 0x312a, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
10001         SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
10002         SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
10003         SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
10004         SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
10005         SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
10006         SND_PCI_QUIRK(0x17aa, 0x31af, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
10007         SND_PCI_QUIRK(0x17aa, 0x3801, "Lenovo Yoga9 14IAP7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
10008         SND_PCI_QUIRK(0x17aa, 0x3802, "Lenovo Yoga DuetITL 2021", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
10009         SND_PCI_QUIRK(0x17aa, 0x3813, "Legion 7i 15IMHG05", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
10010         SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940 / Yoga Duet 7", ALC298_FIXUP_LENOVO_C940_DUET7),
10011         SND_PCI_QUIRK(0x17aa, 0x3819, "Lenovo 13s Gen2 ITL", ALC287_FIXUP_13S_GEN2_SPEAKERS),
10012         SND_PCI_QUIRK(0x17aa, 0x3820, "Yoga Duet 7 13ITL6", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
10013         SND_PCI_QUIRK(0x17aa, 0x3824, "Legion Y9000X 2020", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
10014         SND_PCI_QUIRK(0x17aa, 0x3827, "Ideapad S740", ALC285_FIXUP_IDEAPAD_S740_COEF),
10015         SND_PCI_QUIRK(0x17aa, 0x3834, "Lenovo IdeaPad Slim 9i 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
10016         SND_PCI_QUIRK(0x17aa, 0x383d, "Legion Y9000X 2019", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
10017         SND_PCI_QUIRK(0x17aa, 0x3843, "Yoga 9i", ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP),
10018         SND_PCI_QUIRK(0x17aa, 0x3847, "Legion 7 16ACHG6", ALC287_FIXUP_LEGION_16ACHG6),
10019         SND_PCI_QUIRK(0x17aa, 0x384a, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
10020         SND_PCI_QUIRK(0x17aa, 0x3852, "Lenovo Yoga 7 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
10021         SND_PCI_QUIRK(0x17aa, 0x3853, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
10022         SND_PCI_QUIRK(0x17aa, 0x3855, "Legion 7 16ITHG6", ALC287_FIXUP_LEGION_16ITHG6),
10023         SND_PCI_QUIRK(0x17aa, 0x3869, "Lenovo Yoga7 14IAL7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
10024         SND_PCI_QUIRK(0x17aa, 0x387d, "Yoga S780-16 pro Quad AAC", ALC287_FIXUP_TAS2781_I2C),
10025         SND_PCI_QUIRK(0x17aa, 0x387e, "Yoga S780-16 pro Quad YC", ALC287_FIXUP_TAS2781_I2C),
10026         SND_PCI_QUIRK(0x17aa, 0x3881, "YB9 dual power mode2 YC", ALC287_FIXUP_TAS2781_I2C),
10027         SND_PCI_QUIRK(0x17aa, 0x3884, "Y780 YG DUAL", ALC287_FIXUP_TAS2781_I2C),
10028         SND_PCI_QUIRK(0x17aa, 0x3886, "Y780 VECO DUAL", ALC287_FIXUP_TAS2781_I2C),
10029         SND_PCI_QUIRK(0x17aa, 0x38a7, "Y780P AMD YG dual", ALC287_FIXUP_TAS2781_I2C),
10030         SND_PCI_QUIRK(0x17aa, 0x38a8, "Y780P AMD VECO dual", ALC287_FIXUP_TAS2781_I2C),
10031         SND_PCI_QUIRK(0x17aa, 0x38ba, "Yoga S780-14.5 Air AMD quad YC", ALC287_FIXUP_TAS2781_I2C),
10032         SND_PCI_QUIRK(0x17aa, 0x38bb, "Yoga S780-14.5 Air AMD quad AAC", ALC287_FIXUP_TAS2781_I2C),
10033         SND_PCI_QUIRK(0x17aa, 0x38be, "Yoga S980-14.5 proX YC Dual", ALC287_FIXUP_TAS2781_I2C),
10034         SND_PCI_QUIRK(0x17aa, 0x38bf, "Yoga S980-14.5 proX LX Dual", ALC287_FIXUP_TAS2781_I2C),
10035         SND_PCI_QUIRK(0x17aa, 0x38c3, "Y980 DUAL", ALC287_FIXUP_TAS2781_I2C),
10036         SND_PCI_QUIRK(0x17aa, 0x38cb, "Y790 YG DUAL", ALC287_FIXUP_TAS2781_I2C),
10037         SND_PCI_QUIRK(0x17aa, 0x38cd, "Y790 VECO DUAL", ALC287_FIXUP_TAS2781_I2C),
10038         SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
10039         SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
10040         SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
10041         SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
10042         SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10043         SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
10044         SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
10045         SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10046         SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK),
10047         SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK),
10048         SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK),
10049         SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK),
10050         SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
10051         SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),
10052         SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),
10053         SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460),
10054         SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10055         SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10056         SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10057         SND_PCI_QUIRK(0x17aa, 0x508b, "Thinkpad X12 Gen 1", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
10058         SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10059         SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10060         SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10061         SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
10062         SND_PCI_QUIRK(0x17aa, 0x9e56, "Lenovo ZhaoYang CF4620Z", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
10063         SND_PCI_QUIRK(0x1849, 0x1233, "ASRock NUC Box 1100", ALC233_FIXUP_NO_AUDIO_JACK),
10064         SND_PCI_QUIRK(0x1849, 0xa233, "Positivo Master C6300", ALC269_FIXUP_HEADSET_MIC),
10065         SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
10066         SND_PCI_QUIRK(0x19e5, 0x320f, "Huawei WRT-WX9 ", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
10067         SND_PCI_QUIRK(0x1b35, 0x1235, "CZC B20", ALC269_FIXUP_CZC_B20),
10068         SND_PCI_QUIRK(0x1b35, 0x1236, "CZC TMI", ALC269_FIXUP_CZC_TMI),
10069         SND_PCI_QUIRK(0x1b35, 0x1237, "CZC L101", ALC269_FIXUP_CZC_L101),
10070         SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
10071         SND_PCI_QUIRK(0x1c06, 0x2013, "Lemote A1802", ALC269_FIXUP_LEMOTE_A1802),
10072         SND_PCI_QUIRK(0x1c06, 0x2015, "Lemote A190X", ALC269_FIXUP_LEMOTE_A190X),
10073         SND_PCI_QUIRK(0x1c6c, 0x1251, "Positivo N14KP6-TG", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE),
10074         SND_PCI_QUIRK(0x1d05, 0x1132, "TongFang PHxTxX1", ALC256_FIXUP_SET_COEF_DEFAULTS),
10075         SND_PCI_QUIRK(0x1d05, 0x1096, "TongFang GMxMRxx", ALC269_FIXUP_NO_SHUTUP),
10076         SND_PCI_QUIRK(0x1d05, 0x1100, "TongFang GKxNRxx", ALC269_FIXUP_NO_SHUTUP),
10077         SND_PCI_QUIRK(0x1d05, 0x1111, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
10078         SND_PCI_QUIRK(0x1d05, 0x1119, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
10079         SND_PCI_QUIRK(0x1d05, 0x1129, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
10080         SND_PCI_QUIRK(0x1d05, 0x1147, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
10081         SND_PCI_QUIRK(0x1d05, 0x115c, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
10082         SND_PCI_QUIRK(0x1d05, 0x121b, "TongFang GMxAGxx", ALC269_FIXUP_NO_SHUTUP),
10083         SND_PCI_QUIRK(0x1d72, 0x1602, "RedmiBook", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
10084         SND_PCI_QUIRK(0x1d72, 0x1701, "XiaomiNotebook Pro", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE),
10085         SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC),
10086         SND_PCI_QUIRK(0x1d72, 0x1945, "Redmi G", ALC256_FIXUP_ASUS_HEADSET_MIC),
10087         SND_PCI_QUIRK(0x1d72, 0x1947, "RedmiBook Air", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
10088         SND_PCI_QUIRK(0x8086, 0x2074, "Intel NUC 8", ALC233_FIXUP_INTEL_NUC8_DMIC),
10089         SND_PCI_QUIRK(0x8086, 0x2080, "Intel NUC 8 Rugged", ALC256_FIXUP_INTEL_NUC8_RUGGED),
10090         SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", ALC256_FIXUP_INTEL_NUC10),
10091         SND_PCI_QUIRK(0x8086, 0x3038, "Intel NUC 13", ALC225_FIXUP_HEADSET_JACK),
10092         SND_PCI_QUIRK(0xf111, 0x0001, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
10093
10094 #if 0
10095         /* Below is a quirk table taken from the old code.
10096          * Basically the device should work as is without the fixup table.
10097          * If BIOS doesn't give a proper info, enable the corresponding
10098          * fixup entry.
10099          */
10100         SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
10101                       ALC269_FIXUP_AMIC),
10102         SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
10103         SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),
10104         SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),
10105         SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),
10106         SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC),
10107         SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC),
10108         SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC),
10109         SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC),
10110         SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC),
10111         SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC),
10112         SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC),
10113         SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC),
10114         SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC),
10115         SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC),
10116         SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC),
10117         SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC),
10118         SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC),
10119         SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC),
10120         SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC),
10121         SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC),
10122         SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC),
10123         SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC),
10124         SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC),
10125         SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC),
10126         SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC),
10127         SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC),
10128         SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC),
10129         SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC),
10130         SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC),
10131         SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC),
10132         SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC),
10133         SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC),
10134         SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC),
10135         SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC),
10136         SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC),
10137         SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC),
10138         SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC),
10139         SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC),
10140         SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC),
10141 #endif
10142         {}
10143 };
10144
10145 static const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = {
10146         SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
10147         SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),
10148         SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
10149         SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI),
10150         SND_PCI_QUIRK_VENDOR(0x19e5, "Huawei Matebook", ALC255_FIXUP_MIC_MUTE_LED),
10151         {}
10152 };
10153
10154 static const struct hda_model_fixup alc269_fixup_models[] = {
10155         {.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
10156         {.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
10157         {.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},
10158         {.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},
10159         {.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
10160         {.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"},
10161         {.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"},
10162         {.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"},
10163         {.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
10164         {.id = ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST, .name = "lenovo-dock-limit-boost"},
10165         {.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
10166         {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"},
10167         {.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
10168         {.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
10169         {.id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, .name = "dell-headset3"},
10170         {.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, .name = "dell-headset4"},
10171         {.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
10172         {.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},
10173         {.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
10174         {.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
10175         {.id = ALC292_FIXUP_TPT460, .name = "tpt460"},
10176         {.id = ALC298_FIXUP_TPT470_DOCK_FIX, .name = "tpt470-dock-fix"},
10177         {.id = ALC298_FIXUP_TPT470_DOCK, .name = "tpt470-dock"},
10178         {.id = ALC233_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
10179         {.id = ALC700_FIXUP_INTEL_REFERENCE, .name = "alc700-ref"},
10180         {.id = ALC269_FIXUP_SONY_VAIO, .name = "vaio"},
10181         {.id = ALC269_FIXUP_DELL_M101Z, .name = "dell-m101z"},
10182         {.id = ALC269_FIXUP_ASUS_G73JW, .name = "asus-g73jw"},
10183         {.id = ALC269_FIXUP_LENOVO_EAPD, .name = "lenovo-eapd"},
10184         {.id = ALC275_FIXUP_SONY_HWEQ, .name = "sony-hweq"},
10185         {.id = ALC269_FIXUP_PCM_44K, .name = "pcm44k"},
10186         {.id = ALC269_FIXUP_LIFEBOOK, .name = "lifebook"},
10187         {.id = ALC269_FIXUP_LIFEBOOK_EXTMIC, .name = "lifebook-extmic"},
10188         {.id = ALC269_FIXUP_LIFEBOOK_HP_PIN, .name = "lifebook-hp-pin"},
10189         {.id = ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC, .name = "lifebook-u7x7"},
10190         {.id = ALC269VB_FIXUP_AMIC, .name = "alc269vb-amic"},
10191         {.id = ALC269VB_FIXUP_DMIC, .name = "alc269vb-dmic"},
10192         {.id = ALC269_FIXUP_HP_MUTE_LED_MIC1, .name = "hp-mute-led-mic1"},
10193         {.id = ALC269_FIXUP_HP_MUTE_LED_MIC2, .name = "hp-mute-led-mic2"},
10194         {.id = ALC269_FIXUP_HP_MUTE_LED_MIC3, .name = "hp-mute-led-mic3"},
10195         {.id = ALC269_FIXUP_HP_GPIO_MIC1_LED, .name = "hp-gpio-mic1"},
10196         {.id = ALC269_FIXUP_HP_LINE1_MIC1_LED, .name = "hp-line1-mic1"},
10197         {.id = ALC269_FIXUP_NO_SHUTUP, .name = "noshutup"},
10198         {.id = ALC286_FIXUP_SONY_MIC_NO_PRESENCE, .name = "sony-nomic"},
10199         {.id = ALC269_FIXUP_ASPIRE_HEADSET_MIC, .name = "aspire-headset-mic"},
10200         {.id = ALC269_FIXUP_ASUS_X101, .name = "asus-x101"},
10201         {.id = ALC271_FIXUP_HP_GATE_MIC_JACK, .name = "acer-ao7xx"},
10202         {.id = ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572, .name = "acer-aspire-e1"},
10203         {.id = ALC269_FIXUP_ACER_AC700, .name = "acer-ac700"},
10204         {.id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST, .name = "limit-mic-boost"},
10205         {.id = ALC269VB_FIXUP_ASUS_ZENBOOK, .name = "asus-zenbook"},
10206         {.id = ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A, .name = "asus-zenbook-ux31a"},
10207         {.id = ALC269VB_FIXUP_ORDISSIMO_EVE2, .name = "ordissimo"},
10208         {.id = ALC282_FIXUP_ASUS_TX300, .name = "asus-tx300"},
10209         {.id = ALC283_FIXUP_INT_MIC, .name = "alc283-int-mic"},
10210         {.id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK, .name = "mono-speakers"},
10211         {.id = ALC290_FIXUP_SUBWOOFER_HSJACK, .name = "alc290-subwoofer"},
10212         {.id = ALC269_FIXUP_THINKPAD_ACPI, .name = "thinkpad"},
10213         {.id = ALC269_FIXUP_DMIC_THINKPAD_ACPI, .name = "dmic-thinkpad"},
10214         {.id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE, .name = "alc255-acer"},
10215         {.id = ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc255-asus"},
10216         {.id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc255-dell1"},
10217         {.id = ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "alc255-dell2"},
10218         {.id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc293-dell1"},
10219         {.id = ALC283_FIXUP_HEADSET_MIC, .name = "alc283-headset"},
10220         {.id = ALC255_FIXUP_MIC_MUTE_LED, .name = "alc255-dell-mute"},
10221         {.id = ALC282_FIXUP_ASPIRE_V5_PINS, .name = "aspire-v5"},
10222         {.id = ALC269VB_FIXUP_ASPIRE_E1_COEF, .name = "aspire-e1-coef"},
10223         {.id = ALC280_FIXUP_HP_GPIO4, .name = "hp-gpio4"},
10224         {.id = ALC286_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
10225         {.id = ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, .name = "hp-gpio2-hotkey"},
10226         {.id = ALC280_FIXUP_HP_DOCK_PINS, .name = "hp-dock-pins"},
10227         {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic"},
10228         {.id = ALC280_FIXUP_HP_9480M, .name = "hp-9480m"},
10229         {.id = ALC288_FIXUP_DELL_HEADSET_MODE, .name = "alc288-dell-headset"},
10230         {.id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc288-dell1"},
10231         {.id = ALC288_FIXUP_DELL_XPS_13, .name = "alc288-dell-xps13"},
10232         {.id = ALC292_FIXUP_DELL_E7X, .name = "dell-e7x"},
10233         {.id = ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK, .name = "alc293-dell"},
10234         {.id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc298-dell1"},
10235         {.id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, .name = "alc298-dell-aio"},
10236         {.id = ALC275_FIXUP_DELL_XPS, .name = "alc275-dell-xps"},
10237         {.id = ALC293_FIXUP_LENOVO_SPK_NOISE, .name = "lenovo-spk-noise"},
10238         {.id = ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, .name = "lenovo-hotkey"},
10239         {.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"},
10240         {.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc225-dell1"},
10241         {.id = ALC295_FIXUP_DISABLE_DAC3, .name = "alc295-disable-dac3"},
10242         {.id = ALC285_FIXUP_SPEAKER2_TO_DAC1, .name = "alc285-speaker2-to-dac1"},
10243         {.id = ALC280_FIXUP_HP_HEADSET_MIC, .name = "alc280-hp-headset"},
10244         {.id = ALC221_FIXUP_HP_FRONT_MIC, .name = "alc221-hp-mic"},
10245         {.id = ALC298_FIXUP_SPK_VOLUME, .name = "alc298-spk-volume"},
10246         {.id = ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER, .name = "dell-inspiron-7559"},
10247         {.id = ALC269_FIXUP_ATIV_BOOK_8, .name = "ativ-book"},
10248         {.id = ALC221_FIXUP_HP_MIC_NO_PRESENCE, .name = "alc221-hp-mic"},
10249         {.id = ALC256_FIXUP_ASUS_HEADSET_MODE, .name = "alc256-asus-headset"},
10250         {.id = ALC256_FIXUP_ASUS_MIC, .name = "alc256-asus-mic"},
10251         {.id = ALC256_FIXUP_ASUS_AIO_GPIO2, .name = "alc256-asus-aio"},
10252         {.id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc233-asus"},
10253         {.id = ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE, .name = "alc233-eapd"},
10254         {.id = ALC294_FIXUP_LENOVO_MIC_LOCATION, .name = "alc294-lenovo-mic"},
10255         {.id = ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE, .name = "alc225-wyse"},
10256         {.id = ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, .name = "alc274-dell-aio"},
10257         {.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"},
10258         {.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"},
10259         {.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"},
10260         {.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-headset-jack"},
10261         {.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-chrome-book"},
10262         {.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"},
10263         {.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"},
10264         {.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"},
10265         {.id = ALC298_FIXUP_SAMSUNG_AMP, .name = "alc298-samsung-amp"},
10266         {.id = ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, .name = "alc256-samsung-headphone"},
10267         {.id = ALC255_FIXUP_XIAOMI_HEADSET_MIC, .name = "alc255-xiaomi-headset"},
10268         {.id = ALC274_FIXUP_HP_MIC, .name = "alc274-hp-mic-detect"},
10269         {.id = ALC245_FIXUP_HP_X360_AMP, .name = "alc245-hp-x360-amp"},
10270         {.id = ALC295_FIXUP_HP_OMEN, .name = "alc295-hp-omen"},
10271         {.id = ALC285_FIXUP_HP_SPECTRE_X360, .name = "alc285-hp-spectre-x360"},
10272         {.id = ALC285_FIXUP_HP_SPECTRE_X360_EB1, .name = "alc285-hp-spectre-x360-eb1"},
10273         {.id = ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP, .name = "alc287-ideapad-bass-spk-amp"},
10274         {.id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN, .name = "alc287-yoga9-bass-spk-pin"},
10275         {.id = ALC623_FIXUP_LENOVO_THINKSTATION_P340, .name = "alc623-lenovo-thinkstation-p340"},
10276         {.id = ALC255_FIXUP_ACER_HEADPHONE_AND_MIC, .name = "alc255-acer-headphone-and-mic"},
10277         {.id = ALC285_FIXUP_HP_GPIO_AMP_INIT, .name = "alc285-hp-amp-init"},
10278         {}
10279 };
10280 #define ALC225_STANDARD_PINS \
10281         {0x21, 0x04211020}
10282
10283 #define ALC256_STANDARD_PINS \
10284         {0x12, 0x90a60140}, \
10285         {0x14, 0x90170110}, \
10286         {0x21, 0x02211020}
10287
10288 #define ALC282_STANDARD_PINS \
10289         {0x14, 0x90170110}
10290
10291 #define ALC290_STANDARD_PINS \
10292         {0x12, 0x99a30130}
10293
10294 #define ALC292_STANDARD_PINS \
10295         {0x14, 0x90170110}, \
10296         {0x15, 0x0221401f}
10297
10298 #define ALC295_STANDARD_PINS \
10299         {0x12, 0xb7a60130}, \
10300         {0x14, 0x90170110}, \
10301         {0x21, 0x04211020}
10302
10303 #define ALC298_STANDARD_PINS \
10304         {0x12, 0x90a60130}, \
10305         {0x21, 0x03211020}
10306
10307 static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
10308         SND_HDA_PIN_QUIRK(0x10ec0221, 0x103c, "HP Workstation", ALC221_FIXUP_HP_HEADSET_MIC,
10309                 {0x14, 0x01014020},
10310                 {0x17, 0x90170110},
10311                 {0x18, 0x02a11030},
10312                 {0x19, 0x0181303F},
10313                 {0x21, 0x0221102f}),
10314         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
10315                 {0x12, 0x90a601c0},
10316                 {0x14, 0x90171120},
10317                 {0x21, 0x02211030}),
10318         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
10319                 {0x14, 0x90170110},
10320                 {0x1b, 0x90a70130},
10321                 {0x21, 0x03211020}),
10322         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
10323                 {0x1a, 0x90a70130},
10324                 {0x1b, 0x90170110},
10325                 {0x21, 0x03211020}),
10326         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10327                 ALC225_STANDARD_PINS,
10328                 {0x12, 0xb7a60130},
10329                 {0x14, 0x901701a0}),
10330         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10331                 ALC225_STANDARD_PINS,
10332                 {0x12, 0xb7a60130},
10333                 {0x14, 0x901701b0}),
10334         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10335                 ALC225_STANDARD_PINS,
10336                 {0x12, 0xb7a60150},
10337                 {0x14, 0x901701a0}),
10338         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10339                 ALC225_STANDARD_PINS,
10340                 {0x12, 0xb7a60150},
10341                 {0x14, 0x901701b0}),
10342         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10343                 ALC225_STANDARD_PINS,
10344                 {0x12, 0xb7a60130},
10345                 {0x1b, 0x90170110}),
10346         SND_HDA_PIN_QUIRK(0x10ec0233, 0x8086, "Intel NUC Skull Canyon", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10347                 {0x1b, 0x01111010},
10348                 {0x1e, 0x01451130},
10349                 {0x21, 0x02211020}),
10350         SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
10351                 {0x12, 0x90a60140},
10352                 {0x14, 0x90170110},
10353                 {0x19, 0x02a11030},
10354                 {0x21, 0x02211020}),
10355         SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
10356                 {0x14, 0x90170110},
10357                 {0x19, 0x02a11030},
10358                 {0x1a, 0x02a11040},
10359                 {0x1b, 0x01014020},
10360                 {0x21, 0x0221101f}),
10361         SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
10362                 {0x14, 0x90170110},
10363                 {0x19, 0x02a11030},
10364                 {0x1a, 0x02a11040},
10365                 {0x1b, 0x01011020},
10366                 {0x21, 0x0221101f}),
10367         SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
10368                 {0x14, 0x90170110},
10369                 {0x19, 0x02a11020},
10370                 {0x1a, 0x02a11030},
10371                 {0x21, 0x0221101f}),
10372         SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
10373                 {0x21, 0x02211010}),
10374         SND_HDA_PIN_QUIRK(0x10ec0236, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
10375                 {0x14, 0x90170110},
10376                 {0x19, 0x02a11020},
10377                 {0x21, 0x02211030}),
10378         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
10379                 {0x14, 0x90170110},
10380                 {0x21, 0x02211020}),
10381         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10382                 {0x14, 0x90170130},
10383                 {0x21, 0x02211040}),
10384         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10385                 {0x12, 0x90a60140},
10386                 {0x14, 0x90170110},
10387                 {0x21, 0x02211020}),
10388         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10389                 {0x12, 0x90a60160},
10390                 {0x14, 0x90170120},
10391                 {0x21, 0x02211030}),
10392         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10393                 {0x14, 0x90170110},
10394                 {0x1b, 0x02011020},
10395                 {0x21, 0x0221101f}),
10396         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10397                 {0x14, 0x90170110},
10398                 {0x1b, 0x01011020},
10399                 {0x21, 0x0221101f}),
10400         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10401                 {0x14, 0x90170130},
10402                 {0x1b, 0x01014020},
10403                 {0x21, 0x0221103f}),
10404         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10405                 {0x14, 0x90170130},
10406                 {0x1b, 0x01011020},
10407                 {0x21, 0x0221103f}),
10408         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10409                 {0x14, 0x90170130},
10410                 {0x1b, 0x02011020},
10411                 {0x21, 0x0221103f}),
10412         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10413                 {0x14, 0x90170150},
10414                 {0x1b, 0x02011020},
10415                 {0x21, 0x0221105f}),
10416         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10417                 {0x14, 0x90170110},
10418                 {0x1b, 0x01014020},
10419                 {0x21, 0x0221101f}),
10420         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10421                 {0x12, 0x90a60160},
10422                 {0x14, 0x90170120},
10423                 {0x17, 0x90170140},
10424                 {0x21, 0x0321102f}),
10425         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10426                 {0x12, 0x90a60160},
10427                 {0x14, 0x90170130},
10428                 {0x21, 0x02211040}),
10429         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10430                 {0x12, 0x90a60160},
10431                 {0x14, 0x90170140},
10432                 {0x21, 0x02211050}),
10433         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10434                 {0x12, 0x90a60170},
10435                 {0x14, 0x90170120},
10436                 {0x21, 0x02211030}),
10437         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10438                 {0x12, 0x90a60170},
10439                 {0x14, 0x90170130},
10440                 {0x21, 0x02211040}),
10441         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10442                 {0x12, 0x90a60170},
10443                 {0x14, 0x90171130},
10444                 {0x21, 0x02211040}),
10445         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10446                 {0x12, 0x90a60170},
10447                 {0x14, 0x90170140},
10448                 {0x21, 0x02211050}),
10449         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10450                 {0x12, 0x90a60180},
10451                 {0x14, 0x90170130},
10452                 {0x21, 0x02211040}),
10453         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5565", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10454                 {0x12, 0x90a60180},
10455                 {0x14, 0x90170120},
10456                 {0x21, 0x02211030}),
10457         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10458                 {0x1b, 0x01011020},
10459                 {0x21, 0x02211010}),
10460         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
10461                 {0x14, 0x90170110},
10462                 {0x1b, 0x90a70130},
10463                 {0x21, 0x04211020}),
10464         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
10465                 {0x14, 0x90170110},
10466                 {0x1b, 0x90a70130},
10467                 {0x21, 0x03211020}),
10468         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
10469                 {0x12, 0x90a60130},
10470                 {0x14, 0x90170110},
10471                 {0x21, 0x03211020}),
10472         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
10473                 {0x12, 0x90a60130},
10474                 {0x14, 0x90170110},
10475                 {0x21, 0x04211020}),
10476         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
10477                 {0x1a, 0x90a70130},
10478                 {0x1b, 0x90170110},
10479                 {0x21, 0x03211020}),
10480        SND_HDA_PIN_QUIRK(0x10ec0256, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
10481                 {0x14, 0x90170110},
10482                 {0x19, 0x02a11020},
10483                 {0x21, 0x0221101f}),
10484        SND_HDA_PIN_QUIRK(0x10ec0274, 0x103c, "HP", ALC274_FIXUP_HP_HEADSET_MIC,
10485                 {0x17, 0x90170110},
10486                 {0x19, 0x03a11030},
10487                 {0x21, 0x03211020}),
10488         SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
10489                 {0x12, 0x90a60130},
10490                 {0x14, 0x90170110},
10491                 {0x15, 0x0421101f},
10492                 {0x1a, 0x04a11020}),
10493         SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED,
10494                 {0x12, 0x90a60140},
10495                 {0x14, 0x90170110},
10496                 {0x15, 0x0421101f},
10497                 {0x18, 0x02811030},
10498                 {0x1a, 0x04a1103f},
10499                 {0x1b, 0x02011020}),
10500         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10501                 ALC282_STANDARD_PINS,
10502                 {0x12, 0x99a30130},
10503                 {0x19, 0x03a11020},
10504                 {0x21, 0x0321101f}),
10505         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10506                 ALC282_STANDARD_PINS,
10507                 {0x12, 0x99a30130},
10508                 {0x19, 0x03a11020},
10509                 {0x21, 0x03211040}),
10510         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10511                 ALC282_STANDARD_PINS,
10512                 {0x12, 0x99a30130},
10513                 {0x19, 0x03a11030},
10514                 {0x21, 0x03211020}),
10515         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10516                 ALC282_STANDARD_PINS,
10517                 {0x12, 0x99a30130},
10518                 {0x19, 0x04a11020},
10519                 {0x21, 0x0421101f}),
10520         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED,
10521                 ALC282_STANDARD_PINS,
10522                 {0x12, 0x90a60140},
10523                 {0x19, 0x04a11030},
10524                 {0x21, 0x04211020}),
10525         SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
10526                 ALC282_STANDARD_PINS,
10527                 {0x12, 0x90a609c0},
10528                 {0x18, 0x03a11830},
10529                 {0x19, 0x04a19831},
10530                 {0x1a, 0x0481303f},
10531                 {0x1b, 0x04211020},
10532                 {0x21, 0x0321101f}),
10533         SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
10534                 ALC282_STANDARD_PINS,
10535                 {0x12, 0x90a60940},
10536                 {0x18, 0x03a11830},
10537                 {0x19, 0x04a19831},
10538                 {0x1a, 0x0481303f},
10539                 {0x1b, 0x04211020},
10540                 {0x21, 0x0321101f}),
10541         SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10542                 ALC282_STANDARD_PINS,
10543                 {0x12, 0x90a60130},
10544                 {0x21, 0x0321101f}),
10545         SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10546                 {0x12, 0x90a60160},
10547                 {0x14, 0x90170120},
10548                 {0x21, 0x02211030}),
10549         SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10550                 ALC282_STANDARD_PINS,
10551                 {0x12, 0x90a60130},
10552                 {0x19, 0x03a11020},
10553                 {0x21, 0x0321101f}),
10554         SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
10555                 {0x12, 0x90a60130},
10556                 {0x14, 0x90170110},
10557                 {0x19, 0x04a11040},
10558                 {0x21, 0x04211020}),
10559         SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
10560                 {0x14, 0x90170110},
10561                 {0x19, 0x04a11040},
10562                 {0x1d, 0x40600001},
10563                 {0x21, 0x04211020}),
10564         SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
10565                 {0x14, 0x90170110},
10566                 {0x19, 0x04a11040},
10567                 {0x21, 0x04211020}),
10568         SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_HEADSET_JACK,
10569                 {0x14, 0x90170110},
10570                 {0x17, 0x90170111},
10571                 {0x19, 0x03a11030},
10572                 {0x21, 0x03211020}),
10573         SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC287_FIXUP_THINKPAD_I2S_SPK,
10574                 {0x17, 0x90170110},
10575                 {0x19, 0x03a11030},
10576                 {0x21, 0x03211020}),
10577         SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
10578                 {0x12, 0x90a60130},
10579                 {0x17, 0x90170110},
10580                 {0x21, 0x02211020}),
10581         SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
10582                 {0x12, 0x90a60120},
10583                 {0x14, 0x90170110},
10584                 {0x21, 0x0321101f}),
10585         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10586                 ALC290_STANDARD_PINS,
10587                 {0x15, 0x04211040},
10588                 {0x18, 0x90170112},
10589                 {0x1a, 0x04a11020}),
10590         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10591                 ALC290_STANDARD_PINS,
10592                 {0x15, 0x04211040},
10593                 {0x18, 0x90170110},
10594                 {0x1a, 0x04a11020}),
10595         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10596                 ALC290_STANDARD_PINS,
10597                 {0x15, 0x0421101f},
10598                 {0x1a, 0x04a11020}),
10599         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10600                 ALC290_STANDARD_PINS,
10601                 {0x15, 0x04211020},
10602                 {0x1a, 0x04a11040}),
10603         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10604                 ALC290_STANDARD_PINS,
10605                 {0x14, 0x90170110},
10606                 {0x15, 0x04211020},
10607                 {0x1a, 0x04a11040}),
10608         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10609                 ALC290_STANDARD_PINS,
10610                 {0x14, 0x90170110},
10611                 {0x15, 0x04211020},
10612                 {0x1a, 0x04a11020}),
10613         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10614                 ALC290_STANDARD_PINS,
10615                 {0x14, 0x90170110},
10616                 {0x15, 0x0421101f},
10617                 {0x1a, 0x04a11020}),
10618         SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
10619                 ALC292_STANDARD_PINS,
10620                 {0x12, 0x90a60140},
10621                 {0x16, 0x01014020},
10622                 {0x19, 0x01a19030}),
10623         SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
10624                 ALC292_STANDARD_PINS,
10625                 {0x12, 0x90a60140},
10626                 {0x16, 0x01014020},
10627                 {0x18, 0x02a19031},
10628                 {0x19, 0x01a1903e}),
10629         SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
10630                 ALC292_STANDARD_PINS,
10631                 {0x12, 0x90a60140}),
10632         SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
10633                 ALC292_STANDARD_PINS,
10634                 {0x13, 0x90a60140},
10635                 {0x16, 0x21014020},
10636                 {0x19, 0x21a19030}),
10637         SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
10638                 ALC292_STANDARD_PINS,
10639                 {0x13, 0x90a60140}),
10640         SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_HPE,
10641                 {0x17, 0x90170110},
10642                 {0x21, 0x04211020}),
10643         SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC,
10644                 {0x14, 0x90170110},
10645                 {0x1b, 0x90a70130},
10646                 {0x21, 0x04211020}),
10647         SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
10648                 {0x12, 0x90a60130},
10649                 {0x17, 0x90170110},
10650                 {0x21, 0x03211020}),
10651         SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
10652                 {0x12, 0x90a60130},
10653                 {0x17, 0x90170110},
10654                 {0x21, 0x04211020}),
10655         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
10656                 {0x12, 0x90a60130},
10657                 {0x17, 0x90170110},
10658                 {0x21, 0x03211020}),
10659         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
10660                 {0x12, 0x90a60120},
10661                 {0x17, 0x90170110},
10662                 {0x21, 0x04211030}),
10663         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
10664                 {0x12, 0x90a60130},
10665                 {0x17, 0x90170110},
10666                 {0x21, 0x03211020}),
10667         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
10668                 {0x12, 0x90a60130},
10669                 {0x17, 0x90170110},
10670                 {0x21, 0x03211020}),
10671         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
10672                 {0x14, 0x90170110},
10673                 {0x21, 0x04211020}),
10674         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
10675                 {0x14, 0x90170110},
10676                 {0x21, 0x04211030}),
10677         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10678                 ALC295_STANDARD_PINS,
10679                 {0x17, 0x21014020},
10680                 {0x18, 0x21a19030}),
10681         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10682                 ALC295_STANDARD_PINS,
10683                 {0x17, 0x21014040},
10684                 {0x18, 0x21a19050}),
10685         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10686                 ALC295_STANDARD_PINS),
10687         SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
10688                 ALC298_STANDARD_PINS,
10689                 {0x17, 0x90170110}),
10690         SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
10691                 ALC298_STANDARD_PINS,
10692                 {0x17, 0x90170140}),
10693         SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
10694                 ALC298_STANDARD_PINS,
10695                 {0x17, 0x90170150}),
10696         SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_SPK_VOLUME,
10697                 {0x12, 0xb7a60140},
10698                 {0x13, 0xb7a60150},
10699                 {0x17, 0x90170110},
10700                 {0x1a, 0x03011020},
10701                 {0x21, 0x03211030}),
10702         SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
10703                 {0x12, 0xb7a60140},
10704                 {0x17, 0x90170110},
10705                 {0x1a, 0x03a11030},
10706                 {0x21, 0x03211020}),
10707         SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
10708                 ALC225_STANDARD_PINS,
10709                 {0x12, 0xb7a60130},
10710                 {0x17, 0x90170110}),
10711         SND_HDA_PIN_QUIRK(0x10ec0623, 0x17aa, "Lenovo", ALC283_FIXUP_HEADSET_MIC,
10712                 {0x14, 0x01014010},
10713                 {0x17, 0x90170120},
10714                 {0x18, 0x02a11030},
10715                 {0x19, 0x02a1103f},
10716                 {0x21, 0x0221101f}),
10717         {}
10718 };
10719
10720 /* This is the fallback pin_fixup_tbl for alc269 family, to make the tbl match
10721  * more machines, don't need to match all valid pins, just need to match
10722  * all the pins defined in the tbl. Just because of this reason, it is possible
10723  * that a single machine matches multiple tbls, so there is one limitation:
10724  *   at most one tbl is allowed to define for the same vendor and same codec
10725  */
10726 static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = {
10727         SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
10728                 {0x19, 0x40000000},
10729                 {0x1b, 0x40000000}),
10730         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10731                 {0x19, 0x40000000},
10732                 {0x1a, 0x40000000}),
10733         SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10734                 {0x19, 0x40000000},
10735                 {0x1a, 0x40000000}),
10736         SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
10737                 {0x19, 0x40000000},
10738                 {0x1a, 0x40000000}),
10739         {}
10740 };
10741
10742 static void alc269_fill_coef(struct hda_codec *codec)
10743 {
10744         struct alc_spec *spec = codec->spec;
10745         int val;
10746
10747         if (spec->codec_variant != ALC269_TYPE_ALC269VB)
10748                 return;
10749
10750         if ((alc_get_coef0(codec) & 0x00ff) < 0x015) {
10751                 alc_write_coef_idx(codec, 0xf, 0x960b);
10752                 alc_write_coef_idx(codec, 0xe, 0x8817);
10753         }
10754
10755         if ((alc_get_coef0(codec) & 0x00ff) == 0x016) {
10756                 alc_write_coef_idx(codec, 0xf, 0x960b);
10757                 alc_write_coef_idx(codec, 0xe, 0x8814);
10758         }
10759
10760         if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
10761                 /* Power up output pin */
10762                 alc_update_coef_idx(codec, 0x04, 0, 1<<11);
10763         }
10764
10765         if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
10766                 val = alc_read_coef_idx(codec, 0xd);
10767                 if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {
10768                         /* Capless ramp up clock control */
10769                         alc_write_coef_idx(codec, 0xd, val | (1<<10));
10770                 }
10771                 val = alc_read_coef_idx(codec, 0x17);
10772                 if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {
10773                         /* Class D power on reset */
10774                         alc_write_coef_idx(codec, 0x17, val | (1<<7));
10775                 }
10776         }
10777
10778         /* HP */
10779         alc_update_coef_idx(codec, 0x4, 0, 1<<11);
10780 }
10781
10782 /*
10783  */
10784 static int patch_alc269(struct hda_codec *codec)
10785 {
10786         struct alc_spec *spec;
10787         int err;
10788
10789         err = alc_alloc_spec(codec, 0x0b);
10790         if (err < 0)
10791                 return err;
10792
10793         spec = codec->spec;
10794         spec->gen.shared_mic_vref_pin = 0x18;
10795         codec->power_save_node = 0;
10796         spec->en_3kpull_low = true;
10797
10798 #ifdef CONFIG_PM
10799         codec->patch_ops.suspend = alc269_suspend;
10800         codec->patch_ops.resume = alc269_resume;
10801 #endif
10802         spec->shutup = alc_default_shutup;
10803         spec->init_hook = alc_default_init;
10804
10805         switch (codec->core.vendor_id) {
10806         case 0x10ec0269:
10807                 spec->codec_variant = ALC269_TYPE_ALC269VA;
10808                 switch (alc_get_coef0(codec) & 0x00f0) {
10809                 case 0x0010:
10810                         if (codec->bus->pci &&
10811                             codec->bus->pci->subsystem_vendor == 0x1025 &&
10812                             spec->cdefine.platform_type == 1)
10813                                 err = alc_codec_rename(codec, "ALC271X");
10814                         spec->codec_variant = ALC269_TYPE_ALC269VB;
10815                         break;
10816                 case 0x0020:
10817                         if (codec->bus->pci &&
10818                             codec->bus->pci->subsystem_vendor == 0x17aa &&
10819                             codec->bus->pci->subsystem_device == 0x21f3)
10820                                 err = alc_codec_rename(codec, "ALC3202");
10821                         spec->codec_variant = ALC269_TYPE_ALC269VC;
10822                         break;
10823                 case 0x0030:
10824                         spec->codec_variant = ALC269_TYPE_ALC269VD;
10825                         break;
10826                 default:
10827                         alc_fix_pll_init(codec, 0x20, 0x04, 15);
10828                 }
10829                 if (err < 0)
10830                         goto error;
10831                 spec->shutup = alc269_shutup;
10832                 spec->init_hook = alc269_fill_coef;
10833                 alc269_fill_coef(codec);
10834                 break;
10835
10836         case 0x10ec0280:
10837         case 0x10ec0290:
10838                 spec->codec_variant = ALC269_TYPE_ALC280;
10839                 break;
10840         case 0x10ec0282:
10841                 spec->codec_variant = ALC269_TYPE_ALC282;
10842                 spec->shutup = alc282_shutup;
10843                 spec->init_hook = alc282_init;
10844                 break;
10845         case 0x10ec0233:
10846         case 0x10ec0283:
10847                 spec->codec_variant = ALC269_TYPE_ALC283;
10848                 spec->shutup = alc283_shutup;
10849                 spec->init_hook = alc283_init;
10850                 break;
10851         case 0x10ec0284:
10852         case 0x10ec0292:
10853                 spec->codec_variant = ALC269_TYPE_ALC284;
10854                 break;
10855         case 0x10ec0293:
10856                 spec->codec_variant = ALC269_TYPE_ALC293;
10857                 break;
10858         case 0x10ec0286:
10859         case 0x10ec0288:
10860                 spec->codec_variant = ALC269_TYPE_ALC286;
10861                 break;
10862         case 0x10ec0298:
10863                 spec->codec_variant = ALC269_TYPE_ALC298;
10864                 break;
10865         case 0x10ec0235:
10866         case 0x10ec0255:
10867                 spec->codec_variant = ALC269_TYPE_ALC255;
10868                 spec->shutup = alc256_shutup;
10869                 spec->init_hook = alc256_init;
10870                 break;
10871         case 0x10ec0230:
10872         case 0x10ec0236:
10873         case 0x10ec0256:
10874         case 0x19e58326:
10875                 spec->codec_variant = ALC269_TYPE_ALC256;
10876                 spec->shutup = alc256_shutup;
10877                 spec->init_hook = alc256_init;
10878                 spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */
10879                 if (codec->core.vendor_id == 0x10ec0236 &&
10880                     codec->bus->pci->vendor != PCI_VENDOR_ID_AMD)
10881                         spec->en_3kpull_low = false;
10882                 break;
10883         case 0x10ec0257:
10884                 spec->codec_variant = ALC269_TYPE_ALC257;
10885                 spec->shutup = alc256_shutup;
10886                 spec->init_hook = alc256_init;
10887                 spec->gen.mixer_nid = 0;
10888                 spec->en_3kpull_low = false;
10889                 break;
10890         case 0x10ec0215:
10891         case 0x10ec0245:
10892         case 0x10ec0285:
10893         case 0x10ec0289:
10894                 if (alc_get_coef0(codec) & 0x0010)
10895                         spec->codec_variant = ALC269_TYPE_ALC245;
10896                 else
10897                         spec->codec_variant = ALC269_TYPE_ALC215;
10898                 spec->shutup = alc225_shutup;
10899                 spec->init_hook = alc225_init;
10900                 spec->gen.mixer_nid = 0;
10901                 break;
10902         case 0x10ec0225:
10903         case 0x10ec0295:
10904         case 0x10ec0299:
10905                 spec->codec_variant = ALC269_TYPE_ALC225;
10906                 spec->shutup = alc225_shutup;
10907                 spec->init_hook = alc225_init;
10908                 spec->gen.mixer_nid = 0; /* no loopback on ALC225, ALC295 and ALC299 */
10909                 break;
10910         case 0x10ec0287:
10911                 spec->codec_variant = ALC269_TYPE_ALC287;
10912                 spec->shutup = alc225_shutup;
10913                 spec->init_hook = alc225_init;
10914                 spec->gen.mixer_nid = 0; /* no loopback on ALC287 */
10915                 break;
10916         case 0x10ec0234:
10917         case 0x10ec0274:
10918         case 0x10ec0294:
10919                 spec->codec_variant = ALC269_TYPE_ALC294;
10920                 spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */
10921                 alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */
10922                 spec->init_hook = alc294_init;
10923                 break;
10924         case 0x10ec0300:
10925                 spec->codec_variant = ALC269_TYPE_ALC300;
10926                 spec->gen.mixer_nid = 0; /* no loopback on ALC300 */
10927                 break;
10928         case 0x10ec0623:
10929                 spec->codec_variant = ALC269_TYPE_ALC623;
10930                 break;
10931         case 0x10ec0700:
10932         case 0x10ec0701:
10933         case 0x10ec0703:
10934         case 0x10ec0711:
10935                 spec->codec_variant = ALC269_TYPE_ALC700;
10936                 spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */
10937                 alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */
10938                 spec->init_hook = alc294_init;
10939                 break;
10940
10941         }
10942
10943         if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {
10944                 spec->has_alc5505_dsp = 1;
10945                 spec->init_hook = alc5505_dsp_init;
10946         }
10947
10948         alc_pre_init(codec);
10949
10950         snd_hda_pick_fixup(codec, alc269_fixup_models,
10951                        alc269_fixup_tbl, alc269_fixups);
10952         /* FIXME: both TX300 and ROG Strix G17 have the same SSID, and
10953          * the quirk breaks the latter (bko#214101).
10954          * Clear the wrong entry.
10955          */
10956         if (codec->fixup_id == ALC282_FIXUP_ASUS_TX300 &&
10957             codec->core.vendor_id == 0x10ec0294) {
10958                 codec_dbg(codec, "Clear wrong fixup for ASUS ROG Strix G17\n");
10959                 codec->fixup_id = HDA_FIXUP_ID_NOT_SET;
10960         }
10961
10962         snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups, true);
10963         snd_hda_pick_pin_fixup(codec, alc269_fallback_pin_fixup_tbl, alc269_fixups, false);
10964         snd_hda_pick_fixup(codec, NULL, alc269_fixup_vendor_tbl,
10965                            alc269_fixups);
10966         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
10967
10968         alc_auto_parse_customize_define(codec);
10969
10970         if (has_cdefine_beep(codec))
10971                 spec->gen.beep_nid = 0x01;
10972
10973         /* automatic parse from the BIOS config */
10974         err = alc269_parse_auto_config(codec);
10975         if (err < 0)
10976                 goto error;
10977
10978         if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid) {
10979                 err = set_beep_amp(spec, spec->gen.mixer_nid, 0x04, HDA_INPUT);
10980                 if (err < 0)
10981                         goto error;
10982         }
10983
10984         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
10985
10986         return 0;
10987
10988  error:
10989         alc_free(codec);
10990         return err;
10991 }
10992
10993 /*
10994  * ALC861
10995  */
10996
10997 static int alc861_parse_auto_config(struct hda_codec *codec)
10998 {
10999         static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
11000         static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 };
11001         return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids);
11002 }
11003
11004 /* Pin config fixes */
11005 enum {
11006         ALC861_FIXUP_FSC_AMILO_PI1505,
11007         ALC861_FIXUP_AMP_VREF_0F,
11008         ALC861_FIXUP_NO_JACK_DETECT,
11009         ALC861_FIXUP_ASUS_A6RP,
11010         ALC660_FIXUP_ASUS_W7J,
11011 };
11012
11013 /* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */
11014 static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,
11015                         const struct hda_fixup *fix, int action)
11016 {
11017         struct alc_spec *spec = codec->spec;
11018         unsigned int val;
11019
11020         if (action != HDA_FIXUP_ACT_INIT)
11021                 return;
11022         val = snd_hda_codec_get_pin_target(codec, 0x0f);
11023         if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)))
11024                 val |= AC_PINCTL_IN_EN;
11025         val |= AC_PINCTL_VREF_50;
11026         snd_hda_set_pin_ctl(codec, 0x0f, val);
11027         spec->gen.keep_vref_in_automute = 1;
11028 }
11029
11030 /* suppress the jack-detection */
11031 static void alc_fixup_no_jack_detect(struct hda_codec *codec,
11032                                      const struct hda_fixup *fix, int action)
11033 {
11034         if (action == HDA_FIXUP_ACT_PRE_PROBE)
11035                 codec->no_jack_detect = 1;
11036 }
11037
11038 static const struct hda_fixup alc861_fixups[] = {
11039         [ALC861_FIXUP_FSC_AMILO_PI1505] = {
11040                 .type = HDA_FIXUP_PINS,
11041                 .v.pins = (const struct hda_pintbl[]) {
11042                         { 0x0b, 0x0221101f }, /* HP */
11043                         { 0x0f, 0x90170310 }, /* speaker */
11044                         { }
11045                 }
11046         },
11047         [ALC861_FIXUP_AMP_VREF_0F] = {
11048                 .type = HDA_FIXUP_FUNC,
11049                 .v.func = alc861_fixup_asus_amp_vref_0f,
11050         },
11051         [ALC861_FIXUP_NO_JACK_DETECT] = {
11052                 .type = HDA_FIXUP_FUNC,
11053                 .v.func = alc_fixup_no_jack_detect,
11054         },
11055         [ALC861_FIXUP_ASUS_A6RP] = {
11056                 .type = HDA_FIXUP_FUNC,
11057                 .v.func = alc861_fixup_asus_amp_vref_0f,
11058                 .chained = true,
11059                 .chain_id = ALC861_FIXUP_NO_JACK_DETECT,
11060         },
11061         [ALC660_FIXUP_ASUS_W7J] = {
11062                 .type = HDA_FIXUP_VERBS,
11063                 .v.verbs = (const struct hda_verb[]) {
11064                         /* ASUS W7J needs a magic pin setup on unused NID 0x10
11065                          * for enabling outputs
11066                          */
11067                         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11068                         { }
11069                 },
11070         }
11071 };
11072
11073 static const struct snd_pci_quirk alc861_fixup_tbl[] = {
11074         SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J),
11075         SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J),
11076         SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),
11077         SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),
11078         SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),
11079         SND_PCI_QUIRK_VENDOR(0x1584, "Haier/Uniwill", ALC861_FIXUP_AMP_VREF_0F),
11080         SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505),
11081         {}
11082 };
11083
11084 /*
11085  */
11086 static int patch_alc861(struct hda_codec *codec)
11087 {
11088         struct alc_spec *spec;
11089         int err;
11090
11091         err = alc_alloc_spec(codec, 0x15);
11092         if (err < 0)
11093                 return err;
11094
11095         spec = codec->spec;
11096         if (has_cdefine_beep(codec))
11097                 spec->gen.beep_nid = 0x23;
11098
11099 #ifdef CONFIG_PM
11100         spec->power_hook = alc_power_eapd;
11101 #endif
11102
11103         alc_pre_init(codec);
11104
11105         snd_hda_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
11106         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
11107
11108         /* automatic parse from the BIOS config */
11109         err = alc861_parse_auto_config(codec);
11110         if (err < 0)
11111                 goto error;
11112
11113         if (!spec->gen.no_analog) {
11114                 err = set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
11115                 if (err < 0)
11116                         goto error;
11117         }
11118
11119         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
11120
11121         return 0;
11122
11123  error:
11124         alc_free(codec);
11125         return err;
11126 }
11127
11128 /*
11129  * ALC861-VD support
11130  *
11131  * Based on ALC882
11132  *
11133  * In addition, an independent DAC
11134  */
11135 static int alc861vd_parse_auto_config(struct hda_codec *codec)
11136 {
11137         static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
11138         static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 };
11139         return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids);
11140 }
11141
11142 enum {
11143         ALC660VD_FIX_ASUS_GPIO1,
11144         ALC861VD_FIX_DALLAS,
11145 };
11146
11147 /* exclude VREF80 */
11148 static void alc861vd_fixup_dallas(struct hda_codec *codec,
11149                                   const struct hda_fixup *fix, int action)
11150 {
11151         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11152                 snd_hda_override_pin_caps(codec, 0x18, 0x00000734);
11153                 snd_hda_override_pin_caps(codec, 0x19, 0x0000073c);
11154         }
11155 }
11156
11157 /* reset GPIO1 */
11158 static void alc660vd_fixup_asus_gpio1(struct hda_codec *codec,
11159                                       const struct hda_fixup *fix, int action)
11160 {
11161         struct alc_spec *spec = codec->spec;
11162
11163         if (action == HDA_FIXUP_ACT_PRE_PROBE)
11164                 spec->gpio_mask |= 0x02;
11165         alc_fixup_gpio(codec, action, 0x01);
11166 }
11167
11168 static const struct hda_fixup alc861vd_fixups[] = {
11169         [ALC660VD_FIX_ASUS_GPIO1] = {
11170                 .type = HDA_FIXUP_FUNC,
11171                 .v.func = alc660vd_fixup_asus_gpio1,
11172         },
11173         [ALC861VD_FIX_DALLAS] = {
11174                 .type = HDA_FIXUP_FUNC,
11175                 .v.func = alc861vd_fixup_dallas,
11176         },
11177 };
11178
11179 static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
11180         SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS),
11181         SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
11182         SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS),
11183         {}
11184 };
11185
11186 /*
11187  */
11188 static int patch_alc861vd(struct hda_codec *codec)
11189 {
11190         struct alc_spec *spec;
11191         int err;
11192
11193         err = alc_alloc_spec(codec, 0x0b);
11194         if (err < 0)
11195                 return err;
11196
11197         spec = codec->spec;
11198         if (has_cdefine_beep(codec))
11199                 spec->gen.beep_nid = 0x23;
11200
11201         spec->shutup = alc_eapd_shutup;
11202
11203         alc_pre_init(codec);
11204
11205         snd_hda_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
11206         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
11207
11208         /* automatic parse from the BIOS config */
11209         err = alc861vd_parse_auto_config(codec);
11210         if (err < 0)
11211                 goto error;
11212
11213         if (!spec->gen.no_analog) {
11214                 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
11215                 if (err < 0)
11216                         goto error;
11217         }
11218
11219         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
11220
11221         return 0;
11222
11223  error:
11224         alc_free(codec);
11225         return err;
11226 }
11227
11228 /*
11229  * ALC662 support
11230  *
11231  * ALC662 is almost identical with ALC880 but has cleaner and more flexible
11232  * configuration.  Each pin widget can choose any input DACs and a mixer.
11233  * Each ADC is connected from a mixer of all inputs.  This makes possible
11234  * 6-channel independent captures.
11235  *
11236  * In addition, an independent DAC for the multi-playback (not used in this
11237  * driver yet).
11238  */
11239
11240 /*
11241  * BIOS auto configuration
11242  */
11243
11244 static int alc662_parse_auto_config(struct hda_codec *codec)
11245 {
11246         static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
11247         static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 };
11248         static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 };
11249         const hda_nid_t *ssids;
11250
11251         if (codec->core.vendor_id == 0x10ec0272 || codec->core.vendor_id == 0x10ec0663 ||
11252             codec->core.vendor_id == 0x10ec0665 || codec->core.vendor_id == 0x10ec0670 ||
11253             codec->core.vendor_id == 0x10ec0671)
11254                 ssids = alc663_ssids;
11255         else
11256                 ssids = alc662_ssids;
11257         return alc_parse_auto_config(codec, alc662_ignore, ssids);
11258 }
11259
11260 static void alc272_fixup_mario(struct hda_codec *codec,
11261                                const struct hda_fixup *fix, int action)
11262 {
11263         if (action != HDA_FIXUP_ACT_PRE_PROBE)
11264                 return;
11265         if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
11266                                       (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
11267                                       (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
11268                                       (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
11269                                       (0 << AC_AMPCAP_MUTE_SHIFT)))
11270                 codec_warn(codec, "failed to override amp caps for NID 0x2\n");
11271 }
11272
11273 static const struct snd_pcm_chmap_elem asus_pcm_2_1_chmaps[] = {
11274         { .channels = 2,
11275           .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
11276         { .channels = 4,
11277           .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
11278                    SNDRV_CHMAP_NA, SNDRV_CHMAP_LFE } }, /* LFE only on right */
11279         { }
11280 };
11281
11282 /* override the 2.1 chmap */
11283 static void alc_fixup_bass_chmap(struct hda_codec *codec,
11284                                     const struct hda_fixup *fix, int action)
11285 {
11286         if (action == HDA_FIXUP_ACT_BUILD) {
11287                 struct alc_spec *spec = codec->spec;
11288                 spec->gen.pcm_rec[0]->stream[0].chmap = asus_pcm_2_1_chmaps;
11289         }
11290 }
11291
11292 /* avoid D3 for keeping GPIO up */
11293 static unsigned int gpio_led_power_filter(struct hda_codec *codec,
11294                                           hda_nid_t nid,
11295                                           unsigned int power_state)
11296 {
11297         struct alc_spec *spec = codec->spec;
11298         if (nid == codec->core.afg && power_state == AC_PWRST_D3 && spec->gpio_data)
11299                 return AC_PWRST_D0;
11300         return power_state;
11301 }
11302
11303 static void alc662_fixup_led_gpio1(struct hda_codec *codec,
11304                                    const struct hda_fixup *fix, int action)
11305 {
11306         struct alc_spec *spec = codec->spec;
11307
11308         alc_fixup_hp_gpio_led(codec, action, 0x01, 0);
11309         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11310                 spec->mute_led_polarity = 1;
11311                 codec->power_filter = gpio_led_power_filter;
11312         }
11313 }
11314
11315 static void alc662_usi_automute_hook(struct hda_codec *codec,
11316                                          struct hda_jack_callback *jack)
11317 {
11318         struct alc_spec *spec = codec->spec;
11319         int vref;
11320         msleep(200);
11321         snd_hda_gen_hp_automute(codec, jack);
11322
11323         vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
11324         msleep(100);
11325         snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
11326                             vref);
11327 }
11328
11329 static void alc662_fixup_usi_headset_mic(struct hda_codec *codec,
11330                                      const struct hda_fixup *fix, int action)
11331 {
11332         struct alc_spec *spec = codec->spec;
11333         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11334                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
11335                 spec->gen.hp_automute_hook = alc662_usi_automute_hook;
11336         }
11337 }
11338
11339 static void alc662_aspire_ethos_mute_speakers(struct hda_codec *codec,
11340                                         struct hda_jack_callback *cb)
11341 {
11342         /* surround speakers at 0x1b already get muted automatically when
11343          * headphones are plugged in, but we have to mute/unmute the remaining
11344          * channels manually:
11345          * 0x15 - front left/front right
11346          * 0x18 - front center/ LFE
11347          */
11348         if (snd_hda_jack_detect_state(codec, 0x1b) == HDA_JACK_PRESENT) {
11349                 snd_hda_set_pin_ctl_cache(codec, 0x15, 0);
11350                 snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
11351         } else {
11352                 snd_hda_set_pin_ctl_cache(codec, 0x15, PIN_OUT);
11353                 snd_hda_set_pin_ctl_cache(codec, 0x18, PIN_OUT);
11354         }
11355 }
11356
11357 static void alc662_fixup_aspire_ethos_hp(struct hda_codec *codec,
11358                                         const struct hda_fixup *fix, int action)
11359 {
11360     /* Pin 0x1b: shared headphones jack and surround speakers */
11361         if (!is_jack_detectable(codec, 0x1b))
11362                 return;
11363
11364         switch (action) {
11365         case HDA_FIXUP_ACT_PRE_PROBE:
11366                 snd_hda_jack_detect_enable_callback(codec, 0x1b,
11367                                 alc662_aspire_ethos_mute_speakers);
11368                 /* subwoofer needs an extra GPIO setting to become audible */
11369                 alc_setup_gpio(codec, 0x02);
11370                 break;
11371         case HDA_FIXUP_ACT_INIT:
11372                 /* Make sure to start in a correct state, i.e. if
11373                  * headphones have been plugged in before powering up the system
11374                  */
11375                 alc662_aspire_ethos_mute_speakers(codec, NULL);
11376                 break;
11377         }
11378 }
11379
11380 static void alc671_fixup_hp_headset_mic2(struct hda_codec *codec,
11381                                              const struct hda_fixup *fix, int action)
11382 {
11383         struct alc_spec *spec = codec->spec;
11384
11385         static const struct hda_pintbl pincfgs[] = {
11386                 { 0x19, 0x02a11040 }, /* use as headset mic, with its own jack detect */
11387                 { 0x1b, 0x0181304f },
11388                 { }
11389         };
11390
11391         switch (action) {
11392         case HDA_FIXUP_ACT_PRE_PROBE:
11393                 spec->gen.mixer_nid = 0;
11394                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
11395                 snd_hda_apply_pincfgs(codec, pincfgs);
11396                 break;
11397         case HDA_FIXUP_ACT_INIT:
11398                 alc_write_coef_idx(codec, 0x19, 0xa054);
11399                 break;
11400         }
11401 }
11402
11403 static void alc897_hp_automute_hook(struct hda_codec *codec,
11404                                          struct hda_jack_callback *jack)
11405 {
11406         struct alc_spec *spec = codec->spec;
11407         int vref;
11408
11409         snd_hda_gen_hp_automute(codec, jack);
11410         vref = spec->gen.hp_jack_present ? (PIN_HP | AC_PINCTL_VREF_100) : PIN_HP;
11411         snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
11412                             vref);
11413 }
11414
11415 static void alc897_fixup_lenovo_headset_mic(struct hda_codec *codec,
11416                                      const struct hda_fixup *fix, int action)
11417 {
11418         struct alc_spec *spec = codec->spec;
11419         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11420                 spec->gen.hp_automute_hook = alc897_hp_automute_hook;
11421         }
11422 }
11423
11424 static void alc897_fixup_lenovo_headset_mode(struct hda_codec *codec,
11425                                      const struct hda_fixup *fix, int action)
11426 {
11427         struct alc_spec *spec = codec->spec;
11428
11429         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11430                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
11431                 spec->gen.hp_automute_hook = alc897_hp_automute_hook;
11432         }
11433 }
11434
11435 static const struct coef_fw alc668_coefs[] = {
11436         WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03,    0x0),
11437         WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06,    0x0), WRITE_COEF(0x07, 0x0f80),
11438         WRITE_COEF(0x08, 0x0031), WRITE_COEF(0x0a, 0x0060), WRITE_COEF(0x0b,    0x0),
11439         WRITE_COEF(0x0c, 0x7cf7), WRITE_COEF(0x0d, 0x1080), WRITE_COEF(0x0e, 0x7f7f),
11440         WRITE_COEF(0x0f, 0xcccc), WRITE_COEF(0x10, 0xddcc), WRITE_COEF(0x11, 0x0001),
11441         WRITE_COEF(0x13,    0x0), WRITE_COEF(0x14, 0x2aa0), WRITE_COEF(0x17, 0xa940),
11442         WRITE_COEF(0x19,    0x0), WRITE_COEF(0x1a,    0x0), WRITE_COEF(0x1b,    0x0),
11443         WRITE_COEF(0x1c,    0x0), WRITE_COEF(0x1d,    0x0), WRITE_COEF(0x1e, 0x7418),
11444         WRITE_COEF(0x1f, 0x0804), WRITE_COEF(0x20, 0x4200), WRITE_COEF(0x21, 0x0468),
11445         WRITE_COEF(0x22, 0x8ccc), WRITE_COEF(0x23, 0x0250), WRITE_COEF(0x24, 0x7418),
11446         WRITE_COEF(0x27,    0x0), WRITE_COEF(0x28, 0x8ccc), WRITE_COEF(0x2a, 0xff00),
11447         WRITE_COEF(0x2b, 0x8000), WRITE_COEF(0xa7, 0xff00), WRITE_COEF(0xa8, 0x8000),
11448         WRITE_COEF(0xaa, 0x2e17), WRITE_COEF(0xab, 0xa0c0), WRITE_COEF(0xac,    0x0),
11449         WRITE_COEF(0xad,    0x0), WRITE_COEF(0xae, 0x2ac6), WRITE_COEF(0xaf, 0xa480),
11450         WRITE_COEF(0xb0,    0x0), WRITE_COEF(0xb1,    0x0), WRITE_COEF(0xb2,    0x0),
11451         WRITE_COEF(0xb3,    0x0), WRITE_COEF(0xb4,    0x0), WRITE_COEF(0xb5, 0x1040),
11452         WRITE_COEF(0xb6, 0xd697), WRITE_COEF(0xb7, 0x902b), WRITE_COEF(0xb8, 0xd697),
11453         WRITE_COEF(0xb9, 0x902b), WRITE_COEF(0xba, 0xb8ba), WRITE_COEF(0xbb, 0xaaab),
11454         WRITE_COEF(0xbc, 0xaaaf), WRITE_COEF(0xbd, 0x6aaa), WRITE_COEF(0xbe, 0x1c02),
11455         WRITE_COEF(0xc0, 0x00ff), WRITE_COEF(0xc1, 0x0fa6),
11456         {}
11457 };
11458
11459 static void alc668_restore_default_value(struct hda_codec *codec)
11460 {
11461         alc_process_coef_fw(codec, alc668_coefs);
11462 }
11463
11464 enum {
11465         ALC662_FIXUP_ASPIRE,
11466         ALC662_FIXUP_LED_GPIO1,
11467         ALC662_FIXUP_IDEAPAD,
11468         ALC272_FIXUP_MARIO,
11469         ALC662_FIXUP_CZC_ET26,
11470         ALC662_FIXUP_CZC_P10T,
11471         ALC662_FIXUP_SKU_IGNORE,
11472         ALC662_FIXUP_HP_RP5800,
11473         ALC662_FIXUP_ASUS_MODE1,
11474         ALC662_FIXUP_ASUS_MODE2,
11475         ALC662_FIXUP_ASUS_MODE3,
11476         ALC662_FIXUP_ASUS_MODE4,
11477         ALC662_FIXUP_ASUS_MODE5,
11478         ALC662_FIXUP_ASUS_MODE6,
11479         ALC662_FIXUP_ASUS_MODE7,
11480         ALC662_FIXUP_ASUS_MODE8,
11481         ALC662_FIXUP_NO_JACK_DETECT,
11482         ALC662_FIXUP_ZOTAC_Z68,
11483         ALC662_FIXUP_INV_DMIC,
11484         ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
11485         ALC668_FIXUP_DELL_MIC_NO_PRESENCE,
11486         ALC662_FIXUP_HEADSET_MODE,
11487         ALC668_FIXUP_HEADSET_MODE,
11488         ALC662_FIXUP_BASS_MODE4_CHMAP,
11489         ALC662_FIXUP_BASS_16,
11490         ALC662_FIXUP_BASS_1A,
11491         ALC662_FIXUP_BASS_CHMAP,
11492         ALC668_FIXUP_AUTO_MUTE,
11493         ALC668_FIXUP_DELL_DISABLE_AAMIX,
11494         ALC668_FIXUP_DELL_XPS13,
11495         ALC662_FIXUP_ASUS_Nx50,
11496         ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
11497         ALC668_FIXUP_ASUS_Nx51,
11498         ALC668_FIXUP_MIC_COEF,
11499         ALC668_FIXUP_ASUS_G751,
11500         ALC891_FIXUP_HEADSET_MODE,
11501         ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
11502         ALC662_FIXUP_ACER_VERITON,
11503         ALC892_FIXUP_ASROCK_MOBO,
11504         ALC662_FIXUP_USI_FUNC,
11505         ALC662_FIXUP_USI_HEADSET_MODE,
11506         ALC662_FIXUP_LENOVO_MULTI_CODECS,
11507         ALC669_FIXUP_ACER_ASPIRE_ETHOS,
11508         ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET,
11509         ALC671_FIXUP_HP_HEADSET_MIC2,
11510         ALC662_FIXUP_ACER_X2660G_HEADSET_MODE,
11511         ALC662_FIXUP_ACER_NITRO_HEADSET_MODE,
11512         ALC668_FIXUP_ASUS_NO_HEADSET_MIC,
11513         ALC668_FIXUP_HEADSET_MIC,
11514         ALC668_FIXUP_MIC_DET_COEF,
11515         ALC897_FIXUP_LENOVO_HEADSET_MIC,
11516         ALC897_FIXUP_HEADSET_MIC_PIN,
11517         ALC897_FIXUP_HP_HSMIC_VERB,
11518         ALC897_FIXUP_LENOVO_HEADSET_MODE,
11519         ALC897_FIXUP_HEADSET_MIC_PIN2,
11520         ALC897_FIXUP_UNIS_H3C_X500S,
11521 };
11522
11523 static const struct hda_fixup alc662_fixups[] = {
11524         [ALC662_FIXUP_ASPIRE] = {
11525                 .type = HDA_FIXUP_PINS,
11526                 .v.pins = (const struct hda_pintbl[]) {
11527                         { 0x15, 0x99130112 }, /* subwoofer */
11528                         { }
11529                 }
11530         },
11531         [ALC662_FIXUP_LED_GPIO1] = {
11532                 .type = HDA_FIXUP_FUNC,
11533                 .v.func = alc662_fixup_led_gpio1,
11534         },
11535         [ALC662_FIXUP_IDEAPAD] = {
11536                 .type = HDA_FIXUP_PINS,
11537                 .v.pins = (const struct hda_pintbl[]) {
11538                         { 0x17, 0x99130112 }, /* subwoofer */
11539                         { }
11540                 },
11541                 .chained = true,
11542                 .chain_id = ALC662_FIXUP_LED_GPIO1,
11543         },
11544         [ALC272_FIXUP_MARIO] = {
11545                 .type = HDA_FIXUP_FUNC,
11546                 .v.func = alc272_fixup_mario,
11547         },
11548         [ALC662_FIXUP_CZC_ET26] = {
11549                 .type = HDA_FIXUP_PINS,
11550                 .v.pins = (const struct hda_pintbl[]) {
11551                         {0x12, 0x403cc000},
11552                         {0x14, 0x90170110}, /* speaker */
11553                         {0x15, 0x411111f0},
11554                         {0x16, 0x411111f0},
11555                         {0x18, 0x01a19030}, /* mic */
11556                         {0x19, 0x90a7013f}, /* int-mic */
11557                         {0x1a, 0x01014020},
11558                         {0x1b, 0x0121401f},
11559                         {0x1c, 0x411111f0},
11560                         {0x1d, 0x411111f0},
11561                         {0x1e, 0x40478e35},
11562                         {}
11563                 },
11564                 .chained = true,
11565                 .chain_id = ALC662_FIXUP_SKU_IGNORE
11566         },
11567         [ALC662_FIXUP_CZC_P10T] = {
11568                 .type = HDA_FIXUP_VERBS,
11569                 .v.verbs = (const struct hda_verb[]) {
11570                         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
11571                         {}
11572                 }
11573         },
11574         [ALC662_FIXUP_SKU_IGNORE] = {
11575                 .type = HDA_FIXUP_FUNC,
11576                 .v.func = alc_fixup_sku_ignore,
11577         },
11578         [ALC662_FIXUP_HP_RP5800] = {
11579                 .type = HDA_FIXUP_PINS,
11580                 .v.pins = (const struct hda_pintbl[]) {
11581                         { 0x14, 0x0221201f }, /* HP out */
11582                         { }
11583                 },
11584                 .chained = true,
11585                 .chain_id = ALC662_FIXUP_SKU_IGNORE
11586         },
11587         [ALC662_FIXUP_ASUS_MODE1] = {
11588                 .type = HDA_FIXUP_PINS,
11589                 .v.pins = (const struct hda_pintbl[]) {
11590                         { 0x14, 0x99130110 }, /* speaker */
11591                         { 0x18, 0x01a19c20 }, /* mic */
11592                         { 0x19, 0x99a3092f }, /* int-mic */
11593                         { 0x21, 0x0121401f }, /* HP out */
11594                         { }
11595                 },
11596                 .chained = true,
11597                 .chain_id = ALC662_FIXUP_SKU_IGNORE
11598         },
11599         [ALC662_FIXUP_ASUS_MODE2] = {
11600                 .type = HDA_FIXUP_PINS,
11601                 .v.pins = (const struct hda_pintbl[]) {
11602                         { 0x14, 0x99130110 }, /* speaker */
11603                         { 0x18, 0x01a19820 }, /* mic */
11604                         { 0x19, 0x99a3092f }, /* int-mic */
11605                         { 0x1b, 0x0121401f }, /* HP out */
11606                         { }
11607                 },
11608                 .chained = true,
11609                 .chain_id = ALC662_FIXUP_SKU_IGNORE
11610         },
11611         [ALC662_FIXUP_ASUS_MODE3] = {
11612                 .type = HDA_FIXUP_PINS,
11613                 .v.pins = (const struct hda_pintbl[]) {
11614                         { 0x14, 0x99130110 }, /* speaker */
11615                         { 0x15, 0x0121441f }, /* HP */
11616                         { 0x18, 0x01a19840 }, /* mic */
11617                         { 0x19, 0x99a3094f }, /* int-mic */
11618                         { 0x21, 0x01211420 }, /* HP2 */
11619                         { }
11620                 },
11621                 .chained = true,
11622                 .chain_id = ALC662_FIXUP_SKU_IGNORE
11623         },
11624         [ALC662_FIXUP_ASUS_MODE4] = {
11625                 .type = HDA_FIXUP_PINS,
11626                 .v.pins = (const struct hda_pintbl[]) {
11627                         { 0x14, 0x99130110 }, /* speaker */
11628                         { 0x16, 0x99130111 }, /* speaker */
11629                         { 0x18, 0x01a19840 }, /* mic */
11630                         { 0x19, 0x99a3094f }, /* int-mic */
11631                         { 0x21, 0x0121441f }, /* HP */
11632                         { }
11633                 },
11634                 .chained = true,
11635                 .chain_id = ALC662_FIXUP_SKU_IGNORE
11636         },
11637         [ALC662_FIXUP_ASUS_MODE5] = {
11638                 .type = HDA_FIXUP_PINS,
11639                 .v.pins = (const struct hda_pintbl[]) {
11640                         { 0x14, 0x99130110 }, /* speaker */
11641                         { 0x15, 0x0121441f }, /* HP */
11642                         { 0x16, 0x99130111 }, /* speaker */
11643                         { 0x18, 0x01a19840 }, /* mic */
11644                         { 0x19, 0x99a3094f }, /* int-mic */
11645                         { }
11646                 },
11647                 .chained = true,
11648                 .chain_id = ALC662_FIXUP_SKU_IGNORE
11649         },
11650         [ALC662_FIXUP_ASUS_MODE6] = {
11651                 .type = HDA_FIXUP_PINS,
11652                 .v.pins = (const struct hda_pintbl[]) {
11653                         { 0x14, 0x99130110 }, /* speaker */
11654                         { 0x15, 0x01211420 }, /* HP2 */
11655                         { 0x18, 0x01a19840 }, /* mic */
11656                         { 0x19, 0x99a3094f }, /* int-mic */
11657                         { 0x1b, 0x0121441f }, /* HP */
11658                         { }
11659                 },
11660                 .chained = true,
11661                 .chain_id = ALC662_FIXUP_SKU_IGNORE
11662         },
11663         [ALC662_FIXUP_ASUS_MODE7] = {
11664                 .type = HDA_FIXUP_PINS,
11665                 .v.pins = (const struct hda_pintbl[]) {
11666                         { 0x14, 0x99130110 }, /* speaker */
11667                         { 0x17, 0x99130111 }, /* speaker */
11668                         { 0x18, 0x01a19840 }, /* mic */
11669                         { 0x19, 0x99a3094f }, /* int-mic */
11670                         { 0x1b, 0x01214020 }, /* HP */
11671                         { 0x21, 0x0121401f }, /* HP */
11672                         { }
11673                 },
11674                 .chained = true,
11675                 .chain_id = ALC662_FIXUP_SKU_IGNORE
11676         },
11677         [ALC662_FIXUP_ASUS_MODE8] = {
11678                 .type = HDA_FIXUP_PINS,
11679                 .v.pins = (const struct hda_pintbl[]) {
11680                         { 0x14, 0x99130110 }, /* speaker */
11681                         { 0x12, 0x99a30970 }, /* int-mic */
11682                         { 0x15, 0x01214020 }, /* HP */
11683                         { 0x17, 0x99130111 }, /* speaker */
11684                         { 0x18, 0x01a19840 }, /* mic */
11685                         { 0x21, 0x0121401f }, /* HP */
11686                         { }
11687                 },
11688                 .chained = true,
11689                 .chain_id = ALC662_FIXUP_SKU_IGNORE
11690         },
11691         [ALC662_FIXUP_NO_JACK_DETECT] = {
11692                 .type = HDA_FIXUP_FUNC,
11693                 .v.func = alc_fixup_no_jack_detect,
11694         },
11695         [ALC662_FIXUP_ZOTAC_Z68] = {
11696                 .type = HDA_FIXUP_PINS,
11697                 .v.pins = (const struct hda_pintbl[]) {
11698                         { 0x1b, 0x02214020 }, /* Front HP */
11699                         { }
11700                 }
11701         },
11702         [ALC662_FIXUP_INV_DMIC] = {
11703                 .type = HDA_FIXUP_FUNC,
11704                 .v.func = alc_fixup_inv_dmic,
11705         },
11706         [ALC668_FIXUP_DELL_XPS13] = {
11707                 .type = HDA_FIXUP_FUNC,
11708                 .v.func = alc_fixup_dell_xps13,
11709                 .chained = true,
11710                 .chain_id = ALC668_FIXUP_DELL_DISABLE_AAMIX
11711         },
11712         [ALC668_FIXUP_DELL_DISABLE_AAMIX] = {
11713                 .type = HDA_FIXUP_FUNC,
11714                 .v.func = alc_fixup_disable_aamix,
11715                 .chained = true,
11716                 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
11717         },
11718         [ALC668_FIXUP_AUTO_MUTE] = {
11719                 .type = HDA_FIXUP_FUNC,
11720                 .v.func = alc_fixup_auto_mute_via_amp,
11721                 .chained = true,
11722                 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
11723         },
11724         [ALC662_FIXUP_DELL_MIC_NO_PRESENCE] = {
11725                 .type = HDA_FIXUP_PINS,
11726                 .v.pins = (const struct hda_pintbl[]) {
11727                         { 0x19, 0x03a1113c }, /* use as headset mic, without its own jack detect */
11728                         /* headphone mic by setting pin control of 0x1b (headphone out) to in + vref_50 */
11729                         { }
11730                 },
11731                 .chained = true,
11732                 .chain_id = ALC662_FIXUP_HEADSET_MODE
11733         },
11734         [ALC662_FIXUP_HEADSET_MODE] = {
11735                 .type = HDA_FIXUP_FUNC,
11736                 .v.func = alc_fixup_headset_mode_alc662,
11737         },
11738         [ALC668_FIXUP_DELL_MIC_NO_PRESENCE] = {
11739                 .type = HDA_FIXUP_PINS,
11740                 .v.pins = (const struct hda_pintbl[]) {
11741                         { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
11742                         { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
11743                         { }
11744                 },
11745                 .chained = true,
11746                 .chain_id = ALC668_FIXUP_HEADSET_MODE
11747         },
11748         [ALC668_FIXUP_HEADSET_MODE] = {
11749                 .type = HDA_FIXUP_FUNC,
11750                 .v.func = alc_fixup_headset_mode_alc668,
11751         },
11752         [ALC662_FIXUP_BASS_MODE4_CHMAP] = {
11753                 .type = HDA_FIXUP_FUNC,
11754                 .v.func = alc_fixup_bass_chmap,
11755                 .chained = true,
11756                 .chain_id = ALC662_FIXUP_ASUS_MODE4
11757         },
11758         [ALC662_FIXUP_BASS_16] = {
11759                 .type = HDA_FIXUP_PINS,
11760                 .v.pins = (const struct hda_pintbl[]) {
11761                         {0x16, 0x80106111}, /* bass speaker */
11762                         {}
11763                 },
11764                 .chained = true,
11765                 .chain_id = ALC662_FIXUP_BASS_CHMAP,
11766         },
11767         [ALC662_FIXUP_BASS_1A] = {
11768                 .type = HDA_FIXUP_PINS,
11769                 .v.pins = (const struct hda_pintbl[]) {
11770                         {0x1a, 0x80106111}, /* bass speaker */
11771                         {}
11772                 },
11773                 .chained = true,
11774                 .chain_id = ALC662_FIXUP_BASS_CHMAP,
11775         },
11776         [ALC662_FIXUP_BASS_CHMAP] = {
11777                 .type = HDA_FIXUP_FUNC,
11778                 .v.func = alc_fixup_bass_chmap,
11779         },
11780         [ALC662_FIXUP_ASUS_Nx50] = {
11781                 .type = HDA_FIXUP_FUNC,
11782                 .v.func = alc_fixup_auto_mute_via_amp,
11783                 .chained = true,
11784                 .chain_id = ALC662_FIXUP_BASS_1A
11785         },
11786         [ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE] = {
11787                 .type = HDA_FIXUP_FUNC,
11788                 .v.func = alc_fixup_headset_mode_alc668,
11789                 .chain_id = ALC662_FIXUP_BASS_CHMAP
11790         },
11791         [ALC668_FIXUP_ASUS_Nx51] = {
11792                 .type = HDA_FIXUP_PINS,
11793                 .v.pins = (const struct hda_pintbl[]) {
11794                         { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
11795                         { 0x1a, 0x90170151 }, /* bass speaker */
11796                         { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
11797                         {}
11798                 },
11799                 .chained = true,
11800                 .chain_id = ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
11801         },
11802         [ALC668_FIXUP_MIC_COEF] = {
11803                 .type = HDA_FIXUP_VERBS,
11804                 .v.verbs = (const struct hda_verb[]) {
11805                         { 0x20, AC_VERB_SET_COEF_INDEX, 0xc3 },
11806                         { 0x20, AC_VERB_SET_PROC_COEF, 0x4000 },
11807                         {}
11808                 },
11809         },
11810         [ALC668_FIXUP_ASUS_G751] = {
11811                 .type = HDA_FIXUP_PINS,
11812                 .v.pins = (const struct hda_pintbl[]) {
11813                         { 0x16, 0x0421101f }, /* HP */
11814                         {}
11815                 },
11816                 .chained = true,
11817                 .chain_id = ALC668_FIXUP_MIC_COEF
11818         },
11819         [ALC891_FIXUP_HEADSET_MODE] = {
11820                 .type = HDA_FIXUP_FUNC,
11821                 .v.func = alc_fixup_headset_mode,
11822         },
11823         [ALC891_FIXUP_DELL_MIC_NO_PRESENCE] = {
11824                 .type = HDA_FIXUP_PINS,
11825                 .v.pins = (const struct hda_pintbl[]) {
11826                         { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
11827                         { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
11828                         { }
11829                 },
11830                 .chained = true,
11831                 .chain_id = ALC891_FIXUP_HEADSET_MODE
11832         },
11833         [ALC662_FIXUP_ACER_VERITON] = {
11834                 .type = HDA_FIXUP_PINS,
11835                 .v.pins = (const struct hda_pintbl[]) {
11836                         { 0x15, 0x50170120 }, /* no internal speaker */
11837                         { }
11838                 }
11839         },
11840         [ALC892_FIXUP_ASROCK_MOBO] = {
11841                 .type = HDA_FIXUP_PINS,
11842                 .v.pins = (const struct hda_pintbl[]) {
11843                         { 0x15, 0x40f000f0 }, /* disabled */
11844                         { 0x16, 0x40f000f0 }, /* disabled */
11845                         { }
11846                 }
11847         },
11848         [ALC662_FIXUP_USI_FUNC] = {
11849                 .type = HDA_FIXUP_FUNC,
11850                 .v.func = alc662_fixup_usi_headset_mic,
11851         },
11852         [ALC662_FIXUP_USI_HEADSET_MODE] = {
11853                 .type = HDA_FIXUP_PINS,
11854                 .v.pins = (const struct hda_pintbl[]) {
11855                         { 0x19, 0x02a1913c }, /* use as headset mic, without its own jack detect */
11856                         { 0x18, 0x01a1903d },
11857                         { }
11858                 },
11859                 .chained = true,
11860                 .chain_id = ALC662_FIXUP_USI_FUNC
11861         },
11862         [ALC662_FIXUP_LENOVO_MULTI_CODECS] = {
11863                 .type = HDA_FIXUP_FUNC,
11864                 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
11865         },
11866         [ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET] = {
11867                 .type = HDA_FIXUP_FUNC,
11868                 .v.func = alc662_fixup_aspire_ethos_hp,
11869         },
11870         [ALC669_FIXUP_ACER_ASPIRE_ETHOS] = {
11871                 .type = HDA_FIXUP_PINS,
11872                 .v.pins = (const struct hda_pintbl[]) {
11873                         { 0x15, 0x92130110 }, /* front speakers */
11874                         { 0x18, 0x99130111 }, /* center/subwoofer */
11875                         { 0x1b, 0x11130012 }, /* surround plus jack for HP */
11876                         { }
11877                 },
11878                 .chained = true,
11879                 .chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET
11880         },
11881         [ALC671_FIXUP_HP_HEADSET_MIC2] = {
11882                 .type = HDA_FIXUP_FUNC,
11883                 .v.func = alc671_fixup_hp_headset_mic2,
11884         },
11885         [ALC662_FIXUP_ACER_X2660G_HEADSET_MODE] = {
11886                 .type = HDA_FIXUP_PINS,
11887                 .v.pins = (const struct hda_pintbl[]) {
11888                         { 0x1a, 0x02a1113c }, /* use as headset mic, without its own jack detect */
11889                         { }
11890                 },
11891                 .chained = true,
11892                 .chain_id = ALC662_FIXUP_USI_FUNC
11893         },
11894         [ALC662_FIXUP_ACER_NITRO_HEADSET_MODE] = {
11895                 .type = HDA_FIXUP_PINS,
11896                 .v.pins = (const struct hda_pintbl[]) {
11897                         { 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */
11898                         { 0x1b, 0x0221144f },
11899                         { }
11900                 },
11901                 .chained = true,
11902                 .chain_id = ALC662_FIXUP_USI_FUNC
11903         },
11904         [ALC668_FIXUP_ASUS_NO_HEADSET_MIC] = {
11905                 .type = HDA_FIXUP_PINS,
11906                 .v.pins = (const struct hda_pintbl[]) {
11907                         { 0x1b, 0x04a1112c },
11908                         { }
11909                 },
11910                 .chained = true,
11911                 .chain_id = ALC668_FIXUP_HEADSET_MIC
11912         },
11913         [ALC668_FIXUP_HEADSET_MIC] = {
11914                 .type = HDA_FIXUP_FUNC,
11915                 .v.func = alc269_fixup_headset_mic,
11916                 .chained = true,
11917                 .chain_id = ALC668_FIXUP_MIC_DET_COEF
11918         },
11919         [ALC668_FIXUP_MIC_DET_COEF] = {
11920                 .type = HDA_FIXUP_VERBS,
11921                 .v.verbs = (const struct hda_verb[]) {
11922                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x15 },
11923                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0d60 },
11924                         {}
11925                 },
11926         },
11927         [ALC897_FIXUP_LENOVO_HEADSET_MIC] = {
11928                 .type = HDA_FIXUP_FUNC,
11929                 .v.func = alc897_fixup_lenovo_headset_mic,
11930         },
11931         [ALC897_FIXUP_HEADSET_MIC_PIN] = {
11932                 .type = HDA_FIXUP_PINS,
11933                 .v.pins = (const struct hda_pintbl[]) {
11934                         { 0x1a, 0x03a11050 },
11935                         { }
11936                 },
11937                 .chained = true,
11938                 .chain_id = ALC897_FIXUP_LENOVO_HEADSET_MIC
11939         },
11940         [ALC897_FIXUP_HP_HSMIC_VERB] = {
11941                 .type = HDA_FIXUP_PINS,
11942                 .v.pins = (const struct hda_pintbl[]) {
11943                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
11944                         { }
11945                 },
11946         },
11947         [ALC897_FIXUP_LENOVO_HEADSET_MODE] = {
11948                 .type = HDA_FIXUP_FUNC,
11949                 .v.func = alc897_fixup_lenovo_headset_mode,
11950         },
11951         [ALC897_FIXUP_HEADSET_MIC_PIN2] = {
11952                 .type = HDA_FIXUP_PINS,
11953                 .v.pins = (const struct hda_pintbl[]) {
11954                         { 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */
11955                         { }
11956                 },
11957                 .chained = true,
11958                 .chain_id = ALC897_FIXUP_LENOVO_HEADSET_MODE
11959         },
11960         [ALC897_FIXUP_UNIS_H3C_X500S] = {
11961                 .type = HDA_FIXUP_VERBS,
11962                 .v.verbs = (const struct hda_verb[]) {
11963                         { 0x14, AC_VERB_SET_EAPD_BTLENABLE, 0 },
11964                         {}
11965                 },
11966         },
11967 };
11968
11969 static const struct snd_pci_quirk alc662_fixup_tbl[] = {
11970         SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2),
11971         SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC),
11972         SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", ALC662_FIXUP_INV_DMIC),
11973         SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
11974         SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
11975         SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC),
11976         SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC),
11977         SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
11978         SND_PCI_QUIRK(0x1025, 0x0566, "Acer Aspire Ethos 8951G", ALC669_FIXUP_ACER_ASPIRE_ETHOS),
11979         SND_PCI_QUIRK(0x1025, 0x123c, "Acer Nitro N50-600", ALC662_FIXUP_ACER_NITRO_HEADSET_MODE),
11980         SND_PCI_QUIRK(0x1025, 0x124e, "Acer 2660G", ALC662_FIXUP_ACER_X2660G_HEADSET_MODE),
11981         SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11982         SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11983         SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13),
11984         SND_PCI_QUIRK(0x1028, 0x060a, "Dell XPS 13", ALC668_FIXUP_DELL_XPS13),
11985         SND_PCI_QUIRK(0x1028, 0x060d, "Dell M3800", ALC668_FIXUP_DELL_XPS13),
11986         SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11987         SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11988         SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11989         SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11990         SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
11991         SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
11992         SND_PCI_QUIRK(0x103c, 0x870c, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
11993         SND_PCI_QUIRK(0x103c, 0x8719, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
11994         SND_PCI_QUIRK(0x103c, 0x872b, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
11995         SND_PCI_QUIRK(0x103c, 0x873e, "HP", ALC671_FIXUP_HP_HEADSET_MIC2),
11996         SND_PCI_QUIRK(0x103c, 0x8768, "HP Slim Desktop S01", ALC671_FIXUP_HP_HEADSET_MIC2),
11997         SND_PCI_QUIRK(0x103c, 0x877e, "HP 288 Pro G6", ALC671_FIXUP_HP_HEADSET_MIC2),
11998         SND_PCI_QUIRK(0x103c, 0x885f, "HP 288 Pro G8", ALC671_FIXUP_HP_HEADSET_MIC2),
11999         SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE),
12000         SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50),
12001         SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50),
12002         SND_PCI_QUIRK(0x1043, 0x12ff, "ASUS G751", ALC668_FIXUP_ASUS_G751),
12003         SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A),
12004         SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
12005         SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16),
12006         SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51),
12007         SND_PCI_QUIRK(0x1043, 0x17bd, "ASUS N751", ALC668_FIXUP_ASUS_Nx51),
12008         SND_PCI_QUIRK(0x1043, 0x185d, "ASUS G551JW", ALC668_FIXUP_ASUS_NO_HEADSET_MIC),
12009         SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71SL", ALC662_FIXUP_ASUS_MODE8),
12010         SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16),
12011         SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
12012         SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
12013         SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
12014         SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
12015         SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE),
12016         SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC662_FIXUP_LENOVO_MULTI_CODECS),
12017         SND_PCI_QUIRK(0x17aa, 0x1057, "Lenovo P360", ALC897_FIXUP_HEADSET_MIC_PIN),
12018         SND_PCI_QUIRK(0x17aa, 0x1064, "Lenovo P3 Tower", ALC897_FIXUP_HEADSET_MIC_PIN),
12019         SND_PCI_QUIRK(0x17aa, 0x32ca, "Lenovo ThinkCentre M80", ALC897_FIXUP_HEADSET_MIC_PIN),
12020         SND_PCI_QUIRK(0x17aa, 0x32cb, "Lenovo ThinkCentre M70", ALC897_FIXUP_HEADSET_MIC_PIN),
12021         SND_PCI_QUIRK(0x17aa, 0x32cf, "Lenovo ThinkCentre M950", ALC897_FIXUP_HEADSET_MIC_PIN),
12022         SND_PCI_QUIRK(0x17aa, 0x32f7, "Lenovo ThinkCentre M90", ALC897_FIXUP_HEADSET_MIC_PIN),
12023         SND_PCI_QUIRK(0x17aa, 0x3321, "Lenovo ThinkCentre M70 Gen4", ALC897_FIXUP_HEADSET_MIC_PIN),
12024         SND_PCI_QUIRK(0x17aa, 0x331b, "Lenovo ThinkCentre M90 Gen4", ALC897_FIXUP_HEADSET_MIC_PIN),
12025         SND_PCI_QUIRK(0x17aa, 0x3742, "Lenovo TianYi510Pro-14IOB", ALC897_FIXUP_HEADSET_MIC_PIN2),
12026         SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
12027         SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
12028         SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),
12029         SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68),
12030         SND_PCI_QUIRK(0x1b0a, 0x01b8, "ACER Veriton", ALC662_FIXUP_ACER_VERITON),
12031         SND_PCI_QUIRK(0x1b35, 0x1234, "CZC ET26", ALC662_FIXUP_CZC_ET26),
12032         SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
12033         SND_PCI_QUIRK(0x1c6c, 0x1239, "Compaq N14JP6-V2", ALC897_FIXUP_HP_HSMIC_VERB),
12034
12035 #if 0
12036         /* Below is a quirk table taken from the old code.
12037          * Basically the device should work as is without the fixup table.
12038          * If BIOS doesn't give a proper info, enable the corresponding
12039          * fixup entry.
12040          */
12041         SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),
12042         SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),
12043         SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1),
12044         SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC662_FIXUP_ASUS_MODE3),
12045         SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
12046         SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12047         SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
12048         SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC662_FIXUP_ASUS_MODE1),
12049         SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC662_FIXUP_ASUS_MODE1),
12050         SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12051         SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC662_FIXUP_ASUS_MODE7),
12052         SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC662_FIXUP_ASUS_MODE7),
12053         SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC662_FIXUP_ASUS_MODE8),
12054         SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC662_FIXUP_ASUS_MODE3),
12055         SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC662_FIXUP_ASUS_MODE1),
12056         SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12057         SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_FIXUP_ASUS_MODE2),
12058         SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC662_FIXUP_ASUS_MODE1),
12059         SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12060         SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
12061         SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
12062         SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12063         SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC662_FIXUP_ASUS_MODE1),
12064         SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC662_FIXUP_ASUS_MODE3),
12065         SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_FIXUP_ASUS_MODE2),
12066         SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12067         SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC662_FIXUP_ASUS_MODE5),
12068         SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
12069         SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12070         SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC662_FIXUP_ASUS_MODE1),
12071         SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12072         SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12073         SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC662_FIXUP_ASUS_MODE3),
12074         SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC662_FIXUP_ASUS_MODE3),
12075         SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC662_FIXUP_ASUS_MODE1),
12076         SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC662_FIXUP_ASUS_MODE1),
12077         SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC662_FIXUP_ASUS_MODE1),
12078         SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC662_FIXUP_ASUS_MODE1),
12079         SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC662_FIXUP_ASUS_MODE1),
12080         SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12081         SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_FIXUP_ASUS_MODE2),
12082         SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC662_FIXUP_ASUS_MODE1),
12083         SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
12084         SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC662_FIXUP_ASUS_MODE3),
12085         SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC662_FIXUP_ASUS_MODE1),
12086         SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC662_FIXUP_ASUS_MODE1),
12087         SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC662_FIXUP_ASUS_MODE1),
12088         SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_FIXUP_ASUS_MODE2),
12089         SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
12090         SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE4),
12091 #endif
12092         {}
12093 };
12094
12095 static const struct hda_model_fixup alc662_fixup_models[] = {
12096         {.id = ALC662_FIXUP_ASPIRE, .name = "aspire"},
12097         {.id = ALC662_FIXUP_IDEAPAD, .name = "ideapad"},
12098         {.id = ALC272_FIXUP_MARIO, .name = "mario"},
12099         {.id = ALC662_FIXUP_HP_RP5800, .name = "hp-rp5800"},
12100         {.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"},
12101         {.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"},
12102         {.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"},
12103         {.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"},
12104         {.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"},
12105         {.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
12106         {.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
12107         {.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
12108         {.id = ALC662_FIXUP_ZOTAC_Z68, .name = "zotac-z68"},
12109         {.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},
12110         {.id = ALC662_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc662-headset-multi"},
12111         {.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
12112         {.id = ALC662_FIXUP_HEADSET_MODE, .name = "alc662-headset"},
12113         {.id = ALC668_FIXUP_HEADSET_MODE, .name = "alc668-headset"},
12114         {.id = ALC662_FIXUP_BASS_16, .name = "bass16"},
12115         {.id = ALC662_FIXUP_BASS_1A, .name = "bass1a"},
12116         {.id = ALC668_FIXUP_AUTO_MUTE, .name = "automute"},
12117         {.id = ALC668_FIXUP_DELL_XPS13, .name = "dell-xps13"},
12118         {.id = ALC662_FIXUP_ASUS_Nx50, .name = "asus-nx50"},
12119         {.id = ALC668_FIXUP_ASUS_Nx51, .name = "asus-nx51"},
12120         {.id = ALC668_FIXUP_ASUS_G751, .name = "asus-g751"},
12121         {.id = ALC891_FIXUP_HEADSET_MODE, .name = "alc891-headset"},
12122         {.id = ALC891_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc891-headset-multi"},
12123         {.id = ALC662_FIXUP_ACER_VERITON, .name = "acer-veriton"},
12124         {.id = ALC892_FIXUP_ASROCK_MOBO, .name = "asrock-mobo"},
12125         {.id = ALC662_FIXUP_USI_HEADSET_MODE, .name = "usi-headset"},
12126         {.id = ALC662_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
12127         {.id = ALC669_FIXUP_ACER_ASPIRE_ETHOS, .name = "aspire-ethos"},
12128         {.id = ALC897_FIXUP_UNIS_H3C_X500S, .name = "unis-h3c-x500s"},
12129         {}
12130 };
12131
12132 static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {
12133         SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
12134                 {0x17, 0x02211010},
12135                 {0x18, 0x01a19030},
12136                 {0x1a, 0x01813040},
12137                 {0x21, 0x01014020}),
12138         SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
12139                 {0x16, 0x01813030},
12140                 {0x17, 0x02211010},
12141                 {0x18, 0x01a19040},
12142                 {0x21, 0x01014020}),
12143         SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
12144                 {0x14, 0x01014010},
12145                 {0x18, 0x01a19020},
12146                 {0x1a, 0x0181302f},
12147                 {0x1b, 0x0221401f}),
12148         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
12149                 {0x12, 0x99a30130},
12150                 {0x14, 0x90170110},
12151                 {0x15, 0x0321101f},
12152                 {0x16, 0x03011020}),
12153         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
12154                 {0x12, 0x99a30140},
12155                 {0x14, 0x90170110},
12156                 {0x15, 0x0321101f},
12157                 {0x16, 0x03011020}),
12158         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
12159                 {0x12, 0x99a30150},
12160                 {0x14, 0x90170110},
12161                 {0x15, 0x0321101f},
12162                 {0x16, 0x03011020}),
12163         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
12164                 {0x14, 0x90170110},
12165                 {0x15, 0x0321101f},
12166                 {0x16, 0x03011020}),
12167         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell XPS 15", ALC668_FIXUP_AUTO_MUTE,
12168                 {0x12, 0x90a60130},
12169                 {0x14, 0x90170110},
12170                 {0x15, 0x0321101f}),
12171         SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
12172                 {0x14, 0x01014010},
12173                 {0x17, 0x90170150},
12174                 {0x19, 0x02a11060},
12175                 {0x1b, 0x01813030},
12176                 {0x21, 0x02211020}),
12177         SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
12178                 {0x14, 0x01014010},
12179                 {0x18, 0x01a19040},
12180                 {0x1b, 0x01813030},
12181                 {0x21, 0x02211020}),
12182         SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
12183                 {0x14, 0x01014020},
12184                 {0x17, 0x90170110},
12185                 {0x18, 0x01a19050},
12186                 {0x1b, 0x01813040},
12187                 {0x21, 0x02211030}),
12188         {}
12189 };
12190
12191 /*
12192  */
12193 static int patch_alc662(struct hda_codec *codec)
12194 {
12195         struct alc_spec *spec;
12196         int err;
12197
12198         err = alc_alloc_spec(codec, 0x0b);
12199         if (err < 0)
12200                 return err;
12201
12202         spec = codec->spec;
12203
12204         spec->shutup = alc_eapd_shutup;
12205
12206         /* handle multiple HPs as is */
12207         spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
12208
12209         alc_fix_pll_init(codec, 0x20, 0x04, 15);
12210
12211         switch (codec->core.vendor_id) {
12212         case 0x10ec0668:
12213                 spec->init_hook = alc668_restore_default_value;
12214                 break;
12215         }
12216
12217         alc_pre_init(codec);
12218
12219         snd_hda_pick_fixup(codec, alc662_fixup_models,
12220                        alc662_fixup_tbl, alc662_fixups);
12221         snd_hda_pick_pin_fixup(codec, alc662_pin_fixup_tbl, alc662_fixups, true);
12222         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
12223
12224         alc_auto_parse_customize_define(codec);
12225
12226         if (has_cdefine_beep(codec))
12227                 spec->gen.beep_nid = 0x01;
12228
12229         if ((alc_get_coef0(codec) & (1 << 14)) &&
12230             codec->bus->pci && codec->bus->pci->subsystem_vendor == 0x1025 &&
12231             spec->cdefine.platform_type == 1) {
12232                 err = alc_codec_rename(codec, "ALC272X");
12233                 if (err < 0)
12234                         goto error;
12235         }
12236
12237         /* automatic parse from the BIOS config */
12238         err = alc662_parse_auto_config(codec);
12239         if (err < 0)
12240                 goto error;
12241
12242         if (!spec->gen.no_analog && spec->gen.beep_nid) {
12243                 switch (codec->core.vendor_id) {
12244                 case 0x10ec0662:
12245                         err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
12246                         break;
12247                 case 0x10ec0272:
12248                 case 0x10ec0663:
12249                 case 0x10ec0665:
12250                 case 0x10ec0668:
12251                         err = set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
12252                         break;
12253                 case 0x10ec0273:
12254                         err = set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
12255                         break;
12256                 }
12257                 if (err < 0)
12258                         goto error;
12259         }
12260
12261         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
12262
12263         return 0;
12264
12265  error:
12266         alc_free(codec);
12267         return err;
12268 }
12269
12270 /*
12271  * ALC680 support
12272  */
12273
12274 static int alc680_parse_auto_config(struct hda_codec *codec)
12275 {
12276         return alc_parse_auto_config(codec, NULL, NULL);
12277 }
12278
12279 /*
12280  */
12281 static int patch_alc680(struct hda_codec *codec)
12282 {
12283         int err;
12284
12285         /* ALC680 has no aa-loopback mixer */
12286         err = alc_alloc_spec(codec, 0);
12287         if (err < 0)
12288                 return err;
12289
12290         /* automatic parse from the BIOS config */
12291         err = alc680_parse_auto_config(codec);
12292         if (err < 0) {
12293                 alc_free(codec);
12294                 return err;
12295         }
12296
12297         return 0;
12298 }
12299
12300 /*
12301  * patch entries
12302  */
12303 static const struct hda_device_id snd_hda_id_realtek[] = {
12304         HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269),
12305         HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),
12306         HDA_CODEC_ENTRY(0x10ec0222, "ALC222", patch_alc269),
12307         HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),
12308         HDA_CODEC_ENTRY(0x10ec0230, "ALC236", patch_alc269),
12309         HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),
12310         HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269),
12311         HDA_CODEC_ENTRY(0x10ec0234, "ALC234", patch_alc269),
12312         HDA_CODEC_ENTRY(0x10ec0235, "ALC233", patch_alc269),
12313         HDA_CODEC_ENTRY(0x10ec0236, "ALC236", patch_alc269),
12314         HDA_CODEC_ENTRY(0x10ec0245, "ALC245", patch_alc269),
12315         HDA_CODEC_ENTRY(0x10ec0255, "ALC255", patch_alc269),
12316         HDA_CODEC_ENTRY(0x10ec0256, "ALC256", patch_alc269),
12317         HDA_CODEC_ENTRY(0x10ec0257, "ALC257", patch_alc269),
12318         HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260),
12319         HDA_CODEC_ENTRY(0x10ec0262, "ALC262", patch_alc262),
12320         HDA_CODEC_ENTRY(0x10ec0267, "ALC267", patch_alc268),
12321         HDA_CODEC_ENTRY(0x10ec0268, "ALC268", patch_alc268),
12322         HDA_CODEC_ENTRY(0x10ec0269, "ALC269", patch_alc269),
12323         HDA_CODEC_ENTRY(0x10ec0270, "ALC270", patch_alc269),
12324         HDA_CODEC_ENTRY(0x10ec0272, "ALC272", patch_alc662),
12325         HDA_CODEC_ENTRY(0x10ec0274, "ALC274", patch_alc269),
12326         HDA_CODEC_ENTRY(0x10ec0275, "ALC275", patch_alc269),
12327         HDA_CODEC_ENTRY(0x10ec0276, "ALC276", patch_alc269),
12328         HDA_CODEC_ENTRY(0x10ec0280, "ALC280", patch_alc269),
12329         HDA_CODEC_ENTRY(0x10ec0282, "ALC282", patch_alc269),
12330         HDA_CODEC_ENTRY(0x10ec0283, "ALC283", patch_alc269),
12331         HDA_CODEC_ENTRY(0x10ec0284, "ALC284", patch_alc269),
12332         HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269),
12333         HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269),
12334         HDA_CODEC_ENTRY(0x10ec0287, "ALC287", patch_alc269),
12335         HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269),
12336         HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269),
12337         HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269),
12338         HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269),
12339         HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269),
12340         HDA_CODEC_ENTRY(0x10ec0294, "ALC294", patch_alc269),
12341         HDA_CODEC_ENTRY(0x10ec0295, "ALC295", patch_alc269),
12342         HDA_CODEC_ENTRY(0x10ec0298, "ALC298", patch_alc269),
12343         HDA_CODEC_ENTRY(0x10ec0299, "ALC299", patch_alc269),
12344         HDA_CODEC_ENTRY(0x10ec0300, "ALC300", patch_alc269),
12345         HDA_CODEC_ENTRY(0x10ec0623, "ALC623", patch_alc269),
12346         HDA_CODEC_REV_ENTRY(0x10ec0861, 0x100340, "ALC660", patch_alc861),
12347         HDA_CODEC_ENTRY(0x10ec0660, "ALC660-VD", patch_alc861vd),
12348         HDA_CODEC_ENTRY(0x10ec0861, "ALC861", patch_alc861),
12349         HDA_CODEC_ENTRY(0x10ec0862, "ALC861-VD", patch_alc861vd),
12350         HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100002, "ALC662 rev2", patch_alc882),
12351         HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100101, "ALC662 rev1", patch_alc662),
12352         HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100300, "ALC662 rev3", patch_alc662),
12353         HDA_CODEC_ENTRY(0x10ec0663, "ALC663", patch_alc662),
12354         HDA_CODEC_ENTRY(0x10ec0665, "ALC665", patch_alc662),
12355         HDA_CODEC_ENTRY(0x10ec0667, "ALC667", patch_alc662),
12356         HDA_CODEC_ENTRY(0x10ec0668, "ALC668", patch_alc662),
12357         HDA_CODEC_ENTRY(0x10ec0670, "ALC670", patch_alc662),
12358         HDA_CODEC_ENTRY(0x10ec0671, "ALC671", patch_alc662),
12359         HDA_CODEC_ENTRY(0x10ec0680, "ALC680", patch_alc680),
12360         HDA_CODEC_ENTRY(0x10ec0700, "ALC700", patch_alc269),
12361         HDA_CODEC_ENTRY(0x10ec0701, "ALC701", patch_alc269),
12362         HDA_CODEC_ENTRY(0x10ec0703, "ALC703", patch_alc269),
12363         HDA_CODEC_ENTRY(0x10ec0711, "ALC711", patch_alc269),
12364         HDA_CODEC_ENTRY(0x10ec0867, "ALC891", patch_alc662),
12365         HDA_CODEC_ENTRY(0x10ec0880, "ALC880", patch_alc880),
12366         HDA_CODEC_ENTRY(0x10ec0882, "ALC882", patch_alc882),
12367         HDA_CODEC_ENTRY(0x10ec0883, "ALC883", patch_alc882),
12368         HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100101, "ALC889A", patch_alc882),
12369         HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100103, "ALC889A", patch_alc882),
12370         HDA_CODEC_ENTRY(0x10ec0885, "ALC885", patch_alc882),
12371         HDA_CODEC_ENTRY(0x10ec0887, "ALC887", patch_alc882),
12372         HDA_CODEC_REV_ENTRY(0x10ec0888, 0x100101, "ALC1200", patch_alc882),
12373         HDA_CODEC_ENTRY(0x10ec0888, "ALC888", patch_alc882),
12374         HDA_CODEC_ENTRY(0x10ec0889, "ALC889", patch_alc882),
12375         HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662),
12376         HDA_CODEC_ENTRY(0x10ec0897, "ALC897", patch_alc662),
12377         HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882),
12378         HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882),
12379         HDA_CODEC_ENTRY(0x10ec0b00, "ALCS1200A", patch_alc882),
12380         HDA_CODEC_ENTRY(0x10ec1168, "ALC1220", patch_alc882),
12381         HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882),
12382         HDA_CODEC_ENTRY(0x19e58326, "HW8326", patch_alc269),
12383         {} /* terminator */
12384 };
12385 MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_realtek);
12386
12387 MODULE_LICENSE("GPL");
12388 MODULE_DESCRIPTION("Realtek HD-audio codec");
12389
12390 static struct hda_codec_driver realtek_driver = {
12391         .id = snd_hda_id_realtek,
12392 };
12393
12394 module_hda_codec_driver(realtek_driver);