69b3df84e09603214d10fb852dddd611390ca700
[platform/kernel/linux-starfive.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         ALC888VD_FIXUP_MIC_100VREF,
1990 };
1991
1992 static void alc889_fixup_coef(struct hda_codec *codec,
1993                               const struct hda_fixup *fix, int action)
1994 {
1995         if (action != HDA_FIXUP_ACT_INIT)
1996                 return;
1997         alc_update_coef_idx(codec, 7, 0, 0x2030);
1998 }
1999
2000 /* set up GPIO at initialization */
2001 static void alc885_fixup_macpro_gpio(struct hda_codec *codec,
2002                                      const struct hda_fixup *fix, int action)
2003 {
2004         struct alc_spec *spec = codec->spec;
2005
2006         spec->gpio_write_delay = true;
2007         alc_fixup_gpio3(codec, fix, action);
2008 }
2009
2010 /* Fix the connection of some pins for ALC889:
2011  * At least, Acer Aspire 5935 shows the connections to DAC3/4 don't
2012  * work correctly (bko#42740)
2013  */
2014 static void alc889_fixup_dac_route(struct hda_codec *codec,
2015                                    const struct hda_fixup *fix, int action)
2016 {
2017         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2018                 /* fake the connections during parsing the tree */
2019                 static const hda_nid_t conn1[] = { 0x0c, 0x0d };
2020                 static const hda_nid_t conn2[] = { 0x0e, 0x0f };
2021                 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2022                 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
2023                 snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn2), conn2);
2024                 snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn2), conn2);
2025         } else if (action == HDA_FIXUP_ACT_PROBE) {
2026                 /* restore the connections */
2027                 static const hda_nid_t conn[] = { 0x0c, 0x0d, 0x0e, 0x0f, 0x26 };
2028                 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
2029                 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn), conn);
2030                 snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn), conn);
2031                 snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn), conn);
2032         }
2033 }
2034
2035 /* Set VREF on HP pin */
2036 static void alc889_fixup_mbp_vref(struct hda_codec *codec,
2037                                   const struct hda_fixup *fix, int action)
2038 {
2039         static const hda_nid_t nids[] = { 0x14, 0x15, 0x19 };
2040         struct alc_spec *spec = codec->spec;
2041         int i;
2042
2043         if (action != HDA_FIXUP_ACT_INIT)
2044                 return;
2045         for (i = 0; i < ARRAY_SIZE(nids); i++) {
2046                 unsigned int val = snd_hda_codec_get_pincfg(codec, nids[i]);
2047                 if (get_defcfg_device(val) != AC_JACK_HP_OUT)
2048                         continue;
2049                 val = snd_hda_codec_get_pin_target(codec, nids[i]);
2050                 val |= AC_PINCTL_VREF_80;
2051                 snd_hda_set_pin_ctl(codec, nids[i], val);
2052                 spec->gen.keep_vref_in_automute = 1;
2053                 break;
2054         }
2055 }
2056
2057 static void alc889_fixup_mac_pins(struct hda_codec *codec,
2058                                   const hda_nid_t *nids, int num_nids)
2059 {
2060         struct alc_spec *spec = codec->spec;
2061         int i;
2062
2063         for (i = 0; i < num_nids; i++) {
2064                 unsigned int val;
2065                 val = snd_hda_codec_get_pin_target(codec, nids[i]);
2066                 val |= AC_PINCTL_VREF_50;
2067                 snd_hda_set_pin_ctl(codec, nids[i], val);
2068         }
2069         spec->gen.keep_vref_in_automute = 1;
2070 }
2071
2072 /* Set VREF on speaker pins on imac91 */
2073 static void alc889_fixup_imac91_vref(struct hda_codec *codec,
2074                                      const struct hda_fixup *fix, int action)
2075 {
2076         static const hda_nid_t nids[] = { 0x18, 0x1a };
2077
2078         if (action == HDA_FIXUP_ACT_INIT)
2079                 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2080 }
2081
2082 /* Set VREF on speaker pins on mba11 */
2083 static void alc889_fixup_mba11_vref(struct hda_codec *codec,
2084                                     const struct hda_fixup *fix, int action)
2085 {
2086         static const hda_nid_t nids[] = { 0x18 };
2087
2088         if (action == HDA_FIXUP_ACT_INIT)
2089                 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2090 }
2091
2092 /* Set VREF on speaker pins on mba21 */
2093 static void alc889_fixup_mba21_vref(struct hda_codec *codec,
2094                                     const struct hda_fixup *fix, int action)
2095 {
2096         static const hda_nid_t nids[] = { 0x18, 0x19 };
2097
2098         if (action == HDA_FIXUP_ACT_INIT)
2099                 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2100 }
2101
2102 /* Don't take HP output as primary
2103  * Strangely, the speaker output doesn't work on Vaio Z and some Vaio
2104  * all-in-one desktop PCs (for example VGC-LN51JGB) through DAC 0x05
2105  */
2106 static void alc882_fixup_no_primary_hp(struct hda_codec *codec,
2107                                        const struct hda_fixup *fix, int action)
2108 {
2109         struct alc_spec *spec = codec->spec;
2110         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2111                 spec->gen.no_primary_hp = 1;
2112                 spec->gen.no_multi_io = 1;
2113         }
2114 }
2115
2116 static void alc_fixup_bass_chmap(struct hda_codec *codec,
2117                                  const struct hda_fixup *fix, int action);
2118
2119 /* For dual-codec configuration, we need to disable some features to avoid
2120  * conflicts of kctls and PCM streams
2121  */
2122 static void alc_fixup_dual_codecs(struct hda_codec *codec,
2123                                   const struct hda_fixup *fix, int action)
2124 {
2125         struct alc_spec *spec = codec->spec;
2126
2127         if (action != HDA_FIXUP_ACT_PRE_PROBE)
2128                 return;
2129         /* disable vmaster */
2130         spec->gen.suppress_vmaster = 1;
2131         /* auto-mute and auto-mic switch don't work with multiple codecs */
2132         spec->gen.suppress_auto_mute = 1;
2133         spec->gen.suppress_auto_mic = 1;
2134         /* disable aamix as well */
2135         spec->gen.mixer_nid = 0;
2136         /* add location prefix to avoid conflicts */
2137         codec->force_pin_prefix = 1;
2138 }
2139
2140 static void rename_ctl(struct hda_codec *codec, const char *oldname,
2141                        const char *newname)
2142 {
2143         struct snd_kcontrol *kctl;
2144
2145         kctl = snd_hda_find_mixer_ctl(codec, oldname);
2146         if (kctl)
2147                 snd_ctl_rename(codec->card, kctl, newname);
2148 }
2149
2150 static void alc1220_fixup_gb_dual_codecs(struct hda_codec *codec,
2151                                          const struct hda_fixup *fix,
2152                                          int action)
2153 {
2154         alc_fixup_dual_codecs(codec, fix, action);
2155         switch (action) {
2156         case HDA_FIXUP_ACT_PRE_PROBE:
2157                 /* override card longname to provide a unique UCM profile */
2158                 strcpy(codec->card->longname, "HDAudio-Gigabyte-ALC1220DualCodecs");
2159                 break;
2160         case HDA_FIXUP_ACT_BUILD:
2161                 /* rename Capture controls depending on the codec */
2162                 rename_ctl(codec, "Capture Volume",
2163                            codec->addr == 0 ?
2164                            "Rear-Panel Capture Volume" :
2165                            "Front-Panel Capture Volume");
2166                 rename_ctl(codec, "Capture Switch",
2167                            codec->addr == 0 ?
2168                            "Rear-Panel Capture Switch" :
2169                            "Front-Panel Capture Switch");
2170                 break;
2171         }
2172 }
2173
2174 static void alc1220_fixup_gb_x570(struct hda_codec *codec,
2175                                      const struct hda_fixup *fix,
2176                                      int action)
2177 {
2178         static const hda_nid_t conn1[] = { 0x0c };
2179         static const struct coef_fw gb_x570_coefs[] = {
2180                 WRITE_COEF(0x07, 0x03c0),
2181                 WRITE_COEF(0x1a, 0x01c1),
2182                 WRITE_COEF(0x1b, 0x0202),
2183                 WRITE_COEF(0x43, 0x3005),
2184                 {}
2185         };
2186
2187         switch (action) {
2188         case HDA_FIXUP_ACT_PRE_PROBE:
2189                 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2190                 snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
2191                 break;
2192         case HDA_FIXUP_ACT_INIT:
2193                 alc_process_coef_fw(codec, gb_x570_coefs);
2194                 break;
2195         }
2196 }
2197
2198 static void alc1220_fixup_clevo_p950(struct hda_codec *codec,
2199                                      const struct hda_fixup *fix,
2200                                      int action)
2201 {
2202         static const hda_nid_t conn1[] = { 0x0c };
2203
2204         if (action != HDA_FIXUP_ACT_PRE_PROBE)
2205                 return;
2206
2207         alc_update_coef_idx(codec, 0x7, 0, 0x3c3);
2208         /* We therefore want to make sure 0x14 (front headphone) and
2209          * 0x1b (speakers) use the stereo DAC 0x02
2210          */
2211         snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2212         snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
2213 }
2214
2215 static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
2216                                 const struct hda_fixup *fix, int action);
2217
2218 static void alc1220_fixup_clevo_pb51ed(struct hda_codec *codec,
2219                                      const struct hda_fixup *fix,
2220                                      int action)
2221 {
2222         alc1220_fixup_clevo_p950(codec, fix, action);
2223         alc_fixup_headset_mode_no_hp_mic(codec, fix, action);
2224 }
2225
2226 static void alc887_asus_hp_automute_hook(struct hda_codec *codec,
2227                                          struct hda_jack_callback *jack)
2228 {
2229         struct alc_spec *spec = codec->spec;
2230         unsigned int vref;
2231
2232         snd_hda_gen_hp_automute(codec, jack);
2233
2234         if (spec->gen.hp_jack_present)
2235                 vref = AC_PINCTL_VREF_80;
2236         else
2237                 vref = AC_PINCTL_VREF_HIZ;
2238         snd_hda_set_pin_ctl(codec, 0x19, PIN_HP | vref);
2239 }
2240
2241 static void alc887_fixup_asus_jack(struct hda_codec *codec,
2242                                      const struct hda_fixup *fix, int action)
2243 {
2244         struct alc_spec *spec = codec->spec;
2245         if (action != HDA_FIXUP_ACT_PROBE)
2246                 return;
2247         snd_hda_set_pin_ctl_cache(codec, 0x1b, PIN_HP);
2248         spec->gen.hp_automute_hook = alc887_asus_hp_automute_hook;
2249 }
2250
2251 static const struct hda_fixup alc882_fixups[] = {
2252         [ALC882_FIXUP_ABIT_AW9D_MAX] = {
2253                 .type = HDA_FIXUP_PINS,
2254                 .v.pins = (const struct hda_pintbl[]) {
2255                         { 0x15, 0x01080104 }, /* side */
2256                         { 0x16, 0x01011012 }, /* rear */
2257                         { 0x17, 0x01016011 }, /* clfe */
2258                         { }
2259                 }
2260         },
2261         [ALC882_FIXUP_LENOVO_Y530] = {
2262                 .type = HDA_FIXUP_PINS,
2263                 .v.pins = (const struct hda_pintbl[]) {
2264                         { 0x15, 0x99130112 }, /* rear int speakers */
2265                         { 0x16, 0x99130111 }, /* subwoofer */
2266                         { }
2267                 }
2268         },
2269         [ALC882_FIXUP_PB_M5210] = {
2270                 .type = HDA_FIXUP_PINCTLS,
2271                 .v.pins = (const struct hda_pintbl[]) {
2272                         { 0x19, PIN_VREF50 },
2273                         {}
2274                 }
2275         },
2276         [ALC882_FIXUP_ACER_ASPIRE_7736] = {
2277                 .type = HDA_FIXUP_FUNC,
2278                 .v.func = alc_fixup_sku_ignore,
2279         },
2280         [ALC882_FIXUP_ASUS_W90V] = {
2281                 .type = HDA_FIXUP_PINS,
2282                 .v.pins = (const struct hda_pintbl[]) {
2283                         { 0x16, 0x99130110 }, /* fix sequence for CLFE */
2284                         { }
2285                 }
2286         },
2287         [ALC889_FIXUP_CD] = {
2288                 .type = HDA_FIXUP_PINS,
2289                 .v.pins = (const struct hda_pintbl[]) {
2290                         { 0x1c, 0x993301f0 }, /* CD */
2291                         { }
2292                 }
2293         },
2294         [ALC889_FIXUP_FRONT_HP_NO_PRESENCE] = {
2295                 .type = HDA_FIXUP_PINS,
2296                 .v.pins = (const struct hda_pintbl[]) {
2297                         { 0x1b, 0x02214120 }, /* Front HP jack is flaky, disable jack detect */
2298                         { }
2299                 },
2300                 .chained = true,
2301                 .chain_id = ALC889_FIXUP_CD,
2302         },
2303         [ALC889_FIXUP_VAIO_TT] = {
2304                 .type = HDA_FIXUP_PINS,
2305                 .v.pins = (const struct hda_pintbl[]) {
2306                         { 0x17, 0x90170111 }, /* hidden surround speaker */
2307                         { }
2308                 }
2309         },
2310         [ALC888_FIXUP_EEE1601] = {
2311                 .type = HDA_FIXUP_VERBS,
2312                 .v.verbs = (const struct hda_verb[]) {
2313                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2314                         { 0x20, AC_VERB_SET_PROC_COEF,  0x0838 },
2315                         { }
2316                 }
2317         },
2318         [ALC886_FIXUP_EAPD] = {
2319                 .type = HDA_FIXUP_VERBS,
2320                 .v.verbs = (const struct hda_verb[]) {
2321                         /* change to EAPD mode */
2322                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2323                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0068 },
2324                         { }
2325                 }
2326         },
2327         [ALC882_FIXUP_EAPD] = {
2328                 .type = HDA_FIXUP_VERBS,
2329                 .v.verbs = (const struct hda_verb[]) {
2330                         /* change to EAPD mode */
2331                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2332                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
2333                         { }
2334                 }
2335         },
2336         [ALC883_FIXUP_EAPD] = {
2337                 .type = HDA_FIXUP_VERBS,
2338                 .v.verbs = (const struct hda_verb[]) {
2339                         /* change to EAPD mode */
2340                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2341                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2342                         { }
2343                 }
2344         },
2345         [ALC883_FIXUP_ACER_EAPD] = {
2346                 .type = HDA_FIXUP_VERBS,
2347                 .v.verbs = (const struct hda_verb[]) {
2348                         /* eanable EAPD on Acer laptops */
2349                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2350                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2351                         { }
2352                 }
2353         },
2354         [ALC882_FIXUP_GPIO1] = {
2355                 .type = HDA_FIXUP_FUNC,
2356                 .v.func = alc_fixup_gpio1,
2357         },
2358         [ALC882_FIXUP_GPIO2] = {
2359                 .type = HDA_FIXUP_FUNC,
2360                 .v.func = alc_fixup_gpio2,
2361         },
2362         [ALC882_FIXUP_GPIO3] = {
2363                 .type = HDA_FIXUP_FUNC,
2364                 .v.func = alc_fixup_gpio3,
2365         },
2366         [ALC882_FIXUP_ASUS_W2JC] = {
2367                 .type = HDA_FIXUP_FUNC,
2368                 .v.func = alc_fixup_gpio1,
2369                 .chained = true,
2370                 .chain_id = ALC882_FIXUP_EAPD,
2371         },
2372         [ALC889_FIXUP_COEF] = {
2373                 .type = HDA_FIXUP_FUNC,
2374                 .v.func = alc889_fixup_coef,
2375         },
2376         [ALC882_FIXUP_ACER_ASPIRE_4930G] = {
2377                 .type = HDA_FIXUP_PINS,
2378                 .v.pins = (const struct hda_pintbl[]) {
2379                         { 0x16, 0x99130111 }, /* CLFE speaker */
2380                         { 0x17, 0x99130112 }, /* surround speaker */
2381                         { }
2382                 },
2383                 .chained = true,
2384                 .chain_id = ALC882_FIXUP_GPIO1,
2385         },
2386         [ALC882_FIXUP_ACER_ASPIRE_8930G] = {
2387                 .type = HDA_FIXUP_PINS,
2388                 .v.pins = (const struct hda_pintbl[]) {
2389                         { 0x16, 0x99130111 }, /* CLFE speaker */
2390                         { 0x1b, 0x99130112 }, /* surround speaker */
2391                         { }
2392                 },
2393                 .chained = true,
2394                 .chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS,
2395         },
2396         [ALC882_FIXUP_ASPIRE_8930G_VERBS] = {
2397                 /* additional init verbs for Acer Aspire 8930G */
2398                 .type = HDA_FIXUP_VERBS,
2399                 .v.verbs = (const struct hda_verb[]) {
2400                         /* Enable all DACs */
2401                         /* DAC DISABLE/MUTE 1? */
2402                         /*  setting bits 1-5 disables DAC nids 0x02-0x06
2403                          *  apparently. Init=0x38 */
2404                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x03 },
2405                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2406                         /* DAC DISABLE/MUTE 2? */
2407                         /*  some bit here disables the other DACs.
2408                          *  Init=0x4900 */
2409                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x08 },
2410                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2411                         /* DMIC fix
2412                          * This laptop has a stereo digital microphone.
2413                          * The mics are only 1cm apart which makes the stereo
2414                          * useless. However, either the mic or the ALC889
2415                          * makes the signal become a difference/sum signal
2416                          * instead of standard stereo, which is annoying.
2417                          * So instead we flip this bit which makes the
2418                          * codec replicate the sum signal to both channels,
2419                          * turning it into a normal mono mic.
2420                          */
2421                         /* DMIC_CONTROL? Init value = 0x0001 */
2422                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2423                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0003 },
2424                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2425                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2426                         { }
2427                 },
2428                 .chained = true,
2429                 .chain_id = ALC882_FIXUP_GPIO1,
2430         },
2431         [ALC885_FIXUP_MACPRO_GPIO] = {
2432                 .type = HDA_FIXUP_FUNC,
2433                 .v.func = alc885_fixup_macpro_gpio,
2434         },
2435         [ALC889_FIXUP_DAC_ROUTE] = {
2436                 .type = HDA_FIXUP_FUNC,
2437                 .v.func = alc889_fixup_dac_route,
2438         },
2439         [ALC889_FIXUP_MBP_VREF] = {
2440                 .type = HDA_FIXUP_FUNC,
2441                 .v.func = alc889_fixup_mbp_vref,
2442                 .chained = true,
2443                 .chain_id = ALC882_FIXUP_GPIO1,
2444         },
2445         [ALC889_FIXUP_IMAC91_VREF] = {
2446                 .type = HDA_FIXUP_FUNC,
2447                 .v.func = alc889_fixup_imac91_vref,
2448                 .chained = true,
2449                 .chain_id = ALC882_FIXUP_GPIO1,
2450         },
2451         [ALC889_FIXUP_MBA11_VREF] = {
2452                 .type = HDA_FIXUP_FUNC,
2453                 .v.func = alc889_fixup_mba11_vref,
2454                 .chained = true,
2455                 .chain_id = ALC889_FIXUP_MBP_VREF,
2456         },
2457         [ALC889_FIXUP_MBA21_VREF] = {
2458                 .type = HDA_FIXUP_FUNC,
2459                 .v.func = alc889_fixup_mba21_vref,
2460                 .chained = true,
2461                 .chain_id = ALC889_FIXUP_MBP_VREF,
2462         },
2463         [ALC889_FIXUP_MP11_VREF] = {
2464                 .type = HDA_FIXUP_FUNC,
2465                 .v.func = alc889_fixup_mba11_vref,
2466                 .chained = true,
2467                 .chain_id = ALC885_FIXUP_MACPRO_GPIO,
2468         },
2469         [ALC889_FIXUP_MP41_VREF] = {
2470                 .type = HDA_FIXUP_FUNC,
2471                 .v.func = alc889_fixup_mbp_vref,
2472                 .chained = true,
2473                 .chain_id = ALC885_FIXUP_MACPRO_GPIO,
2474         },
2475         [ALC882_FIXUP_INV_DMIC] = {
2476                 .type = HDA_FIXUP_FUNC,
2477                 .v.func = alc_fixup_inv_dmic,
2478         },
2479         [ALC882_FIXUP_NO_PRIMARY_HP] = {
2480                 .type = HDA_FIXUP_FUNC,
2481                 .v.func = alc882_fixup_no_primary_hp,
2482         },
2483         [ALC887_FIXUP_ASUS_BASS] = {
2484                 .type = HDA_FIXUP_PINS,
2485                 .v.pins = (const struct hda_pintbl[]) {
2486                         {0x16, 0x99130130}, /* bass speaker */
2487                         {}
2488                 },
2489                 .chained = true,
2490                 .chain_id = ALC887_FIXUP_BASS_CHMAP,
2491         },
2492         [ALC887_FIXUP_BASS_CHMAP] = {
2493                 .type = HDA_FIXUP_FUNC,
2494                 .v.func = alc_fixup_bass_chmap,
2495         },
2496         [ALC1220_FIXUP_GB_DUAL_CODECS] = {
2497                 .type = HDA_FIXUP_FUNC,
2498                 .v.func = alc1220_fixup_gb_dual_codecs,
2499         },
2500         [ALC1220_FIXUP_GB_X570] = {
2501                 .type = HDA_FIXUP_FUNC,
2502                 .v.func = alc1220_fixup_gb_x570,
2503         },
2504         [ALC1220_FIXUP_CLEVO_P950] = {
2505                 .type = HDA_FIXUP_FUNC,
2506                 .v.func = alc1220_fixup_clevo_p950,
2507         },
2508         [ALC1220_FIXUP_CLEVO_PB51ED] = {
2509                 .type = HDA_FIXUP_FUNC,
2510                 .v.func = alc1220_fixup_clevo_pb51ed,
2511         },
2512         [ALC1220_FIXUP_CLEVO_PB51ED_PINS] = {
2513                 .type = HDA_FIXUP_PINS,
2514                 .v.pins = (const struct hda_pintbl[]) {
2515                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
2516                         {}
2517                 },
2518                 .chained = true,
2519                 .chain_id = ALC1220_FIXUP_CLEVO_PB51ED,
2520         },
2521         [ALC887_FIXUP_ASUS_AUDIO] = {
2522                 .type = HDA_FIXUP_PINS,
2523                 .v.pins = (const struct hda_pintbl[]) {
2524                         { 0x15, 0x02a14150 }, /* use as headset mic, without its own jack detect */
2525                         { 0x19, 0x22219420 },
2526                         {}
2527                 },
2528         },
2529         [ALC887_FIXUP_ASUS_HMIC] = {
2530                 .type = HDA_FIXUP_FUNC,
2531                 .v.func = alc887_fixup_asus_jack,
2532                 .chained = true,
2533                 .chain_id = ALC887_FIXUP_ASUS_AUDIO,
2534         },
2535         [ALCS1200A_FIXUP_MIC_VREF] = {
2536                 .type = HDA_FIXUP_PINCTLS,
2537                 .v.pins = (const struct hda_pintbl[]) {
2538                         { 0x18, PIN_VREF50 }, /* rear mic */
2539                         { 0x19, PIN_VREF50 }, /* front mic */
2540                         {}
2541                 }
2542         },
2543         [ALC888VD_FIXUP_MIC_100VREF] = {
2544                 .type = HDA_FIXUP_PINCTLS,
2545                 .v.pins = (const struct hda_pintbl[]) {
2546                         { 0x18, PIN_VREF100 }, /* headset mic */
2547                         {}
2548                 }
2549         },
2550 };
2551
2552 static const struct snd_pci_quirk alc882_fixup_tbl[] = {
2553         SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),
2554         SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2555         SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2556         SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),
2557         SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2558         SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),
2559         SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD),
2560         SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
2561                       ALC882_FIXUP_ACER_ASPIRE_4930G),
2562         SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
2563                       ALC882_FIXUP_ACER_ASPIRE_4930G),
2564         SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
2565                       ALC882_FIXUP_ACER_ASPIRE_8930G),
2566         SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
2567                       ALC882_FIXUP_ACER_ASPIRE_8930G),
2568         SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
2569                       ALC882_FIXUP_ACER_ASPIRE_4930G),
2570         SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
2571         SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
2572                       ALC882_FIXUP_ACER_ASPIRE_4930G),
2573         SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
2574                       ALC882_FIXUP_ACER_ASPIRE_4930G),
2575         SND_PCI_QUIRK(0x1025, 0x021e, "Acer Aspire 5739G",
2576                       ALC882_FIXUP_ACER_ASPIRE_4930G),
2577         SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
2578         SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G),
2579         SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
2580         SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
2581         SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
2582         SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC),
2583         SND_PCI_QUIRK(0x1043, 0x2390, "Asus D700SA", ALC887_FIXUP_ASUS_HMIC),
2584         SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601),
2585         SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS),
2586         SND_PCI_QUIRK(0x1043, 0x8691, "ASUS ROG Ranger VIII", ALC882_FIXUP_GPIO3),
2587         SND_PCI_QUIRK(0x1043, 0x8797, "ASUS TUF B550M-PLUS", ALCS1200A_FIXUP_MIC_VREF),
2588         SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),
2589         SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP),
2590         SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
2591         SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP),
2592         SND_PCI_QUIRK(0x104d, 0x9060, "Sony Vaio VPCL14M1R", ALC882_FIXUP_NO_PRIMARY_HP),
2593
2594         /* All Apple entries are in codec SSIDs */
2595         SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF),
2596         SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC889_FIXUP_MBP_VREF),
2597         SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
2598         SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC889_FIXUP_MP11_VREF),
2599         SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO),
2600         SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO),
2601         SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC889_FIXUP_MBP_VREF),
2602         SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF),
2603         SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD),
2604         SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBA11_VREF),
2605         SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBA21_VREF),
2606         SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF),
2607         SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
2608         SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO),
2609         SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),
2610         SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),
2611         SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),
2612         SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 4,1/5,1", ALC889_FIXUP_MP41_VREF),
2613         SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
2614         SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
2615         SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
2616         SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF),
2617
2618         SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
2619         SND_PCI_QUIRK(0x10ec, 0x12d8, "iBase Elo Touch", ALC888VD_FIXUP_MIC_100VREF),
2620         SND_PCI_QUIRK(0x13fe, 0x1009, "Advantech MIT-W101", ALC886_FIXUP_EAPD),
2621         SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),
2622         SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
2623         SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_GB_X570),
2624         SND_PCI_QUIRK(0x1458, 0xa0ce, "Gigabyte X570 Aorus Xtreme", ALC1220_FIXUP_GB_X570),
2625         SND_PCI_QUIRK(0x1458, 0xa0d5, "Gigabyte X570S Aorus Master", ALC1220_FIXUP_GB_X570),
2626         SND_PCI_QUIRK(0x1462, 0x11f7, "MSI-GE63", ALC1220_FIXUP_CLEVO_P950),
2627         SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950),
2628         SND_PCI_QUIRK(0x1462, 0x1229, "MSI-GP73", ALC1220_FIXUP_CLEVO_P950),
2629         SND_PCI_QUIRK(0x1462, 0x1275, "MSI-GL63", ALC1220_FIXUP_CLEVO_P950),
2630         SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950),
2631         SND_PCI_QUIRK(0x1462, 0x1293, "MSI-GP65", ALC1220_FIXUP_CLEVO_P950),
2632         SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
2633         SND_PCI_QUIRK(0x1462, 0xcc34, "MSI Godlike X570", ALC1220_FIXUP_GB_DUAL_CODECS),
2634         SND_PCI_QUIRK(0x1462, 0xda57, "MSI Z270-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
2635         SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
2636         SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
2637         SND_PCI_QUIRK(0x1558, 0x3702, "Clevo X370SN[VW]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2638         SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2639         SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2640         SND_PCI_QUIRK(0x1558, 0x65d2, "Clevo PB51R[CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2641         SND_PCI_QUIRK(0x1558, 0x65e1, "Clevo PB51[ED][DF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2642         SND_PCI_QUIRK(0x1558, 0x65e5, "Clevo PC50D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2643         SND_PCI_QUIRK(0x1558, 0x65f1, "Clevo PC50HS", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2644         SND_PCI_QUIRK(0x1558, 0x65f5, "Clevo PD50PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2645         SND_PCI_QUIRK(0x1558, 0x66a2, "Clevo PE60RNE", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2646         SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2647         SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2648         SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2649         SND_PCI_QUIRK(0x1558, 0x67f1, "Clevo PC70H[PRS]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2650         SND_PCI_QUIRK(0x1558, 0x67f5, "Clevo PD70PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2651         SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2652         SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170SM", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2653         SND_PCI_QUIRK(0x1558, 0x7715, "Clevo X170KM-G", ALC1220_FIXUP_CLEVO_PB51ED),
2654         SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
2655         SND_PCI_QUIRK(0x1558, 0x9506, "Clevo P955HQ", ALC1220_FIXUP_CLEVO_P950),
2656         SND_PCI_QUIRK(0x1558, 0x950a, "Clevo P955H[PR]", ALC1220_FIXUP_CLEVO_P950),
2657         SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),
2658         SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950),
2659         SND_PCI_QUIRK(0x1558, 0x95e3, "Clevo P955[ER]T", ALC1220_FIXUP_CLEVO_P950),
2660         SND_PCI_QUIRK(0x1558, 0x95e4, "Clevo P955ER", ALC1220_FIXUP_CLEVO_P950),
2661         SND_PCI_QUIRK(0x1558, 0x95e5, "Clevo P955EE6", ALC1220_FIXUP_CLEVO_P950),
2662         SND_PCI_QUIRK(0x1558, 0x95e6, "Clevo P950R[CDF]", ALC1220_FIXUP_CLEVO_P950),
2663         SND_PCI_QUIRK(0x1558, 0x96e1, "Clevo P960[ER][CDFN]-K", ALC1220_FIXUP_CLEVO_P950),
2664         SND_PCI_QUIRK(0x1558, 0x97e1, "Clevo P970[ER][CDFN]", ALC1220_FIXUP_CLEVO_P950),
2665         SND_PCI_QUIRK(0x1558, 0x97e2, "Clevo P970RC-M", ALC1220_FIXUP_CLEVO_P950),
2666         SND_PCI_QUIRK(0x1558, 0xd502, "Clevo PD50SNE", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2667         SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
2668         SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
2669         SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
2670         SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF),
2671         {}
2672 };
2673
2674 static const struct hda_model_fixup alc882_fixup_models[] = {
2675         {.id = ALC882_FIXUP_ABIT_AW9D_MAX, .name = "abit-aw9d"},
2676         {.id = ALC882_FIXUP_LENOVO_Y530, .name = "lenovo-y530"},
2677         {.id = ALC882_FIXUP_ACER_ASPIRE_7736, .name = "acer-aspire-7736"},
2678         {.id = ALC882_FIXUP_ASUS_W90V, .name = "asus-w90v"},
2679         {.id = ALC889_FIXUP_CD, .name = "cd"},
2680         {.id = ALC889_FIXUP_FRONT_HP_NO_PRESENCE, .name = "no-front-hp"},
2681         {.id = ALC889_FIXUP_VAIO_TT, .name = "vaio-tt"},
2682         {.id = ALC888_FIXUP_EEE1601, .name = "eee1601"},
2683         {.id = ALC882_FIXUP_EAPD, .name = "alc882-eapd"},
2684         {.id = ALC883_FIXUP_EAPD, .name = "alc883-eapd"},
2685         {.id = ALC882_FIXUP_GPIO1, .name = "gpio1"},
2686         {.id = ALC882_FIXUP_GPIO2, .name = "gpio2"},
2687         {.id = ALC882_FIXUP_GPIO3, .name = "gpio3"},
2688         {.id = ALC889_FIXUP_COEF, .name = "alc889-coef"},
2689         {.id = ALC882_FIXUP_ASUS_W2JC, .name = "asus-w2jc"},
2690         {.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"},
2691         {.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"},
2692         {.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"},
2693         {.id = ALC885_FIXUP_MACPRO_GPIO, .name = "macpro-gpio"},
2694         {.id = ALC889_FIXUP_DAC_ROUTE, .name = "dac-route"},
2695         {.id = ALC889_FIXUP_MBP_VREF, .name = "mbp-vref"},
2696         {.id = ALC889_FIXUP_IMAC91_VREF, .name = "imac91-vref"},
2697         {.id = ALC889_FIXUP_MBA11_VREF, .name = "mba11-vref"},
2698         {.id = ALC889_FIXUP_MBA21_VREF, .name = "mba21-vref"},
2699         {.id = ALC889_FIXUP_MP11_VREF, .name = "mp11-vref"},
2700         {.id = ALC889_FIXUP_MP41_VREF, .name = "mp41-vref"},
2701         {.id = ALC882_FIXUP_INV_DMIC, .name = "inv-dmic"},
2702         {.id = ALC882_FIXUP_NO_PRIMARY_HP, .name = "no-primary-hp"},
2703         {.id = ALC887_FIXUP_ASUS_BASS, .name = "asus-bass"},
2704         {.id = ALC1220_FIXUP_GB_DUAL_CODECS, .name = "dual-codecs"},
2705         {.id = ALC1220_FIXUP_GB_X570, .name = "gb-x570"},
2706         {.id = ALC1220_FIXUP_CLEVO_P950, .name = "clevo-p950"},
2707         {}
2708 };
2709
2710 static const struct snd_hda_pin_quirk alc882_pin_fixup_tbl[] = {
2711         SND_HDA_PIN_QUIRK(0x10ec1220, 0x1043, "ASUS", ALC1220_FIXUP_CLEVO_P950,
2712                 {0x14, 0x01014010},
2713                 {0x15, 0x01011012},
2714                 {0x16, 0x01016011},
2715                 {0x18, 0x01a19040},
2716                 {0x19, 0x02a19050},
2717                 {0x1a, 0x0181304f},
2718                 {0x1b, 0x0221401f},
2719                 {0x1e, 0x01456130}),
2720         SND_HDA_PIN_QUIRK(0x10ec1220, 0x1462, "MS-7C35", ALC1220_FIXUP_CLEVO_P950,
2721                 {0x14, 0x01015010},
2722                 {0x15, 0x01011012},
2723                 {0x16, 0x01011011},
2724                 {0x18, 0x01a11040},
2725                 {0x19, 0x02a19050},
2726                 {0x1a, 0x0181104f},
2727                 {0x1b, 0x0221401f},
2728                 {0x1e, 0x01451130}),
2729         {}
2730 };
2731
2732 /*
2733  * BIOS auto configuration
2734  */
2735 /* almost identical with ALC880 parser... */
2736 static int alc882_parse_auto_config(struct hda_codec *codec)
2737 {
2738         static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };
2739         static const hda_nid_t alc882_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2740         return alc_parse_auto_config(codec, alc882_ignore, alc882_ssids);
2741 }
2742
2743 /*
2744  */
2745 static int patch_alc882(struct hda_codec *codec)
2746 {
2747         struct alc_spec *spec;
2748         int err;
2749
2750         err = alc_alloc_spec(codec, 0x0b);
2751         if (err < 0)
2752                 return err;
2753
2754         spec = codec->spec;
2755
2756         switch (codec->core.vendor_id) {
2757         case 0x10ec0882:
2758         case 0x10ec0885:
2759         case 0x10ec0900:
2760         case 0x10ec0b00:
2761         case 0x10ec1220:
2762                 break;
2763         default:
2764                 /* ALC883 and variants */
2765                 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2766                 break;
2767         }
2768
2769         alc_pre_init(codec);
2770
2771         snd_hda_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl,
2772                        alc882_fixups);
2773         snd_hda_pick_pin_fixup(codec, alc882_pin_fixup_tbl, alc882_fixups, true);
2774         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2775
2776         alc_auto_parse_customize_define(codec);
2777
2778         if (has_cdefine_beep(codec))
2779                 spec->gen.beep_nid = 0x01;
2780
2781         /* automatic parse from the BIOS config */
2782         err = alc882_parse_auto_config(codec);
2783         if (err < 0)
2784                 goto error;
2785
2786         if (!spec->gen.no_analog && spec->gen.beep_nid) {
2787                 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2788                 if (err < 0)
2789                         goto error;
2790         }
2791
2792         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2793
2794         return 0;
2795
2796  error:
2797         alc_free(codec);
2798         return err;
2799 }
2800
2801
2802 /*
2803  * ALC262 support
2804  */
2805 static int alc262_parse_auto_config(struct hda_codec *codec)
2806 {
2807         static const hda_nid_t alc262_ignore[] = { 0x1d, 0 };
2808         static const hda_nid_t alc262_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2809         return alc_parse_auto_config(codec, alc262_ignore, alc262_ssids);
2810 }
2811
2812 /*
2813  * Pin config fixes
2814  */
2815 enum {
2816         ALC262_FIXUP_FSC_H270,
2817         ALC262_FIXUP_FSC_S7110,
2818         ALC262_FIXUP_HP_Z200,
2819         ALC262_FIXUP_TYAN,
2820         ALC262_FIXUP_LENOVO_3000,
2821         ALC262_FIXUP_BENQ,
2822         ALC262_FIXUP_BENQ_T31,
2823         ALC262_FIXUP_INV_DMIC,
2824         ALC262_FIXUP_INTEL_BAYLEYBAY,
2825 };
2826
2827 static const struct hda_fixup alc262_fixups[] = {
2828         [ALC262_FIXUP_FSC_H270] = {
2829                 .type = HDA_FIXUP_PINS,
2830                 .v.pins = (const struct hda_pintbl[]) {
2831                         { 0x14, 0x99130110 }, /* speaker */
2832                         { 0x15, 0x0221142f }, /* front HP */
2833                         { 0x1b, 0x0121141f }, /* rear HP */
2834                         { }
2835                 }
2836         },
2837         [ALC262_FIXUP_FSC_S7110] = {
2838                 .type = HDA_FIXUP_PINS,
2839                 .v.pins = (const struct hda_pintbl[]) {
2840                         { 0x15, 0x90170110 }, /* speaker */
2841                         { }
2842                 },
2843                 .chained = true,
2844                 .chain_id = ALC262_FIXUP_BENQ,
2845         },
2846         [ALC262_FIXUP_HP_Z200] = {
2847                 .type = HDA_FIXUP_PINS,
2848                 .v.pins = (const struct hda_pintbl[]) {
2849                         { 0x16, 0x99130120 }, /* internal speaker */
2850                         { }
2851                 }
2852         },
2853         [ALC262_FIXUP_TYAN] = {
2854                 .type = HDA_FIXUP_PINS,
2855                 .v.pins = (const struct hda_pintbl[]) {
2856                         { 0x14, 0x1993e1f0 }, /* int AUX */
2857                         { }
2858                 }
2859         },
2860         [ALC262_FIXUP_LENOVO_3000] = {
2861                 .type = HDA_FIXUP_PINCTLS,
2862                 .v.pins = (const struct hda_pintbl[]) {
2863                         { 0x19, PIN_VREF50 },
2864                         {}
2865                 },
2866                 .chained = true,
2867                 .chain_id = ALC262_FIXUP_BENQ,
2868         },
2869         [ALC262_FIXUP_BENQ] = {
2870                 .type = HDA_FIXUP_VERBS,
2871                 .v.verbs = (const struct hda_verb[]) {
2872                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2873                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2874                         {}
2875                 }
2876         },
2877         [ALC262_FIXUP_BENQ_T31] = {
2878                 .type = HDA_FIXUP_VERBS,
2879                 .v.verbs = (const struct hda_verb[]) {
2880                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2881                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2882                         {}
2883                 }
2884         },
2885         [ALC262_FIXUP_INV_DMIC] = {
2886                 .type = HDA_FIXUP_FUNC,
2887                 .v.func = alc_fixup_inv_dmic,
2888         },
2889         [ALC262_FIXUP_INTEL_BAYLEYBAY] = {
2890                 .type = HDA_FIXUP_FUNC,
2891                 .v.func = alc_fixup_no_depop_delay,
2892         },
2893 };
2894
2895 static const struct snd_pci_quirk alc262_fixup_tbl[] = {
2896         SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", ALC262_FIXUP_HP_Z200),
2897         SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu Lifebook S7110", ALC262_FIXUP_FSC_S7110),
2898         SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ),
2899         SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN),
2900         SND_PCI_QUIRK(0x1734, 0x1141, "FSC ESPRIMO U9210", ALC262_FIXUP_FSC_H270),
2901         SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270),
2902         SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000),
2903         SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ),
2904         SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_FIXUP_BENQ_T31),
2905         SND_PCI_QUIRK(0x8086, 0x7270, "BayleyBay", ALC262_FIXUP_INTEL_BAYLEYBAY),
2906         {}
2907 };
2908
2909 static const struct hda_model_fixup alc262_fixup_models[] = {
2910         {.id = ALC262_FIXUP_INV_DMIC, .name = "inv-dmic"},
2911         {.id = ALC262_FIXUP_FSC_H270, .name = "fsc-h270"},
2912         {.id = ALC262_FIXUP_FSC_S7110, .name = "fsc-s7110"},
2913         {.id = ALC262_FIXUP_HP_Z200, .name = "hp-z200"},
2914         {.id = ALC262_FIXUP_TYAN, .name = "tyan"},
2915         {.id = ALC262_FIXUP_LENOVO_3000, .name = "lenovo-3000"},
2916         {.id = ALC262_FIXUP_BENQ, .name = "benq"},
2917         {.id = ALC262_FIXUP_BENQ_T31, .name = "benq-t31"},
2918         {.id = ALC262_FIXUP_INTEL_BAYLEYBAY, .name = "bayleybay"},
2919         {}
2920 };
2921
2922 /*
2923  */
2924 static int patch_alc262(struct hda_codec *codec)
2925 {
2926         struct alc_spec *spec;
2927         int err;
2928
2929         err = alc_alloc_spec(codec, 0x0b);
2930         if (err < 0)
2931                 return err;
2932
2933         spec = codec->spec;
2934         spec->gen.shared_mic_vref_pin = 0x18;
2935
2936         spec->shutup = alc_eapd_shutup;
2937
2938 #if 0
2939         /* pshou 07/11/05  set a zero PCM sample to DAC when FIFO is
2940          * under-run
2941          */
2942         alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x80);
2943 #endif
2944         alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2945
2946         alc_pre_init(codec);
2947
2948         snd_hda_pick_fixup(codec, alc262_fixup_models, alc262_fixup_tbl,
2949                        alc262_fixups);
2950         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2951
2952         alc_auto_parse_customize_define(codec);
2953
2954         if (has_cdefine_beep(codec))
2955                 spec->gen.beep_nid = 0x01;
2956
2957         /* automatic parse from the BIOS config */
2958         err = alc262_parse_auto_config(codec);
2959         if (err < 0)
2960                 goto error;
2961
2962         if (!spec->gen.no_analog && spec->gen.beep_nid) {
2963                 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2964                 if (err < 0)
2965                         goto error;
2966         }
2967
2968         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2969
2970         return 0;
2971
2972  error:
2973         alc_free(codec);
2974         return err;
2975 }
2976
2977 /*
2978  *  ALC268
2979  */
2980 /* bind Beep switches of both NID 0x0f and 0x10 */
2981 static int alc268_beep_switch_put(struct snd_kcontrol *kcontrol,
2982                                   struct snd_ctl_elem_value *ucontrol)
2983 {
2984         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2985         unsigned long pval;
2986         int err;
2987
2988         mutex_lock(&codec->control_mutex);
2989         pval = kcontrol->private_value;
2990         kcontrol->private_value = (pval & ~0xff) | 0x0f;
2991         err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2992         if (err >= 0) {
2993                 kcontrol->private_value = (pval & ~0xff) | 0x10;
2994                 err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2995         }
2996         kcontrol->private_value = pval;
2997         mutex_unlock(&codec->control_mutex);
2998         return err;
2999 }
3000
3001 static const struct snd_kcontrol_new alc268_beep_mixer[] = {
3002         HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
3003         {
3004                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3005                 .name = "Beep Playback Switch",
3006                 .subdevice = HDA_SUBDEV_AMP_FLAG,
3007                 .info = snd_hda_mixer_amp_switch_info,
3008                 .get = snd_hda_mixer_amp_switch_get,
3009                 .put = alc268_beep_switch_put,
3010                 .private_value = HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT)
3011         },
3012 };
3013
3014 /* set PCBEEP vol = 0, mute connections */
3015 static const struct hda_verb alc268_beep_init_verbs[] = {
3016         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3017         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3018         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3019         { }
3020 };
3021
3022 enum {
3023         ALC268_FIXUP_INV_DMIC,
3024         ALC268_FIXUP_HP_EAPD,
3025         ALC268_FIXUP_SPDIF,
3026 };
3027
3028 static const struct hda_fixup alc268_fixups[] = {
3029         [ALC268_FIXUP_INV_DMIC] = {
3030                 .type = HDA_FIXUP_FUNC,
3031                 .v.func = alc_fixup_inv_dmic,
3032         },
3033         [ALC268_FIXUP_HP_EAPD] = {
3034                 .type = HDA_FIXUP_VERBS,
3035                 .v.verbs = (const struct hda_verb[]) {
3036                         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 0},
3037                         {}
3038                 }
3039         },
3040         [ALC268_FIXUP_SPDIF] = {
3041                 .type = HDA_FIXUP_PINS,
3042                 .v.pins = (const struct hda_pintbl[]) {
3043                         { 0x1e, 0x014b1180 }, /* enable SPDIF out */
3044                         {}
3045                 }
3046         },
3047 };
3048
3049 static const struct hda_model_fixup alc268_fixup_models[] = {
3050         {.id = ALC268_FIXUP_INV_DMIC, .name = "inv-dmic"},
3051         {.id = ALC268_FIXUP_HP_EAPD, .name = "hp-eapd"},
3052         {.id = ALC268_FIXUP_SPDIF, .name = "spdif"},
3053         {}
3054 };
3055
3056 static const struct snd_pci_quirk alc268_fixup_tbl[] = {
3057         SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF),
3058         SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC),
3059         /* below is codec SSID since multiple Toshiba laptops have the
3060          * same PCI SSID 1179:ff00
3061          */
3062         SND_PCI_QUIRK(0x1179, 0xff06, "Toshiba P200", ALC268_FIXUP_HP_EAPD),
3063         {}
3064 };
3065
3066 /*
3067  * BIOS auto configuration
3068  */
3069 static int alc268_parse_auto_config(struct hda_codec *codec)
3070 {
3071         static const hda_nid_t alc268_ssids[] = { 0x15, 0x1b, 0x14, 0 };
3072         return alc_parse_auto_config(codec, NULL, alc268_ssids);
3073 }
3074
3075 /*
3076  */
3077 static int patch_alc268(struct hda_codec *codec)
3078 {
3079         struct alc_spec *spec;
3080         int i, err;
3081
3082         /* ALC268 has no aa-loopback mixer */
3083         err = alc_alloc_spec(codec, 0);
3084         if (err < 0)
3085                 return err;
3086
3087         spec = codec->spec;
3088         if (has_cdefine_beep(codec))
3089                 spec->gen.beep_nid = 0x01;
3090
3091         spec->shutup = alc_eapd_shutup;
3092
3093         alc_pre_init(codec);
3094
3095         snd_hda_pick_fixup(codec, alc268_fixup_models, alc268_fixup_tbl, alc268_fixups);
3096         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
3097
3098         /* automatic parse from the BIOS config */
3099         err = alc268_parse_auto_config(codec);
3100         if (err < 0)
3101                 goto error;
3102
3103         if (err > 0 && !spec->gen.no_analog &&
3104             spec->gen.autocfg.speaker_pins[0] != 0x1d) {
3105                 for (i = 0; i < ARRAY_SIZE(alc268_beep_mixer); i++) {
3106                         if (!snd_hda_gen_add_kctl(&spec->gen, NULL,
3107                                                   &alc268_beep_mixer[i])) {
3108                                 err = -ENOMEM;
3109                                 goto error;
3110                         }
3111                 }
3112                 snd_hda_add_verbs(codec, alc268_beep_init_verbs);
3113                 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
3114                         /* override the amp caps for beep generator */
3115                         snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
3116                                           (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
3117                                           (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
3118                                           (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
3119                                           (0 << AC_AMPCAP_MUTE_SHIFT));
3120         }
3121
3122         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
3123
3124         return 0;
3125
3126  error:
3127         alc_free(codec);
3128         return err;
3129 }
3130
3131 /*
3132  * ALC269
3133  */
3134
3135 static const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
3136         .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
3137 };
3138
3139 static const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
3140         .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
3141 };
3142
3143 /* different alc269-variants */
3144 enum {
3145         ALC269_TYPE_ALC269VA,
3146         ALC269_TYPE_ALC269VB,
3147         ALC269_TYPE_ALC269VC,
3148         ALC269_TYPE_ALC269VD,
3149         ALC269_TYPE_ALC280,
3150         ALC269_TYPE_ALC282,
3151         ALC269_TYPE_ALC283,
3152         ALC269_TYPE_ALC284,
3153         ALC269_TYPE_ALC293,
3154         ALC269_TYPE_ALC286,
3155         ALC269_TYPE_ALC298,
3156         ALC269_TYPE_ALC255,
3157         ALC269_TYPE_ALC256,
3158         ALC269_TYPE_ALC257,
3159         ALC269_TYPE_ALC215,
3160         ALC269_TYPE_ALC225,
3161         ALC269_TYPE_ALC245,
3162         ALC269_TYPE_ALC287,
3163         ALC269_TYPE_ALC294,
3164         ALC269_TYPE_ALC300,
3165         ALC269_TYPE_ALC623,
3166         ALC269_TYPE_ALC700,
3167 };
3168
3169 /*
3170  * BIOS auto configuration
3171  */
3172 static int alc269_parse_auto_config(struct hda_codec *codec)
3173 {
3174         static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };
3175         static const hda_nid_t alc269_ssids[] = { 0, 0x1b, 0x14, 0x21 };
3176         static const hda_nid_t alc269va_ssids[] = { 0x15, 0x1b, 0x14, 0 };
3177         struct alc_spec *spec = codec->spec;
3178         const hda_nid_t *ssids;
3179
3180         switch (spec->codec_variant) {
3181         case ALC269_TYPE_ALC269VA:
3182         case ALC269_TYPE_ALC269VC:
3183         case ALC269_TYPE_ALC280:
3184         case ALC269_TYPE_ALC284:
3185         case ALC269_TYPE_ALC293:
3186                 ssids = alc269va_ssids;
3187                 break;
3188         case ALC269_TYPE_ALC269VB:
3189         case ALC269_TYPE_ALC269VD:
3190         case ALC269_TYPE_ALC282:
3191         case ALC269_TYPE_ALC283:
3192         case ALC269_TYPE_ALC286:
3193         case ALC269_TYPE_ALC298:
3194         case ALC269_TYPE_ALC255:
3195         case ALC269_TYPE_ALC256:
3196         case ALC269_TYPE_ALC257:
3197         case ALC269_TYPE_ALC215:
3198         case ALC269_TYPE_ALC225:
3199         case ALC269_TYPE_ALC245:
3200         case ALC269_TYPE_ALC287:
3201         case ALC269_TYPE_ALC294:
3202         case ALC269_TYPE_ALC300:
3203         case ALC269_TYPE_ALC623:
3204         case ALC269_TYPE_ALC700:
3205                 ssids = alc269_ssids;
3206                 break;
3207         default:
3208                 ssids = alc269_ssids;
3209                 break;
3210         }
3211
3212         return alc_parse_auto_config(codec, alc269_ignore, ssids);
3213 }
3214
3215 static const struct hda_jack_keymap alc_headset_btn_keymap[] = {
3216         { SND_JACK_BTN_0, KEY_PLAYPAUSE },
3217         { SND_JACK_BTN_1, KEY_VOICECOMMAND },
3218         { SND_JACK_BTN_2, KEY_VOLUMEUP },
3219         { SND_JACK_BTN_3, KEY_VOLUMEDOWN },
3220         {}
3221 };
3222
3223 static void alc_headset_btn_callback(struct hda_codec *codec,
3224                                      struct hda_jack_callback *jack)
3225 {
3226         int report = 0;
3227
3228         if (jack->unsol_res & (7 << 13))
3229                 report |= SND_JACK_BTN_0;
3230
3231         if (jack->unsol_res  & (1 << 16 | 3 << 8))
3232                 report |= SND_JACK_BTN_1;
3233
3234         /* Volume up key */
3235         if (jack->unsol_res & (7 << 23))
3236                 report |= SND_JACK_BTN_2;
3237
3238         /* Volume down key */
3239         if (jack->unsol_res & (7 << 10))
3240                 report |= SND_JACK_BTN_3;
3241
3242         snd_hda_jack_set_button_state(codec, jack->nid, report);
3243 }
3244
3245 static void alc_disable_headset_jack_key(struct hda_codec *codec)
3246 {
3247         struct alc_spec *spec = codec->spec;
3248
3249         if (!spec->has_hs_key)
3250                 return;
3251
3252         switch (codec->core.vendor_id) {
3253         case 0x10ec0215:
3254         case 0x10ec0225:
3255         case 0x10ec0285:
3256         case 0x10ec0287:
3257         case 0x10ec0295:
3258         case 0x10ec0289:
3259         case 0x10ec0299:
3260                 alc_write_coef_idx(codec, 0x48, 0x0);
3261                 alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3262                 alc_update_coef_idx(codec, 0x44, 0x0045 << 8, 0x0);
3263                 break;
3264         case 0x10ec0230:
3265         case 0x10ec0236:
3266         case 0x10ec0256:
3267         case 0x10ec0257:
3268         case 0x19e58326:
3269                 alc_write_coef_idx(codec, 0x48, 0x0);
3270                 alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3271                 break;
3272         }
3273 }
3274
3275 static void alc_enable_headset_jack_key(struct hda_codec *codec)
3276 {
3277         struct alc_spec *spec = codec->spec;
3278
3279         if (!spec->has_hs_key)
3280                 return;
3281
3282         switch (codec->core.vendor_id) {
3283         case 0x10ec0215:
3284         case 0x10ec0225:
3285         case 0x10ec0285:
3286         case 0x10ec0287:
3287         case 0x10ec0295:
3288         case 0x10ec0289:
3289         case 0x10ec0299:
3290                 alc_write_coef_idx(codec, 0x48, 0xd011);
3291                 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3292                 alc_update_coef_idx(codec, 0x44, 0x007f << 8, 0x0045 << 8);
3293                 break;
3294         case 0x10ec0230:
3295         case 0x10ec0236:
3296         case 0x10ec0256:
3297         case 0x10ec0257:
3298         case 0x19e58326:
3299                 alc_write_coef_idx(codec, 0x48, 0xd011);
3300                 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3301                 break;
3302         }
3303 }
3304
3305 static void alc_fixup_headset_jack(struct hda_codec *codec,
3306                                     const struct hda_fixup *fix, int action)
3307 {
3308         struct alc_spec *spec = codec->spec;
3309         hda_nid_t hp_pin;
3310
3311         switch (action) {
3312         case HDA_FIXUP_ACT_PRE_PROBE:
3313                 spec->has_hs_key = 1;
3314                 snd_hda_jack_detect_enable_callback(codec, 0x55,
3315                                                     alc_headset_btn_callback);
3316                 break;
3317         case HDA_FIXUP_ACT_BUILD:
3318                 hp_pin = alc_get_hp_pin(spec);
3319                 if (!hp_pin || snd_hda_jack_bind_keymap(codec, 0x55,
3320                                                         alc_headset_btn_keymap,
3321                                                         hp_pin))
3322                         snd_hda_jack_add_kctl(codec, 0x55, "Headset Jack",
3323                                               false, SND_JACK_HEADSET,
3324                                               alc_headset_btn_keymap);
3325
3326                 alc_enable_headset_jack_key(codec);
3327                 break;
3328         }
3329 }
3330
3331 static void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)
3332 {
3333         alc_update_coef_idx(codec, 0x04, 1 << 11, power_up ? (1 << 11) : 0);
3334 }
3335
3336 static void alc269_shutup(struct hda_codec *codec)
3337 {
3338         struct alc_spec *spec = codec->spec;
3339
3340         if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3341                 alc269vb_toggle_power_output(codec, 0);
3342         if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3343                         (alc_get_coef0(codec) & 0x00ff) == 0x018) {
3344                 msleep(150);
3345         }
3346         alc_shutup_pins(codec);
3347 }
3348
3349 static const struct coef_fw alc282_coefs[] = {
3350         WRITE_COEF(0x03, 0x0002), /* Power Down Control */
3351         UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
3352         WRITE_COEF(0x07, 0x0200), /* DMIC control */
3353         UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3354         UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3355         WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3356         WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3357         WRITE_COEF(0x0e, 0x6e00), /* LDO1/2/3, DAC/ADC */
3358         UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3359         UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3360         WRITE_COEF(0x6f, 0x0), /* Class D test 4 */
3361         UPDATE_COEF(0x0c, 0xfe00, 0), /* IO power down directly */
3362         WRITE_COEF(0x34, 0xa0c0), /* ANC */
3363         UPDATE_COEF(0x16, 0x0008, 0), /* AGC MUX */
3364         UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3365         UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3366         WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3367         WRITE_COEF(0x63, 0x2902), /* PLL */
3368         WRITE_COEF(0x68, 0xa080), /* capless control 2 */
3369         WRITE_COEF(0x69, 0x3400), /* capless control 3 */
3370         WRITE_COEF(0x6a, 0x2f3e), /* capless control 4 */
3371         WRITE_COEF(0x6b, 0x0), /* capless control 5 */
3372         UPDATE_COEF(0x6d, 0x0fff, 0x0900), /* class D test 2 */
3373         WRITE_COEF(0x6e, 0x110a), /* class D test 3 */
3374         UPDATE_COEF(0x70, 0x00f8, 0x00d8), /* class D test 5 */
3375         WRITE_COEF(0x71, 0x0014), /* class D test 6 */
3376         WRITE_COEF(0x72, 0xc2ba), /* classD OCP */
3377         UPDATE_COEF(0x77, 0x0f80, 0), /* classD pure DC test */
3378         WRITE_COEF(0x6c, 0xfc06), /* Class D amp control */
3379         {}
3380 };
3381
3382 static void alc282_restore_default_value(struct hda_codec *codec)
3383 {
3384         alc_process_coef_fw(codec, alc282_coefs);
3385 }
3386
3387 static void alc282_init(struct hda_codec *codec)
3388 {
3389         struct alc_spec *spec = codec->spec;
3390         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3391         bool hp_pin_sense;
3392         int coef78;
3393
3394         alc282_restore_default_value(codec);
3395
3396         if (!hp_pin)
3397                 return;
3398         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3399         coef78 = alc_read_coef_idx(codec, 0x78);
3400
3401         /* Index 0x78 Direct Drive HP AMP LPM Control 1 */
3402         /* Headphone capless set to high power mode */
3403         alc_write_coef_idx(codec, 0x78, 0x9004);
3404
3405         if (hp_pin_sense)
3406                 msleep(2);
3407
3408         snd_hda_codec_write(codec, hp_pin, 0,
3409                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3410
3411         if (hp_pin_sense)
3412                 msleep(85);
3413
3414         snd_hda_codec_write(codec, hp_pin, 0,
3415                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3416
3417         if (hp_pin_sense)
3418                 msleep(100);
3419
3420         /* Headphone capless set to normal mode */
3421         alc_write_coef_idx(codec, 0x78, coef78);
3422 }
3423
3424 static void alc282_shutup(struct hda_codec *codec)
3425 {
3426         struct alc_spec *spec = codec->spec;
3427         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3428         bool hp_pin_sense;
3429         int coef78;
3430
3431         if (!hp_pin) {
3432                 alc269_shutup(codec);
3433                 return;
3434         }
3435
3436         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3437         coef78 = alc_read_coef_idx(codec, 0x78);
3438         alc_write_coef_idx(codec, 0x78, 0x9004);
3439
3440         if (hp_pin_sense)
3441                 msleep(2);
3442
3443         snd_hda_codec_write(codec, hp_pin, 0,
3444                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3445
3446         if (hp_pin_sense)
3447                 msleep(85);
3448
3449         if (!spec->no_shutup_pins)
3450                 snd_hda_codec_write(codec, hp_pin, 0,
3451                                     AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3452
3453         if (hp_pin_sense)
3454                 msleep(100);
3455
3456         alc_auto_setup_eapd(codec, false);
3457         alc_shutup_pins(codec);
3458         alc_write_coef_idx(codec, 0x78, coef78);
3459 }
3460
3461 static const struct coef_fw alc283_coefs[] = {
3462         WRITE_COEF(0x03, 0x0002), /* Power Down Control */
3463         UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
3464         WRITE_COEF(0x07, 0x0200), /* DMIC control */
3465         UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3466         UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3467         WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3468         WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3469         WRITE_COEF(0x0e, 0x6fc0), /* LDO1/2/3, DAC/ADC */
3470         UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3471         UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3472         WRITE_COEF(0x3a, 0x0), /* Class D test 4 */
3473         UPDATE_COEF(0x0c, 0xfe00, 0x0), /* IO power down directly */
3474         WRITE_COEF(0x22, 0xa0c0), /* ANC */
3475         UPDATE_COEFEX(0x53, 0x01, 0x000f, 0x0008), /* AGC MUX */
3476         UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3477         UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3478         WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3479         WRITE_COEF(0x2e, 0x2902), /* PLL */
3480         WRITE_COEF(0x33, 0xa080), /* capless control 2 */
3481         WRITE_COEF(0x34, 0x3400), /* capless control 3 */
3482         WRITE_COEF(0x35, 0x2f3e), /* capless control 4 */
3483         WRITE_COEF(0x36, 0x0), /* capless control 5 */
3484         UPDATE_COEF(0x38, 0x0fff, 0x0900), /* class D test 2 */
3485         WRITE_COEF(0x39, 0x110a), /* class D test 3 */
3486         UPDATE_COEF(0x3b, 0x00f8, 0x00d8), /* class D test 5 */
3487         WRITE_COEF(0x3c, 0x0014), /* class D test 6 */
3488         WRITE_COEF(0x3d, 0xc2ba), /* classD OCP */
3489         UPDATE_COEF(0x42, 0x0f80, 0x0), /* classD pure DC test */
3490         WRITE_COEF(0x49, 0x0), /* test mode */
3491         UPDATE_COEF(0x40, 0xf800, 0x9800), /* Class D DC enable */
3492         UPDATE_COEF(0x42, 0xf000, 0x2000), /* DC offset */
3493         WRITE_COEF(0x37, 0xfc06), /* Class D amp control */
3494         UPDATE_COEF(0x1b, 0x8000, 0), /* HP JD control */
3495         {}
3496 };
3497
3498 static void alc283_restore_default_value(struct hda_codec *codec)
3499 {
3500         alc_process_coef_fw(codec, alc283_coefs);
3501 }
3502
3503 static void alc283_init(struct hda_codec *codec)
3504 {
3505         struct alc_spec *spec = codec->spec;
3506         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3507         bool hp_pin_sense;
3508
3509         alc283_restore_default_value(codec);
3510
3511         if (!hp_pin)
3512                 return;
3513
3514         msleep(30);
3515         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3516
3517         /* Index 0x43 Direct Drive HP AMP LPM Control 1 */
3518         /* Headphone capless set to high power mode */
3519         alc_write_coef_idx(codec, 0x43, 0x9004);
3520
3521         snd_hda_codec_write(codec, hp_pin, 0,
3522                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3523
3524         if (hp_pin_sense)
3525                 msleep(85);
3526
3527         snd_hda_codec_write(codec, hp_pin, 0,
3528                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3529
3530         if (hp_pin_sense)
3531                 msleep(85);
3532         /* Index 0x46 Combo jack auto switch control 2 */
3533         /* 3k pull low control for Headset jack. */
3534         alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3535         /* Headphone capless set to normal mode */
3536         alc_write_coef_idx(codec, 0x43, 0x9614);
3537 }
3538
3539 static void alc283_shutup(struct hda_codec *codec)
3540 {
3541         struct alc_spec *spec = codec->spec;
3542         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3543         bool hp_pin_sense;
3544
3545         if (!hp_pin) {
3546                 alc269_shutup(codec);
3547                 return;
3548         }
3549
3550         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3551
3552         alc_write_coef_idx(codec, 0x43, 0x9004);
3553
3554         /*depop hp during suspend*/
3555         alc_write_coef_idx(codec, 0x06, 0x2100);
3556
3557         snd_hda_codec_write(codec, hp_pin, 0,
3558                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3559
3560         if (hp_pin_sense)
3561                 msleep(100);
3562
3563         if (!spec->no_shutup_pins)
3564                 snd_hda_codec_write(codec, hp_pin, 0,
3565                                     AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3566
3567         alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
3568
3569         if (hp_pin_sense)
3570                 msleep(100);
3571         alc_auto_setup_eapd(codec, false);
3572         alc_shutup_pins(codec);
3573         alc_write_coef_idx(codec, 0x43, 0x9614);
3574 }
3575
3576 static void alc256_init(struct hda_codec *codec)
3577 {
3578         struct alc_spec *spec = codec->spec;
3579         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3580         bool hp_pin_sense;
3581
3582         if (spec->ultra_low_power) {
3583                 alc_update_coef_idx(codec, 0x03, 1<<1, 1<<1);
3584                 alc_update_coef_idx(codec, 0x08, 3<<2, 3<<2);
3585                 alc_update_coef_idx(codec, 0x08, 7<<4, 0);
3586                 alc_update_coef_idx(codec, 0x3b, 1<<15, 0);
3587                 alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3588                 msleep(30);
3589         }
3590
3591         if (!hp_pin)
3592                 hp_pin = 0x21;
3593
3594         msleep(30);
3595
3596         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3597
3598         if (hp_pin_sense)
3599                 msleep(2);
3600
3601         alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3602
3603         snd_hda_codec_write(codec, hp_pin, 0,
3604                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3605
3606         if (hp_pin_sense || spec->ultra_low_power)
3607                 msleep(85);
3608
3609         snd_hda_codec_write(codec, hp_pin, 0,
3610                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3611
3612         if (hp_pin_sense || spec->ultra_low_power)
3613                 msleep(100);
3614
3615         alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3616         alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
3617         alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */
3618         alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15);
3619         /*
3620          * Expose headphone mic (or possibly Line In on some machines) instead
3621          * of PC Beep on 1Ah, and disable 1Ah loopback for all outputs. See
3622          * Documentation/sound/hd-audio/realtek-pc-beep.rst for details of
3623          * this register.
3624          */
3625         alc_write_coef_idx(codec, 0x36, 0x5757);
3626 }
3627
3628 static void alc256_shutup(struct hda_codec *codec)
3629 {
3630         struct alc_spec *spec = codec->spec;
3631         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3632         bool hp_pin_sense;
3633
3634         if (!hp_pin)
3635                 hp_pin = 0x21;
3636
3637         alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3638         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3639
3640         if (hp_pin_sense)
3641                 msleep(2);
3642
3643         snd_hda_codec_write(codec, hp_pin, 0,
3644                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3645
3646         if (hp_pin_sense || spec->ultra_low_power)
3647                 msleep(85);
3648
3649         /* 3k pull low control for Headset jack. */
3650         /* NOTE: call this before clearing the pin, otherwise codec stalls */
3651         /* If disable 3k pulldown control for alc257, the Mic detection will not work correctly
3652          * when booting with headset plugged. So skip setting it for the codec alc257
3653          */
3654         if (spec->en_3kpull_low)
3655                 alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
3656
3657         if (!spec->no_shutup_pins)
3658                 snd_hda_codec_write(codec, hp_pin, 0,
3659                                     AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3660
3661         if (hp_pin_sense || spec->ultra_low_power)
3662                 msleep(100);
3663
3664         alc_auto_setup_eapd(codec, false);
3665         alc_shutup_pins(codec);
3666         if (spec->ultra_low_power) {
3667                 msleep(50);
3668                 alc_update_coef_idx(codec, 0x03, 1<<1, 0);
3669                 alc_update_coef_idx(codec, 0x08, 7<<4, 7<<4);
3670                 alc_update_coef_idx(codec, 0x08, 3<<2, 0);
3671                 alc_update_coef_idx(codec, 0x3b, 1<<15, 1<<15);
3672                 alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3673                 msleep(30);
3674         }
3675 }
3676
3677 static void alc285_hp_init(struct hda_codec *codec)
3678 {
3679         struct alc_spec *spec = codec->spec;
3680         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3681         int i, val;
3682         int coef38, coef0d, coef36;
3683
3684         alc_update_coef_idx(codec, 0x4a, 1<<15, 1<<15); /* Reset HP JD */
3685         coef38 = alc_read_coef_idx(codec, 0x38); /* Amp control */
3686         coef0d = alc_read_coef_idx(codec, 0x0d); /* Digital Misc control */
3687         coef36 = alc_read_coef_idx(codec, 0x36); /* Passthrough Control */
3688         alc_update_coef_idx(codec, 0x38, 1<<4, 0x0);
3689         alc_update_coef_idx(codec, 0x0d, 0x110, 0x0);
3690
3691         alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
3692
3693         if (hp_pin)
3694                 snd_hda_codec_write(codec, hp_pin, 0,
3695                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3696
3697         msleep(130);
3698         alc_update_coef_idx(codec, 0x36, 1<<14, 1<<14);
3699         alc_update_coef_idx(codec, 0x36, 1<<13, 0x0);
3700
3701         if (hp_pin)
3702                 snd_hda_codec_write(codec, hp_pin, 0,
3703                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3704         msleep(10);
3705         alc_write_coef_idx(codec, 0x67, 0x0); /* Set HP depop to manual mode */
3706         alc_write_coefex_idx(codec, 0x58, 0x00, 0x7880);
3707         alc_write_coefex_idx(codec, 0x58, 0x0f, 0xf049);
3708         alc_update_coefex_idx(codec, 0x58, 0x03, 0x00f0, 0x00c0);
3709
3710         alc_write_coefex_idx(codec, 0x58, 0x00, 0xf888); /* HP depop procedure start */
3711         val = alc_read_coefex_idx(codec, 0x58, 0x00);
3712         for (i = 0; i < 20 && val & 0x8000; i++) {
3713                 msleep(50);
3714                 val = alc_read_coefex_idx(codec, 0x58, 0x00);
3715         } /* Wait for depop procedure finish  */
3716
3717         alc_write_coefex_idx(codec, 0x58, 0x00, val); /* write back the result */
3718         alc_update_coef_idx(codec, 0x38, 1<<4, coef38);
3719         alc_update_coef_idx(codec, 0x0d, 0x110, coef0d);
3720         alc_update_coef_idx(codec, 0x36, 3<<13, coef36);
3721
3722         msleep(50);
3723         alc_update_coef_idx(codec, 0x4a, 1<<15, 0);
3724 }
3725
3726 static void alc225_init(struct hda_codec *codec)
3727 {
3728         struct alc_spec *spec = codec->spec;
3729         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3730         bool hp1_pin_sense, hp2_pin_sense;
3731
3732         if (spec->ultra_low_power) {
3733                 alc_update_coef_idx(codec, 0x08, 0x0f << 2, 3<<2);
3734                 alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3735                 alc_update_coef_idx(codec, 0x33, 1<<11, 0);
3736                 msleep(30);
3737         }
3738
3739         if (spec->codec_variant != ALC269_TYPE_ALC287 &&
3740                 spec->codec_variant != ALC269_TYPE_ALC245)
3741                 /* required only at boot or S3 and S4 resume time */
3742                 if (!spec->done_hp_init ||
3743                         is_s3_resume(codec) ||
3744                         is_s4_resume(codec)) {
3745                         alc285_hp_init(codec);
3746                         spec->done_hp_init = true;
3747                 }
3748
3749         if (!hp_pin)
3750                 hp_pin = 0x21;
3751         msleep(30);
3752
3753         hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3754         hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3755
3756         if (hp1_pin_sense || hp2_pin_sense)
3757                 msleep(2);
3758
3759         alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3760
3761         if (hp1_pin_sense || spec->ultra_low_power)
3762                 snd_hda_codec_write(codec, hp_pin, 0,
3763                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3764         if (hp2_pin_sense)
3765                 snd_hda_codec_write(codec, 0x16, 0,
3766                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3767
3768         if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3769                 msleep(85);
3770
3771         if (hp1_pin_sense || spec->ultra_low_power)
3772                 snd_hda_codec_write(codec, hp_pin, 0,
3773                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3774         if (hp2_pin_sense)
3775                 snd_hda_codec_write(codec, 0x16, 0,
3776                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3777
3778         if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3779                 msleep(100);
3780
3781         alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3782         alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
3783 }
3784
3785 static void alc225_shutup(struct hda_codec *codec)
3786 {
3787         struct alc_spec *spec = codec->spec;
3788         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3789         bool hp1_pin_sense, hp2_pin_sense;
3790
3791         if (!hp_pin)
3792                 hp_pin = 0x21;
3793
3794         alc_disable_headset_jack_key(codec);
3795         /* 3k pull low control for Headset jack. */
3796         alc_update_coef_idx(codec, 0x4a, 0, 3 << 10);
3797
3798         hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3799         hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3800
3801         if (hp1_pin_sense || hp2_pin_sense)
3802                 msleep(2);
3803
3804         if (hp1_pin_sense || spec->ultra_low_power)
3805                 snd_hda_codec_write(codec, hp_pin, 0,
3806                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3807         if (hp2_pin_sense)
3808                 snd_hda_codec_write(codec, 0x16, 0,
3809                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3810
3811         if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3812                 msleep(85);
3813
3814         if (hp1_pin_sense || spec->ultra_low_power)
3815                 snd_hda_codec_write(codec, hp_pin, 0,
3816                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3817         if (hp2_pin_sense)
3818                 snd_hda_codec_write(codec, 0x16, 0,
3819                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3820
3821         if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3822                 msleep(100);
3823
3824         alc_auto_setup_eapd(codec, false);
3825         alc_shutup_pins(codec);
3826         if (spec->ultra_low_power) {
3827                 msleep(50);
3828                 alc_update_coef_idx(codec, 0x08, 0x0f << 2, 0x0c << 2);
3829                 alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3830                 alc_update_coef_idx(codec, 0x33, 1<<11, 1<<11);
3831                 alc_update_coef_idx(codec, 0x4a, 3<<4, 2<<4);
3832                 msleep(30);
3833         }
3834
3835         alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3836         alc_enable_headset_jack_key(codec);
3837 }
3838
3839 static void alc_default_init(struct hda_codec *codec)
3840 {
3841         struct alc_spec *spec = codec->spec;
3842         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3843         bool hp_pin_sense;
3844
3845         if (!hp_pin)
3846                 return;
3847
3848         msleep(30);
3849
3850         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3851
3852         if (hp_pin_sense)
3853                 msleep(2);
3854
3855         snd_hda_codec_write(codec, hp_pin, 0,
3856                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3857
3858         if (hp_pin_sense)
3859                 msleep(85);
3860
3861         snd_hda_codec_write(codec, hp_pin, 0,
3862                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3863
3864         if (hp_pin_sense)
3865                 msleep(100);
3866 }
3867
3868 static void alc_default_shutup(struct hda_codec *codec)
3869 {
3870         struct alc_spec *spec = codec->spec;
3871         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3872         bool hp_pin_sense;
3873
3874         if (!hp_pin) {
3875                 alc269_shutup(codec);
3876                 return;
3877         }
3878
3879         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3880
3881         if (hp_pin_sense)
3882                 msleep(2);
3883
3884         snd_hda_codec_write(codec, hp_pin, 0,
3885                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3886
3887         if (hp_pin_sense)
3888                 msleep(85);
3889
3890         if (!spec->no_shutup_pins)
3891                 snd_hda_codec_write(codec, hp_pin, 0,
3892                                     AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3893
3894         if (hp_pin_sense)
3895                 msleep(100);
3896
3897         alc_auto_setup_eapd(codec, false);
3898         alc_shutup_pins(codec);
3899 }
3900
3901 static void alc294_hp_init(struct hda_codec *codec)
3902 {
3903         struct alc_spec *spec = codec->spec;
3904         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3905         int i, val;
3906
3907         if (!hp_pin)
3908                 return;
3909
3910         snd_hda_codec_write(codec, hp_pin, 0,
3911                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3912
3913         msleep(100);
3914
3915         if (!spec->no_shutup_pins)
3916                 snd_hda_codec_write(codec, hp_pin, 0,
3917                                     AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3918
3919         alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */
3920         alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */
3921
3922         /* Wait for depop procedure finish  */
3923         val = alc_read_coefex_idx(codec, 0x58, 0x01);
3924         for (i = 0; i < 20 && val & 0x0080; i++) {
3925                 msleep(50);
3926                 val = alc_read_coefex_idx(codec, 0x58, 0x01);
3927         }
3928         /* Set HP depop to auto mode */
3929         alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b);
3930         msleep(50);
3931 }
3932
3933 static void alc294_init(struct hda_codec *codec)
3934 {
3935         struct alc_spec *spec = codec->spec;
3936
3937         /* required only at boot or S4 resume time */
3938         if (!spec->done_hp_init ||
3939             codec->core.dev.power.power_state.event == PM_EVENT_RESTORE) {
3940                 alc294_hp_init(codec);
3941                 spec->done_hp_init = true;
3942         }
3943         alc_default_init(codec);
3944 }
3945
3946 static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg,
3947                              unsigned int val)
3948 {
3949         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3950         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val & 0xffff); /* LSB */
3951         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val >> 16); /* MSB */
3952 }
3953
3954 static int alc5505_coef_get(struct hda_codec *codec, unsigned int index_reg)
3955 {
3956         unsigned int val;
3957
3958         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3959         val = snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3960                 & 0xffff;
3961         val |= snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3962                 << 16;
3963         return val;
3964 }
3965
3966 static void alc5505_dsp_halt(struct hda_codec *codec)
3967 {
3968         unsigned int val;
3969
3970         alc5505_coef_set(codec, 0x3000, 0x000c); /* DSP CPU stop */
3971         alc5505_coef_set(codec, 0x880c, 0x0008); /* DDR enter self refresh */
3972         alc5505_coef_set(codec, 0x61c0, 0x11110080); /* Clock control for PLL and CPU */
3973         alc5505_coef_set(codec, 0x6230, 0xfc0d4011); /* Disable Input OP */
3974         alc5505_coef_set(codec, 0x61b4, 0x040a2b03); /* Stop PLL2 */
3975         alc5505_coef_set(codec, 0x61b0, 0x00005b17); /* Stop PLL1 */
3976         alc5505_coef_set(codec, 0x61b8, 0x04133303); /* Stop PLL3 */
3977         val = alc5505_coef_get(codec, 0x6220);
3978         alc5505_coef_set(codec, 0x6220, (val | 0x3000)); /* switch Ringbuffer clock to DBUS clock */
3979 }
3980
3981 static void alc5505_dsp_back_from_halt(struct hda_codec *codec)
3982 {
3983         alc5505_coef_set(codec, 0x61b8, 0x04133302);
3984         alc5505_coef_set(codec, 0x61b0, 0x00005b16);
3985         alc5505_coef_set(codec, 0x61b4, 0x040a2b02);
3986         alc5505_coef_set(codec, 0x6230, 0xf80d4011);
3987         alc5505_coef_set(codec, 0x6220, 0x2002010f);
3988         alc5505_coef_set(codec, 0x880c, 0x00000004);
3989 }
3990
3991 static void alc5505_dsp_init(struct hda_codec *codec)
3992 {
3993         unsigned int val;
3994
3995         alc5505_dsp_halt(codec);
3996         alc5505_dsp_back_from_halt(codec);
3997         alc5505_coef_set(codec, 0x61b0, 0x5b14); /* PLL1 control */
3998         alc5505_coef_set(codec, 0x61b0, 0x5b16);
3999         alc5505_coef_set(codec, 0x61b4, 0x04132b00); /* PLL2 control */
4000         alc5505_coef_set(codec, 0x61b4, 0x04132b02);
4001         alc5505_coef_set(codec, 0x61b8, 0x041f3300); /* PLL3 control*/
4002         alc5505_coef_set(codec, 0x61b8, 0x041f3302);
4003         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_CODEC_RESET, 0); /* Function reset */
4004         alc5505_coef_set(codec, 0x61b8, 0x041b3302);
4005         alc5505_coef_set(codec, 0x61b8, 0x04173302);
4006         alc5505_coef_set(codec, 0x61b8, 0x04163302);
4007         alc5505_coef_set(codec, 0x8800, 0x348b328b); /* DRAM control */
4008         alc5505_coef_set(codec, 0x8808, 0x00020022); /* DRAM control */
4009         alc5505_coef_set(codec, 0x8818, 0x00000400); /* DRAM control */
4010
4011         val = alc5505_coef_get(codec, 0x6200) >> 16; /* Read revision ID */
4012         if (val <= 3)
4013                 alc5505_coef_set(codec, 0x6220, 0x2002010f); /* I/O PAD Configuration */
4014         else
4015                 alc5505_coef_set(codec, 0x6220, 0x6002018f);
4016
4017         alc5505_coef_set(codec, 0x61ac, 0x055525f0); /**/
4018         alc5505_coef_set(codec, 0x61c0, 0x12230080); /* Clock control */
4019         alc5505_coef_set(codec, 0x61b4, 0x040e2b02); /* PLL2 control */
4020         alc5505_coef_set(codec, 0x61bc, 0x010234f8); /* OSC Control */
4021         alc5505_coef_set(codec, 0x880c, 0x00000004); /* DRAM Function control */
4022         alc5505_coef_set(codec, 0x880c, 0x00000003);
4023         alc5505_coef_set(codec, 0x880c, 0x00000010);
4024
4025 #ifdef HALT_REALTEK_ALC5505
4026         alc5505_dsp_halt(codec);
4027 #endif
4028 }
4029
4030 #ifdef HALT_REALTEK_ALC5505
4031 #define alc5505_dsp_suspend(codec)      do { } while (0) /* NOP */
4032 #define alc5505_dsp_resume(codec)       do { } while (0) /* NOP */
4033 #else
4034 #define alc5505_dsp_suspend(codec)      alc5505_dsp_halt(codec)
4035 #define alc5505_dsp_resume(codec)       alc5505_dsp_back_from_halt(codec)
4036 #endif
4037
4038 #ifdef CONFIG_PM
4039 static int alc269_suspend(struct hda_codec *codec)
4040 {
4041         struct alc_spec *spec = codec->spec;
4042
4043         if (spec->has_alc5505_dsp)
4044                 alc5505_dsp_suspend(codec);
4045
4046         return alc_suspend(codec);
4047 }
4048
4049 static int alc269_resume(struct hda_codec *codec)
4050 {
4051         struct alc_spec *spec = codec->spec;
4052
4053         if (spec->codec_variant == ALC269_TYPE_ALC269VB)
4054                 alc269vb_toggle_power_output(codec, 0);
4055         if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
4056                         (alc_get_coef0(codec) & 0x00ff) == 0x018) {
4057                 msleep(150);
4058         }
4059
4060         codec->patch_ops.init(codec);
4061
4062         if (spec->codec_variant == ALC269_TYPE_ALC269VB)
4063                 alc269vb_toggle_power_output(codec, 1);
4064         if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
4065                         (alc_get_coef0(codec) & 0x00ff) == 0x017) {
4066                 msleep(200);
4067         }
4068
4069         snd_hda_regmap_sync(codec);
4070         hda_call_check_power_status(codec, 0x01);
4071
4072         /* on some machine, the BIOS will clear the codec gpio data when enter
4073          * suspend, and won't restore the data after resume, so we restore it
4074          * in the driver.
4075          */
4076         if (spec->gpio_data)
4077                 alc_write_gpio_data(codec);
4078
4079         if (spec->has_alc5505_dsp)
4080                 alc5505_dsp_resume(codec);
4081
4082         return 0;
4083 }
4084 #endif /* CONFIG_PM */
4085
4086 static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,
4087                                                  const struct hda_fixup *fix, int action)
4088 {
4089         struct alc_spec *spec = codec->spec;
4090
4091         if (action == HDA_FIXUP_ACT_PRE_PROBE)
4092                 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
4093 }
4094
4095 static void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec,
4096                                                  const struct hda_fixup *fix,
4097                                                  int action)
4098 {
4099         unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21);
4100         unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19);
4101
4102         if (cfg_headphone && cfg_headset_mic == 0x411111f0)
4103                 snd_hda_codec_set_pincfg(codec, 0x19,
4104                         (cfg_headphone & ~AC_DEFCFG_DEVICE) |
4105                         (AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT));
4106 }
4107
4108 static void alc269_fixup_hweq(struct hda_codec *codec,
4109                                const struct hda_fixup *fix, int action)
4110 {
4111         if (action == HDA_FIXUP_ACT_INIT)
4112                 alc_update_coef_idx(codec, 0x1e, 0, 0x80);
4113 }
4114
4115 static void alc269_fixup_headset_mic(struct hda_codec *codec,
4116                                        const struct hda_fixup *fix, int action)
4117 {
4118         struct alc_spec *spec = codec->spec;
4119
4120         if (action == HDA_FIXUP_ACT_PRE_PROBE)
4121                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4122 }
4123
4124 static void alc271_fixup_dmic(struct hda_codec *codec,
4125                               const struct hda_fixup *fix, int action)
4126 {
4127         static const struct hda_verb verbs[] = {
4128                 {0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
4129                 {0x20, AC_VERB_SET_PROC_COEF, 0x4000},
4130                 {}
4131         };
4132         unsigned int cfg;
4133
4134         if (strcmp(codec->core.chip_name, "ALC271X") &&
4135             strcmp(codec->core.chip_name, "ALC269VB"))
4136                 return;
4137         cfg = snd_hda_codec_get_pincfg(codec, 0x12);
4138         if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
4139                 snd_hda_sequence_write(codec, verbs);
4140 }
4141
4142 /* Fix the speaker amp after resume, etc */
4143 static void alc269vb_fixup_aspire_e1_coef(struct hda_codec *codec,
4144                                           const struct hda_fixup *fix,
4145                                           int action)
4146 {
4147         if (action == HDA_FIXUP_ACT_INIT)
4148                 alc_update_coef_idx(codec, 0x0d, 0x6000, 0x6000);
4149 }
4150
4151 static void alc269_fixup_pcm_44k(struct hda_codec *codec,
4152                                  const struct hda_fixup *fix, int action)
4153 {
4154         struct alc_spec *spec = codec->spec;
4155
4156         if (action != HDA_FIXUP_ACT_PROBE)
4157                 return;
4158
4159         /* Due to a hardware problem on Lenovo Ideadpad, we need to
4160          * fix the sample rate of analog I/O to 44.1kHz
4161          */
4162         spec->gen.stream_analog_playback = &alc269_44k_pcm_analog_playback;
4163         spec->gen.stream_analog_capture = &alc269_44k_pcm_analog_capture;
4164 }
4165
4166 static void alc269_fixup_stereo_dmic(struct hda_codec *codec,
4167                                      const struct hda_fixup *fix, int action)
4168 {
4169         /* The digital-mic unit sends PDM (differential signal) instead of
4170          * the standard PCM, thus you can't record a valid mono stream as is.
4171          * Below is a workaround specific to ALC269 to control the dmic
4172          * signal source as mono.
4173          */
4174         if (action == HDA_FIXUP_ACT_INIT)
4175                 alc_update_coef_idx(codec, 0x07, 0, 0x80);
4176 }
4177
4178 static void alc269_quanta_automute(struct hda_codec *codec)
4179 {
4180         snd_hda_gen_update_outputs(codec);
4181
4182         alc_write_coef_idx(codec, 0x0c, 0x680);
4183         alc_write_coef_idx(codec, 0x0c, 0x480);
4184 }
4185
4186 static void alc269_fixup_quanta_mute(struct hda_codec *codec,
4187                                      const struct hda_fixup *fix, int action)
4188 {
4189         struct alc_spec *spec = codec->spec;
4190         if (action != HDA_FIXUP_ACT_PROBE)
4191                 return;
4192         spec->gen.automute_hook = alc269_quanta_automute;
4193 }
4194
4195 static void alc269_x101_hp_automute_hook(struct hda_codec *codec,
4196                                          struct hda_jack_callback *jack)
4197 {
4198         struct alc_spec *spec = codec->spec;
4199         int vref;
4200         msleep(200);
4201         snd_hda_gen_hp_automute(codec, jack);
4202
4203         vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
4204         msleep(100);
4205         snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4206                             vref);
4207         msleep(500);
4208         snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4209                             vref);
4210 }
4211
4212 /*
4213  * Magic sequence to make Huawei Matebook X right speaker working (bko#197801)
4214  */
4215 struct hda_alc298_mbxinit {
4216         unsigned char value_0x23;
4217         unsigned char value_0x25;
4218 };
4219
4220 static void alc298_huawei_mbx_stereo_seq(struct hda_codec *codec,
4221                                          const struct hda_alc298_mbxinit *initval,
4222                                          bool first)
4223 {
4224         snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x0);
4225         alc_write_coef_idx(codec, 0x26, 0xb000);
4226
4227         if (first)
4228                 snd_hda_codec_write(codec, 0x21, 0, AC_VERB_GET_PIN_SENSE, 0x0);
4229
4230         snd_hda_codec_write(codec, 0x6, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
4231         alc_write_coef_idx(codec, 0x26, 0xf000);
4232         alc_write_coef_idx(codec, 0x23, initval->value_0x23);
4233
4234         if (initval->value_0x23 != 0x1e)
4235                 alc_write_coef_idx(codec, 0x25, initval->value_0x25);
4236
4237         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
4238         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
4239 }
4240
4241 static void alc298_fixup_huawei_mbx_stereo(struct hda_codec *codec,
4242                                            const struct hda_fixup *fix,
4243                                            int action)
4244 {
4245         /* Initialization magic */
4246         static const struct hda_alc298_mbxinit dac_init[] = {
4247                 {0x0c, 0x00}, {0x0d, 0x00}, {0x0e, 0x00}, {0x0f, 0x00},
4248                 {0x10, 0x00}, {0x1a, 0x40}, {0x1b, 0x82}, {0x1c, 0x00},
4249                 {0x1d, 0x00}, {0x1e, 0x00}, {0x1f, 0x00},
4250                 {0x20, 0xc2}, {0x21, 0xc8}, {0x22, 0x26}, {0x23, 0x24},
4251                 {0x27, 0xff}, {0x28, 0xff}, {0x29, 0xff}, {0x2a, 0x8f},
4252                 {0x2b, 0x02}, {0x2c, 0x48}, {0x2d, 0x34}, {0x2e, 0x00},
4253                 {0x2f, 0x00},
4254                 {0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00},
4255                 {0x34, 0x00}, {0x35, 0x01}, {0x36, 0x93}, {0x37, 0x0c},
4256                 {0x38, 0x00}, {0x39, 0x00}, {0x3a, 0xf8}, {0x38, 0x80},
4257                 {}
4258         };
4259         const struct hda_alc298_mbxinit *seq;
4260
4261         if (action != HDA_FIXUP_ACT_INIT)
4262                 return;
4263
4264         /* Start */
4265         snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x00);
4266         snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
4267         alc_write_coef_idx(codec, 0x26, 0xf000);
4268         alc_write_coef_idx(codec, 0x22, 0x31);
4269         alc_write_coef_idx(codec, 0x23, 0x0b);
4270         alc_write_coef_idx(codec, 0x25, 0x00);
4271         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
4272         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
4273
4274         for (seq = dac_init; seq->value_0x23; seq++)
4275                 alc298_huawei_mbx_stereo_seq(codec, seq, seq == dac_init);
4276 }
4277
4278 static void alc269_fixup_x101_headset_mic(struct hda_codec *codec,
4279                                      const struct hda_fixup *fix, int action)
4280 {
4281         struct alc_spec *spec = codec->spec;
4282         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4283                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4284                 spec->gen.hp_automute_hook = alc269_x101_hp_automute_hook;
4285         }
4286 }
4287
4288 static void alc_update_vref_led(struct hda_codec *codec, hda_nid_t pin,
4289                                 bool polarity, bool on)
4290 {
4291         unsigned int pinval;
4292
4293         if (!pin)
4294                 return;
4295         if (polarity)
4296                 on = !on;
4297         pinval = snd_hda_codec_get_pin_target(codec, pin);
4298         pinval &= ~AC_PINCTL_VREFEN;
4299         pinval |= on ? AC_PINCTL_VREF_80 : AC_PINCTL_VREF_HIZ;
4300         /* temporarily power up/down for setting VREF */
4301         snd_hda_power_up_pm(codec);
4302         snd_hda_set_pin_ctl_cache(codec, pin, pinval);
4303         snd_hda_power_down_pm(codec);
4304 }
4305
4306 /* update mute-LED according to the speaker mute state via mic VREF pin */
4307 static int vref_mute_led_set(struct led_classdev *led_cdev,
4308                              enum led_brightness brightness)
4309 {
4310         struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4311         struct alc_spec *spec = codec->spec;
4312
4313         alc_update_vref_led(codec, spec->mute_led_nid,
4314                             spec->mute_led_polarity, brightness);
4315         return 0;
4316 }
4317
4318 /* Make sure the led works even in runtime suspend */
4319 static unsigned int led_power_filter(struct hda_codec *codec,
4320                                                   hda_nid_t nid,
4321                                                   unsigned int power_state)
4322 {
4323         struct alc_spec *spec = codec->spec;
4324
4325         if (power_state != AC_PWRST_D3 || nid == 0 ||
4326             (nid != spec->mute_led_nid && nid != spec->cap_mute_led_nid))
4327                 return power_state;
4328
4329         /* Set pin ctl again, it might have just been set to 0 */
4330         snd_hda_set_pin_ctl(codec, nid,
4331                             snd_hda_codec_get_pin_target(codec, nid));
4332
4333         return snd_hda_gen_path_power_filter(codec, nid, power_state);
4334 }
4335
4336 static void alc269_fixup_hp_mute_led(struct hda_codec *codec,
4337                                      const struct hda_fixup *fix, int action)
4338 {
4339         struct alc_spec *spec = codec->spec;
4340         const struct dmi_device *dev = NULL;
4341
4342         if (action != HDA_FIXUP_ACT_PRE_PROBE)
4343                 return;
4344
4345         while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
4346                 int pol, pin;
4347                 if (sscanf(dev->name, "HP_Mute_LED_%d_%x", &pol, &pin) != 2)
4348                         continue;
4349                 if (pin < 0x0a || pin >= 0x10)
4350                         break;
4351                 spec->mute_led_polarity = pol;
4352                 spec->mute_led_nid = pin - 0x0a + 0x18;
4353                 snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
4354                 codec->power_filter = led_power_filter;
4355                 codec_dbg(codec,
4356                           "Detected mute LED for %x:%d\n", spec->mute_led_nid,
4357                            spec->mute_led_polarity);
4358                 break;
4359         }
4360 }
4361
4362 static void alc269_fixup_hp_mute_led_micx(struct hda_codec *codec,
4363                                           const struct hda_fixup *fix,
4364                                           int action, hda_nid_t pin)
4365 {
4366         struct alc_spec *spec = codec->spec;
4367
4368         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4369                 spec->mute_led_polarity = 0;
4370                 spec->mute_led_nid = pin;
4371                 snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
4372                 codec->power_filter = led_power_filter;
4373         }
4374 }
4375
4376 static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec,
4377                                 const struct hda_fixup *fix, int action)
4378 {
4379         alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x18);
4380 }
4381
4382 static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,
4383                                 const struct hda_fixup *fix, int action)
4384 {
4385         alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x19);
4386 }
4387
4388 static void alc269_fixup_hp_mute_led_mic3(struct hda_codec *codec,
4389                                 const struct hda_fixup *fix, int action)
4390 {
4391         alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1b);
4392 }
4393
4394 /* update LED status via GPIO */
4395 static void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask,
4396                                 int polarity, bool enabled)
4397 {
4398         if (polarity)
4399                 enabled = !enabled;
4400         alc_update_gpio_data(codec, mask, !enabled); /* muted -> LED on */
4401 }
4402
4403 /* turn on/off mute LED via GPIO per vmaster hook */
4404 static int gpio_mute_led_set(struct led_classdev *led_cdev,
4405                              enum led_brightness brightness)
4406 {
4407         struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4408         struct alc_spec *spec = codec->spec;
4409
4410         alc_update_gpio_led(codec, spec->gpio_mute_led_mask,
4411                             spec->mute_led_polarity, !brightness);
4412         return 0;
4413 }
4414
4415 /* turn on/off mic-mute LED via GPIO per capture hook */
4416 static int micmute_led_set(struct led_classdev *led_cdev,
4417                            enum led_brightness brightness)
4418 {
4419         struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4420         struct alc_spec *spec = codec->spec;
4421
4422         alc_update_gpio_led(codec, spec->gpio_mic_led_mask,
4423                             spec->micmute_led_polarity, !brightness);
4424         return 0;
4425 }
4426
4427 /* setup mute and mic-mute GPIO bits, add hooks appropriately */
4428 static void alc_fixup_hp_gpio_led(struct hda_codec *codec,
4429                                   int action,
4430                                   unsigned int mute_mask,
4431                                   unsigned int micmute_mask)
4432 {
4433         struct alc_spec *spec = codec->spec;
4434
4435         alc_fixup_gpio(codec, action, mute_mask | micmute_mask);
4436
4437         if (action != HDA_FIXUP_ACT_PRE_PROBE)
4438                 return;
4439         if (mute_mask) {
4440                 spec->gpio_mute_led_mask = mute_mask;
4441                 snd_hda_gen_add_mute_led_cdev(codec, gpio_mute_led_set);
4442         }
4443         if (micmute_mask) {
4444                 spec->gpio_mic_led_mask = micmute_mask;
4445                 snd_hda_gen_add_micmute_led_cdev(codec, micmute_led_set);
4446         }
4447 }
4448
4449 static void alc236_fixup_hp_gpio_led(struct hda_codec *codec,
4450                                 const struct hda_fixup *fix, int action)
4451 {
4452         alc_fixup_hp_gpio_led(codec, action, 0x02, 0x01);
4453 }
4454
4455 static void alc269_fixup_hp_gpio_led(struct hda_codec *codec,
4456                                 const struct hda_fixup *fix, int action)
4457 {
4458         alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
4459 }
4460
4461 static void alc285_fixup_hp_gpio_led(struct hda_codec *codec,
4462                                 const struct hda_fixup *fix, int action)
4463 {
4464         alc_fixup_hp_gpio_led(codec, action, 0x04, 0x01);
4465 }
4466
4467 static void alc286_fixup_hp_gpio_led(struct hda_codec *codec,
4468                                 const struct hda_fixup *fix, int action)
4469 {
4470         alc_fixup_hp_gpio_led(codec, action, 0x02, 0x20);
4471 }
4472
4473 static void alc287_fixup_hp_gpio_led(struct hda_codec *codec,
4474                                 const struct hda_fixup *fix, int action)
4475 {
4476         alc_fixup_hp_gpio_led(codec, action, 0x10, 0);
4477 }
4478
4479 static void alc245_fixup_hp_gpio_led(struct hda_codec *codec,
4480                                 const struct hda_fixup *fix, int action)
4481 {
4482         struct alc_spec *spec = codec->spec;
4483
4484         if (action == HDA_FIXUP_ACT_PRE_PROBE)
4485                 spec->micmute_led_polarity = 1;
4486         alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4487 }
4488
4489 /* turn on/off mic-mute LED per capture hook via VREF change */
4490 static int vref_micmute_led_set(struct led_classdev *led_cdev,
4491                                 enum led_brightness brightness)
4492 {
4493         struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4494         struct alc_spec *spec = codec->spec;
4495
4496         alc_update_vref_led(codec, spec->cap_mute_led_nid,
4497                             spec->micmute_led_polarity, brightness);
4498         return 0;
4499 }
4500
4501 static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec,
4502                                 const struct hda_fixup *fix, int action)
4503 {
4504         struct alc_spec *spec = codec->spec;
4505
4506         alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
4507         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4508                 /* Like hp_gpio_mic1_led, but also needs GPIO4 low to
4509                  * enable headphone amp
4510                  */
4511                 spec->gpio_mask |= 0x10;
4512                 spec->gpio_dir |= 0x10;
4513                 spec->cap_mute_led_nid = 0x18;
4514                 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4515                 codec->power_filter = led_power_filter;
4516         }
4517 }
4518
4519 static void alc280_fixup_hp_gpio4(struct hda_codec *codec,
4520                                    const struct hda_fixup *fix, int action)
4521 {
4522         struct alc_spec *spec = codec->spec;
4523
4524         alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
4525         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4526                 spec->cap_mute_led_nid = 0x18;
4527                 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4528                 codec->power_filter = led_power_filter;
4529         }
4530 }
4531
4532 /* HP Spectre x360 14 model needs a unique workaround for enabling the amp;
4533  * it needs to toggle the GPIO0 once on and off at each time (bko#210633)
4534  */
4535 static void alc245_fixup_hp_x360_amp(struct hda_codec *codec,
4536                                      const struct hda_fixup *fix, int action)
4537 {
4538         struct alc_spec *spec = codec->spec;
4539
4540         switch (action) {
4541         case HDA_FIXUP_ACT_PRE_PROBE:
4542                 spec->gpio_mask |= 0x01;
4543                 spec->gpio_dir |= 0x01;
4544                 break;
4545         case HDA_FIXUP_ACT_INIT:
4546                 /* need to toggle GPIO to enable the amp */
4547                 alc_update_gpio_data(codec, 0x01, true);
4548                 msleep(100);
4549                 alc_update_gpio_data(codec, 0x01, false);
4550                 break;
4551         }
4552 }
4553
4554 /* toggle GPIO2 at each time stream is started; we use PREPARE state instead */
4555 static void alc274_hp_envy_pcm_hook(struct hda_pcm_stream *hinfo,
4556                                     struct hda_codec *codec,
4557                                     struct snd_pcm_substream *substream,
4558                                     int action)
4559 {
4560         switch (action) {
4561         case HDA_GEN_PCM_ACT_PREPARE:
4562                 alc_update_gpio_data(codec, 0x04, true);
4563                 break;
4564         case HDA_GEN_PCM_ACT_CLEANUP:
4565                 alc_update_gpio_data(codec, 0x04, false);
4566                 break;
4567         }
4568 }
4569
4570 static void alc274_fixup_hp_envy_gpio(struct hda_codec *codec,
4571                                       const struct hda_fixup *fix,
4572                                       int action)
4573 {
4574         struct alc_spec *spec = codec->spec;
4575
4576         if (action == HDA_FIXUP_ACT_PROBE) {
4577                 spec->gpio_mask |= 0x04;
4578                 spec->gpio_dir |= 0x04;
4579                 spec->gen.pcm_playback_hook = alc274_hp_envy_pcm_hook;
4580         }
4581 }
4582
4583 static void alc_update_coef_led(struct hda_codec *codec,
4584                                 struct alc_coef_led *led,
4585                                 bool polarity, bool on)
4586 {
4587         if (polarity)
4588                 on = !on;
4589         /* temporarily power up/down for setting COEF bit */
4590         alc_update_coef_idx(codec, led->idx, led->mask,
4591                             on ? led->on : led->off);
4592 }
4593
4594 /* update mute-LED according to the speaker mute state via COEF bit */
4595 static int coef_mute_led_set(struct led_classdev *led_cdev,
4596                              enum led_brightness brightness)
4597 {
4598         struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4599         struct alc_spec *spec = codec->spec;
4600
4601         alc_update_coef_led(codec, &spec->mute_led_coef,
4602                             spec->mute_led_polarity, brightness);
4603         return 0;
4604 }
4605
4606 static void alc285_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4607                                           const struct hda_fixup *fix,
4608                                           int action)
4609 {
4610         struct alc_spec *spec = codec->spec;
4611
4612         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4613                 spec->mute_led_polarity = 0;
4614                 spec->mute_led_coef.idx = 0x0b;
4615                 spec->mute_led_coef.mask = 1 << 3;
4616                 spec->mute_led_coef.on = 1 << 3;
4617                 spec->mute_led_coef.off = 0;
4618                 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4619         }
4620 }
4621
4622 static void alc236_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4623                                           const struct hda_fixup *fix,
4624                                           int action)
4625 {
4626         struct alc_spec *spec = codec->spec;
4627
4628         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4629                 spec->mute_led_polarity = 0;
4630                 spec->mute_led_coef.idx = 0x34;
4631                 spec->mute_led_coef.mask = 1 << 5;
4632                 spec->mute_led_coef.on = 0;
4633                 spec->mute_led_coef.off = 1 << 5;
4634                 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4635         }
4636 }
4637
4638 static void alc236_fixup_hp_mute_led_coefbit2(struct hda_codec *codec,
4639                                           const struct hda_fixup *fix, int action)
4640 {
4641         struct alc_spec *spec = codec->spec;
4642
4643         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4644                 spec->mute_led_polarity = 0;
4645                 spec->mute_led_coef.idx = 0x07;
4646                 spec->mute_led_coef.mask = 1;
4647                 spec->mute_led_coef.on = 1;
4648                 spec->mute_led_coef.off = 0;
4649                 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4650         }
4651 }
4652
4653 static void alc245_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4654                                           const struct hda_fixup *fix,
4655                                           int action)
4656 {
4657         struct alc_spec *spec = codec->spec;
4658
4659         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4660                 spec->mute_led_polarity = 0;
4661                 spec->mute_led_coef.idx = 0x0b;
4662                 spec->mute_led_coef.mask = 3 << 2;
4663                 spec->mute_led_coef.on = 2 << 2;
4664                 spec->mute_led_coef.off = 1 << 2;
4665                 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4666         }
4667 }
4668
4669 /* turn on/off mic-mute LED per capture hook by coef bit */
4670 static int coef_micmute_led_set(struct led_classdev *led_cdev,
4671                                 enum led_brightness brightness)
4672 {
4673         struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4674         struct alc_spec *spec = codec->spec;
4675
4676         alc_update_coef_led(codec, &spec->mic_led_coef,
4677                             spec->micmute_led_polarity, brightness);
4678         return 0;
4679 }
4680
4681 static void alc285_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4682                                 const struct hda_fixup *fix, int action)
4683 {
4684         struct alc_spec *spec = codec->spec;
4685
4686         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4687                 spec->mic_led_coef.idx = 0x19;
4688                 spec->mic_led_coef.mask = 1 << 13;
4689                 spec->mic_led_coef.on = 1 << 13;
4690                 spec->mic_led_coef.off = 0;
4691                 snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
4692         }
4693 }
4694
4695 static void alc285_fixup_hp_gpio_micmute_led(struct hda_codec *codec,
4696                                 const struct hda_fixup *fix, int action)
4697 {
4698         struct alc_spec *spec = codec->spec;
4699
4700         if (action == HDA_FIXUP_ACT_PRE_PROBE)
4701                 spec->micmute_led_polarity = 1;
4702         alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4703 }
4704
4705 static void alc236_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4706                                 const struct hda_fixup *fix, int action)
4707 {
4708         struct alc_spec *spec = codec->spec;
4709
4710         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4711                 spec->mic_led_coef.idx = 0x35;
4712                 spec->mic_led_coef.mask = 3 << 2;
4713                 spec->mic_led_coef.on = 2 << 2;
4714                 spec->mic_led_coef.off = 1 << 2;
4715                 snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
4716         }
4717 }
4718
4719 static void alc285_fixup_hp_mute_led(struct hda_codec *codec,
4720                                 const struct hda_fixup *fix, int action)
4721 {
4722         alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
4723         alc285_fixup_hp_coef_micmute_led(codec, fix, action);
4724 }
4725
4726 static void alc285_fixup_hp_spectre_x360_mute_led(struct hda_codec *codec,
4727                                 const struct hda_fixup *fix, int action)
4728 {
4729         alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
4730         alc285_fixup_hp_gpio_micmute_led(codec, fix, action);
4731 }
4732
4733 static void alc236_fixup_hp_mute_led(struct hda_codec *codec,
4734                                 const struct hda_fixup *fix, int action)
4735 {
4736         alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
4737         alc236_fixup_hp_coef_micmute_led(codec, fix, action);
4738 }
4739
4740 static void alc236_fixup_hp_micmute_led_vref(struct hda_codec *codec,
4741                                 const struct hda_fixup *fix, int action)
4742 {
4743         struct alc_spec *spec = codec->spec;
4744
4745         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4746                 spec->cap_mute_led_nid = 0x1a;
4747                 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4748                 codec->power_filter = led_power_filter;
4749         }
4750 }
4751
4752 static void alc236_fixup_hp_mute_led_micmute_vref(struct hda_codec *codec,
4753                                 const struct hda_fixup *fix, int action)
4754 {
4755         alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
4756         alc236_fixup_hp_micmute_led_vref(codec, fix, action);
4757 }
4758
4759 static inline void alc298_samsung_write_coef_pack(struct hda_codec *codec,
4760                                                   const unsigned short coefs[2])
4761 {
4762         alc_write_coef_idx(codec, 0x23, coefs[0]);
4763         alc_write_coef_idx(codec, 0x25, coefs[1]);
4764         alc_write_coef_idx(codec, 0x26, 0xb011);
4765 }
4766
4767 struct alc298_samsung_amp_desc {
4768         unsigned char nid;
4769         unsigned short init_seq[2][2];
4770 };
4771
4772 static void alc298_fixup_samsung_amp(struct hda_codec *codec,
4773                                      const struct hda_fixup *fix, int action)
4774 {
4775         int i, j;
4776         static const unsigned short init_seq[][2] = {
4777                 { 0x19, 0x00 }, { 0x20, 0xc0 }, { 0x22, 0x44 }, { 0x23, 0x08 },
4778                 { 0x24, 0x85 }, { 0x25, 0x41 }, { 0x35, 0x40 }, { 0x36, 0x01 },
4779                 { 0x38, 0x81 }, { 0x3a, 0x03 }, { 0x3b, 0x81 }, { 0x40, 0x3e },
4780                 { 0x41, 0x07 }, { 0x400, 0x1 }
4781         };
4782         static const struct alc298_samsung_amp_desc amps[] = {
4783                 { 0x3a, { { 0x18, 0x1 }, { 0x26, 0x0 } } },
4784                 { 0x39, { { 0x18, 0x2 }, { 0x26, 0x1 } } }
4785         };
4786
4787         if (action != HDA_FIXUP_ACT_INIT)
4788                 return;
4789
4790         for (i = 0; i < ARRAY_SIZE(amps); i++) {
4791                 alc_write_coef_idx(codec, 0x22, amps[i].nid);
4792
4793                 for (j = 0; j < ARRAY_SIZE(amps[i].init_seq); j++)
4794                         alc298_samsung_write_coef_pack(codec, amps[i].init_seq[j]);
4795
4796                 for (j = 0; j < ARRAY_SIZE(init_seq); j++)
4797                         alc298_samsung_write_coef_pack(codec, init_seq[j]);
4798         }
4799 }
4800
4801 #if IS_REACHABLE(CONFIG_INPUT)
4802 static void gpio2_mic_hotkey_event(struct hda_codec *codec,
4803                                    struct hda_jack_callback *event)
4804 {
4805         struct alc_spec *spec = codec->spec;
4806
4807         /* GPIO2 just toggles on a keypress/keyrelease cycle. Therefore
4808            send both key on and key off event for every interrupt. */
4809         input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1);
4810         input_sync(spec->kb_dev);
4811         input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0);
4812         input_sync(spec->kb_dev);
4813 }
4814
4815 static int alc_register_micmute_input_device(struct hda_codec *codec)
4816 {
4817         struct alc_spec *spec = codec->spec;
4818         int i;
4819
4820         spec->kb_dev = input_allocate_device();
4821         if (!spec->kb_dev) {
4822                 codec_err(codec, "Out of memory (input_allocate_device)\n");
4823                 return -ENOMEM;
4824         }
4825
4826         spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE;
4827
4828         spec->kb_dev->name = "Microphone Mute Button";
4829         spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);
4830         spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]);
4831         spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map);
4832         spec->kb_dev->keycode = spec->alc_mute_keycode_map;
4833         for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++)
4834                 set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit);
4835
4836         if (input_register_device(spec->kb_dev)) {
4837                 codec_err(codec, "input_register_device failed\n");
4838                 input_free_device(spec->kb_dev);
4839                 spec->kb_dev = NULL;
4840                 return -ENOMEM;
4841         }
4842
4843         return 0;
4844 }
4845
4846 /* GPIO1 = set according to SKU external amp
4847  * GPIO2 = mic mute hotkey
4848  * GPIO3 = mute LED
4849  * GPIO4 = mic mute LED
4850  */
4851 static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
4852                                              const struct hda_fixup *fix, int action)
4853 {
4854         struct alc_spec *spec = codec->spec;
4855
4856         alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
4857         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4858                 spec->init_amp = ALC_INIT_DEFAULT;
4859                 if (alc_register_micmute_input_device(codec) != 0)
4860                         return;
4861
4862                 spec->gpio_mask |= 0x06;
4863                 spec->gpio_dir |= 0x02;
4864                 spec->gpio_data |= 0x02;
4865                 snd_hda_codec_write_cache(codec, codec->core.afg, 0,
4866                                           AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x04);
4867                 snd_hda_jack_detect_enable_callback(codec, codec->core.afg,
4868                                                     gpio2_mic_hotkey_event);
4869                 return;
4870         }
4871
4872         if (!spec->kb_dev)
4873                 return;
4874
4875         switch (action) {
4876         case HDA_FIXUP_ACT_FREE:
4877                 input_unregister_device(spec->kb_dev);
4878                 spec->kb_dev = NULL;
4879         }
4880 }
4881
4882 /* Line2 = mic mute hotkey
4883  * GPIO2 = mic mute LED
4884  */
4885 static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,
4886                                              const struct hda_fixup *fix, int action)
4887 {
4888         struct alc_spec *spec = codec->spec;
4889
4890         alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4891         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4892                 spec->init_amp = ALC_INIT_DEFAULT;
4893                 if (alc_register_micmute_input_device(codec) != 0)
4894                         return;
4895
4896                 snd_hda_jack_detect_enable_callback(codec, 0x1b,
4897                                                     gpio2_mic_hotkey_event);
4898                 return;
4899         }
4900
4901         if (!spec->kb_dev)
4902                 return;
4903
4904         switch (action) {
4905         case HDA_FIXUP_ACT_FREE:
4906                 input_unregister_device(spec->kb_dev);
4907                 spec->kb_dev = NULL;
4908         }
4909 }
4910 #else /* INPUT */
4911 #define alc280_fixup_hp_gpio2_mic_hotkey        NULL
4912 #define alc233_fixup_lenovo_line2_mic_hotkey    NULL
4913 #endif /* INPUT */
4914
4915 static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,
4916                                 const struct hda_fixup *fix, int action)
4917 {
4918         struct alc_spec *spec = codec->spec;
4919
4920         alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1a);
4921         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4922                 spec->cap_mute_led_nid = 0x18;
4923                 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4924         }
4925 }
4926
4927 static const struct coef_fw alc225_pre_hsmode[] = {
4928         UPDATE_COEF(0x4a, 1<<8, 0),
4929         UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
4930         UPDATE_COEF(0x63, 3<<14, 3<<14),
4931         UPDATE_COEF(0x4a, 3<<4, 2<<4),
4932         UPDATE_COEF(0x4a, 3<<10, 3<<10),
4933         UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10),
4934         UPDATE_COEF(0x4a, 3<<10, 0),
4935         {}
4936 };
4937
4938 static void alc_headset_mode_unplugged(struct hda_codec *codec)
4939 {
4940         struct alc_spec *spec = codec->spec;
4941         static const struct coef_fw coef0255[] = {
4942                 WRITE_COEF(0x1b, 0x0c0b), /* LDO and MISC control */
4943                 WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4944                 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4945                 WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4946                 WRITE_COEFEX(0x57, 0x03, 0x8aa6), /* Direct Drive HP Amp control */
4947                 {}
4948         };
4949         static const struct coef_fw coef0256[] = {
4950                 WRITE_COEF(0x1b, 0x0c4b), /* LDO and MISC control */
4951                 WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4952                 WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4953                 WRITE_COEFEX(0x57, 0x03, 0x09a3), /* Direct Drive HP Amp control */
4954                 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4955                 {}
4956         };
4957         static const struct coef_fw coef0233[] = {
4958                 WRITE_COEF(0x1b, 0x0c0b),
4959                 WRITE_COEF(0x45, 0xc429),
4960                 UPDATE_COEF(0x35, 0x4000, 0),
4961                 WRITE_COEF(0x06, 0x2104),
4962                 WRITE_COEF(0x1a, 0x0001),
4963                 WRITE_COEF(0x26, 0x0004),
4964                 WRITE_COEF(0x32, 0x42a3),
4965                 {}
4966         };
4967         static const struct coef_fw coef0288[] = {
4968                 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
4969                 UPDATE_COEF(0x50, 0x2000, 0x2000),
4970                 UPDATE_COEF(0x56, 0x0006, 0x0006),
4971                 UPDATE_COEF(0x66, 0x0008, 0),
4972                 UPDATE_COEF(0x67, 0x2000, 0),
4973                 {}
4974         };
4975         static const struct coef_fw coef0298[] = {
4976                 UPDATE_COEF(0x19, 0x1300, 0x0300),
4977                 {}
4978         };
4979         static const struct coef_fw coef0292[] = {
4980                 WRITE_COEF(0x76, 0x000e),
4981                 WRITE_COEF(0x6c, 0x2400),
4982                 WRITE_COEF(0x18, 0x7308),
4983                 WRITE_COEF(0x6b, 0xc429),
4984                 {}
4985         };
4986         static const struct coef_fw coef0293[] = {
4987                 UPDATE_COEF(0x10, 7<<8, 6<<8), /* SET Line1 JD to 0 */
4988                 UPDATE_COEFEX(0x57, 0x05, 1<<15|1<<13, 0x0), /* SET charge pump by verb */
4989                 UPDATE_COEFEX(0x57, 0x03, 1<<10, 1<<10), /* SET EN_OSW to 1 */
4990                 UPDATE_COEF(0x1a, 1<<3, 1<<3), /* Combo JD gating with LINE1-VREFO */
4991                 WRITE_COEF(0x45, 0xc429), /* Set to TRS type */
4992                 UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
4993                 {}
4994         };
4995         static const struct coef_fw coef0668[] = {
4996                 WRITE_COEF(0x15, 0x0d40),
4997                 WRITE_COEF(0xb7, 0x802b),
4998                 {}
4999         };
5000         static const struct coef_fw coef0225[] = {
5001                 UPDATE_COEF(0x63, 3<<14, 0),
5002                 {}
5003         };
5004         static const struct coef_fw coef0274[] = {
5005                 UPDATE_COEF(0x4a, 0x0100, 0),
5006                 UPDATE_COEFEX(0x57, 0x05, 0x4000, 0),
5007                 UPDATE_COEF(0x6b, 0xf000, 0x5000),
5008                 UPDATE_COEF(0x4a, 0x0010, 0),
5009                 UPDATE_COEF(0x4a, 0x0c00, 0x0c00),
5010                 WRITE_COEF(0x45, 0x5289),
5011                 UPDATE_COEF(0x4a, 0x0c00, 0),
5012                 {}
5013         };
5014
5015         if (spec->no_internal_mic_pin) {
5016                 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
5017                 return;
5018         }
5019
5020         switch (codec->core.vendor_id) {
5021         case 0x10ec0255:
5022                 alc_process_coef_fw(codec, coef0255);
5023                 break;
5024         case 0x10ec0230:
5025         case 0x10ec0236:
5026         case 0x10ec0256:
5027         case 0x19e58326:
5028                 alc_process_coef_fw(codec, coef0256);
5029                 break;
5030         case 0x10ec0234:
5031         case 0x10ec0274:
5032         case 0x10ec0294:
5033                 alc_process_coef_fw(codec, coef0274);
5034                 break;
5035         case 0x10ec0233:
5036         case 0x10ec0283:
5037                 alc_process_coef_fw(codec, coef0233);
5038                 break;
5039         case 0x10ec0286:
5040         case 0x10ec0288:
5041                 alc_process_coef_fw(codec, coef0288);
5042                 break;
5043         case 0x10ec0298:
5044                 alc_process_coef_fw(codec, coef0298);
5045                 alc_process_coef_fw(codec, coef0288);
5046                 break;
5047         case 0x10ec0292:
5048                 alc_process_coef_fw(codec, coef0292);
5049                 break;
5050         case 0x10ec0293:
5051                 alc_process_coef_fw(codec, coef0293);
5052                 break;
5053         case 0x10ec0668:
5054                 alc_process_coef_fw(codec, coef0668);
5055                 break;
5056         case 0x10ec0215:
5057         case 0x10ec0225:
5058         case 0x10ec0285:
5059         case 0x10ec0295:
5060         case 0x10ec0289:
5061         case 0x10ec0299:
5062                 alc_process_coef_fw(codec, alc225_pre_hsmode);
5063                 alc_process_coef_fw(codec, coef0225);
5064                 break;
5065         case 0x10ec0867:
5066                 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5067                 break;
5068         }
5069         codec_dbg(codec, "Headset jack set to unplugged mode.\n");
5070 }
5071
5072
5073 static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
5074                                     hda_nid_t mic_pin)
5075 {
5076         static const struct coef_fw coef0255[] = {
5077                 WRITE_COEFEX(0x57, 0x03, 0x8aa6),
5078                 WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
5079                 {}
5080         };
5081         static const struct coef_fw coef0256[] = {
5082                 UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14), /* Direct Drive HP Amp control(Set to verb control)*/
5083                 WRITE_COEFEX(0x57, 0x03, 0x09a3),
5084                 WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
5085                 {}
5086         };
5087         static const struct coef_fw coef0233[] = {
5088                 UPDATE_COEF(0x35, 0, 1<<14),
5089                 WRITE_COEF(0x06, 0x2100),
5090                 WRITE_COEF(0x1a, 0x0021),
5091                 WRITE_COEF(0x26, 0x008c),
5092                 {}
5093         };
5094         static const struct coef_fw coef0288[] = {
5095                 UPDATE_COEF(0x4f, 0x00c0, 0),
5096                 UPDATE_COEF(0x50, 0x2000, 0),
5097                 UPDATE_COEF(0x56, 0x0006, 0),
5098                 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
5099                 UPDATE_COEF(0x66, 0x0008, 0x0008),
5100                 UPDATE_COEF(0x67, 0x2000, 0x2000),
5101                 {}
5102         };
5103         static const struct coef_fw coef0292[] = {
5104                 WRITE_COEF(0x19, 0xa208),
5105                 WRITE_COEF(0x2e, 0xacf0),
5106                 {}
5107         };
5108         static const struct coef_fw coef0293[] = {
5109                 UPDATE_COEFEX(0x57, 0x05, 0, 1<<15|1<<13), /* SET charge pump by verb */
5110                 UPDATE_COEFEX(0x57, 0x03, 1<<10, 0), /* SET EN_OSW to 0 */
5111                 UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
5112                 {}
5113         };
5114         static const struct coef_fw coef0688[] = {
5115                 WRITE_COEF(0xb7, 0x802b),
5116                 WRITE_COEF(0xb5, 0x1040),
5117                 UPDATE_COEF(0xc3, 0, 1<<12),
5118                 {}
5119         };
5120         static const struct coef_fw coef0225[] = {
5121                 UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14),
5122                 UPDATE_COEF(0x4a, 3<<4, 2<<4),
5123                 UPDATE_COEF(0x63, 3<<14, 0),
5124                 {}
5125         };
5126         static const struct coef_fw coef0274[] = {
5127                 UPDATE_COEFEX(0x57, 0x05, 0x4000, 0x4000),
5128                 UPDATE_COEF(0x4a, 0x0010, 0),
5129                 UPDATE_COEF(0x6b, 0xf000, 0),
5130                 {}
5131         };
5132
5133         switch (codec->core.vendor_id) {
5134         case 0x10ec0255:
5135                 alc_write_coef_idx(codec, 0x45, 0xc489);
5136                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5137                 alc_process_coef_fw(codec, coef0255);
5138                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5139                 break;
5140         case 0x10ec0230:
5141         case 0x10ec0236:
5142         case 0x10ec0256:
5143         case 0x19e58326:
5144                 alc_write_coef_idx(codec, 0x45, 0xc489);
5145                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5146                 alc_process_coef_fw(codec, coef0256);
5147                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5148                 break;
5149         case 0x10ec0234:
5150         case 0x10ec0274:
5151         case 0x10ec0294:
5152                 alc_write_coef_idx(codec, 0x45, 0x4689);
5153                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5154                 alc_process_coef_fw(codec, coef0274);
5155                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5156                 break;
5157         case 0x10ec0233:
5158         case 0x10ec0283:
5159                 alc_write_coef_idx(codec, 0x45, 0xc429);
5160                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5161                 alc_process_coef_fw(codec, coef0233);
5162                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5163                 break;
5164         case 0x10ec0286:
5165         case 0x10ec0288:
5166         case 0x10ec0298:
5167                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5168                 alc_process_coef_fw(codec, coef0288);
5169                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5170                 break;
5171         case 0x10ec0292:
5172                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5173                 alc_process_coef_fw(codec, coef0292);
5174                 break;
5175         case 0x10ec0293:
5176                 /* Set to TRS mode */
5177                 alc_write_coef_idx(codec, 0x45, 0xc429);
5178                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5179                 alc_process_coef_fw(codec, coef0293);
5180                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5181                 break;
5182         case 0x10ec0867:
5183                 alc_update_coefex_idx(codec, 0x57, 0x5, 0, 1<<14);
5184                 fallthrough;
5185         case 0x10ec0221:
5186         case 0x10ec0662:
5187                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5188                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5189                 break;
5190         case 0x10ec0668:
5191                 alc_write_coef_idx(codec, 0x11, 0x0001);
5192                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5193                 alc_process_coef_fw(codec, coef0688);
5194                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5195                 break;
5196         case 0x10ec0215:
5197         case 0x10ec0225:
5198         case 0x10ec0285:
5199         case 0x10ec0295:
5200         case 0x10ec0289:
5201         case 0x10ec0299:
5202                 alc_process_coef_fw(codec, alc225_pre_hsmode);
5203                 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x31<<10);
5204                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5205                 alc_process_coef_fw(codec, coef0225);
5206                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5207                 break;
5208         }
5209         codec_dbg(codec, "Headset jack set to mic-in mode.\n");
5210 }
5211
5212 static void alc_headset_mode_default(struct hda_codec *codec)
5213 {
5214         static const struct coef_fw coef0225[] = {
5215                 UPDATE_COEF(0x45, 0x3f<<10, 0x30<<10),
5216                 UPDATE_COEF(0x45, 0x3f<<10, 0x31<<10),
5217                 UPDATE_COEF(0x49, 3<<8, 0<<8),
5218                 UPDATE_COEF(0x4a, 3<<4, 3<<4),
5219                 UPDATE_COEF(0x63, 3<<14, 0),
5220                 UPDATE_COEF(0x67, 0xf000, 0x3000),
5221                 {}
5222         };
5223         static const struct coef_fw coef0255[] = {
5224                 WRITE_COEF(0x45, 0xc089),
5225                 WRITE_COEF(0x45, 0xc489),
5226                 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5227                 WRITE_COEF(0x49, 0x0049),
5228                 {}
5229         };
5230         static const struct coef_fw coef0256[] = {
5231                 WRITE_COEF(0x45, 0xc489),
5232                 WRITE_COEFEX(0x57, 0x03, 0x0da3),
5233                 WRITE_COEF(0x49, 0x0049),
5234                 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
5235                 WRITE_COEF(0x06, 0x6100),
5236                 {}
5237         };
5238         static const struct coef_fw coef0233[] = {
5239                 WRITE_COEF(0x06, 0x2100),
5240                 WRITE_COEF(0x32, 0x4ea3),
5241                 {}
5242         };
5243         static const struct coef_fw coef0288[] = {
5244                 UPDATE_COEF(0x4f, 0xfcc0, 0xc400), /* Set to TRS type */
5245                 UPDATE_COEF(0x50, 0x2000, 0x2000),
5246                 UPDATE_COEF(0x56, 0x0006, 0x0006),
5247                 UPDATE_COEF(0x66, 0x0008, 0),
5248                 UPDATE_COEF(0x67, 0x2000, 0),
5249                 {}
5250         };
5251         static const struct coef_fw coef0292[] = {
5252                 WRITE_COEF(0x76, 0x000e),
5253                 WRITE_COEF(0x6c, 0x2400),
5254                 WRITE_COEF(0x6b, 0xc429),
5255                 WRITE_COEF(0x18, 0x7308),
5256                 {}
5257         };
5258         static const struct coef_fw coef0293[] = {
5259                 UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
5260                 WRITE_COEF(0x45, 0xC429), /* Set to TRS type */
5261                 UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
5262                 {}
5263         };
5264         static const struct coef_fw coef0688[] = {
5265                 WRITE_COEF(0x11, 0x0041),
5266                 WRITE_COEF(0x15, 0x0d40),
5267                 WRITE_COEF(0xb7, 0x802b),
5268                 {}
5269         };
5270         static const struct coef_fw coef0274[] = {
5271                 WRITE_COEF(0x45, 0x4289),
5272                 UPDATE_COEF(0x4a, 0x0010, 0x0010),
5273                 UPDATE_COEF(0x6b, 0x0f00, 0),
5274                 UPDATE_COEF(0x49, 0x0300, 0x0300),
5275                 {}
5276         };
5277
5278         switch (codec->core.vendor_id) {
5279         case 0x10ec0215:
5280         case 0x10ec0225:
5281         case 0x10ec0285:
5282         case 0x10ec0295:
5283         case 0x10ec0289:
5284         case 0x10ec0299:
5285                 alc_process_coef_fw(codec, alc225_pre_hsmode);
5286                 alc_process_coef_fw(codec, coef0225);
5287                 break;
5288         case 0x10ec0255:
5289                 alc_process_coef_fw(codec, coef0255);
5290                 break;
5291         case 0x10ec0230:
5292         case 0x10ec0236:
5293         case 0x10ec0256:
5294         case 0x19e58326:
5295                 alc_write_coef_idx(codec, 0x1b, 0x0e4b);
5296                 alc_write_coef_idx(codec, 0x45, 0xc089);
5297                 msleep(50);
5298                 alc_process_coef_fw(codec, coef0256);
5299                 break;
5300         case 0x10ec0234:
5301         case 0x10ec0274:
5302         case 0x10ec0294:
5303                 alc_process_coef_fw(codec, coef0274);
5304                 break;
5305         case 0x10ec0233:
5306         case 0x10ec0283:
5307                 alc_process_coef_fw(codec, coef0233);
5308                 break;
5309         case 0x10ec0286:
5310         case 0x10ec0288:
5311         case 0x10ec0298:
5312                 alc_process_coef_fw(codec, coef0288);
5313                 break;
5314         case 0x10ec0292:
5315                 alc_process_coef_fw(codec, coef0292);
5316                 break;
5317         case 0x10ec0293:
5318                 alc_process_coef_fw(codec, coef0293);
5319                 break;
5320         case 0x10ec0668:
5321                 alc_process_coef_fw(codec, coef0688);
5322                 break;
5323         case 0x10ec0867:
5324                 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5325                 break;
5326         }
5327         codec_dbg(codec, "Headset jack set to headphone (default) mode.\n");
5328 }
5329
5330 /* Iphone type */
5331 static void alc_headset_mode_ctia(struct hda_codec *codec)
5332 {
5333         int val;
5334
5335         static const struct coef_fw coef0255[] = {
5336                 WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
5337                 WRITE_COEF(0x1b, 0x0c2b),
5338                 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5339                 {}
5340         };
5341         static const struct coef_fw coef0256[] = {
5342                 WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
5343                 WRITE_COEF(0x1b, 0x0e6b),
5344                 {}
5345         };
5346         static const struct coef_fw coef0233[] = {
5347                 WRITE_COEF(0x45, 0xd429),
5348                 WRITE_COEF(0x1b, 0x0c2b),
5349                 WRITE_COEF(0x32, 0x4ea3),
5350                 {}
5351         };
5352         static const struct coef_fw coef0288[] = {
5353                 UPDATE_COEF(0x50, 0x2000, 0x2000),
5354                 UPDATE_COEF(0x56, 0x0006, 0x0006),
5355                 UPDATE_COEF(0x66, 0x0008, 0),
5356                 UPDATE_COEF(0x67, 0x2000, 0),
5357                 {}
5358         };
5359         static const struct coef_fw coef0292[] = {
5360                 WRITE_COEF(0x6b, 0xd429),
5361                 WRITE_COEF(0x76, 0x0008),
5362                 WRITE_COEF(0x18, 0x7388),
5363                 {}
5364         };
5365         static const struct coef_fw coef0293[] = {
5366                 WRITE_COEF(0x45, 0xd429), /* Set to ctia type */
5367                 UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
5368                 {}
5369         };
5370         static const struct coef_fw coef0688[] = {
5371                 WRITE_COEF(0x11, 0x0001),
5372                 WRITE_COEF(0x15, 0x0d60),
5373                 WRITE_COEF(0xc3, 0x0000),
5374                 {}
5375         };
5376         static const struct coef_fw coef0225_1[] = {
5377                 UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
5378                 UPDATE_COEF(0x63, 3<<14, 2<<14),
5379                 {}
5380         };
5381         static const struct coef_fw coef0225_2[] = {
5382                 UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
5383                 UPDATE_COEF(0x63, 3<<14, 1<<14),
5384                 {}
5385         };
5386
5387         switch (codec->core.vendor_id) {
5388         case 0x10ec0255:
5389                 alc_process_coef_fw(codec, coef0255);
5390                 break;
5391         case 0x10ec0230:
5392         case 0x10ec0236:
5393         case 0x10ec0256:
5394         case 0x19e58326:
5395                 alc_process_coef_fw(codec, coef0256);
5396                 break;
5397         case 0x10ec0234:
5398         case 0x10ec0274:
5399         case 0x10ec0294:
5400                 alc_write_coef_idx(codec, 0x45, 0xd689);
5401                 break;
5402         case 0x10ec0233:
5403         case 0x10ec0283:
5404                 alc_process_coef_fw(codec, coef0233);
5405                 break;
5406         case 0x10ec0298:
5407                 val = alc_read_coef_idx(codec, 0x50);
5408                 if (val & (1 << 12)) {
5409                         alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
5410                         alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5411                         msleep(300);
5412                 } else {
5413                         alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5414                         alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5415                         msleep(300);
5416                 }
5417                 break;
5418         case 0x10ec0286:
5419         case 0x10ec0288:
5420                 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5421                 msleep(300);
5422                 alc_process_coef_fw(codec, coef0288);
5423                 break;
5424         case 0x10ec0292:
5425                 alc_process_coef_fw(codec, coef0292);
5426                 break;
5427         case 0x10ec0293:
5428                 alc_process_coef_fw(codec, coef0293);
5429                 break;
5430         case 0x10ec0668:
5431                 alc_process_coef_fw(codec, coef0688);
5432                 break;
5433         case 0x10ec0215:
5434         case 0x10ec0225:
5435         case 0x10ec0285:
5436         case 0x10ec0295:
5437         case 0x10ec0289:
5438         case 0x10ec0299:
5439                 val = alc_read_coef_idx(codec, 0x45);
5440                 if (val & (1 << 9))
5441                         alc_process_coef_fw(codec, coef0225_2);
5442                 else
5443                         alc_process_coef_fw(codec, coef0225_1);
5444                 break;
5445         case 0x10ec0867:
5446                 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5447                 break;
5448         }
5449         codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n");
5450 }
5451
5452 /* Nokia type */
5453 static void alc_headset_mode_omtp(struct hda_codec *codec)
5454 {
5455         static const struct coef_fw coef0255[] = {
5456                 WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
5457                 WRITE_COEF(0x1b, 0x0c2b),
5458                 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5459                 {}
5460         };
5461         static const struct coef_fw coef0256[] = {
5462                 WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
5463                 WRITE_COEF(0x1b, 0x0e6b),
5464                 {}
5465         };
5466         static const struct coef_fw coef0233[] = {
5467                 WRITE_COEF(0x45, 0xe429),
5468                 WRITE_COEF(0x1b, 0x0c2b),
5469                 WRITE_COEF(0x32, 0x4ea3),
5470                 {}
5471         };
5472         static const struct coef_fw coef0288[] = {
5473                 UPDATE_COEF(0x50, 0x2000, 0x2000),
5474                 UPDATE_COEF(0x56, 0x0006, 0x0006),
5475                 UPDATE_COEF(0x66, 0x0008, 0),
5476                 UPDATE_COEF(0x67, 0x2000, 0),
5477                 {}
5478         };
5479         static const struct coef_fw coef0292[] = {
5480                 WRITE_COEF(0x6b, 0xe429),
5481                 WRITE_COEF(0x76, 0x0008),
5482                 WRITE_COEF(0x18, 0x7388),
5483                 {}
5484         };
5485         static const struct coef_fw coef0293[] = {
5486                 WRITE_COEF(0x45, 0xe429), /* Set to omtp type */
5487                 UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
5488                 {}
5489         };
5490         static const struct coef_fw coef0688[] = {
5491                 WRITE_COEF(0x11, 0x0001),
5492                 WRITE_COEF(0x15, 0x0d50),
5493                 WRITE_COEF(0xc3, 0x0000),
5494                 {}
5495         };
5496         static const struct coef_fw coef0225[] = {
5497                 UPDATE_COEF(0x45, 0x3f<<10, 0x39<<10),
5498                 UPDATE_COEF(0x63, 3<<14, 2<<14),
5499                 {}
5500         };
5501
5502         switch (codec->core.vendor_id) {
5503         case 0x10ec0255:
5504                 alc_process_coef_fw(codec, coef0255);
5505                 break;
5506         case 0x10ec0230:
5507         case 0x10ec0236:
5508         case 0x10ec0256:
5509         case 0x19e58326:
5510                 alc_process_coef_fw(codec, coef0256);
5511                 break;
5512         case 0x10ec0234:
5513         case 0x10ec0274:
5514         case 0x10ec0294:
5515                 alc_write_coef_idx(codec, 0x45, 0xe689);
5516                 break;
5517         case 0x10ec0233:
5518         case 0x10ec0283:
5519                 alc_process_coef_fw(codec, coef0233);
5520                 break;
5521         case 0x10ec0298:
5522                 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);/* Headset output enable */
5523                 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5524                 msleep(300);
5525                 break;
5526         case 0x10ec0286:
5527         case 0x10ec0288:
5528                 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5529                 msleep(300);
5530                 alc_process_coef_fw(codec, coef0288);
5531                 break;
5532         case 0x10ec0292:
5533                 alc_process_coef_fw(codec, coef0292);
5534                 break;
5535         case 0x10ec0293:
5536                 alc_process_coef_fw(codec, coef0293);
5537                 break;
5538         case 0x10ec0668:
5539                 alc_process_coef_fw(codec, coef0688);
5540                 break;
5541         case 0x10ec0215:
5542         case 0x10ec0225:
5543         case 0x10ec0285:
5544         case 0x10ec0295:
5545         case 0x10ec0289:
5546         case 0x10ec0299:
5547                 alc_process_coef_fw(codec, coef0225);
5548                 break;
5549         }
5550         codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n");
5551 }
5552
5553 static void alc_determine_headset_type(struct hda_codec *codec)
5554 {
5555         int val;
5556         bool is_ctia = false;
5557         struct alc_spec *spec = codec->spec;
5558         static const struct coef_fw coef0255[] = {
5559                 WRITE_COEF(0x45, 0xd089), /* combo jack auto switch control(Check type)*/
5560                 WRITE_COEF(0x49, 0x0149), /* combo jack auto switch control(Vref
5561  conteol) */
5562                 {}
5563         };
5564         static const struct coef_fw coef0288[] = {
5565                 UPDATE_COEF(0x4f, 0xfcc0, 0xd400), /* Check Type */
5566                 {}
5567         };
5568         static const struct coef_fw coef0298[] = {
5569                 UPDATE_COEF(0x50, 0x2000, 0x2000),
5570                 UPDATE_COEF(0x56, 0x0006, 0x0006),
5571                 UPDATE_COEF(0x66, 0x0008, 0),
5572                 UPDATE_COEF(0x67, 0x2000, 0),
5573                 UPDATE_COEF(0x19, 0x1300, 0x1300),
5574                 {}
5575         };
5576         static const struct coef_fw coef0293[] = {
5577                 UPDATE_COEF(0x4a, 0x000f, 0x0008), /* Combo Jack auto detect */
5578                 WRITE_COEF(0x45, 0xD429), /* Set to ctia type */
5579                 {}
5580         };
5581         static const struct coef_fw coef0688[] = {
5582                 WRITE_COEF(0x11, 0x0001),
5583                 WRITE_COEF(0xb7, 0x802b),
5584                 WRITE_COEF(0x15, 0x0d60),
5585                 WRITE_COEF(0xc3, 0x0c00),
5586                 {}
5587         };
5588         static const struct coef_fw coef0274[] = {
5589                 UPDATE_COEF(0x4a, 0x0010, 0),
5590                 UPDATE_COEF(0x4a, 0x8000, 0),
5591                 WRITE_COEF(0x45, 0xd289),
5592                 UPDATE_COEF(0x49, 0x0300, 0x0300),
5593                 {}
5594         };
5595
5596         if (spec->no_internal_mic_pin) {
5597                 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
5598                 return;
5599         }
5600
5601         switch (codec->core.vendor_id) {
5602         case 0x10ec0255:
5603                 alc_process_coef_fw(codec, coef0255);
5604                 msleep(300);
5605                 val = alc_read_coef_idx(codec, 0x46);
5606                 is_ctia = (val & 0x0070) == 0x0070;
5607                 break;
5608         case 0x10ec0230:
5609         case 0x10ec0236:
5610         case 0x10ec0256:
5611         case 0x19e58326:
5612                 alc_write_coef_idx(codec, 0x1b, 0x0e4b);
5613                 alc_write_coef_idx(codec, 0x06, 0x6104);
5614                 alc_write_coefex_idx(codec, 0x57, 0x3, 0x09a3);
5615
5616                 snd_hda_codec_write(codec, 0x21, 0,
5617                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5618                 msleep(80);
5619                 snd_hda_codec_write(codec, 0x21, 0,
5620                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5621
5622                 alc_process_coef_fw(codec, coef0255);
5623                 msleep(300);
5624                 val = alc_read_coef_idx(codec, 0x46);
5625                 is_ctia = (val & 0x0070) == 0x0070;
5626
5627                 alc_write_coefex_idx(codec, 0x57, 0x3, 0x0da3);
5628                 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5629
5630                 snd_hda_codec_write(codec, 0x21, 0,
5631                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5632                 msleep(80);
5633                 snd_hda_codec_write(codec, 0x21, 0,
5634                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5635                 break;
5636         case 0x10ec0234:
5637         case 0x10ec0274:
5638         case 0x10ec0294:
5639                 alc_process_coef_fw(codec, coef0274);
5640                 msleep(850);
5641                 val = alc_read_coef_idx(codec, 0x46);
5642                 is_ctia = (val & 0x00f0) == 0x00f0;
5643                 break;
5644         case 0x10ec0233:
5645         case 0x10ec0283:
5646                 alc_write_coef_idx(codec, 0x45, 0xd029);
5647                 msleep(300);
5648                 val = alc_read_coef_idx(codec, 0x46);
5649                 is_ctia = (val & 0x0070) == 0x0070;
5650                 break;
5651         case 0x10ec0298:
5652                 snd_hda_codec_write(codec, 0x21, 0,
5653                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5654                 msleep(100);
5655                 snd_hda_codec_write(codec, 0x21, 0,
5656                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5657                 msleep(200);
5658
5659                 val = alc_read_coef_idx(codec, 0x50);
5660                 if (val & (1 << 12)) {
5661                         alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
5662                         alc_process_coef_fw(codec, coef0288);
5663                         msleep(350);
5664                         val = alc_read_coef_idx(codec, 0x50);
5665                         is_ctia = (val & 0x0070) == 0x0070;
5666                 } else {
5667                         alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5668                         alc_process_coef_fw(codec, coef0288);
5669                         msleep(350);
5670                         val = alc_read_coef_idx(codec, 0x50);
5671                         is_ctia = (val & 0x0070) == 0x0070;
5672                 }
5673                 alc_process_coef_fw(codec, coef0298);
5674                 snd_hda_codec_write(codec, 0x21, 0,
5675                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
5676                 msleep(75);
5677                 snd_hda_codec_write(codec, 0x21, 0,
5678                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5679                 break;
5680         case 0x10ec0286:
5681         case 0x10ec0288:
5682                 alc_process_coef_fw(codec, coef0288);
5683                 msleep(350);
5684                 val = alc_read_coef_idx(codec, 0x50);
5685                 is_ctia = (val & 0x0070) == 0x0070;
5686                 break;
5687         case 0x10ec0292:
5688                 alc_write_coef_idx(codec, 0x6b, 0xd429);
5689                 msleep(300);
5690                 val = alc_read_coef_idx(codec, 0x6c);
5691                 is_ctia = (val & 0x001c) == 0x001c;
5692                 break;
5693         case 0x10ec0293:
5694                 alc_process_coef_fw(codec, coef0293);
5695                 msleep(300);
5696                 val = alc_read_coef_idx(codec, 0x46);
5697                 is_ctia = (val & 0x0070) == 0x0070;
5698                 break;
5699         case 0x10ec0668:
5700                 alc_process_coef_fw(codec, coef0688);
5701                 msleep(300);
5702                 val = alc_read_coef_idx(codec, 0xbe);
5703                 is_ctia = (val & 0x1c02) == 0x1c02;
5704                 break;
5705         case 0x10ec0215:
5706         case 0x10ec0225:
5707         case 0x10ec0285:
5708         case 0x10ec0295:
5709         case 0x10ec0289:
5710         case 0x10ec0299:
5711                 snd_hda_codec_write(codec, 0x21, 0,
5712                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5713                 msleep(80);
5714                 snd_hda_codec_write(codec, 0x21, 0,
5715                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5716
5717                 alc_process_coef_fw(codec, alc225_pre_hsmode);
5718                 alc_update_coef_idx(codec, 0x67, 0xf000, 0x1000);
5719                 val = alc_read_coef_idx(codec, 0x45);
5720                 if (val & (1 << 9)) {
5721                         alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5722                         alc_update_coef_idx(codec, 0x49, 3<<8, 2<<8);
5723                         msleep(800);
5724                         val = alc_read_coef_idx(codec, 0x46);
5725                         is_ctia = (val & 0x00f0) == 0x00f0;
5726                 } else {
5727                         alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5728                         alc_update_coef_idx(codec, 0x49, 3<<8, 1<<8);
5729                         msleep(800);
5730                         val = alc_read_coef_idx(codec, 0x46);
5731                         is_ctia = (val & 0x00f0) == 0x00f0;
5732                 }
5733                 alc_update_coef_idx(codec, 0x4a, 7<<6, 7<<6);
5734                 alc_update_coef_idx(codec, 0x4a, 3<<4, 3<<4);
5735                 alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
5736
5737                 snd_hda_codec_write(codec, 0x21, 0,
5738                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5739                 msleep(80);
5740                 snd_hda_codec_write(codec, 0x21, 0,
5741                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5742                 break;
5743         case 0x10ec0867:
5744                 is_ctia = true;
5745                 break;
5746         }
5747
5748         codec_dbg(codec, "Headset jack detected iPhone-style headset: %s\n",
5749                     is_ctia ? "yes" : "no");
5750         spec->current_headset_type = is_ctia ? ALC_HEADSET_TYPE_CTIA : ALC_HEADSET_TYPE_OMTP;
5751 }
5752
5753 static void alc_update_headset_mode(struct hda_codec *codec)
5754 {
5755         struct alc_spec *spec = codec->spec;
5756
5757         hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]];
5758         hda_nid_t hp_pin = alc_get_hp_pin(spec);
5759
5760         int new_headset_mode;
5761
5762         if (!snd_hda_jack_detect(codec, hp_pin))
5763                 new_headset_mode = ALC_HEADSET_MODE_UNPLUGGED;
5764         else if (mux_pin == spec->headset_mic_pin)
5765                 new_headset_mode = ALC_HEADSET_MODE_HEADSET;
5766         else if (mux_pin == spec->headphone_mic_pin)
5767                 new_headset_mode = ALC_HEADSET_MODE_MIC;
5768         else
5769                 new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;
5770
5771         if (new_headset_mode == spec->current_headset_mode) {
5772                 snd_hda_gen_update_outputs(codec);
5773                 return;
5774         }
5775
5776         switch (new_headset_mode) {
5777         case ALC_HEADSET_MODE_UNPLUGGED:
5778                 alc_headset_mode_unplugged(codec);
5779                 spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5780                 spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5781                 spec->gen.hp_jack_present = false;
5782                 break;
5783         case ALC_HEADSET_MODE_HEADSET:
5784                 if (spec->current_headset_type == ALC_HEADSET_TYPE_UNKNOWN)
5785                         alc_determine_headset_type(codec);
5786                 if (spec->current_headset_type == ALC_HEADSET_TYPE_CTIA)
5787                         alc_headset_mode_ctia(codec);
5788                 else if (spec->current_headset_type == ALC_HEADSET_TYPE_OMTP)
5789                         alc_headset_mode_omtp(codec);
5790                 spec->gen.hp_jack_present = true;
5791                 break;
5792         case ALC_HEADSET_MODE_MIC:
5793                 alc_headset_mode_mic_in(codec, hp_pin, spec->headphone_mic_pin);
5794                 spec->gen.hp_jack_present = false;
5795                 break;
5796         case ALC_HEADSET_MODE_HEADPHONE:
5797                 alc_headset_mode_default(codec);
5798                 spec->gen.hp_jack_present = true;
5799                 break;
5800         }
5801         if (new_headset_mode != ALC_HEADSET_MODE_MIC) {
5802                 snd_hda_set_pin_ctl_cache(codec, hp_pin,
5803                                           AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
5804                 if (spec->headphone_mic_pin && spec->headphone_mic_pin != hp_pin)
5805                         snd_hda_set_pin_ctl_cache(codec, spec->headphone_mic_pin,
5806                                                   PIN_VREFHIZ);
5807         }
5808         spec->current_headset_mode = new_headset_mode;
5809
5810         snd_hda_gen_update_outputs(codec);
5811 }
5812
5813 static void alc_update_headset_mode_hook(struct hda_codec *codec,
5814                                          struct snd_kcontrol *kcontrol,
5815                                          struct snd_ctl_elem_value *ucontrol)
5816 {
5817         alc_update_headset_mode(codec);
5818 }
5819
5820 static void alc_update_headset_jack_cb(struct hda_codec *codec,
5821                                        struct hda_jack_callback *jack)
5822 {
5823         snd_hda_gen_hp_automute(codec, jack);
5824         alc_update_headset_mode(codec);
5825 }
5826
5827 static void alc_probe_headset_mode(struct hda_codec *codec)
5828 {
5829         int i;
5830         struct alc_spec *spec = codec->spec;
5831         struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5832
5833         /* Find mic pins */
5834         for (i = 0; i < cfg->num_inputs; i++) {
5835                 if (cfg->inputs[i].is_headset_mic && !spec->headset_mic_pin)
5836                         spec->headset_mic_pin = cfg->inputs[i].pin;
5837                 if (cfg->inputs[i].is_headphone_mic && !spec->headphone_mic_pin)
5838                         spec->headphone_mic_pin = cfg->inputs[i].pin;
5839         }
5840
5841         WARN_ON(spec->gen.cap_sync_hook);
5842         spec->gen.cap_sync_hook = alc_update_headset_mode_hook;
5843         spec->gen.automute_hook = alc_update_headset_mode;
5844         spec->gen.hp_automute_hook = alc_update_headset_jack_cb;
5845 }
5846
5847 static void alc_fixup_headset_mode(struct hda_codec *codec,
5848                                 const struct hda_fixup *fix, int action)
5849 {
5850         struct alc_spec *spec = codec->spec;
5851
5852         switch (action) {
5853         case HDA_FIXUP_ACT_PRE_PROBE:
5854                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC | HDA_PINCFG_HEADPHONE_MIC;
5855                 break;
5856         case HDA_FIXUP_ACT_PROBE:
5857                 alc_probe_headset_mode(codec);
5858                 break;
5859         case HDA_FIXUP_ACT_INIT:
5860                 if (is_s3_resume(codec) || is_s4_resume(codec)) {
5861                         spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5862                         spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5863                 }
5864                 alc_update_headset_mode(codec);
5865                 break;
5866         }
5867 }
5868
5869 static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
5870                                 const struct hda_fixup *fix, int action)
5871 {
5872         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5873                 struct alc_spec *spec = codec->spec;
5874                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5875         }
5876         else
5877                 alc_fixup_headset_mode(codec, fix, action);
5878 }
5879
5880 static void alc255_set_default_jack_type(struct hda_codec *codec)
5881 {
5882         /* Set to iphone type */
5883         static const struct coef_fw alc255fw[] = {
5884                 WRITE_COEF(0x1b, 0x880b),
5885                 WRITE_COEF(0x45, 0xd089),
5886                 WRITE_COEF(0x1b, 0x080b),
5887                 WRITE_COEF(0x46, 0x0004),
5888                 WRITE_COEF(0x1b, 0x0c0b),
5889                 {}
5890         };
5891         static const struct coef_fw alc256fw[] = {
5892                 WRITE_COEF(0x1b, 0x884b),
5893                 WRITE_COEF(0x45, 0xd089),
5894                 WRITE_COEF(0x1b, 0x084b),
5895                 WRITE_COEF(0x46, 0x0004),
5896                 WRITE_COEF(0x1b, 0x0c4b),
5897                 {}
5898         };
5899         switch (codec->core.vendor_id) {
5900         case 0x10ec0255:
5901                 alc_process_coef_fw(codec, alc255fw);
5902                 break;
5903         case 0x10ec0230:
5904         case 0x10ec0236:
5905         case 0x10ec0256:
5906         case 0x19e58326:
5907                 alc_process_coef_fw(codec, alc256fw);
5908                 break;
5909         }
5910         msleep(30);
5911 }
5912
5913 static void alc_fixup_headset_mode_alc255(struct hda_codec *codec,
5914                                 const struct hda_fixup *fix, int action)
5915 {
5916         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5917                 alc255_set_default_jack_type(codec);
5918         }
5919         alc_fixup_headset_mode(codec, fix, action);
5920 }
5921
5922 static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,
5923                                 const struct hda_fixup *fix, int action)
5924 {
5925         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5926                 struct alc_spec *spec = codec->spec;
5927                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5928                 alc255_set_default_jack_type(codec);
5929         }
5930         else
5931                 alc_fixup_headset_mode(codec, fix, action);
5932 }
5933
5934 static void alc288_update_headset_jack_cb(struct hda_codec *codec,
5935                                        struct hda_jack_callback *jack)
5936 {
5937         struct alc_spec *spec = codec->spec;
5938
5939         alc_update_headset_jack_cb(codec, jack);
5940         /* Headset Mic enable or disable, only for Dell Dino */
5941         alc_update_gpio_data(codec, 0x40, spec->gen.hp_jack_present);
5942 }
5943
5944 static void alc_fixup_headset_mode_dell_alc288(struct hda_codec *codec,
5945                                 const struct hda_fixup *fix, int action)
5946 {
5947         alc_fixup_headset_mode(codec, fix, action);
5948         if (action == HDA_FIXUP_ACT_PROBE) {
5949                 struct alc_spec *spec = codec->spec;
5950                 /* toggled via hp_automute_hook */
5951                 spec->gpio_mask |= 0x40;
5952                 spec->gpio_dir |= 0x40;
5953                 spec->gen.hp_automute_hook = alc288_update_headset_jack_cb;
5954         }
5955 }
5956
5957 static void alc_fixup_auto_mute_via_amp(struct hda_codec *codec,
5958                                         const struct hda_fixup *fix, int action)
5959 {
5960         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5961                 struct alc_spec *spec = codec->spec;
5962                 spec->gen.auto_mute_via_amp = 1;
5963         }
5964 }
5965
5966 static void alc_fixup_no_shutup(struct hda_codec *codec,
5967                                 const struct hda_fixup *fix, int action)
5968 {
5969         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5970                 struct alc_spec *spec = codec->spec;
5971                 spec->no_shutup_pins = 1;
5972         }
5973 }
5974
5975 static void alc_fixup_disable_aamix(struct hda_codec *codec,
5976                                     const struct hda_fixup *fix, int action)
5977 {
5978         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5979                 struct alc_spec *spec = codec->spec;
5980                 /* Disable AA-loopback as it causes white noise */
5981                 spec->gen.mixer_nid = 0;
5982         }
5983 }
5984
5985 /* fixup for Thinkpad docks: add dock pins, avoid HP parser fixup */
5986 static void alc_fixup_tpt440_dock(struct hda_codec *codec,
5987                                   const struct hda_fixup *fix, int action)
5988 {
5989         static const struct hda_pintbl pincfgs[] = {
5990                 { 0x16, 0x21211010 }, /* dock headphone */
5991                 { 0x19, 0x21a11010 }, /* dock mic */
5992                 { }
5993         };
5994         struct alc_spec *spec = codec->spec;
5995
5996         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5997                 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
5998                 codec->power_save_node = 0; /* avoid click noises */
5999                 snd_hda_apply_pincfgs(codec, pincfgs);
6000         }
6001 }
6002
6003 static void alc_fixup_tpt470_dock(struct hda_codec *codec,
6004                                   const struct hda_fixup *fix, int action)
6005 {
6006         static const struct hda_pintbl pincfgs[] = {
6007                 { 0x17, 0x21211010 }, /* dock headphone */
6008                 { 0x19, 0x21a11010 }, /* dock mic */
6009                 { }
6010         };
6011         struct alc_spec *spec = codec->spec;
6012
6013         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6014                 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
6015                 snd_hda_apply_pincfgs(codec, pincfgs);
6016         } else if (action == HDA_FIXUP_ACT_INIT) {
6017                 /* Enable DOCK device */
6018                 snd_hda_codec_write(codec, 0x17, 0,
6019                             AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
6020                 /* Enable DOCK device */
6021                 snd_hda_codec_write(codec, 0x19, 0,
6022                             AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
6023         }
6024 }
6025
6026 static void alc_fixup_tpt470_dacs(struct hda_codec *codec,
6027                                   const struct hda_fixup *fix, int action)
6028 {
6029         /* Assure the speaker pin to be coupled with DAC NID 0x03; otherwise
6030          * the speaker output becomes too low by some reason on Thinkpads with
6031          * ALC298 codec
6032          */
6033         static const hda_nid_t preferred_pairs[] = {
6034                 0x14, 0x03, 0x17, 0x02, 0x21, 0x02,
6035                 0
6036         };
6037         struct alc_spec *spec = codec->spec;
6038
6039         if (action == HDA_FIXUP_ACT_PRE_PROBE)
6040                 spec->gen.preferred_dacs = preferred_pairs;
6041 }
6042
6043 static void alc295_fixup_asus_dacs(struct hda_codec *codec,
6044                                    const struct hda_fixup *fix, int action)
6045 {
6046         static const hda_nid_t preferred_pairs[] = {
6047                 0x17, 0x02, 0x21, 0x03, 0
6048         };
6049         struct alc_spec *spec = codec->spec;
6050
6051         if (action == HDA_FIXUP_ACT_PRE_PROBE)
6052                 spec->gen.preferred_dacs = preferred_pairs;
6053 }
6054
6055 static void alc_shutup_dell_xps13(struct hda_codec *codec)
6056 {
6057         struct alc_spec *spec = codec->spec;
6058         int hp_pin = alc_get_hp_pin(spec);
6059
6060         /* Prevent pop noises when headphones are plugged in */
6061         snd_hda_codec_write(codec, hp_pin, 0,
6062                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
6063         msleep(20);
6064 }
6065
6066 static void alc_fixup_dell_xps13(struct hda_codec *codec,
6067                                 const struct hda_fixup *fix, int action)
6068 {
6069         struct alc_spec *spec = codec->spec;
6070         struct hda_input_mux *imux = &spec->gen.input_mux;
6071         int i;
6072
6073         switch (action) {
6074         case HDA_FIXUP_ACT_PRE_PROBE:
6075                 /* mic pin 0x19 must be initialized with Vref Hi-Z, otherwise
6076                  * it causes a click noise at start up
6077                  */
6078                 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
6079                 spec->shutup = alc_shutup_dell_xps13;
6080                 break;
6081         case HDA_FIXUP_ACT_PROBE:
6082                 /* Make the internal mic the default input source. */
6083                 for (i = 0; i < imux->num_items; i++) {
6084                         if (spec->gen.imux_pins[i] == 0x12) {
6085                                 spec->gen.cur_mux[0] = i;
6086                                 break;
6087                         }
6088                 }
6089                 break;
6090         }
6091 }
6092
6093 static void alc_fixup_headset_mode_alc662(struct hda_codec *codec,
6094                                 const struct hda_fixup *fix, int action)
6095 {
6096         struct alc_spec *spec = codec->spec;
6097
6098         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6099                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
6100                 spec->gen.hp_mic = 1; /* Mic-in is same pin as headphone */
6101
6102                 /* Disable boost for mic-in permanently. (This code is only called
6103                    from quirks that guarantee that the headphone is at NID 0x1b.) */
6104                 snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000);
6105                 snd_hda_override_wcaps(codec, 0x1b, get_wcaps(codec, 0x1b) & ~AC_WCAP_IN_AMP);
6106         } else
6107                 alc_fixup_headset_mode(codec, fix, action);
6108 }
6109
6110 static void alc_fixup_headset_mode_alc668(struct hda_codec *codec,
6111                                 const struct hda_fixup *fix, int action)
6112 {
6113         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6114                 alc_write_coef_idx(codec, 0xc4, 0x8000);
6115                 alc_update_coef_idx(codec, 0xc2, ~0xfe, 0);
6116                 snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
6117         }
6118         alc_fixup_headset_mode(codec, fix, action);
6119 }
6120
6121 /* Returns the nid of the external mic input pin, or 0 if it cannot be found. */
6122 static int find_ext_mic_pin(struct hda_codec *codec)
6123 {
6124         struct alc_spec *spec = codec->spec;
6125         struct auto_pin_cfg *cfg = &spec->gen.autocfg;
6126         hda_nid_t nid;
6127         unsigned int defcfg;
6128         int i;
6129
6130         for (i = 0; i < cfg->num_inputs; i++) {
6131                 if (cfg->inputs[i].type != AUTO_PIN_MIC)
6132                         continue;
6133                 nid = cfg->inputs[i].pin;
6134                 defcfg = snd_hda_codec_get_pincfg(codec, nid);
6135                 if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT)
6136                         continue;
6137                 return nid;
6138         }
6139
6140         return 0;
6141 }
6142
6143 static void alc271_hp_gate_mic_jack(struct hda_codec *codec,
6144                                     const struct hda_fixup *fix,
6145                                     int action)
6146 {
6147         struct alc_spec *spec = codec->spec;
6148
6149         if (action == HDA_FIXUP_ACT_PROBE) {
6150                 int mic_pin = find_ext_mic_pin(codec);
6151                 int hp_pin = alc_get_hp_pin(spec);
6152
6153                 if (snd_BUG_ON(!mic_pin || !hp_pin))
6154                         return;
6155                 snd_hda_jack_set_gating_jack(codec, mic_pin, hp_pin);
6156         }
6157 }
6158
6159 static void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec,
6160                                              const struct hda_fixup *fix,
6161                                              int action)
6162 {
6163         struct alc_spec *spec = codec->spec;
6164         struct auto_pin_cfg *cfg = &spec->gen.autocfg;
6165         int i;
6166
6167         /* The mic boosts on level 2 and 3 are too noisy
6168            on the internal mic input.
6169            Therefore limit the boost to 0 or 1. */
6170
6171         if (action != HDA_FIXUP_ACT_PROBE)
6172                 return;
6173
6174         for (i = 0; i < cfg->num_inputs; i++) {
6175                 hda_nid_t nid = cfg->inputs[i].pin;
6176                 unsigned int defcfg;
6177                 if (cfg->inputs[i].type != AUTO_PIN_MIC)
6178                         continue;
6179                 defcfg = snd_hda_codec_get_pincfg(codec, nid);
6180                 if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
6181                         continue;
6182
6183                 snd_hda_override_amp_caps(codec, nid, HDA_INPUT,
6184                                           (0x00 << AC_AMPCAP_OFFSET_SHIFT) |
6185                                           (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) |
6186                                           (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) |
6187                                           (0 << AC_AMPCAP_MUTE_SHIFT));
6188         }
6189 }
6190
6191 static void alc283_hp_automute_hook(struct hda_codec *codec,
6192                                     struct hda_jack_callback *jack)
6193 {
6194         struct alc_spec *spec = codec->spec;
6195         int vref;
6196
6197         msleep(200);
6198         snd_hda_gen_hp_automute(codec, jack);
6199
6200         vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
6201
6202         msleep(600);
6203         snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
6204                             vref);
6205 }
6206
6207 static void alc283_fixup_chromebook(struct hda_codec *codec,
6208                                     const struct hda_fixup *fix, int action)
6209 {
6210         struct alc_spec *spec = codec->spec;
6211
6212         switch (action) {
6213         case HDA_FIXUP_ACT_PRE_PROBE:
6214                 snd_hda_override_wcaps(codec, 0x03, 0);
6215                 /* Disable AA-loopback as it causes white noise */
6216                 spec->gen.mixer_nid = 0;
6217                 break;
6218         case HDA_FIXUP_ACT_INIT:
6219                 /* MIC2-VREF control */
6220                 /* Set to manual mode */
6221                 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
6222                 /* Enable Line1 input control by verb */
6223                 alc_update_coef_idx(codec, 0x1a, 0, 1 << 4);
6224                 break;
6225         }
6226 }
6227
6228 static void alc283_fixup_sense_combo_jack(struct hda_codec *codec,
6229                                     const struct hda_fixup *fix, int action)
6230 {
6231         struct alc_spec *spec = codec->spec;
6232
6233         switch (action) {
6234         case HDA_FIXUP_ACT_PRE_PROBE:
6235                 spec->gen.hp_automute_hook = alc283_hp_automute_hook;
6236                 break;
6237         case HDA_FIXUP_ACT_INIT:
6238                 /* MIC2-VREF control */
6239                 /* Set to manual mode */
6240                 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
6241                 break;
6242         }
6243 }
6244
6245 /* mute tablet speaker pin (0x14) via dock plugging in addition */
6246 static void asus_tx300_automute(struct hda_codec *codec)
6247 {
6248         struct alc_spec *spec = codec->spec;
6249         snd_hda_gen_update_outputs(codec);
6250         if (snd_hda_jack_detect(codec, 0x1b))
6251                 spec->gen.mute_bits |= (1ULL << 0x14);
6252 }
6253
6254 static void alc282_fixup_asus_tx300(struct hda_codec *codec,
6255                                     const struct hda_fixup *fix, int action)
6256 {
6257         struct alc_spec *spec = codec->spec;
6258         static const struct hda_pintbl dock_pins[] = {
6259                 { 0x1b, 0x21114000 }, /* dock speaker pin */
6260                 {}
6261         };
6262
6263         switch (action) {
6264         case HDA_FIXUP_ACT_PRE_PROBE:
6265                 spec->init_amp = ALC_INIT_DEFAULT;
6266                 /* TX300 needs to set up GPIO2 for the speaker amp */
6267                 alc_setup_gpio(codec, 0x04);
6268                 snd_hda_apply_pincfgs(codec, dock_pins);
6269                 spec->gen.auto_mute_via_amp = 1;
6270                 spec->gen.automute_hook = asus_tx300_automute;
6271                 snd_hda_jack_detect_enable_callback(codec, 0x1b,
6272                                                     snd_hda_gen_hp_automute);
6273                 break;
6274         case HDA_FIXUP_ACT_PROBE:
6275                 spec->init_amp = ALC_INIT_DEFAULT;
6276                 break;
6277         case HDA_FIXUP_ACT_BUILD:
6278                 /* this is a bit tricky; give more sane names for the main
6279                  * (tablet) speaker and the dock speaker, respectively
6280                  */
6281                 rename_ctl(codec, "Speaker Playback Switch",
6282                            "Dock Speaker Playback Switch");
6283                 rename_ctl(codec, "Bass Speaker Playback Switch",
6284                            "Speaker Playback Switch");
6285                 break;
6286         }
6287 }
6288
6289 static void alc290_fixup_mono_speakers(struct hda_codec *codec,
6290                                        const struct hda_fixup *fix, int action)
6291 {
6292         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6293                 /* DAC node 0x03 is giving mono output. We therefore want to
6294                    make sure 0x14 (front speaker) and 0x15 (headphones) use the
6295                    stereo DAC, while leaving 0x17 (bass speaker) for node 0x03. */
6296                 static const hda_nid_t conn1[] = { 0x0c };
6297                 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
6298                 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
6299         }
6300 }
6301
6302 static void alc298_fixup_speaker_volume(struct hda_codec *codec,
6303                                         const struct hda_fixup *fix, int action)
6304 {
6305         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6306                 /* The speaker is routed to the Node 0x06 by a mistake, as a result
6307                    we can't adjust the speaker's volume since this node does not has
6308                    Amp-out capability. we change the speaker's route to:
6309                    Node 0x02 (Audio Output) -> Node 0x0c (Audio Mixer) -> Node 0x17 (
6310                    Pin Complex), since Node 0x02 has Amp-out caps, we can adjust
6311                    speaker's volume now. */
6312
6313                 static const hda_nid_t conn1[] = { 0x0c };
6314                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn1), conn1);
6315         }
6316 }
6317
6318 /* disable DAC3 (0x06) selection on NID 0x17 as it has no volume amp control */
6319 static void alc295_fixup_disable_dac3(struct hda_codec *codec,
6320                                       const struct hda_fixup *fix, int action)
6321 {
6322         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6323                 static const hda_nid_t conn[] = { 0x02, 0x03 };
6324                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6325         }
6326 }
6327
6328 /* force NID 0x17 (Bass Speaker) to DAC1 to share it with the main speaker */
6329 static void alc285_fixup_speaker2_to_dac1(struct hda_codec *codec,
6330                                           const struct hda_fixup *fix, int action)
6331 {
6332         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6333                 static const hda_nid_t conn[] = { 0x02 };
6334                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6335         }
6336 }
6337
6338 /* Hook to update amp GPIO4 for automute */
6339 static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,
6340                                           struct hda_jack_callback *jack)
6341 {
6342         struct alc_spec *spec = codec->spec;
6343
6344         snd_hda_gen_hp_automute(codec, jack);
6345         /* mute_led_polarity is set to 0, so we pass inverted value here */
6346         alc_update_gpio_led(codec, 0x10, spec->mute_led_polarity,
6347                             !spec->gen.hp_jack_present);
6348 }
6349
6350 /* Manage GPIOs for HP EliteBook Folio 9480m.
6351  *
6352  * GPIO4 is the headphone amplifier power control
6353  * GPIO3 is the audio output mute indicator LED
6354  */
6355
6356 static void alc280_fixup_hp_9480m(struct hda_codec *codec,
6357                                   const struct hda_fixup *fix,
6358                                   int action)
6359 {
6360         struct alc_spec *spec = codec->spec;
6361
6362         alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
6363         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6364                 /* amp at GPIO4; toggled via alc280_hp_gpio4_automute_hook() */
6365                 spec->gpio_mask |= 0x10;
6366                 spec->gpio_dir |= 0x10;
6367                 spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook;
6368         }
6369 }
6370
6371 static void alc275_fixup_gpio4_off(struct hda_codec *codec,
6372                                    const struct hda_fixup *fix,
6373                                    int action)
6374 {
6375         struct alc_spec *spec = codec->spec;
6376
6377         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6378                 spec->gpio_mask |= 0x04;
6379                 spec->gpio_dir |= 0x04;
6380                 /* set data bit low */
6381         }
6382 }
6383
6384 /* Quirk for Thinkpad X1 7th and 8th Gen
6385  * The following fixed routing needed
6386  * DAC1 (NID 0x02) -> Speaker (NID 0x14); some eq applied secretly
6387  * DAC2 (NID 0x03) -> Bass (NID 0x17) & Headphone (NID 0x21); sharing a DAC
6388  * DAC3 (NID 0x06) -> Unused, due to the lack of volume amp
6389  */
6390 static void alc285_fixup_thinkpad_x1_gen7(struct hda_codec *codec,
6391                                           const struct hda_fixup *fix, int action)
6392 {
6393         static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */
6394         static const hda_nid_t preferred_pairs[] = {
6395                 0x14, 0x02, 0x17, 0x03, 0x21, 0x03, 0
6396         };
6397         struct alc_spec *spec = codec->spec;
6398
6399         switch (action) {
6400         case HDA_FIXUP_ACT_PRE_PROBE:
6401                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6402                 spec->gen.preferred_dacs = preferred_pairs;
6403                 break;
6404         case HDA_FIXUP_ACT_BUILD:
6405                 /* The generic parser creates somewhat unintuitive volume ctls
6406                  * with the fixed routing above, and the shared DAC2 may be
6407                  * confusing for PA.
6408                  * Rename those to unique names so that PA doesn't touch them
6409                  * and use only Master volume.
6410                  */
6411                 rename_ctl(codec, "Front Playback Volume", "DAC1 Playback Volume");
6412                 rename_ctl(codec, "Bass Speaker Playback Volume", "DAC2 Playback Volume");
6413                 break;
6414         }
6415 }
6416
6417 static void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec,
6418                                          const struct hda_fixup *fix,
6419                                          int action)
6420 {
6421         alc_fixup_dual_codecs(codec, fix, action);
6422         switch (action) {
6423         case HDA_FIXUP_ACT_PRE_PROBE:
6424                 /* override card longname to provide a unique UCM profile */
6425                 strcpy(codec->card->longname, "HDAudio-Lenovo-DualCodecs");
6426                 break;
6427         case HDA_FIXUP_ACT_BUILD:
6428                 /* rename Capture controls depending on the codec */
6429                 rename_ctl(codec, "Capture Volume",
6430                            codec->addr == 0 ?
6431                            "Rear-Panel Capture Volume" :
6432                            "Front-Panel Capture Volume");
6433                 rename_ctl(codec, "Capture Switch",
6434                            codec->addr == 0 ?
6435                            "Rear-Panel Capture Switch" :
6436                            "Front-Panel Capture Switch");
6437                 break;
6438         }
6439 }
6440
6441 static void alc225_fixup_s3_pop_noise(struct hda_codec *codec,
6442                                       const struct hda_fixup *fix, int action)
6443 {
6444         if (action != HDA_FIXUP_ACT_PRE_PROBE)
6445                 return;
6446
6447         codec->power_save_node = 1;
6448 }
6449
6450 /* Forcibly assign NID 0x03 to HP/LO while NID 0x02 to SPK for EQ */
6451 static void alc274_fixup_bind_dacs(struct hda_codec *codec,
6452                                     const struct hda_fixup *fix, int action)
6453 {
6454         struct alc_spec *spec = codec->spec;
6455         static const hda_nid_t preferred_pairs[] = {
6456                 0x21, 0x03, 0x1b, 0x03, 0x16, 0x02,
6457                 0
6458         };
6459
6460         if (action != HDA_FIXUP_ACT_PRE_PROBE)
6461                 return;
6462
6463         spec->gen.preferred_dacs = preferred_pairs;
6464         spec->gen.auto_mute_via_amp = 1;
6465         codec->power_save_node = 0;
6466 }
6467
6468 /* avoid DAC 0x06 for bass speaker 0x17; it has no volume control */
6469 static void alc289_fixup_asus_ga401(struct hda_codec *codec,
6470                                     const struct hda_fixup *fix, int action)
6471 {
6472         static const hda_nid_t preferred_pairs[] = {
6473                 0x14, 0x02, 0x17, 0x02, 0x21, 0x03, 0
6474         };
6475         struct alc_spec *spec = codec->spec;
6476
6477         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6478                 spec->gen.preferred_dacs = preferred_pairs;
6479                 spec->gen.obey_preferred_dacs = 1;
6480         }
6481 }
6482
6483 /* The DAC of NID 0x3 will introduce click/pop noise on headphones, so invalidate it */
6484 static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
6485                               const struct hda_fixup *fix, int action)
6486 {
6487         if (action != HDA_FIXUP_ACT_PRE_PROBE)
6488                 return;
6489
6490         snd_hda_override_wcaps(codec, 0x03, 0);
6491 }
6492
6493 static void alc_combo_jack_hp_jd_restart(struct hda_codec *codec)
6494 {
6495         switch (codec->core.vendor_id) {
6496         case 0x10ec0274:
6497         case 0x10ec0294:
6498         case 0x10ec0225:
6499         case 0x10ec0295:
6500         case 0x10ec0299:
6501                 alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */
6502                 alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
6503                 break;
6504         case 0x10ec0230:
6505         case 0x10ec0235:
6506         case 0x10ec0236:
6507         case 0x10ec0255:
6508         case 0x10ec0256:
6509         case 0x10ec0257:
6510         case 0x19e58326:
6511                 alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */
6512                 alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
6513                 break;
6514         }
6515 }
6516
6517 static void alc295_fixup_chromebook(struct hda_codec *codec,
6518                                     const struct hda_fixup *fix, int action)
6519 {
6520         struct alc_spec *spec = codec->spec;
6521
6522         switch (action) {
6523         case HDA_FIXUP_ACT_PRE_PROBE:
6524                 spec->ultra_low_power = true;
6525                 break;
6526         case HDA_FIXUP_ACT_INIT:
6527                 alc_combo_jack_hp_jd_restart(codec);
6528                 break;
6529         }
6530 }
6531
6532 static void alc_fixup_disable_mic_vref(struct hda_codec *codec,
6533                                   const struct hda_fixup *fix, int action)
6534 {
6535         if (action == HDA_FIXUP_ACT_PRE_PROBE)
6536                 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
6537 }
6538
6539
6540 static void alc294_gx502_toggle_output(struct hda_codec *codec,
6541                                         struct hda_jack_callback *cb)
6542 {
6543         /* The Windows driver sets the codec up in a very different way where
6544          * it appears to leave 0x10 = 0x8a20 set. For Linux we need to toggle it
6545          */
6546         if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
6547                 alc_write_coef_idx(codec, 0x10, 0x8a20);
6548         else
6549                 alc_write_coef_idx(codec, 0x10, 0x0a20);
6550 }
6551
6552 static void alc294_fixup_gx502_hp(struct hda_codec *codec,
6553                                         const struct hda_fixup *fix, int action)
6554 {
6555         /* Pin 0x21: headphones/headset mic */
6556         if (!is_jack_detectable(codec, 0x21))
6557                 return;
6558
6559         switch (action) {
6560         case HDA_FIXUP_ACT_PRE_PROBE:
6561                 snd_hda_jack_detect_enable_callback(codec, 0x21,
6562                                 alc294_gx502_toggle_output);
6563                 break;
6564         case HDA_FIXUP_ACT_INIT:
6565                 /* Make sure to start in a correct state, i.e. if
6566                  * headphones have been plugged in before powering up the system
6567                  */
6568                 alc294_gx502_toggle_output(codec, NULL);
6569                 break;
6570         }
6571 }
6572
6573 static void alc294_gu502_toggle_output(struct hda_codec *codec,
6574                                        struct hda_jack_callback *cb)
6575 {
6576         /* Windows sets 0x10 to 0x8420 for Node 0x20 which is
6577          * responsible from changes between speakers and headphones
6578          */
6579         if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
6580                 alc_write_coef_idx(codec, 0x10, 0x8420);
6581         else
6582                 alc_write_coef_idx(codec, 0x10, 0x0a20);
6583 }
6584
6585 static void alc294_fixup_gu502_hp(struct hda_codec *codec,
6586                                   const struct hda_fixup *fix, int action)
6587 {
6588         if (!is_jack_detectable(codec, 0x21))
6589                 return;
6590
6591         switch (action) {
6592         case HDA_FIXUP_ACT_PRE_PROBE:
6593                 snd_hda_jack_detect_enable_callback(codec, 0x21,
6594                                 alc294_gu502_toggle_output);
6595                 break;
6596         case HDA_FIXUP_ACT_INIT:
6597                 alc294_gu502_toggle_output(codec, NULL);
6598                 break;
6599         }
6600 }
6601
6602 static void  alc285_fixup_hp_gpio_amp_init(struct hda_codec *codec,
6603                               const struct hda_fixup *fix, int action)
6604 {
6605         if (action != HDA_FIXUP_ACT_INIT)
6606                 return;
6607
6608         msleep(100);
6609         alc_write_coef_idx(codec, 0x65, 0x0);
6610 }
6611
6612 static void alc274_fixup_hp_headset_mic(struct hda_codec *codec,
6613                                     const struct hda_fixup *fix, int action)
6614 {
6615         switch (action) {
6616         case HDA_FIXUP_ACT_INIT:
6617                 alc_combo_jack_hp_jd_restart(codec);
6618                 break;
6619         }
6620 }
6621
6622 static void alc_fixup_no_int_mic(struct hda_codec *codec,
6623                                     const struct hda_fixup *fix, int action)
6624 {
6625         struct alc_spec *spec = codec->spec;
6626
6627         switch (action) {
6628         case HDA_FIXUP_ACT_PRE_PROBE:
6629                 /* Mic RING SLEEVE swap for combo jack */
6630                 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
6631                 spec->no_internal_mic_pin = true;
6632                 break;
6633         case HDA_FIXUP_ACT_INIT:
6634                 alc_combo_jack_hp_jd_restart(codec);
6635                 break;
6636         }
6637 }
6638
6639 /* GPIO1 = amplifier on/off
6640  * GPIO3 = mic mute LED
6641  */
6642 static void alc285_fixup_hp_spectre_x360_eb1(struct hda_codec *codec,
6643                                           const struct hda_fixup *fix, int action)
6644 {
6645         static const hda_nid_t conn[] = { 0x02 };
6646
6647         struct alc_spec *spec = codec->spec;
6648         static const struct hda_pintbl pincfgs[] = {
6649                 { 0x14, 0x90170110 },  /* front/high speakers */
6650                 { 0x17, 0x90170130 },  /* back/bass speakers */
6651                 { }
6652         };
6653
6654         //enable micmute led
6655         alc_fixup_hp_gpio_led(codec, action, 0x00, 0x04);
6656
6657         switch (action) {
6658         case HDA_FIXUP_ACT_PRE_PROBE:
6659                 spec->micmute_led_polarity = 1;
6660                 /* needed for amp of back speakers */
6661                 spec->gpio_mask |= 0x01;
6662                 spec->gpio_dir |= 0x01;
6663                 snd_hda_apply_pincfgs(codec, pincfgs);
6664                 /* share DAC to have unified volume control */
6665                 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
6666                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6667                 break;
6668         case HDA_FIXUP_ACT_INIT:
6669                 /* need to toggle GPIO to enable the amp of back speakers */
6670                 alc_update_gpio_data(codec, 0x01, true);
6671                 msleep(100);
6672                 alc_update_gpio_data(codec, 0x01, false);
6673                 break;
6674         }
6675 }
6676
6677 static void alc285_fixup_hp_spectre_x360(struct hda_codec *codec,
6678                                           const struct hda_fixup *fix, int action)
6679 {
6680         static const hda_nid_t conn[] = { 0x02 };
6681         static const struct hda_pintbl pincfgs[] = {
6682                 { 0x14, 0x90170110 },  /* rear speaker */
6683                 { }
6684         };
6685
6686         switch (action) {
6687         case HDA_FIXUP_ACT_PRE_PROBE:
6688                 snd_hda_apply_pincfgs(codec, pincfgs);
6689                 /* force front speaker to DAC1 */
6690                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6691                 break;
6692         }
6693 }
6694
6695 /* for hda_fixup_thinkpad_acpi() */
6696 #include "thinkpad_helper.c"
6697
6698 static void alc_fixup_thinkpad_acpi(struct hda_codec *codec,
6699                                     const struct hda_fixup *fix, int action)
6700 {
6701         alc_fixup_no_shutup(codec, fix, action); /* reduce click noise */
6702         hda_fixup_thinkpad_acpi(codec, fix, action);
6703 }
6704
6705 /* Fixup for Lenovo Legion 15IMHg05 speaker output on headset removal. */
6706 static void alc287_fixup_legion_15imhg05_speakers(struct hda_codec *codec,
6707                                                   const struct hda_fixup *fix,
6708                                                   int action)
6709 {
6710         struct alc_spec *spec = codec->spec;
6711
6712         switch (action) {
6713         case HDA_FIXUP_ACT_PRE_PROBE:
6714                 spec->gen.suppress_auto_mute = 1;
6715                 break;
6716         }
6717 }
6718
6719 static int comp_bind(struct device *dev)
6720 {
6721         struct hda_codec *cdc = dev_to_hda_codec(dev);
6722         struct alc_spec *spec = cdc->spec;
6723
6724         return component_bind_all(dev, spec->comps);
6725 }
6726
6727 static void comp_unbind(struct device *dev)
6728 {
6729         struct hda_codec *cdc = dev_to_hda_codec(dev);
6730         struct alc_spec *spec = cdc->spec;
6731
6732         component_unbind_all(dev, spec->comps);
6733 }
6734
6735 static const struct component_master_ops comp_master_ops = {
6736         .bind = comp_bind,
6737         .unbind = comp_unbind,
6738 };
6739
6740 static void comp_generic_playback_hook(struct hda_pcm_stream *hinfo, struct hda_codec *cdc,
6741                                        struct snd_pcm_substream *sub, int action)
6742 {
6743         struct alc_spec *spec = cdc->spec;
6744         int i;
6745
6746         for (i = 0; i < HDA_MAX_COMPONENTS; i++) {
6747                 if (spec->comps[i].dev && spec->comps[i].pre_playback_hook)
6748                         spec->comps[i].pre_playback_hook(spec->comps[i].dev, action);
6749         }
6750         for (i = 0; i < HDA_MAX_COMPONENTS; i++) {
6751                 if (spec->comps[i].dev && spec->comps[i].playback_hook)
6752                         spec->comps[i].playback_hook(spec->comps[i].dev, action);
6753         }
6754         for (i = 0; i < HDA_MAX_COMPONENTS; i++) {
6755                 if (spec->comps[i].dev && spec->comps[i].post_playback_hook)
6756                         spec->comps[i].post_playback_hook(spec->comps[i].dev, action);
6757         }
6758 }
6759
6760 struct scodec_dev_name {
6761         const char *bus;
6762         const char *hid;
6763         int index;
6764 };
6765
6766 /* match the device name in a slightly relaxed manner */
6767 static int comp_match_cs35l41_dev_name(struct device *dev, void *data)
6768 {
6769         struct scodec_dev_name *p = data;
6770         const char *d = dev_name(dev);
6771         int n = strlen(p->bus);
6772         char tmp[32];
6773
6774         /* check the bus name */
6775         if (strncmp(d, p->bus, n))
6776                 return 0;
6777         /* skip the bus number */
6778         if (isdigit(d[n]))
6779                 n++;
6780         /* the rest must be exact matching */
6781         snprintf(tmp, sizeof(tmp), "-%s:00-cs35l41-hda.%d", p->hid, p->index);
6782         return !strcmp(d + n, tmp);
6783 }
6784
6785 static int comp_match_tas2781_dev_name(struct device *dev,
6786         void *data)
6787 {
6788         struct scodec_dev_name *p = data;
6789         const char *d = dev_name(dev);
6790         int n = strlen(p->bus);
6791         char tmp[32];
6792
6793         /* check the bus name */
6794         if (strncmp(d, p->bus, n))
6795                 return 0;
6796         /* skip the bus number */
6797         if (isdigit(d[n]))
6798                 n++;
6799         /* the rest must be exact matching */
6800         snprintf(tmp, sizeof(tmp), "-%s:00", p->hid);
6801
6802         return !strcmp(d + n, tmp);
6803 }
6804
6805 static void cs35l41_generic_fixup(struct hda_codec *cdc, int action, const char *bus,
6806                                   const char *hid, int count)
6807 {
6808         struct device *dev = hda_codec_dev(cdc);
6809         struct alc_spec *spec = cdc->spec;
6810         struct scodec_dev_name *rec;
6811         int ret, i;
6812
6813         switch (action) {
6814         case HDA_FIXUP_ACT_PRE_PROBE:
6815                 for (i = 0; i < count; i++) {
6816                         rec = devm_kmalloc(dev, sizeof(*rec), GFP_KERNEL);
6817                         if (!rec)
6818                                 return;
6819                         rec->bus = bus;
6820                         rec->hid = hid;
6821                         rec->index = i;
6822                         spec->comps[i].codec = cdc;
6823                         component_match_add(dev, &spec->match,
6824                                             comp_match_cs35l41_dev_name, rec);
6825                 }
6826                 ret = component_master_add_with_match(dev, &comp_master_ops, spec->match);
6827                 if (ret)
6828                         codec_err(cdc, "Fail to register component aggregator %d\n", ret);
6829                 else
6830                         spec->gen.pcm_playback_hook = comp_generic_playback_hook;
6831                 break;
6832         case HDA_FIXUP_ACT_FREE:
6833                 component_master_del(dev, &comp_master_ops);
6834                 break;
6835         }
6836 }
6837
6838 static void tas2781_generic_fixup(struct hda_codec *cdc, int action,
6839         const char *bus, const char *hid)
6840 {
6841         struct device *dev = hda_codec_dev(cdc);
6842         struct alc_spec *spec = cdc->spec;
6843         struct scodec_dev_name *rec;
6844         int ret;
6845
6846         switch (action) {
6847         case HDA_FIXUP_ACT_PRE_PROBE:
6848                 rec = devm_kmalloc(dev, sizeof(*rec), GFP_KERNEL);
6849                 if (!rec)
6850                         return;
6851                 rec->bus = bus;
6852                 rec->hid = hid;
6853                 rec->index = 0;
6854                 spec->comps[0].codec = cdc;
6855                 component_match_add(dev, &spec->match,
6856                         comp_match_tas2781_dev_name, rec);
6857                 ret = component_master_add_with_match(dev, &comp_master_ops,
6858                         spec->match);
6859                 if (ret)
6860                         codec_err(cdc,
6861                                 "Fail to register component aggregator %d\n",
6862                                 ret);
6863                 else
6864                         spec->gen.pcm_playback_hook =
6865                                 comp_generic_playback_hook;
6866                 break;
6867         case HDA_FIXUP_ACT_FREE:
6868                 component_master_del(dev, &comp_master_ops);
6869                 break;
6870         }
6871 }
6872
6873 static void cs35l41_fixup_i2c_two(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
6874 {
6875         cs35l41_generic_fixup(cdc, action, "i2c", "CSC3551", 2);
6876 }
6877
6878 static void cs35l41_fixup_spi_two(struct hda_codec *codec, const struct hda_fixup *fix, int action)
6879 {
6880         cs35l41_generic_fixup(codec, action, "spi", "CSC3551", 2);
6881 }
6882
6883 static void cs35l41_fixup_spi_four(struct hda_codec *codec, const struct hda_fixup *fix, int action)
6884 {
6885         cs35l41_generic_fixup(codec, action, "spi", "CSC3551", 4);
6886 }
6887
6888 static void alc287_fixup_legion_16achg6_speakers(struct hda_codec *cdc, const struct hda_fixup *fix,
6889                                                  int action)
6890 {
6891         cs35l41_generic_fixup(cdc, action, "i2c", "CLSA0100", 2);
6892 }
6893
6894 static void alc287_fixup_legion_16ithg6_speakers(struct hda_codec *cdc, const struct hda_fixup *fix,
6895                                                  int action)
6896 {
6897         cs35l41_generic_fixup(cdc, action, "i2c", "CLSA0101", 2);
6898 }
6899
6900 static void tas2781_fixup_i2c(struct hda_codec *cdc,
6901         const struct hda_fixup *fix, int action)
6902 {
6903          tas2781_generic_fixup(cdc, action, "i2c", "TIAS2781");
6904 }
6905
6906 /* for alc295_fixup_hp_top_speakers */
6907 #include "hp_x360_helper.c"
6908
6909 /* for alc285_fixup_ideapad_s740_coef() */
6910 #include "ideapad_s740_helper.c"
6911
6912 static const struct coef_fw alc256_fixup_set_coef_defaults_coefs[] = {
6913         WRITE_COEF(0x10, 0x0020), WRITE_COEF(0x24, 0x0000),
6914         WRITE_COEF(0x26, 0x0000), WRITE_COEF(0x29, 0x3000),
6915         WRITE_COEF(0x37, 0xfe05), WRITE_COEF(0x45, 0x5089),
6916         {}
6917 };
6918
6919 static void alc256_fixup_set_coef_defaults(struct hda_codec *codec,
6920                                            const struct hda_fixup *fix,
6921                                            int action)
6922 {
6923         /*
6924          * A certain other OS sets these coeffs to different values. On at least
6925          * one TongFang barebone these settings might survive even a cold
6926          * reboot. So to restore a clean slate the values are explicitly reset
6927          * to default here. Without this, the external microphone is always in a
6928          * plugged-in state, while the internal microphone is always in an
6929          * unplugged state, breaking the ability to use the internal microphone.
6930          */
6931         alc_process_coef_fw(codec, alc256_fixup_set_coef_defaults_coefs);
6932 }
6933
6934 static const struct coef_fw alc233_fixup_no_audio_jack_coefs[] = {
6935         WRITE_COEF(0x1a, 0x9003), WRITE_COEF(0x1b, 0x0e2b), WRITE_COEF(0x37, 0xfe06),
6936         WRITE_COEF(0x38, 0x4981), WRITE_COEF(0x45, 0xd489), WRITE_COEF(0x46, 0x0074),
6937         WRITE_COEF(0x49, 0x0149),
6938         {}
6939 };
6940
6941 static void alc233_fixup_no_audio_jack(struct hda_codec *codec,
6942                                        const struct hda_fixup *fix,
6943                                        int action)
6944 {
6945         /*
6946          * The audio jack input and output is not detected on the ASRock NUC Box
6947          * 1100 series when cold booting without this fix. Warm rebooting from a
6948          * certain other OS makes the audio functional, as COEF settings are
6949          * preserved in this case. This fix sets these altered COEF values as
6950          * the default.
6951          */
6952         alc_process_coef_fw(codec, alc233_fixup_no_audio_jack_coefs);
6953 }
6954
6955 static void alc256_fixup_mic_no_presence_and_resume(struct hda_codec *codec,
6956                                                     const struct hda_fixup *fix,
6957                                                     int action)
6958 {
6959         /*
6960          * The Clevo NJ51CU comes either with the ALC293 or the ALC256 codec,
6961          * but uses the 0x8686 subproduct id in both cases. The ALC256 codec
6962          * needs an additional quirk for sound working after suspend and resume.
6963          */
6964         if (codec->core.vendor_id == 0x10ec0256) {
6965                 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
6966                 snd_hda_codec_set_pincfg(codec, 0x19, 0x04a11120);
6967         } else {
6968                 snd_hda_codec_set_pincfg(codec, 0x1a, 0x04a1113c);
6969         }
6970 }
6971
6972 static void alc_fixup_dell4_mic_no_presence_quiet(struct hda_codec *codec,
6973                                                   const struct hda_fixup *fix,
6974                                                   int action)
6975 {
6976         struct alc_spec *spec = codec->spec;
6977         struct hda_input_mux *imux = &spec->gen.input_mux;
6978         int i;
6979
6980         alc269_fixup_limit_int_mic_boost(codec, fix, action);
6981
6982         switch (action) {
6983         case HDA_FIXUP_ACT_PRE_PROBE:
6984                 /**
6985                  * Set the vref of pin 0x19 (Headset Mic) and pin 0x1b (Headphone Mic)
6986                  * to Hi-Z to avoid pop noises at startup and when plugging and
6987                  * unplugging headphones.
6988                  */
6989                 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
6990                 snd_hda_codec_set_pin_target(codec, 0x1b, PIN_VREFHIZ);
6991                 break;
6992         case HDA_FIXUP_ACT_PROBE:
6993                 /**
6994                  * Make the internal mic (0x12) the default input source to
6995                  * prevent pop noises on cold boot.
6996                  */
6997                 for (i = 0; i < imux->num_items; i++) {
6998                         if (spec->gen.imux_pins[i] == 0x12) {
6999                                 spec->gen.cur_mux[0] = i;
7000                                 break;
7001                         }
7002                 }
7003                 break;
7004         }
7005 }
7006
7007 static void alc287_fixup_yoga9_14iap7_bass_spk_pin(struct hda_codec *codec,
7008                                           const struct hda_fixup *fix, int action)
7009 {
7010         /*
7011          * The Pin Complex 0x17 for the bass speakers is wrongly reported as
7012          * unconnected.
7013          */
7014         static const struct hda_pintbl pincfgs[] = {
7015                 { 0x17, 0x90170121 },
7016                 { }
7017         };
7018         /*
7019          * Avoid DAC 0x06 and 0x08, as they have no volume controls.
7020          * DAC 0x02 and 0x03 would be fine.
7021          */
7022         static const hda_nid_t conn[] = { 0x02, 0x03 };
7023         /*
7024          * Prefer both speakerbar (0x14) and bass speakers (0x17) connected to DAC 0x02.
7025          * Headphones (0x21) are connected to DAC 0x03.
7026          */
7027         static const hda_nid_t preferred_pairs[] = {
7028                 0x14, 0x02,
7029                 0x17, 0x02,
7030                 0x21, 0x03,
7031                 0
7032         };
7033         struct alc_spec *spec = codec->spec;
7034
7035         switch (action) {
7036         case HDA_FIXUP_ACT_PRE_PROBE:
7037                 snd_hda_apply_pincfgs(codec, pincfgs);
7038                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
7039                 spec->gen.preferred_dacs = preferred_pairs;
7040                 break;
7041         }
7042 }
7043
7044 static void alc295_fixup_dell_inspiron_top_speakers(struct hda_codec *codec,
7045                                           const struct hda_fixup *fix, int action)
7046 {
7047         static const struct hda_pintbl pincfgs[] = {
7048                 { 0x14, 0x90170151 },
7049                 { 0x17, 0x90170150 },
7050                 { }
7051         };
7052         static const hda_nid_t conn[] = { 0x02, 0x03 };
7053         static const hda_nid_t preferred_pairs[] = {
7054                 0x14, 0x02,
7055                 0x17, 0x03,
7056                 0x21, 0x02,
7057                 0
7058         };
7059         struct alc_spec *spec = codec->spec;
7060
7061         alc_fixup_no_shutup(codec, fix, action);
7062
7063         switch (action) {
7064         case HDA_FIXUP_ACT_PRE_PROBE:
7065                 snd_hda_apply_pincfgs(codec, pincfgs);
7066                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
7067                 spec->gen.preferred_dacs = preferred_pairs;
7068                 break;
7069         }
7070 }
7071
7072 /* Forcibly assign NID 0x03 to HP while NID 0x02 to SPK */
7073 static void alc287_fixup_bind_dacs(struct hda_codec *codec,
7074                                     const struct hda_fixup *fix, int action)
7075 {
7076         struct alc_spec *spec = codec->spec;
7077         static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */
7078         static const hda_nid_t preferred_pairs[] = {
7079                 0x17, 0x02, 0x21, 0x03, 0
7080         };
7081
7082         if (action != HDA_FIXUP_ACT_PRE_PROBE)
7083                 return;
7084
7085         snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
7086         spec->gen.preferred_dacs = preferred_pairs;
7087         spec->gen.auto_mute_via_amp = 1;
7088         if (spec->gen.autocfg.speaker_pins[0] != 0x14) {
7089                 snd_hda_codec_write_cache(codec, 0x14, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
7090                                         0x0); /* Make sure 0x14 was disable */
7091         }
7092 }
7093 /* Fix none verb table of Headset Mic pin */
7094 static void alc_fixup_headset_mic(struct hda_codec *codec,
7095                                    const struct hda_fixup *fix, int action)
7096 {
7097         struct alc_spec *spec = codec->spec;
7098         static const struct hda_pintbl pincfgs[] = {
7099                 { 0x19, 0x03a1103c },
7100                 { }
7101         };
7102
7103         switch (action) {
7104         case HDA_FIXUP_ACT_PRE_PROBE:
7105                 snd_hda_apply_pincfgs(codec, pincfgs);
7106                 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
7107                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
7108                 break;
7109         }
7110 }
7111
7112
7113 enum {
7114         ALC269_FIXUP_GPIO2,
7115         ALC269_FIXUP_SONY_VAIO,
7116         ALC275_FIXUP_SONY_VAIO_GPIO2,
7117         ALC269_FIXUP_DELL_M101Z,
7118         ALC269_FIXUP_SKU_IGNORE,
7119         ALC269_FIXUP_ASUS_G73JW,
7120         ALC269_FIXUP_ASUS_N7601ZM_PINS,
7121         ALC269_FIXUP_ASUS_N7601ZM,
7122         ALC269_FIXUP_LENOVO_EAPD,
7123         ALC275_FIXUP_SONY_HWEQ,
7124         ALC275_FIXUP_SONY_DISABLE_AAMIX,
7125         ALC271_FIXUP_DMIC,
7126         ALC269_FIXUP_PCM_44K,
7127         ALC269_FIXUP_STEREO_DMIC,
7128         ALC269_FIXUP_HEADSET_MIC,
7129         ALC269_FIXUP_QUANTA_MUTE,
7130         ALC269_FIXUP_LIFEBOOK,
7131         ALC269_FIXUP_LIFEBOOK_EXTMIC,
7132         ALC269_FIXUP_LIFEBOOK_HP_PIN,
7133         ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT,
7134         ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC,
7135         ALC269_FIXUP_AMIC,
7136         ALC269_FIXUP_DMIC,
7137         ALC269VB_FIXUP_AMIC,
7138         ALC269VB_FIXUP_DMIC,
7139         ALC269_FIXUP_HP_MUTE_LED,
7140         ALC269_FIXUP_HP_MUTE_LED_MIC1,
7141         ALC269_FIXUP_HP_MUTE_LED_MIC2,
7142         ALC269_FIXUP_HP_MUTE_LED_MIC3,
7143         ALC269_FIXUP_HP_GPIO_LED,
7144         ALC269_FIXUP_HP_GPIO_MIC1_LED,
7145         ALC269_FIXUP_HP_LINE1_MIC1_LED,
7146         ALC269_FIXUP_INV_DMIC,
7147         ALC269_FIXUP_LENOVO_DOCK,
7148         ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST,
7149         ALC269_FIXUP_NO_SHUTUP,
7150         ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
7151         ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
7152         ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
7153         ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
7154         ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
7155         ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
7156         ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET,
7157         ALC269_FIXUP_HEADSET_MODE,
7158         ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
7159         ALC269_FIXUP_ASPIRE_HEADSET_MIC,
7160         ALC269_FIXUP_ASUS_X101_FUNC,
7161         ALC269_FIXUP_ASUS_X101_VERB,
7162         ALC269_FIXUP_ASUS_X101,
7163         ALC271_FIXUP_AMIC_MIC2,
7164         ALC271_FIXUP_HP_GATE_MIC_JACK,
7165         ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572,
7166         ALC269_FIXUP_ACER_AC700,
7167         ALC269_FIXUP_LIMIT_INT_MIC_BOOST,
7168         ALC269VB_FIXUP_ASUS_ZENBOOK,
7169         ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,
7170         ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE,
7171         ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,
7172         ALC269VB_FIXUP_ORDISSIMO_EVE2,
7173         ALC283_FIXUP_CHROME_BOOK,
7174         ALC283_FIXUP_SENSE_COMBO_JACK,
7175         ALC282_FIXUP_ASUS_TX300,
7176         ALC283_FIXUP_INT_MIC,
7177         ALC290_FIXUP_MONO_SPEAKERS,
7178         ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
7179         ALC290_FIXUP_SUBWOOFER,
7180         ALC290_FIXUP_SUBWOOFER_HSJACK,
7181         ALC269_FIXUP_THINKPAD_ACPI,
7182         ALC269_FIXUP_DMIC_THINKPAD_ACPI,
7183         ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO,
7184         ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
7185         ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
7186         ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7187         ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
7188         ALC255_FIXUP_HEADSET_MODE,
7189         ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
7190         ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
7191         ALC292_FIXUP_TPT440_DOCK,
7192         ALC292_FIXUP_TPT440,
7193         ALC283_FIXUP_HEADSET_MIC,
7194         ALC255_FIXUP_MIC_MUTE_LED,
7195         ALC282_FIXUP_ASPIRE_V5_PINS,
7196         ALC269VB_FIXUP_ASPIRE_E1_COEF,
7197         ALC280_FIXUP_HP_GPIO4,
7198         ALC286_FIXUP_HP_GPIO_LED,
7199         ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
7200         ALC280_FIXUP_HP_DOCK_PINS,
7201         ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,
7202         ALC280_FIXUP_HP_9480M,
7203         ALC245_FIXUP_HP_X360_AMP,
7204         ALC285_FIXUP_HP_SPECTRE_X360_EB1,
7205         ALC288_FIXUP_DELL_HEADSET_MODE,
7206         ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
7207         ALC288_FIXUP_DELL_XPS_13,
7208         ALC288_FIXUP_DISABLE_AAMIX,
7209         ALC292_FIXUP_DELL_E7X_AAMIX,
7210         ALC292_FIXUP_DELL_E7X,
7211         ALC292_FIXUP_DISABLE_AAMIX,
7212         ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK,
7213         ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
7214         ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
7215         ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
7216         ALC275_FIXUP_DELL_XPS,
7217         ALC293_FIXUP_LENOVO_SPK_NOISE,
7218         ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
7219         ALC255_FIXUP_DELL_SPK_NOISE,
7220         ALC225_FIXUP_DISABLE_MIC_VREF,
7221         ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
7222         ALC295_FIXUP_DISABLE_DAC3,
7223         ALC285_FIXUP_SPEAKER2_TO_DAC1,
7224         ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1,
7225         ALC285_FIXUP_ASUS_HEADSET_MIC,
7226         ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS,
7227         ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1,
7228         ALC285_FIXUP_ASUS_I2C_HEADSET_MIC,
7229         ALC280_FIXUP_HP_HEADSET_MIC,
7230         ALC221_FIXUP_HP_FRONT_MIC,
7231         ALC292_FIXUP_TPT460,
7232         ALC298_FIXUP_SPK_VOLUME,
7233         ALC298_FIXUP_LENOVO_SPK_VOLUME,
7234         ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER,
7235         ALC269_FIXUP_ATIV_BOOK_8,
7236         ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE,
7237         ALC221_FIXUP_HP_MIC_NO_PRESENCE,
7238         ALC256_FIXUP_ASUS_HEADSET_MODE,
7239         ALC256_FIXUP_ASUS_MIC,
7240         ALC256_FIXUP_ASUS_AIO_GPIO2,
7241         ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,
7242         ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,
7243         ALC233_FIXUP_LENOVO_MULTI_CODECS,
7244         ALC233_FIXUP_ACER_HEADSET_MIC,
7245         ALC294_FIXUP_LENOVO_MIC_LOCATION,
7246         ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE,
7247         ALC225_FIXUP_S3_POP_NOISE,
7248         ALC700_FIXUP_INTEL_REFERENCE,
7249         ALC274_FIXUP_DELL_BIND_DACS,
7250         ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
7251         ALC298_FIXUP_TPT470_DOCK_FIX,
7252         ALC298_FIXUP_TPT470_DOCK,
7253         ALC255_FIXUP_DUMMY_LINEOUT_VERB,
7254         ALC255_FIXUP_DELL_HEADSET_MIC,
7255         ALC256_FIXUP_HUAWEI_MACH_WX9_PINS,
7256         ALC298_FIXUP_HUAWEI_MBX_STEREO,
7257         ALC295_FIXUP_HP_X360,
7258         ALC221_FIXUP_HP_HEADSET_MIC,
7259         ALC285_FIXUP_LENOVO_HEADPHONE_NOISE,
7260         ALC295_FIXUP_HP_AUTO_MUTE,
7261         ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
7262         ALC294_FIXUP_ASUS_MIC,
7263         ALC294_FIXUP_ASUS_HEADSET_MIC,
7264         ALC294_FIXUP_ASUS_SPK,
7265         ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
7266         ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
7267         ALC255_FIXUP_ACER_HEADSET_MIC,
7268         ALC295_FIXUP_CHROME_BOOK,
7269         ALC225_FIXUP_HEADSET_JACK,
7270         ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE,
7271         ALC225_FIXUP_WYSE_AUTO_MUTE,
7272         ALC225_FIXUP_WYSE_DISABLE_MIC_VREF,
7273         ALC286_FIXUP_ACER_AIO_HEADSET_MIC,
7274         ALC256_FIXUP_ASUS_HEADSET_MIC,
7275         ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
7276         ALC299_FIXUP_PREDATOR_SPK,
7277         ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE,
7278         ALC289_FIXUP_DELL_SPK1,
7279         ALC289_FIXUP_DELL_SPK2,
7280         ALC289_FIXUP_DUAL_SPK,
7281         ALC289_FIXUP_RTK_AMP_DUAL_SPK,
7282         ALC294_FIXUP_SPK2_TO_DAC1,
7283         ALC294_FIXUP_ASUS_DUAL_SPK,
7284         ALC285_FIXUP_THINKPAD_X1_GEN7,
7285         ALC285_FIXUP_THINKPAD_HEADSET_JACK,
7286         ALC294_FIXUP_ASUS_ALLY,
7287         ALC294_FIXUP_ASUS_ALLY_PINS,
7288         ALC294_FIXUP_ASUS_ALLY_VERBS,
7289         ALC294_FIXUP_ASUS_ALLY_SPEAKER,
7290         ALC294_FIXUP_ASUS_HPE,
7291         ALC294_FIXUP_ASUS_COEF_1B,
7292         ALC294_FIXUP_ASUS_GX502_HP,
7293         ALC294_FIXUP_ASUS_GX502_PINS,
7294         ALC294_FIXUP_ASUS_GX502_VERBS,
7295         ALC294_FIXUP_ASUS_GU502_HP,
7296         ALC294_FIXUP_ASUS_GU502_PINS,
7297         ALC294_FIXUP_ASUS_GU502_VERBS,
7298         ALC294_FIXUP_ASUS_G513_PINS,
7299         ALC285_FIXUP_ASUS_G533Z_PINS,
7300         ALC285_FIXUP_HP_GPIO_LED,
7301         ALC285_FIXUP_HP_MUTE_LED,
7302         ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED,
7303         ALC236_FIXUP_HP_MUTE_LED_COEFBIT2,
7304         ALC236_FIXUP_HP_GPIO_LED,
7305         ALC236_FIXUP_HP_MUTE_LED,
7306         ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
7307         ALC298_FIXUP_SAMSUNG_AMP,
7308         ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
7309         ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
7310         ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
7311         ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS,
7312         ALC269VC_FIXUP_ACER_HEADSET_MIC,
7313         ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE,
7314         ALC289_FIXUP_ASUS_GA401,
7315         ALC289_FIXUP_ASUS_GA502,
7316         ALC256_FIXUP_ACER_MIC_NO_PRESENCE,
7317         ALC285_FIXUP_HP_GPIO_AMP_INIT,
7318         ALC269_FIXUP_CZC_B20,
7319         ALC269_FIXUP_CZC_TMI,
7320         ALC269_FIXUP_CZC_L101,
7321         ALC269_FIXUP_LEMOTE_A1802,
7322         ALC269_FIXUP_LEMOTE_A190X,
7323         ALC256_FIXUP_INTEL_NUC8_RUGGED,
7324         ALC233_FIXUP_INTEL_NUC8_DMIC,
7325         ALC233_FIXUP_INTEL_NUC8_BOOST,
7326         ALC256_FIXUP_INTEL_NUC10,
7327         ALC255_FIXUP_XIAOMI_HEADSET_MIC,
7328         ALC274_FIXUP_HP_MIC,
7329         ALC274_FIXUP_HP_HEADSET_MIC,
7330         ALC274_FIXUP_HP_ENVY_GPIO,
7331         ALC256_FIXUP_ASUS_HPE,
7332         ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
7333         ALC287_FIXUP_HP_GPIO_LED,
7334         ALC256_FIXUP_HP_HEADSET_MIC,
7335         ALC245_FIXUP_HP_GPIO_LED,
7336         ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
7337         ALC282_FIXUP_ACER_DISABLE_LINEOUT,
7338         ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST,
7339         ALC256_FIXUP_ACER_HEADSET_MIC,
7340         ALC285_FIXUP_IDEAPAD_S740_COEF,
7341         ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST,
7342         ALC295_FIXUP_ASUS_DACS,
7343         ALC295_FIXUP_HP_OMEN,
7344         ALC285_FIXUP_HP_SPECTRE_X360,
7345         ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP,
7346         ALC623_FIXUP_LENOVO_THINKSTATION_P340,
7347         ALC255_FIXUP_ACER_HEADPHONE_AND_MIC,
7348         ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST,
7349         ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS,
7350         ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
7351         ALC287_FIXUP_YOGA7_14ITL_SPEAKERS,
7352         ALC298_FIXUP_LENOVO_C940_DUET7,
7353         ALC287_FIXUP_13S_GEN2_SPEAKERS,
7354         ALC256_FIXUP_SET_COEF_DEFAULTS,
7355         ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
7356         ALC233_FIXUP_NO_AUDIO_JACK,
7357         ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME,
7358         ALC285_FIXUP_LEGION_Y9000X_SPEAKERS,
7359         ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
7360         ALC287_FIXUP_LEGION_16ACHG6,
7361         ALC287_FIXUP_CS35L41_I2C_2,
7362         ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED,
7363         ALC245_FIXUP_CS35L41_SPI_2,
7364         ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED,
7365         ALC245_FIXUP_CS35L41_SPI_4,
7366         ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED,
7367         ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED,
7368         ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE,
7369         ALC287_FIXUP_LEGION_16ITHG6,
7370         ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK,
7371         ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN,
7372         ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS,
7373         ALC236_FIXUP_DELL_DUAL_CODECS,
7374         ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI,
7375         ALC287_FIXUP_TAS2781_I2C,
7376         ALC245_FIXUP_HP_MUTE_LED_COEFBIT,
7377         ALC245_FIXUP_HP_X360_MUTE_LEDS,
7378         ALC287_FIXUP_THINKPAD_I2S_SPK,
7379         ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD,
7380         ALC2XX_FIXUP_HEADSET_MIC,
7381         ALC289_FIXUP_DELL_CS35L41_SPI_2,
7382         ALC294_FIXUP_CS35L41_I2C_2,
7383 };
7384
7385 /* A special fixup for Lenovo C940 and Yoga Duet 7;
7386  * both have the very same PCI SSID, and we need to apply different fixups
7387  * depending on the codec ID
7388  */
7389 static void alc298_fixup_lenovo_c940_duet7(struct hda_codec *codec,
7390                                            const struct hda_fixup *fix,
7391                                            int action)
7392 {
7393         int id;
7394
7395         if (codec->core.vendor_id == 0x10ec0298)
7396                 id = ALC298_FIXUP_LENOVO_SPK_VOLUME; /* C940 */
7397         else
7398                 id = ALC287_FIXUP_YOGA7_14ITL_SPEAKERS; /* Duet 7 */
7399         __snd_hda_apply_fixup(codec, id, action, 0);
7400 }
7401
7402 static const struct hda_fixup alc269_fixups[] = {
7403         [ALC269_FIXUP_GPIO2] = {
7404                 .type = HDA_FIXUP_FUNC,
7405                 .v.func = alc_fixup_gpio2,
7406         },
7407         [ALC269_FIXUP_SONY_VAIO] = {
7408                 .type = HDA_FIXUP_PINCTLS,
7409                 .v.pins = (const struct hda_pintbl[]) {
7410                         {0x19, PIN_VREFGRD},
7411                         {}
7412                 }
7413         },
7414         [ALC275_FIXUP_SONY_VAIO_GPIO2] = {
7415                 .type = HDA_FIXUP_FUNC,
7416                 .v.func = alc275_fixup_gpio4_off,
7417                 .chained = true,
7418                 .chain_id = ALC269_FIXUP_SONY_VAIO
7419         },
7420         [ALC269_FIXUP_DELL_M101Z] = {
7421                 .type = HDA_FIXUP_VERBS,
7422                 .v.verbs = (const struct hda_verb[]) {
7423                         /* Enables internal speaker */
7424                         {0x20, AC_VERB_SET_COEF_INDEX, 13},
7425                         {0x20, AC_VERB_SET_PROC_COEF, 0x4040},
7426                         {}
7427                 }
7428         },
7429         [ALC269_FIXUP_SKU_IGNORE] = {
7430                 .type = HDA_FIXUP_FUNC,
7431                 .v.func = alc_fixup_sku_ignore,
7432         },
7433         [ALC269_FIXUP_ASUS_G73JW] = {
7434                 .type = HDA_FIXUP_PINS,
7435                 .v.pins = (const struct hda_pintbl[]) {
7436                         { 0x17, 0x99130111 }, /* subwoofer */
7437                         { }
7438                 }
7439         },
7440         [ALC269_FIXUP_ASUS_N7601ZM_PINS] = {
7441                 .type = HDA_FIXUP_PINS,
7442                 .v.pins = (const struct hda_pintbl[]) {
7443                         { 0x19, 0x03A11050 },
7444                         { 0x1a, 0x03A11C30 },
7445                         { 0x21, 0x03211420 },
7446                         { }
7447                 }
7448         },
7449         [ALC269_FIXUP_ASUS_N7601ZM] = {
7450                 .type = HDA_FIXUP_VERBS,
7451                 .v.verbs = (const struct hda_verb[]) {
7452                         {0x20, AC_VERB_SET_COEF_INDEX, 0x62},
7453                         {0x20, AC_VERB_SET_PROC_COEF, 0xa007},
7454                         {0x20, AC_VERB_SET_COEF_INDEX, 0x10},
7455                         {0x20, AC_VERB_SET_PROC_COEF, 0x8420},
7456                         {0x20, AC_VERB_SET_COEF_INDEX, 0x0f},
7457                         {0x20, AC_VERB_SET_PROC_COEF, 0x7774},
7458                         { }
7459                 },
7460                 .chained = true,
7461                 .chain_id = ALC269_FIXUP_ASUS_N7601ZM_PINS,
7462         },
7463         [ALC269_FIXUP_LENOVO_EAPD] = {
7464                 .type = HDA_FIXUP_VERBS,
7465                 .v.verbs = (const struct hda_verb[]) {
7466                         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
7467                         {}
7468                 }
7469         },
7470         [ALC275_FIXUP_SONY_HWEQ] = {
7471                 .type = HDA_FIXUP_FUNC,
7472                 .v.func = alc269_fixup_hweq,
7473                 .chained = true,
7474                 .chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
7475         },
7476         [ALC275_FIXUP_SONY_DISABLE_AAMIX] = {
7477                 .type = HDA_FIXUP_FUNC,
7478                 .v.func = alc_fixup_disable_aamix,
7479                 .chained = true,
7480                 .chain_id = ALC269_FIXUP_SONY_VAIO
7481         },
7482         [ALC271_FIXUP_DMIC] = {
7483                 .type = HDA_FIXUP_FUNC,
7484                 .v.func = alc271_fixup_dmic,
7485         },
7486         [ALC269_FIXUP_PCM_44K] = {
7487                 .type = HDA_FIXUP_FUNC,
7488                 .v.func = alc269_fixup_pcm_44k,
7489                 .chained = true,
7490                 .chain_id = ALC269_FIXUP_QUANTA_MUTE
7491         },
7492         [ALC269_FIXUP_STEREO_DMIC] = {
7493                 .type = HDA_FIXUP_FUNC,
7494                 .v.func = alc269_fixup_stereo_dmic,
7495         },
7496         [ALC269_FIXUP_HEADSET_MIC] = {
7497                 .type = HDA_FIXUP_FUNC,
7498                 .v.func = alc269_fixup_headset_mic,
7499         },
7500         [ALC269_FIXUP_QUANTA_MUTE] = {
7501                 .type = HDA_FIXUP_FUNC,
7502                 .v.func = alc269_fixup_quanta_mute,
7503         },
7504         [ALC269_FIXUP_LIFEBOOK] = {
7505                 .type = HDA_FIXUP_PINS,
7506                 .v.pins = (const struct hda_pintbl[]) {
7507                         { 0x1a, 0x2101103f }, /* dock line-out */
7508                         { 0x1b, 0x23a11040 }, /* dock mic-in */
7509                         { }
7510                 },
7511                 .chained = true,
7512                 .chain_id = ALC269_FIXUP_QUANTA_MUTE
7513         },
7514         [ALC269_FIXUP_LIFEBOOK_EXTMIC] = {
7515                 .type = HDA_FIXUP_PINS,
7516                 .v.pins = (const struct hda_pintbl[]) {
7517                         { 0x19, 0x01a1903c }, /* headset mic, with jack detect */
7518                         { }
7519                 },
7520         },
7521         [ALC269_FIXUP_LIFEBOOK_HP_PIN] = {
7522                 .type = HDA_FIXUP_PINS,
7523                 .v.pins = (const struct hda_pintbl[]) {
7524                         { 0x21, 0x0221102f }, /* HP out */
7525                         { }
7526                 },
7527         },
7528         [ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT] = {
7529                 .type = HDA_FIXUP_FUNC,
7530                 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
7531         },
7532         [ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = {
7533                 .type = HDA_FIXUP_FUNC,
7534                 .v.func = alc269_fixup_pincfg_U7x7_headset_mic,
7535         },
7536         [ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO] = {
7537                 .type = HDA_FIXUP_PINS,
7538                 .v.pins = (const struct hda_pintbl[]) {
7539                         { 0x18, 0x03a19020 }, /* headset mic */
7540                         { 0x1b, 0x90170150 }, /* speaker */
7541                         { }
7542                 },
7543         },
7544         [ALC269_FIXUP_AMIC] = {
7545                 .type = HDA_FIXUP_PINS,
7546                 .v.pins = (const struct hda_pintbl[]) {
7547                         { 0x14, 0x99130110 }, /* speaker */
7548                         { 0x15, 0x0121401f }, /* HP out */
7549                         { 0x18, 0x01a19c20 }, /* mic */
7550                         { 0x19, 0x99a3092f }, /* int-mic */
7551                         { }
7552                 },
7553         },
7554         [ALC269_FIXUP_DMIC] = {
7555                 .type = HDA_FIXUP_PINS,
7556                 .v.pins = (const struct hda_pintbl[]) {
7557                         { 0x12, 0x99a3092f }, /* int-mic */
7558                         { 0x14, 0x99130110 }, /* speaker */
7559                         { 0x15, 0x0121401f }, /* HP out */
7560                         { 0x18, 0x01a19c20 }, /* mic */
7561                         { }
7562                 },
7563         },
7564         [ALC269VB_FIXUP_AMIC] = {
7565                 .type = HDA_FIXUP_PINS,
7566                 .v.pins = (const struct hda_pintbl[]) {
7567                         { 0x14, 0x99130110 }, /* speaker */
7568                         { 0x18, 0x01a19c20 }, /* mic */
7569                         { 0x19, 0x99a3092f }, /* int-mic */
7570                         { 0x21, 0x0121401f }, /* HP out */
7571                         { }
7572                 },
7573         },
7574         [ALC269VB_FIXUP_DMIC] = {
7575                 .type = HDA_FIXUP_PINS,
7576                 .v.pins = (const struct hda_pintbl[]) {
7577                         { 0x12, 0x99a3092f }, /* int-mic */
7578                         { 0x14, 0x99130110 }, /* speaker */
7579                         { 0x18, 0x01a19c20 }, /* mic */
7580                         { 0x21, 0x0121401f }, /* HP out */
7581                         { }
7582                 },
7583         },
7584         [ALC269_FIXUP_HP_MUTE_LED] = {
7585                 .type = HDA_FIXUP_FUNC,
7586                 .v.func = alc269_fixup_hp_mute_led,
7587         },
7588         [ALC269_FIXUP_HP_MUTE_LED_MIC1] = {
7589                 .type = HDA_FIXUP_FUNC,
7590                 .v.func = alc269_fixup_hp_mute_led_mic1,
7591         },
7592         [ALC269_FIXUP_HP_MUTE_LED_MIC2] = {
7593                 .type = HDA_FIXUP_FUNC,
7594                 .v.func = alc269_fixup_hp_mute_led_mic2,
7595         },
7596         [ALC269_FIXUP_HP_MUTE_LED_MIC3] = {
7597                 .type = HDA_FIXUP_FUNC,
7598                 .v.func = alc269_fixup_hp_mute_led_mic3,
7599                 .chained = true,
7600                 .chain_id = ALC295_FIXUP_HP_AUTO_MUTE
7601         },
7602         [ALC269_FIXUP_HP_GPIO_LED] = {
7603                 .type = HDA_FIXUP_FUNC,
7604                 .v.func = alc269_fixup_hp_gpio_led,
7605         },
7606         [ALC269_FIXUP_HP_GPIO_MIC1_LED] = {
7607                 .type = HDA_FIXUP_FUNC,
7608                 .v.func = alc269_fixup_hp_gpio_mic1_led,
7609         },
7610         [ALC269_FIXUP_HP_LINE1_MIC1_LED] = {
7611                 .type = HDA_FIXUP_FUNC,
7612                 .v.func = alc269_fixup_hp_line1_mic1_led,
7613         },
7614         [ALC269_FIXUP_INV_DMIC] = {
7615                 .type = HDA_FIXUP_FUNC,
7616                 .v.func = alc_fixup_inv_dmic,
7617         },
7618         [ALC269_FIXUP_NO_SHUTUP] = {
7619                 .type = HDA_FIXUP_FUNC,
7620                 .v.func = alc_fixup_no_shutup,
7621         },
7622         [ALC269_FIXUP_LENOVO_DOCK] = {
7623                 .type = HDA_FIXUP_PINS,
7624                 .v.pins = (const struct hda_pintbl[]) {
7625                         { 0x19, 0x23a11040 }, /* dock mic */
7626                         { 0x1b, 0x2121103f }, /* dock headphone */
7627                         { }
7628                 },
7629                 .chained = true,
7630                 .chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT
7631         },
7632         [ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST] = {
7633                 .type = HDA_FIXUP_FUNC,
7634                 .v.func = alc269_fixup_limit_int_mic_boost,
7635                 .chained = true,
7636                 .chain_id = ALC269_FIXUP_LENOVO_DOCK,
7637         },
7638         [ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = {
7639                 .type = HDA_FIXUP_FUNC,
7640                 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
7641                 .chained = true,
7642                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
7643         },
7644         [ALC269_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7645                 .type = HDA_FIXUP_PINS,
7646                 .v.pins = (const struct hda_pintbl[]) {
7647                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7648                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7649                         { }
7650                 },
7651                 .chained = true,
7652                 .chain_id = ALC269_FIXUP_HEADSET_MODE
7653         },
7654         [ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {
7655                 .type = HDA_FIXUP_PINS,
7656                 .v.pins = (const struct hda_pintbl[]) {
7657                         { 0x16, 0x21014020 }, /* dock line out */
7658                         { 0x19, 0x21a19030 }, /* dock mic */
7659                         { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7660                         { }
7661                 },
7662                 .chained = true,
7663                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7664         },
7665         [ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = {
7666                 .type = HDA_FIXUP_PINS,
7667                 .v.pins = (const struct hda_pintbl[]) {
7668                         { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7669                         { }
7670                 },
7671                 .chained = true,
7672                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7673         },
7674         [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = {
7675                 .type = HDA_FIXUP_PINS,
7676                 .v.pins = (const struct hda_pintbl[]) {
7677                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7678                         { 0x1b, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7679                         { }
7680                 },
7681                 .chained = true,
7682                 .chain_id = ALC269_FIXUP_HEADSET_MODE
7683         },
7684         [ALC269_FIXUP_HEADSET_MODE] = {
7685                 .type = HDA_FIXUP_FUNC,
7686                 .v.func = alc_fixup_headset_mode,
7687                 .chained = true,
7688                 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
7689         },
7690         [ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
7691                 .type = HDA_FIXUP_FUNC,
7692                 .v.func = alc_fixup_headset_mode_no_hp_mic,
7693         },
7694         [ALC269_FIXUP_ASPIRE_HEADSET_MIC] = {
7695                 .type = HDA_FIXUP_PINS,
7696                 .v.pins = (const struct hda_pintbl[]) {
7697                         { 0x19, 0x01a1913c }, /* headset mic w/o jack detect */
7698                         { }
7699                 },
7700                 .chained = true,
7701                 .chain_id = ALC269_FIXUP_HEADSET_MODE,
7702         },
7703         [ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {
7704                 .type = HDA_FIXUP_PINS,
7705                 .v.pins = (const struct hda_pintbl[]) {
7706                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7707                         { }
7708                 },
7709                 .chained = true,
7710                 .chain_id = ALC269_FIXUP_HEADSET_MIC
7711         },
7712         [ALC256_FIXUP_HUAWEI_MACH_WX9_PINS] = {
7713                 .type = HDA_FIXUP_PINS,
7714                 .v.pins = (const struct hda_pintbl[]) {
7715                         {0x12, 0x90a60130},
7716                         {0x13, 0x40000000},
7717                         {0x14, 0x90170110},
7718                         {0x18, 0x411111f0},
7719                         {0x19, 0x04a11040},
7720                         {0x1a, 0x411111f0},
7721                         {0x1b, 0x90170112},
7722                         {0x1d, 0x40759a05},
7723                         {0x1e, 0x411111f0},
7724                         {0x21, 0x04211020},
7725                         { }
7726                 },
7727                 .chained = true,
7728                 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
7729         },
7730         [ALC298_FIXUP_HUAWEI_MBX_STEREO] = {
7731                 .type = HDA_FIXUP_FUNC,
7732                 .v.func = alc298_fixup_huawei_mbx_stereo,
7733                 .chained = true,
7734                 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
7735         },
7736         [ALC269_FIXUP_ASUS_X101_FUNC] = {
7737                 .type = HDA_FIXUP_FUNC,
7738                 .v.func = alc269_fixup_x101_headset_mic,
7739         },
7740         [ALC269_FIXUP_ASUS_X101_VERB] = {
7741                 .type = HDA_FIXUP_VERBS,
7742                 .v.verbs = (const struct hda_verb[]) {
7743                         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
7744                         {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
7745                         {0x20, AC_VERB_SET_PROC_COEF,  0x0310},
7746                         { }
7747                 },
7748                 .chained = true,
7749                 .chain_id = ALC269_FIXUP_ASUS_X101_FUNC
7750         },
7751         [ALC269_FIXUP_ASUS_X101] = {
7752                 .type = HDA_FIXUP_PINS,
7753                 .v.pins = (const struct hda_pintbl[]) {
7754                         { 0x18, 0x04a1182c }, /* Headset mic */
7755                         { }
7756                 },
7757                 .chained = true,
7758                 .chain_id = ALC269_FIXUP_ASUS_X101_VERB
7759         },
7760         [ALC271_FIXUP_AMIC_MIC2] = {
7761                 .type = HDA_FIXUP_PINS,
7762                 .v.pins = (const struct hda_pintbl[]) {
7763                         { 0x14, 0x99130110 }, /* speaker */
7764                         { 0x19, 0x01a19c20 }, /* mic */
7765                         { 0x1b, 0x99a7012f }, /* int-mic */
7766                         { 0x21, 0x0121401f }, /* HP out */
7767                         { }
7768                 },
7769         },
7770         [ALC271_FIXUP_HP_GATE_MIC_JACK] = {
7771                 .type = HDA_FIXUP_FUNC,
7772                 .v.func = alc271_hp_gate_mic_jack,
7773                 .chained = true,
7774                 .chain_id = ALC271_FIXUP_AMIC_MIC2,
7775         },
7776         [ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572] = {
7777                 .type = HDA_FIXUP_FUNC,
7778                 .v.func = alc269_fixup_limit_int_mic_boost,
7779                 .chained = true,
7780                 .chain_id = ALC271_FIXUP_HP_GATE_MIC_JACK,
7781         },
7782         [ALC269_FIXUP_ACER_AC700] = {
7783                 .type = HDA_FIXUP_PINS,
7784                 .v.pins = (const struct hda_pintbl[]) {
7785                         { 0x12, 0x99a3092f }, /* int-mic */
7786                         { 0x14, 0x99130110 }, /* speaker */
7787                         { 0x18, 0x03a11c20 }, /* mic */
7788                         { 0x1e, 0x0346101e }, /* SPDIF1 */
7789                         { 0x21, 0x0321101f }, /* HP out */
7790                         { }
7791                 },
7792                 .chained = true,
7793                 .chain_id = ALC271_FIXUP_DMIC,
7794         },
7795         [ALC269_FIXUP_LIMIT_INT_MIC_BOOST] = {
7796                 .type = HDA_FIXUP_FUNC,
7797                 .v.func = alc269_fixup_limit_int_mic_boost,
7798                 .chained = true,
7799                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
7800         },
7801         [ALC269VB_FIXUP_ASUS_ZENBOOK] = {
7802                 .type = HDA_FIXUP_FUNC,
7803                 .v.func = alc269_fixup_limit_int_mic_boost,
7804                 .chained = true,
7805                 .chain_id = ALC269VB_FIXUP_DMIC,
7806         },
7807         [ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A] = {
7808                 .type = HDA_FIXUP_VERBS,
7809                 .v.verbs = (const struct hda_verb[]) {
7810                         /* class-D output amp +5dB */
7811                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x12 },
7812                         { 0x20, AC_VERB_SET_PROC_COEF, 0x2800 },
7813                         {}
7814                 },
7815                 .chained = true,
7816                 .chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,
7817         },
7818         [ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7819                 .type = HDA_FIXUP_PINS,
7820                 .v.pins = (const struct hda_pintbl[]) {
7821                         { 0x18, 0x01a110f0 },  /* use as headset mic */
7822                         { }
7823                 },
7824                 .chained = true,
7825                 .chain_id = ALC269_FIXUP_HEADSET_MIC
7826         },
7827         [ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {
7828                 .type = HDA_FIXUP_FUNC,
7829                 .v.func = alc269_fixup_limit_int_mic_boost,
7830                 .chained = true,
7831                 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC1,
7832         },
7833         [ALC269VB_FIXUP_ORDISSIMO_EVE2] = {
7834                 .type = HDA_FIXUP_PINS,
7835                 .v.pins = (const struct hda_pintbl[]) {
7836                         { 0x12, 0x99a3092f }, /* int-mic */
7837                         { 0x18, 0x03a11d20 }, /* mic */
7838                         { 0x19, 0x411111f0 }, /* Unused bogus pin */
7839                         { }
7840                 },
7841         },
7842         [ALC283_FIXUP_CHROME_BOOK] = {
7843                 .type = HDA_FIXUP_FUNC,
7844                 .v.func = alc283_fixup_chromebook,
7845         },
7846         [ALC283_FIXUP_SENSE_COMBO_JACK] = {
7847                 .type = HDA_FIXUP_FUNC,
7848                 .v.func = alc283_fixup_sense_combo_jack,
7849                 .chained = true,
7850                 .chain_id = ALC283_FIXUP_CHROME_BOOK,
7851         },
7852         [ALC282_FIXUP_ASUS_TX300] = {
7853                 .type = HDA_FIXUP_FUNC,
7854                 .v.func = alc282_fixup_asus_tx300,
7855         },
7856         [ALC283_FIXUP_INT_MIC] = {
7857                 .type = HDA_FIXUP_VERBS,
7858                 .v.verbs = (const struct hda_verb[]) {
7859                         {0x20, AC_VERB_SET_COEF_INDEX, 0x1a},
7860                         {0x20, AC_VERB_SET_PROC_COEF, 0x0011},
7861                         { }
7862                 },
7863                 .chained = true,
7864                 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
7865         },
7866         [ALC290_FIXUP_SUBWOOFER_HSJACK] = {
7867                 .type = HDA_FIXUP_PINS,
7868                 .v.pins = (const struct hda_pintbl[]) {
7869                         { 0x17, 0x90170112 }, /* subwoofer */
7870                         { }
7871                 },
7872                 .chained = true,
7873                 .chain_id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
7874         },
7875         [ALC290_FIXUP_SUBWOOFER] = {
7876                 .type = HDA_FIXUP_PINS,
7877                 .v.pins = (const struct hda_pintbl[]) {
7878                         { 0x17, 0x90170112 }, /* subwoofer */
7879                         { }
7880                 },
7881                 .chained = true,
7882                 .chain_id = ALC290_FIXUP_MONO_SPEAKERS,
7883         },
7884         [ALC290_FIXUP_MONO_SPEAKERS] = {
7885                 .type = HDA_FIXUP_FUNC,
7886                 .v.func = alc290_fixup_mono_speakers,
7887         },
7888         [ALC290_FIXUP_MONO_SPEAKERS_HSJACK] = {
7889                 .type = HDA_FIXUP_FUNC,
7890                 .v.func = alc290_fixup_mono_speakers,
7891                 .chained = true,
7892                 .chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
7893         },
7894         [ALC269_FIXUP_THINKPAD_ACPI] = {
7895                 .type = HDA_FIXUP_FUNC,
7896                 .v.func = alc_fixup_thinkpad_acpi,
7897                 .chained = true,
7898                 .chain_id = ALC269_FIXUP_SKU_IGNORE,
7899         },
7900         [ALC269_FIXUP_DMIC_THINKPAD_ACPI] = {
7901                 .type = HDA_FIXUP_FUNC,
7902                 .v.func = alc_fixup_inv_dmic,
7903                 .chained = true,
7904                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
7905         },
7906         [ALC255_FIXUP_ACER_MIC_NO_PRESENCE] = {
7907                 .type = HDA_FIXUP_PINS,
7908                 .v.pins = (const struct hda_pintbl[]) {
7909                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7910                         { }
7911                 },
7912                 .chained = true,
7913                 .chain_id = ALC255_FIXUP_HEADSET_MODE
7914         },
7915         [ALC255_FIXUP_ASUS_MIC_NO_PRESENCE] = {
7916                 .type = HDA_FIXUP_PINS,
7917                 .v.pins = (const struct hda_pintbl[]) {
7918                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7919                         { }
7920                 },
7921                 .chained = true,
7922                 .chain_id = ALC255_FIXUP_HEADSET_MODE
7923         },
7924         [ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7925                 .type = HDA_FIXUP_PINS,
7926                 .v.pins = (const struct hda_pintbl[]) {
7927                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7928                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7929                         { }
7930                 },
7931                 .chained = true,
7932                 .chain_id = ALC255_FIXUP_HEADSET_MODE
7933         },
7934         [ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {
7935                 .type = HDA_FIXUP_PINS,
7936                 .v.pins = (const struct hda_pintbl[]) {
7937                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7938                         { }
7939                 },
7940                 .chained = true,
7941                 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
7942         },
7943         [ALC255_FIXUP_HEADSET_MODE] = {
7944                 .type = HDA_FIXUP_FUNC,
7945                 .v.func = alc_fixup_headset_mode_alc255,
7946                 .chained = true,
7947                 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
7948         },
7949         [ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
7950                 .type = HDA_FIXUP_FUNC,
7951                 .v.func = alc_fixup_headset_mode_alc255_no_hp_mic,
7952         },
7953         [ALC293_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7954                 .type = HDA_FIXUP_PINS,
7955                 .v.pins = (const struct hda_pintbl[]) {
7956                         { 0x18, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7957                         { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7958                         { }
7959                 },
7960                 .chained = true,
7961                 .chain_id = ALC269_FIXUP_HEADSET_MODE
7962         },
7963         [ALC292_FIXUP_TPT440_DOCK] = {
7964                 .type = HDA_FIXUP_FUNC,
7965                 .v.func = alc_fixup_tpt440_dock,
7966                 .chained = true,
7967                 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
7968         },
7969         [ALC292_FIXUP_TPT440] = {
7970                 .type = HDA_FIXUP_FUNC,
7971                 .v.func = alc_fixup_disable_aamix,
7972                 .chained = true,
7973                 .chain_id = ALC292_FIXUP_TPT440_DOCK,
7974         },
7975         [ALC283_FIXUP_HEADSET_MIC] = {
7976                 .type = HDA_FIXUP_PINS,
7977                 .v.pins = (const struct hda_pintbl[]) {
7978                         { 0x19, 0x04a110f0 },
7979                         { },
7980                 },
7981         },
7982         [ALC255_FIXUP_MIC_MUTE_LED] = {
7983                 .type = HDA_FIXUP_FUNC,
7984                 .v.func = alc_fixup_micmute_led,
7985         },
7986         [ALC282_FIXUP_ASPIRE_V5_PINS] = {
7987                 .type = HDA_FIXUP_PINS,
7988                 .v.pins = (const struct hda_pintbl[]) {
7989                         { 0x12, 0x90a60130 },
7990                         { 0x14, 0x90170110 },
7991                         { 0x17, 0x40000008 },
7992                         { 0x18, 0x411111f0 },
7993                         { 0x19, 0x01a1913c },
7994                         { 0x1a, 0x411111f0 },
7995                         { 0x1b, 0x411111f0 },
7996                         { 0x1d, 0x40f89b2d },
7997                         { 0x1e, 0x411111f0 },
7998                         { 0x21, 0x0321101f },
7999                         { },
8000                 },
8001         },
8002         [ALC269VB_FIXUP_ASPIRE_E1_COEF] = {
8003                 .type = HDA_FIXUP_FUNC,
8004                 .v.func = alc269vb_fixup_aspire_e1_coef,
8005         },
8006         [ALC280_FIXUP_HP_GPIO4] = {
8007                 .type = HDA_FIXUP_FUNC,
8008                 .v.func = alc280_fixup_hp_gpio4,
8009         },
8010         [ALC286_FIXUP_HP_GPIO_LED] = {
8011                 .type = HDA_FIXUP_FUNC,
8012                 .v.func = alc286_fixup_hp_gpio_led,
8013         },
8014         [ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY] = {
8015                 .type = HDA_FIXUP_FUNC,
8016                 .v.func = alc280_fixup_hp_gpio2_mic_hotkey,
8017         },
8018         [ALC280_FIXUP_HP_DOCK_PINS] = {
8019                 .type = HDA_FIXUP_PINS,
8020                 .v.pins = (const struct hda_pintbl[]) {
8021                         { 0x1b, 0x21011020 }, /* line-out */
8022                         { 0x1a, 0x01a1903c }, /* headset mic */
8023                         { 0x18, 0x2181103f }, /* line-in */
8024                         { },
8025                 },
8026                 .chained = true,
8027                 .chain_id = ALC280_FIXUP_HP_GPIO4
8028         },
8029         [ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {
8030                 .type = HDA_FIXUP_PINS,
8031                 .v.pins = (const struct hda_pintbl[]) {
8032                         { 0x1b, 0x21011020 }, /* line-out */
8033                         { 0x18, 0x2181103f }, /* line-in */
8034                         { },
8035                 },
8036                 .chained = true,
8037                 .chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED
8038         },
8039         [ALC280_FIXUP_HP_9480M] = {
8040                 .type = HDA_FIXUP_FUNC,
8041                 .v.func = alc280_fixup_hp_9480m,
8042         },
8043         [ALC245_FIXUP_HP_X360_AMP] = {
8044                 .type = HDA_FIXUP_FUNC,
8045                 .v.func = alc245_fixup_hp_x360_amp,
8046                 .chained = true,
8047                 .chain_id = ALC245_FIXUP_HP_GPIO_LED
8048         },
8049         [ALC288_FIXUP_DELL_HEADSET_MODE] = {
8050                 .type = HDA_FIXUP_FUNC,
8051                 .v.func = alc_fixup_headset_mode_dell_alc288,
8052                 .chained = true,
8053                 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
8054         },
8055         [ALC288_FIXUP_DELL1_MIC_NO_PRESENCE] = {
8056                 .type = HDA_FIXUP_PINS,
8057                 .v.pins = (const struct hda_pintbl[]) {
8058                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8059                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
8060                         { }
8061                 },
8062                 .chained = true,
8063                 .chain_id = ALC288_FIXUP_DELL_HEADSET_MODE
8064         },
8065         [ALC288_FIXUP_DISABLE_AAMIX] = {
8066                 .type = HDA_FIXUP_FUNC,
8067                 .v.func = alc_fixup_disable_aamix,
8068                 .chained = true,
8069                 .chain_id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE
8070         },
8071         [ALC288_FIXUP_DELL_XPS_13] = {
8072                 .type = HDA_FIXUP_FUNC,
8073                 .v.func = alc_fixup_dell_xps13,
8074                 .chained = true,
8075                 .chain_id = ALC288_FIXUP_DISABLE_AAMIX
8076         },
8077         [ALC292_FIXUP_DISABLE_AAMIX] = {
8078                 .type = HDA_FIXUP_FUNC,
8079                 .v.func = alc_fixup_disable_aamix,
8080                 .chained = true,
8081                 .chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE
8082         },
8083         [ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = {
8084                 .type = HDA_FIXUP_FUNC,
8085                 .v.func = alc_fixup_disable_aamix,
8086                 .chained = true,
8087                 .chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE
8088         },
8089         [ALC292_FIXUP_DELL_E7X_AAMIX] = {
8090                 .type = HDA_FIXUP_FUNC,
8091                 .v.func = alc_fixup_dell_xps13,
8092                 .chained = true,
8093                 .chain_id = ALC292_FIXUP_DISABLE_AAMIX
8094         },
8095         [ALC292_FIXUP_DELL_E7X] = {
8096                 .type = HDA_FIXUP_FUNC,
8097                 .v.func = alc_fixup_micmute_led,
8098                 /* micmute fixup must be applied at last */
8099                 .chained_before = true,
8100                 .chain_id = ALC292_FIXUP_DELL_E7X_AAMIX,
8101         },
8102         [ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE] = {
8103                 .type = HDA_FIXUP_PINS,
8104                 .v.pins = (const struct hda_pintbl[]) {
8105                         { 0x18, 0x01a1913c }, /* headset mic w/o jack detect */
8106                         { }
8107                 },
8108                 .chained_before = true,
8109                 .chain_id = ALC269_FIXUP_HEADSET_MODE,
8110         },
8111         [ALC298_FIXUP_DELL1_MIC_NO_PRESENCE] = {
8112                 .type = HDA_FIXUP_PINS,
8113                 .v.pins = (const struct hda_pintbl[]) {
8114                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8115                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
8116                         { }
8117                 },
8118                 .chained = true,
8119                 .chain_id = ALC269_FIXUP_HEADSET_MODE
8120         },
8121         [ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE] = {
8122                 .type = HDA_FIXUP_PINS,
8123                 .v.pins = (const struct hda_pintbl[]) {
8124                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8125                         { }
8126                 },
8127                 .chained = true,
8128                 .chain_id = ALC269_FIXUP_HEADSET_MODE
8129         },
8130         [ALC275_FIXUP_DELL_XPS] = {
8131                 .type = HDA_FIXUP_VERBS,
8132                 .v.verbs = (const struct hda_verb[]) {
8133                         /* Enables internal speaker */
8134                         {0x20, AC_VERB_SET_COEF_INDEX, 0x1f},
8135                         {0x20, AC_VERB_SET_PROC_COEF, 0x00c0},
8136                         {0x20, AC_VERB_SET_COEF_INDEX, 0x30},
8137                         {0x20, AC_VERB_SET_PROC_COEF, 0x00b1},
8138                         {}
8139                 }
8140         },
8141         [ALC293_FIXUP_LENOVO_SPK_NOISE] = {
8142                 .type = HDA_FIXUP_FUNC,
8143                 .v.func = alc_fixup_disable_aamix,
8144                 .chained = true,
8145                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
8146         },
8147         [ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = {
8148                 .type = HDA_FIXUP_FUNC,
8149                 .v.func = alc233_fixup_lenovo_line2_mic_hotkey,
8150         },
8151         [ALC233_FIXUP_INTEL_NUC8_DMIC] = {
8152                 .type = HDA_FIXUP_FUNC,
8153                 .v.func = alc_fixup_inv_dmic,
8154                 .chained = true,
8155                 .chain_id = ALC233_FIXUP_INTEL_NUC8_BOOST,
8156         },
8157         [ALC233_FIXUP_INTEL_NUC8_BOOST] = {
8158                 .type = HDA_FIXUP_FUNC,
8159                 .v.func = alc269_fixup_limit_int_mic_boost
8160         },
8161         [ALC255_FIXUP_DELL_SPK_NOISE] = {
8162                 .type = HDA_FIXUP_FUNC,
8163                 .v.func = alc_fixup_disable_aamix,
8164                 .chained = true,
8165                 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
8166         },
8167         [ALC225_FIXUP_DISABLE_MIC_VREF] = {
8168                 .type = HDA_FIXUP_FUNC,
8169                 .v.func = alc_fixup_disable_mic_vref,
8170                 .chained = true,
8171                 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
8172         },
8173         [ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = {
8174                 .type = HDA_FIXUP_VERBS,
8175                 .v.verbs = (const struct hda_verb[]) {
8176                         /* Disable pass-through path for FRONT 14h */
8177                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
8178                         { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
8179                         {}
8180                 },
8181                 .chained = true,
8182                 .chain_id = ALC225_FIXUP_DISABLE_MIC_VREF
8183         },
8184         [ALC280_FIXUP_HP_HEADSET_MIC] = {
8185                 .type = HDA_FIXUP_FUNC,
8186                 .v.func = alc_fixup_disable_aamix,
8187                 .chained = true,
8188                 .chain_id = ALC269_FIXUP_HEADSET_MIC,
8189         },
8190         [ALC221_FIXUP_HP_FRONT_MIC] = {
8191                 .type = HDA_FIXUP_PINS,
8192                 .v.pins = (const struct hda_pintbl[]) {
8193                         { 0x19, 0x02a19020 }, /* Front Mic */
8194                         { }
8195                 },
8196         },
8197         [ALC292_FIXUP_TPT460] = {
8198                 .type = HDA_FIXUP_FUNC,
8199                 .v.func = alc_fixup_tpt440_dock,
8200                 .chained = true,
8201                 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE,
8202         },
8203         [ALC298_FIXUP_SPK_VOLUME] = {
8204                 .type = HDA_FIXUP_FUNC,
8205                 .v.func = alc298_fixup_speaker_volume,
8206                 .chained = true,
8207                 .chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
8208         },
8209         [ALC298_FIXUP_LENOVO_SPK_VOLUME] = {
8210                 .type = HDA_FIXUP_FUNC,
8211                 .v.func = alc298_fixup_speaker_volume,
8212         },
8213         [ALC295_FIXUP_DISABLE_DAC3] = {
8214                 .type = HDA_FIXUP_FUNC,
8215                 .v.func = alc295_fixup_disable_dac3,
8216         },
8217         [ALC285_FIXUP_SPEAKER2_TO_DAC1] = {
8218                 .type = HDA_FIXUP_FUNC,
8219                 .v.func = alc285_fixup_speaker2_to_dac1,
8220                 .chained = true,
8221                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
8222         },
8223         [ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1] = {
8224                 .type = HDA_FIXUP_FUNC,
8225                 .v.func = alc285_fixup_speaker2_to_dac1,
8226                 .chained = true,
8227                 .chain_id = ALC245_FIXUP_CS35L41_SPI_2
8228         },
8229         [ALC285_FIXUP_ASUS_HEADSET_MIC] = {
8230                 .type = HDA_FIXUP_PINS,
8231                 .v.pins = (const struct hda_pintbl[]) {
8232                         { 0x19, 0x03a11050 },
8233                         { 0x1b, 0x03a11c30 },
8234                         { }
8235                 },
8236                 .chained = true,
8237                 .chain_id = ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1
8238         },
8239         [ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS] = {
8240                 .type = HDA_FIXUP_PINS,
8241                 .v.pins = (const struct hda_pintbl[]) {
8242                         { 0x14, 0x90170120 },
8243                         { }
8244                 },
8245                 .chained = true,
8246                 .chain_id = ALC285_FIXUP_ASUS_HEADSET_MIC
8247         },
8248         [ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1] = {
8249                 .type = HDA_FIXUP_FUNC,
8250                 .v.func = alc285_fixup_speaker2_to_dac1,
8251                 .chained = true,
8252                 .chain_id = ALC287_FIXUP_CS35L41_I2C_2
8253         },
8254         [ALC285_FIXUP_ASUS_I2C_HEADSET_MIC] = {
8255                 .type = HDA_FIXUP_PINS,
8256                 .v.pins = (const struct hda_pintbl[]) {
8257                         { 0x19, 0x03a11050 },
8258                         { 0x1b, 0x03a11c30 },
8259                         { }
8260                 },
8261                 .chained = true,
8262                 .chain_id = ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1
8263         },
8264         [ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
8265                 .type = HDA_FIXUP_PINS,
8266                 .v.pins = (const struct hda_pintbl[]) {
8267                         { 0x1b, 0x90170151 },
8268                         { }
8269                 },
8270                 .chained = true,
8271                 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
8272         },
8273         [ALC269_FIXUP_ATIV_BOOK_8] = {
8274                 .type = HDA_FIXUP_FUNC,
8275                 .v.func = alc_fixup_auto_mute_via_amp,
8276                 .chained = true,
8277                 .chain_id = ALC269_FIXUP_NO_SHUTUP
8278         },
8279         [ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE] = {
8280                 .type = HDA_FIXUP_PINS,
8281                 .v.pins = (const struct hda_pintbl[]) {
8282                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8283                         { 0x1a, 0x01813030 }, /* use as headphone mic, without its own jack detect */
8284                         { }
8285                 },
8286                 .chained = true,
8287                 .chain_id = ALC269_FIXUP_HEADSET_MODE
8288         },
8289         [ALC221_FIXUP_HP_MIC_NO_PRESENCE] = {
8290                 .type = HDA_FIXUP_PINS,
8291                 .v.pins = (const struct hda_pintbl[]) {
8292                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8293                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
8294                         { }
8295                 },
8296                 .chained = true,
8297                 .chain_id = ALC269_FIXUP_HEADSET_MODE
8298         },
8299         [ALC256_FIXUP_ASUS_HEADSET_MODE] = {
8300                 .type = HDA_FIXUP_FUNC,
8301                 .v.func = alc_fixup_headset_mode,
8302         },
8303         [ALC256_FIXUP_ASUS_MIC] = {
8304                 .type = HDA_FIXUP_PINS,
8305                 .v.pins = (const struct hda_pintbl[]) {
8306                         { 0x13, 0x90a60160 }, /* use as internal mic */
8307                         { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
8308                         { }
8309                 },
8310                 .chained = true,
8311                 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8312         },
8313         [ALC256_FIXUP_ASUS_AIO_GPIO2] = {
8314                 .type = HDA_FIXUP_FUNC,
8315                 /* Set up GPIO2 for the speaker amp */
8316                 .v.func = alc_fixup_gpio4,
8317         },
8318         [ALC233_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8319                 .type = HDA_FIXUP_PINS,
8320                 .v.pins = (const struct hda_pintbl[]) {
8321                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8322                         { }
8323                 },
8324                 .chained = true,
8325                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8326         },
8327         [ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE] = {
8328                 .type = HDA_FIXUP_VERBS,
8329                 .v.verbs = (const struct hda_verb[]) {
8330                         /* Enables internal speaker */
8331                         {0x20, AC_VERB_SET_COEF_INDEX, 0x40},
8332                         {0x20, AC_VERB_SET_PROC_COEF, 0x8800},
8333                         {}
8334                 },
8335                 .chained = true,
8336                 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
8337         },
8338         [ALC233_FIXUP_LENOVO_MULTI_CODECS] = {
8339                 .type = HDA_FIXUP_FUNC,
8340                 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
8341                 .chained = true,
8342                 .chain_id = ALC269_FIXUP_GPIO2
8343         },
8344         [ALC233_FIXUP_ACER_HEADSET_MIC] = {
8345                 .type = HDA_FIXUP_VERBS,
8346                 .v.verbs = (const struct hda_verb[]) {
8347                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
8348                         { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
8349                         { }
8350                 },
8351                 .chained = true,
8352                 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
8353         },
8354         [ALC294_FIXUP_LENOVO_MIC_LOCATION] = {
8355                 .type = HDA_FIXUP_PINS,
8356                 .v.pins = (const struct hda_pintbl[]) {
8357                         /* Change the mic location from front to right, otherwise there are
8358                            two front mics with the same name, pulseaudio can't handle them.
8359                            This is just a temporary workaround, after applying this fixup,
8360                            there will be one "Front Mic" and one "Mic" in this machine.
8361                          */
8362                         { 0x1a, 0x04a19040 },
8363                         { }
8364                 },
8365         },
8366         [ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE] = {
8367                 .type = HDA_FIXUP_PINS,
8368                 .v.pins = (const struct hda_pintbl[]) {
8369                         { 0x16, 0x0101102f }, /* Rear Headset HP */
8370                         { 0x19, 0x02a1913c }, /* use as Front headset mic, without its own jack detect */
8371                         { 0x1a, 0x01a19030 }, /* Rear Headset MIC */
8372                         { 0x1b, 0x02011020 },
8373                         { }
8374                 },
8375                 .chained = true,
8376                 .chain_id = ALC225_FIXUP_S3_POP_NOISE
8377         },
8378         [ALC225_FIXUP_S3_POP_NOISE] = {
8379                 .type = HDA_FIXUP_FUNC,
8380                 .v.func = alc225_fixup_s3_pop_noise,
8381                 .chained = true,
8382                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8383         },
8384         [ALC700_FIXUP_INTEL_REFERENCE] = {
8385                 .type = HDA_FIXUP_VERBS,
8386                 .v.verbs = (const struct hda_verb[]) {
8387                         /* Enables internal speaker */
8388                         {0x20, AC_VERB_SET_COEF_INDEX, 0x45},
8389                         {0x20, AC_VERB_SET_PROC_COEF, 0x5289},
8390                         {0x20, AC_VERB_SET_COEF_INDEX, 0x4A},
8391                         {0x20, AC_VERB_SET_PROC_COEF, 0x001b},
8392                         {0x58, AC_VERB_SET_COEF_INDEX, 0x00},
8393                         {0x58, AC_VERB_SET_PROC_COEF, 0x3888},
8394                         {0x20, AC_VERB_SET_COEF_INDEX, 0x6f},
8395                         {0x20, AC_VERB_SET_PROC_COEF, 0x2c0b},
8396                         {}
8397                 }
8398         },
8399         [ALC274_FIXUP_DELL_BIND_DACS] = {
8400                 .type = HDA_FIXUP_FUNC,
8401                 .v.func = alc274_fixup_bind_dacs,
8402                 .chained = true,
8403                 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
8404         },
8405         [ALC274_FIXUP_DELL_AIO_LINEOUT_VERB] = {
8406                 .type = HDA_FIXUP_PINS,
8407                 .v.pins = (const struct hda_pintbl[]) {
8408                         { 0x1b, 0x0401102f },
8409                         { }
8410                 },
8411                 .chained = true,
8412                 .chain_id = ALC274_FIXUP_DELL_BIND_DACS
8413         },
8414         [ALC298_FIXUP_TPT470_DOCK_FIX] = {
8415                 .type = HDA_FIXUP_FUNC,
8416                 .v.func = alc_fixup_tpt470_dock,
8417                 .chained = true,
8418                 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE
8419         },
8420         [ALC298_FIXUP_TPT470_DOCK] = {
8421                 .type = HDA_FIXUP_FUNC,
8422                 .v.func = alc_fixup_tpt470_dacs,
8423                 .chained = true,
8424                 .chain_id = ALC298_FIXUP_TPT470_DOCK_FIX
8425         },
8426         [ALC255_FIXUP_DUMMY_LINEOUT_VERB] = {
8427                 .type = HDA_FIXUP_PINS,
8428                 .v.pins = (const struct hda_pintbl[]) {
8429                         { 0x14, 0x0201101f },
8430                         { }
8431                 },
8432                 .chained = true,
8433                 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
8434         },
8435         [ALC255_FIXUP_DELL_HEADSET_MIC] = {
8436                 .type = HDA_FIXUP_PINS,
8437                 .v.pins = (const struct hda_pintbl[]) {
8438                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8439                         { }
8440                 },
8441                 .chained = true,
8442                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8443         },
8444         [ALC295_FIXUP_HP_X360] = {
8445                 .type = HDA_FIXUP_FUNC,
8446                 .v.func = alc295_fixup_hp_top_speakers,
8447                 .chained = true,
8448                 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC3
8449         },
8450         [ALC221_FIXUP_HP_HEADSET_MIC] = {
8451                 .type = HDA_FIXUP_PINS,
8452                 .v.pins = (const struct hda_pintbl[]) {
8453                         { 0x19, 0x0181313f},
8454                         { }
8455                 },
8456                 .chained = true,
8457                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8458         },
8459         [ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = {
8460                 .type = HDA_FIXUP_FUNC,
8461                 .v.func = alc285_fixup_invalidate_dacs,
8462                 .chained = true,
8463                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
8464         },
8465         [ALC295_FIXUP_HP_AUTO_MUTE] = {
8466                 .type = HDA_FIXUP_FUNC,
8467                 .v.func = alc_fixup_auto_mute_via_amp,
8468         },
8469         [ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE] = {
8470                 .type = HDA_FIXUP_PINS,
8471                 .v.pins = (const struct hda_pintbl[]) {
8472                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8473                         { }
8474                 },
8475                 .chained = true,
8476                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8477         },
8478         [ALC294_FIXUP_ASUS_MIC] = {
8479                 .type = HDA_FIXUP_PINS,
8480                 .v.pins = (const struct hda_pintbl[]) {
8481                         { 0x13, 0x90a60160 }, /* use as internal mic */
8482                         { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
8483                         { }
8484                 },
8485                 .chained = true,
8486                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8487         },
8488         [ALC294_FIXUP_ASUS_HEADSET_MIC] = {
8489                 .type = HDA_FIXUP_PINS,
8490                 .v.pins = (const struct hda_pintbl[]) {
8491                         { 0x19, 0x01a1103c }, /* use as headset mic */
8492                         { }
8493                 },
8494                 .chained = true,
8495                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8496         },
8497         [ALC294_FIXUP_ASUS_SPK] = {
8498                 .type = HDA_FIXUP_VERBS,
8499                 .v.verbs = (const struct hda_verb[]) {
8500                         /* Set EAPD high */
8501                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x40 },
8502                         { 0x20, AC_VERB_SET_PROC_COEF, 0x8800 },
8503                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
8504                         { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
8505                         { }
8506                 },
8507                 .chained = true,
8508                 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8509         },
8510         [ALC295_FIXUP_CHROME_BOOK] = {
8511                 .type = HDA_FIXUP_FUNC,
8512                 .v.func = alc295_fixup_chromebook,
8513                 .chained = true,
8514                 .chain_id = ALC225_FIXUP_HEADSET_JACK
8515         },
8516         [ALC225_FIXUP_HEADSET_JACK] = {
8517                 .type = HDA_FIXUP_FUNC,
8518                 .v.func = alc_fixup_headset_jack,
8519         },
8520         [ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
8521                 .type = HDA_FIXUP_PINS,
8522                 .v.pins = (const struct hda_pintbl[]) {
8523                         { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8524                         { }
8525                 },
8526                 .chained = true,
8527                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8528         },
8529         [ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE] = {
8530                 .type = HDA_FIXUP_VERBS,
8531                 .v.verbs = (const struct hda_verb[]) {
8532                         /* Disable PCBEEP-IN passthrough */
8533                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
8534                         { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
8535                         { }
8536                 },
8537                 .chained = true,
8538                 .chain_id = ALC285_FIXUP_LENOVO_HEADPHONE_NOISE
8539         },
8540         [ALC255_FIXUP_ACER_HEADSET_MIC] = {
8541                 .type = HDA_FIXUP_PINS,
8542                 .v.pins = (const struct hda_pintbl[]) {
8543                         { 0x19, 0x03a11130 },
8544                         { 0x1a, 0x90a60140 }, /* use as internal mic */
8545                         { }
8546                 },
8547                 .chained = true,
8548                 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
8549         },
8550         [ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE] = {
8551                 .type = HDA_FIXUP_PINS,
8552                 .v.pins = (const struct hda_pintbl[]) {
8553                         { 0x16, 0x01011020 }, /* Rear Line out */
8554                         { 0x19, 0x01a1913c }, /* use as Front headset mic, without its own jack detect */
8555                         { }
8556                 },
8557                 .chained = true,
8558                 .chain_id = ALC225_FIXUP_WYSE_AUTO_MUTE
8559         },
8560         [ALC225_FIXUP_WYSE_AUTO_MUTE] = {
8561                 .type = HDA_FIXUP_FUNC,
8562                 .v.func = alc_fixup_auto_mute_via_amp,
8563                 .chained = true,
8564                 .chain_id = ALC225_FIXUP_WYSE_DISABLE_MIC_VREF
8565         },
8566         [ALC225_FIXUP_WYSE_DISABLE_MIC_VREF] = {
8567                 .type = HDA_FIXUP_FUNC,
8568                 .v.func = alc_fixup_disable_mic_vref,
8569                 .chained = true,
8570                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8571         },
8572         [ALC286_FIXUP_ACER_AIO_HEADSET_MIC] = {
8573                 .type = HDA_FIXUP_VERBS,
8574                 .v.verbs = (const struct hda_verb[]) {
8575                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x4f },
8576                         { 0x20, AC_VERB_SET_PROC_COEF, 0x5029 },
8577                         { }
8578                 },
8579                 .chained = true,
8580                 .chain_id = ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE
8581         },
8582         [ALC256_FIXUP_ASUS_HEADSET_MIC] = {
8583                 .type = HDA_FIXUP_PINS,
8584                 .v.pins = (const struct hda_pintbl[]) {
8585                         { 0x19, 0x03a11020 }, /* headset mic with jack detect */
8586                         { }
8587                 },
8588                 .chained = true,
8589                 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8590         },
8591         [ALC256_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8592                 .type = HDA_FIXUP_PINS,
8593                 .v.pins = (const struct hda_pintbl[]) {
8594                         { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
8595                         { }
8596                 },
8597                 .chained = true,
8598                 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8599         },
8600         [ALC299_FIXUP_PREDATOR_SPK] = {
8601                 .type = HDA_FIXUP_PINS,
8602                 .v.pins = (const struct hda_pintbl[]) {
8603                         { 0x21, 0x90170150 }, /* use as headset mic, without its own jack detect */
8604                         { }
8605                 }
8606         },
8607         [ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE] = {
8608                 .type = HDA_FIXUP_PINS,
8609                 .v.pins = (const struct hda_pintbl[]) {
8610                         { 0x19, 0x04a11040 },
8611                         { 0x21, 0x04211020 },
8612                         { }
8613                 },
8614                 .chained = true,
8615                 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8616         },
8617         [ALC289_FIXUP_DELL_SPK1] = {
8618                 .type = HDA_FIXUP_PINS,
8619                 .v.pins = (const struct hda_pintbl[]) {
8620                         { 0x14, 0x90170140 },
8621                         { }
8622                 },
8623                 .chained = true,
8624                 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
8625         },
8626         [ALC289_FIXUP_DELL_SPK2] = {
8627                 .type = HDA_FIXUP_PINS,
8628                 .v.pins = (const struct hda_pintbl[]) {
8629                         { 0x17, 0x90170130 }, /* bass spk */
8630                         { }
8631                 },
8632                 .chained = true,
8633                 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
8634         },
8635         [ALC289_FIXUP_DUAL_SPK] = {
8636                 .type = HDA_FIXUP_FUNC,
8637                 .v.func = alc285_fixup_speaker2_to_dac1,
8638                 .chained = true,
8639                 .chain_id = ALC289_FIXUP_DELL_SPK2
8640         },
8641         [ALC289_FIXUP_RTK_AMP_DUAL_SPK] = {
8642                 .type = HDA_FIXUP_FUNC,
8643                 .v.func = alc285_fixup_speaker2_to_dac1,
8644                 .chained = true,
8645                 .chain_id = ALC289_FIXUP_DELL_SPK1
8646         },
8647         [ALC294_FIXUP_SPK2_TO_DAC1] = {
8648                 .type = HDA_FIXUP_FUNC,
8649                 .v.func = alc285_fixup_speaker2_to_dac1,
8650                 .chained = true,
8651                 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8652         },
8653         [ALC294_FIXUP_ASUS_DUAL_SPK] = {
8654                 .type = HDA_FIXUP_FUNC,
8655                 /* The GPIO must be pulled to initialize the AMP */
8656                 .v.func = alc_fixup_gpio4,
8657                 .chained = true,
8658                 .chain_id = ALC294_FIXUP_SPK2_TO_DAC1
8659         },
8660         [ALC294_FIXUP_ASUS_ALLY] = {
8661                 .type = HDA_FIXUP_FUNC,
8662                 .v.func = cs35l41_fixup_i2c_two,
8663                 .chained = true,
8664                 .chain_id = ALC294_FIXUP_ASUS_ALLY_PINS
8665         },
8666         [ALC294_FIXUP_ASUS_ALLY_PINS] = {
8667                 .type = HDA_FIXUP_PINS,
8668                 .v.pins = (const struct hda_pintbl[]) {
8669                         { 0x19, 0x03a11050 },
8670                         { 0x1a, 0x03a11c30 },
8671                         { 0x21, 0x03211420 },
8672                         { }
8673                 },
8674                 .chained = true,
8675                 .chain_id = ALC294_FIXUP_ASUS_ALLY_VERBS
8676         },
8677         [ALC294_FIXUP_ASUS_ALLY_VERBS] = {
8678                 .type = HDA_FIXUP_VERBS,
8679                 .v.verbs = (const struct hda_verb[]) {
8680                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
8681                         { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
8682                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x46 },
8683                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0004 },
8684                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x47 },
8685                         { 0x20, AC_VERB_SET_PROC_COEF, 0xa47a },
8686                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x49 },
8687                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0049},
8688                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x4a },
8689                         { 0x20, AC_VERB_SET_PROC_COEF, 0x201b },
8690                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x6b },
8691                         { 0x20, AC_VERB_SET_PROC_COEF, 0x4278},
8692                         { }
8693                 },
8694                 .chained = true,
8695                 .chain_id = ALC294_FIXUP_ASUS_ALLY_SPEAKER
8696         },
8697         [ALC294_FIXUP_ASUS_ALLY_SPEAKER] = {
8698                 .type = HDA_FIXUP_FUNC,
8699                 .v.func = alc285_fixup_speaker2_to_dac1,
8700         },
8701         [ALC285_FIXUP_THINKPAD_X1_GEN7] = {
8702                 .type = HDA_FIXUP_FUNC,
8703                 .v.func = alc285_fixup_thinkpad_x1_gen7,
8704                 .chained = true,
8705                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
8706         },
8707         [ALC285_FIXUP_THINKPAD_HEADSET_JACK] = {
8708                 .type = HDA_FIXUP_FUNC,
8709                 .v.func = alc_fixup_headset_jack,
8710                 .chained = true,
8711                 .chain_id = ALC285_FIXUP_THINKPAD_X1_GEN7
8712         },
8713         [ALC294_FIXUP_ASUS_HPE] = {
8714                 .type = HDA_FIXUP_VERBS,
8715                 .v.verbs = (const struct hda_verb[]) {
8716                         /* Set EAPD high */
8717                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
8718                         { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
8719                         { }
8720                 },
8721                 .chained = true,
8722                 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8723         },
8724         [ALC294_FIXUP_ASUS_GX502_PINS] = {
8725                 .type = HDA_FIXUP_PINS,
8726                 .v.pins = (const struct hda_pintbl[]) {
8727                         { 0x19, 0x03a11050 }, /* front HP mic */
8728                         { 0x1a, 0x01a11830 }, /* rear external mic */
8729                         { 0x21, 0x03211020 }, /* front HP out */
8730                         { }
8731                 },
8732                 .chained = true,
8733                 .chain_id = ALC294_FIXUP_ASUS_GX502_VERBS
8734         },
8735         [ALC294_FIXUP_ASUS_GX502_VERBS] = {
8736                 .type = HDA_FIXUP_VERBS,
8737                 .v.verbs = (const struct hda_verb[]) {
8738                         /* set 0x15 to HP-OUT ctrl */
8739                         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
8740                         /* unmute the 0x15 amp */
8741                         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
8742                         { }
8743                 },
8744                 .chained = true,
8745                 .chain_id = ALC294_FIXUP_ASUS_GX502_HP
8746         },
8747         [ALC294_FIXUP_ASUS_GX502_HP] = {
8748                 .type = HDA_FIXUP_FUNC,
8749                 .v.func = alc294_fixup_gx502_hp,
8750         },
8751         [ALC294_FIXUP_ASUS_GU502_PINS] = {
8752                 .type = HDA_FIXUP_PINS,
8753                 .v.pins = (const struct hda_pintbl[]) {
8754                         { 0x19, 0x01a11050 }, /* rear HP mic */
8755                         { 0x1a, 0x01a11830 }, /* rear external mic */
8756                         { 0x21, 0x012110f0 }, /* rear HP out */
8757                         { }
8758                 },
8759                 .chained = true,
8760                 .chain_id = ALC294_FIXUP_ASUS_GU502_VERBS
8761         },
8762         [ALC294_FIXUP_ASUS_GU502_VERBS] = {
8763                 .type = HDA_FIXUP_VERBS,
8764                 .v.verbs = (const struct hda_verb[]) {
8765                         /* set 0x15 to HP-OUT ctrl */
8766                         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
8767                         /* unmute the 0x15 amp */
8768                         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
8769                         /* set 0x1b to HP-OUT */
8770                         { 0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
8771                         { }
8772                 },
8773                 .chained = true,
8774                 .chain_id = ALC294_FIXUP_ASUS_GU502_HP
8775         },
8776         [ALC294_FIXUP_ASUS_GU502_HP] = {
8777                 .type = HDA_FIXUP_FUNC,
8778                 .v.func = alc294_fixup_gu502_hp,
8779         },
8780          [ALC294_FIXUP_ASUS_G513_PINS] = {
8781                 .type = HDA_FIXUP_PINS,
8782                 .v.pins = (const struct hda_pintbl[]) {
8783                                 { 0x19, 0x03a11050 }, /* front HP mic */
8784                                 { 0x1a, 0x03a11c30 }, /* rear external mic */
8785                                 { 0x21, 0x03211420 }, /* front HP out */
8786                                 { }
8787                 },
8788         },
8789         [ALC285_FIXUP_ASUS_G533Z_PINS] = {
8790                 .type = HDA_FIXUP_PINS,
8791                 .v.pins = (const struct hda_pintbl[]) {
8792                         { 0x14, 0x90170152 }, /* Speaker Surround Playback Switch */
8793                         { 0x19, 0x03a19020 }, /* Mic Boost Volume */
8794                         { 0x1a, 0x03a11c30 }, /* Mic Boost Volume */
8795                         { 0x1e, 0x90170151 }, /* Rear jack, IN OUT EAPD Detect */
8796                         { 0x21, 0x03211420 },
8797                         { }
8798                 },
8799         },
8800         [ALC294_FIXUP_ASUS_COEF_1B] = {
8801                 .type = HDA_FIXUP_VERBS,
8802                 .v.verbs = (const struct hda_verb[]) {
8803                         /* Set bit 10 to correct noisy output after reboot from
8804                          * Windows 10 (due to pop noise reduction?)
8805                          */
8806                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x1b },
8807                         { 0x20, AC_VERB_SET_PROC_COEF, 0x4e4b },
8808                         { }
8809                 },
8810                 .chained = true,
8811                 .chain_id = ALC289_FIXUP_ASUS_GA401,
8812         },
8813         [ALC285_FIXUP_HP_GPIO_LED] = {
8814                 .type = HDA_FIXUP_FUNC,
8815                 .v.func = alc285_fixup_hp_gpio_led,
8816         },
8817         [ALC285_FIXUP_HP_MUTE_LED] = {
8818                 .type = HDA_FIXUP_FUNC,
8819                 .v.func = alc285_fixup_hp_mute_led,
8820         },
8821         [ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED] = {
8822                 .type = HDA_FIXUP_FUNC,
8823                 .v.func = alc285_fixup_hp_spectre_x360_mute_led,
8824         },
8825         [ALC236_FIXUP_HP_MUTE_LED_COEFBIT2] = {
8826             .type = HDA_FIXUP_FUNC,
8827             .v.func = alc236_fixup_hp_mute_led_coefbit2,
8828         },
8829         [ALC236_FIXUP_HP_GPIO_LED] = {
8830                 .type = HDA_FIXUP_FUNC,
8831                 .v.func = alc236_fixup_hp_gpio_led,
8832         },
8833         [ALC236_FIXUP_HP_MUTE_LED] = {
8834                 .type = HDA_FIXUP_FUNC,
8835                 .v.func = alc236_fixup_hp_mute_led,
8836         },
8837         [ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF] = {
8838                 .type = HDA_FIXUP_FUNC,
8839                 .v.func = alc236_fixup_hp_mute_led_micmute_vref,
8840         },
8841         [ALC298_FIXUP_SAMSUNG_AMP] = {
8842                 .type = HDA_FIXUP_FUNC,
8843                 .v.func = alc298_fixup_samsung_amp,
8844                 .chained = true,
8845                 .chain_id = ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET
8846         },
8847         [ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
8848                 .type = HDA_FIXUP_VERBS,
8849                 .v.verbs = (const struct hda_verb[]) {
8850                         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc5 },
8851                         { }
8852                 },
8853         },
8854         [ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
8855                 .type = HDA_FIXUP_VERBS,
8856                 .v.verbs = (const struct hda_verb[]) {
8857                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x08},
8858                         { 0x20, AC_VERB_SET_PROC_COEF, 0x2fcf},
8859                         { }
8860                 },
8861         },
8862         [ALC295_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8863                 .type = HDA_FIXUP_PINS,
8864                 .v.pins = (const struct hda_pintbl[]) {
8865                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8866                         { }
8867                 },
8868                 .chained = true,
8869                 .chain_id = ALC269_FIXUP_HEADSET_MODE
8870         },
8871         [ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS] = {
8872                 .type = HDA_FIXUP_PINS,
8873                 .v.pins = (const struct hda_pintbl[]) {
8874                         { 0x14, 0x90100120 }, /* use as internal speaker */
8875                         { 0x18, 0x02a111f0 }, /* use as headset mic, without its own jack detect */
8876                         { 0x1a, 0x01011020 }, /* use as line out */
8877                         { },
8878                 },
8879                 .chained = true,
8880                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8881         },
8882         [ALC269VC_FIXUP_ACER_HEADSET_MIC] = {
8883                 .type = HDA_FIXUP_PINS,
8884                 .v.pins = (const struct hda_pintbl[]) {
8885                         { 0x18, 0x02a11030 }, /* use as headset mic */
8886                         { }
8887                 },
8888                 .chained = true,
8889                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8890         },
8891         [ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE] = {
8892                 .type = HDA_FIXUP_PINS,
8893                 .v.pins = (const struct hda_pintbl[]) {
8894                         { 0x18, 0x01a11130 }, /* use as headset mic, without its own jack detect */
8895                         { }
8896                 },
8897                 .chained = true,
8898                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8899         },
8900         [ALC289_FIXUP_ASUS_GA401] = {
8901                 .type = HDA_FIXUP_FUNC,
8902                 .v.func = alc289_fixup_asus_ga401,
8903                 .chained = true,
8904                 .chain_id = ALC289_FIXUP_ASUS_GA502,
8905         },
8906         [ALC289_FIXUP_ASUS_GA502] = {
8907                 .type = HDA_FIXUP_PINS,
8908                 .v.pins = (const struct hda_pintbl[]) {
8909                         { 0x19, 0x03a11020 }, /* headset mic with jack detect */
8910                         { }
8911                 },
8912         },
8913         [ALC256_FIXUP_ACER_MIC_NO_PRESENCE] = {
8914                 .type = HDA_FIXUP_PINS,
8915                 .v.pins = (const struct hda_pintbl[]) {
8916                         { 0x19, 0x02a11120 }, /* use as headset mic, without its own jack detect */
8917                         { }
8918                 },
8919                 .chained = true,
8920                 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8921         },
8922         [ALC285_FIXUP_HP_GPIO_AMP_INIT] = {
8923                 .type = HDA_FIXUP_FUNC,
8924                 .v.func = alc285_fixup_hp_gpio_amp_init,
8925                 .chained = true,
8926                 .chain_id = ALC285_FIXUP_HP_GPIO_LED
8927         },
8928         [ALC269_FIXUP_CZC_B20] = {
8929                 .type = HDA_FIXUP_PINS,
8930                 .v.pins = (const struct hda_pintbl[]) {
8931                         { 0x12, 0x411111f0 },
8932                         { 0x14, 0x90170110 }, /* speaker */
8933                         { 0x15, 0x032f1020 }, /* HP out */
8934                         { 0x17, 0x411111f0 },
8935                         { 0x18, 0x03ab1040 }, /* mic */
8936                         { 0x19, 0xb7a7013f },
8937                         { 0x1a, 0x0181305f },
8938                         { 0x1b, 0x411111f0 },
8939                         { 0x1d, 0x411111f0 },
8940                         { 0x1e, 0x411111f0 },
8941                         { }
8942                 },
8943                 .chain_id = ALC269_FIXUP_DMIC,
8944         },
8945         [ALC269_FIXUP_CZC_TMI] = {
8946                 .type = HDA_FIXUP_PINS,
8947                 .v.pins = (const struct hda_pintbl[]) {
8948                         { 0x12, 0x4000c000 },
8949                         { 0x14, 0x90170110 }, /* speaker */
8950                         { 0x15, 0x0421401f }, /* HP out */
8951                         { 0x17, 0x411111f0 },
8952                         { 0x18, 0x04a19020 }, /* mic */
8953                         { 0x19, 0x411111f0 },
8954                         { 0x1a, 0x411111f0 },
8955                         { 0x1b, 0x411111f0 },
8956                         { 0x1d, 0x40448505 },
8957                         { 0x1e, 0x411111f0 },
8958                         { 0x20, 0x8000ffff },
8959                         { }
8960                 },
8961                 .chain_id = ALC269_FIXUP_DMIC,
8962         },
8963         [ALC269_FIXUP_CZC_L101] = {
8964                 .type = HDA_FIXUP_PINS,
8965                 .v.pins = (const struct hda_pintbl[]) {
8966                         { 0x12, 0x40000000 },
8967                         { 0x14, 0x01014010 }, /* speaker */
8968                         { 0x15, 0x411111f0 }, /* HP out */
8969                         { 0x16, 0x411111f0 },
8970                         { 0x18, 0x01a19020 }, /* mic */
8971                         { 0x19, 0x02a19021 },
8972                         { 0x1a, 0x0181302f },
8973                         { 0x1b, 0x0221401f },
8974                         { 0x1c, 0x411111f0 },
8975                         { 0x1d, 0x4044c601 },
8976                         { 0x1e, 0x411111f0 },
8977                         { }
8978                 },
8979                 .chain_id = ALC269_FIXUP_DMIC,
8980         },
8981         [ALC269_FIXUP_LEMOTE_A1802] = {
8982                 .type = HDA_FIXUP_PINS,
8983                 .v.pins = (const struct hda_pintbl[]) {
8984                         { 0x12, 0x40000000 },
8985                         { 0x14, 0x90170110 }, /* speaker */
8986                         { 0x17, 0x411111f0 },
8987                         { 0x18, 0x03a19040 }, /* mic1 */
8988                         { 0x19, 0x90a70130 }, /* mic2 */
8989                         { 0x1a, 0x411111f0 },
8990                         { 0x1b, 0x411111f0 },
8991                         { 0x1d, 0x40489d2d },
8992                         { 0x1e, 0x411111f0 },
8993                         { 0x20, 0x0003ffff },
8994                         { 0x21, 0x03214020 },
8995                         { }
8996                 },
8997                 .chain_id = ALC269_FIXUP_DMIC,
8998         },
8999         [ALC269_FIXUP_LEMOTE_A190X] = {
9000                 .type = HDA_FIXUP_PINS,
9001                 .v.pins = (const struct hda_pintbl[]) {
9002                         { 0x14, 0x99130110 }, /* speaker */
9003                         { 0x15, 0x0121401f }, /* HP out */
9004                         { 0x18, 0x01a19c20 }, /* rear  mic */
9005                         { 0x19, 0x99a3092f }, /* front mic */
9006                         { 0x1b, 0x0201401f }, /* front lineout */
9007                         { }
9008                 },
9009                 .chain_id = ALC269_FIXUP_DMIC,
9010         },
9011         [ALC256_FIXUP_INTEL_NUC8_RUGGED] = {
9012                 .type = HDA_FIXUP_PINS,
9013                 .v.pins = (const struct hda_pintbl[]) {
9014                         { 0x1b, 0x01a1913c }, /* use as headset mic, without its own jack detect */
9015                         { }
9016                 },
9017                 .chained = true,
9018                 .chain_id = ALC269_FIXUP_HEADSET_MODE
9019         },
9020         [ALC256_FIXUP_INTEL_NUC10] = {
9021                 .type = HDA_FIXUP_PINS,
9022                 .v.pins = (const struct hda_pintbl[]) {
9023                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
9024                         { }
9025                 },
9026                 .chained = true,
9027                 .chain_id = ALC269_FIXUP_HEADSET_MODE
9028         },
9029         [ALC255_FIXUP_XIAOMI_HEADSET_MIC] = {
9030                 .type = HDA_FIXUP_VERBS,
9031                 .v.verbs = (const struct hda_verb[]) {
9032                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
9033                         { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
9034                         { }
9035                 },
9036                 .chained = true,
9037                 .chain_id = ALC289_FIXUP_ASUS_GA502
9038         },
9039         [ALC274_FIXUP_HP_MIC] = {
9040                 .type = HDA_FIXUP_VERBS,
9041                 .v.verbs = (const struct hda_verb[]) {
9042                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
9043                         { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
9044                         { }
9045                 },
9046         },
9047         [ALC274_FIXUP_HP_HEADSET_MIC] = {
9048                 .type = HDA_FIXUP_FUNC,
9049                 .v.func = alc274_fixup_hp_headset_mic,
9050                 .chained = true,
9051                 .chain_id = ALC274_FIXUP_HP_MIC
9052         },
9053         [ALC274_FIXUP_HP_ENVY_GPIO] = {
9054                 .type = HDA_FIXUP_FUNC,
9055                 .v.func = alc274_fixup_hp_envy_gpio,
9056         },
9057         [ALC256_FIXUP_ASUS_HPE] = {
9058                 .type = HDA_FIXUP_VERBS,
9059                 .v.verbs = (const struct hda_verb[]) {
9060                         /* Set EAPD high */
9061                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
9062                         { 0x20, AC_VERB_SET_PROC_COEF, 0x7778 },
9063                         { }
9064                 },
9065                 .chained = true,
9066                 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
9067         },
9068         [ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK] = {
9069                 .type = HDA_FIXUP_FUNC,
9070                 .v.func = alc_fixup_headset_jack,
9071                 .chained = true,
9072                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
9073         },
9074         [ALC287_FIXUP_HP_GPIO_LED] = {
9075                 .type = HDA_FIXUP_FUNC,
9076                 .v.func = alc287_fixup_hp_gpio_led,
9077         },
9078         [ALC256_FIXUP_HP_HEADSET_MIC] = {
9079                 .type = HDA_FIXUP_FUNC,
9080                 .v.func = alc274_fixup_hp_headset_mic,
9081         },
9082         [ALC236_FIXUP_DELL_AIO_HEADSET_MIC] = {
9083                 .type = HDA_FIXUP_FUNC,
9084                 .v.func = alc_fixup_no_int_mic,
9085                 .chained = true,
9086                 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
9087         },
9088         [ALC282_FIXUP_ACER_DISABLE_LINEOUT] = {
9089                 .type = HDA_FIXUP_PINS,
9090                 .v.pins = (const struct hda_pintbl[]) {
9091                         { 0x1b, 0x411111f0 },
9092                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
9093                         { },
9094                 },
9095                 .chained = true,
9096                 .chain_id = ALC269_FIXUP_HEADSET_MODE
9097         },
9098         [ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST] = {
9099                 .type = HDA_FIXUP_FUNC,
9100                 .v.func = alc269_fixup_limit_int_mic_boost,
9101                 .chained = true,
9102                 .chain_id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
9103         },
9104         [ALC256_FIXUP_ACER_HEADSET_MIC] = {
9105                 .type = HDA_FIXUP_PINS,
9106                 .v.pins = (const struct hda_pintbl[]) {
9107                         { 0x19, 0x02a1113c }, /* use as headset mic, without its own jack detect */
9108                         { 0x1a, 0x90a1092f }, /* use as internal mic */
9109                         { }
9110                 },
9111                 .chained = true,
9112                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
9113         },
9114         [ALC285_FIXUP_IDEAPAD_S740_COEF] = {
9115                 .type = HDA_FIXUP_FUNC,
9116                 .v.func = alc285_fixup_ideapad_s740_coef,
9117                 .chained = true,
9118                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
9119         },
9120         [ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST] = {
9121                 .type = HDA_FIXUP_FUNC,
9122                 .v.func = alc269_fixup_limit_int_mic_boost,
9123                 .chained = true,
9124                 .chain_id = ALC285_FIXUP_HP_MUTE_LED,
9125         },
9126         [ALC295_FIXUP_ASUS_DACS] = {
9127                 .type = HDA_FIXUP_FUNC,
9128                 .v.func = alc295_fixup_asus_dacs,
9129         },
9130         [ALC295_FIXUP_HP_OMEN] = {
9131                 .type = HDA_FIXUP_PINS,
9132                 .v.pins = (const struct hda_pintbl[]) {
9133                         { 0x12, 0xb7a60130 },
9134                         { 0x13, 0x40000000 },
9135                         { 0x14, 0x411111f0 },
9136                         { 0x16, 0x411111f0 },
9137                         { 0x17, 0x90170110 },
9138                         { 0x18, 0x411111f0 },
9139                         { 0x19, 0x02a11030 },
9140                         { 0x1a, 0x411111f0 },
9141                         { 0x1b, 0x04a19030 },
9142                         { 0x1d, 0x40600001 },
9143                         { 0x1e, 0x411111f0 },
9144                         { 0x21, 0x03211020 },
9145                         {}
9146                 },
9147                 .chained = true,
9148                 .chain_id = ALC269_FIXUP_HP_LINE1_MIC1_LED,
9149         },
9150         [ALC285_FIXUP_HP_SPECTRE_X360] = {
9151                 .type = HDA_FIXUP_FUNC,
9152                 .v.func = alc285_fixup_hp_spectre_x360,
9153         },
9154         [ALC285_FIXUP_HP_SPECTRE_X360_EB1] = {
9155                 .type = HDA_FIXUP_FUNC,
9156                 .v.func = alc285_fixup_hp_spectre_x360_eb1
9157         },
9158         [ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP] = {
9159                 .type = HDA_FIXUP_FUNC,
9160                 .v.func = alc285_fixup_ideapad_s740_coef,
9161                 .chained = true,
9162                 .chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,
9163         },
9164         [ALC623_FIXUP_LENOVO_THINKSTATION_P340] = {
9165                 .type = HDA_FIXUP_FUNC,
9166                 .v.func = alc_fixup_no_shutup,
9167                 .chained = true,
9168                 .chain_id = ALC283_FIXUP_HEADSET_MIC,
9169         },
9170         [ALC255_FIXUP_ACER_HEADPHONE_AND_MIC] = {
9171                 .type = HDA_FIXUP_PINS,
9172                 .v.pins = (const struct hda_pintbl[]) {
9173                         { 0x21, 0x03211030 }, /* Change the Headphone location to Left */
9174                         { }
9175                 },
9176                 .chained = true,
9177                 .chain_id = ALC255_FIXUP_XIAOMI_HEADSET_MIC
9178         },
9179         [ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST] = {
9180                 .type = HDA_FIXUP_FUNC,
9181                 .v.func = alc269_fixup_limit_int_mic_boost,
9182                 .chained = true,
9183                 .chain_id = ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
9184         },
9185         [ALC285_FIXUP_LEGION_Y9000X_SPEAKERS] = {
9186                 .type = HDA_FIXUP_FUNC,
9187                 .v.func = alc285_fixup_ideapad_s740_coef,
9188                 .chained = true,
9189                 .chain_id = ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
9190         },
9191         [ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE] = {
9192                 .type = HDA_FIXUP_FUNC,
9193                 .v.func = alc287_fixup_legion_15imhg05_speakers,
9194                 .chained = true,
9195                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
9196         },
9197         [ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS] = {
9198                 .type = HDA_FIXUP_VERBS,
9199                 //.v.verbs = legion_15imhg05_coefs,
9200                 .v.verbs = (const struct hda_verb[]) {
9201                          // set left speaker Legion 7i.
9202                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9203                          { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
9204
9205                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9206                          { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9207                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9208                          { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
9209                          { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9210
9211                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9212                          { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9213                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9214                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9215                          { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9216
9217                          // set right speaker Legion 7i.
9218                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9219                          { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
9220
9221                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9222                          { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9223                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9224                          { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
9225                          { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9226
9227                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9228                          { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9229                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9230                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9231                          { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9232                          {}
9233                 },
9234                 .chained = true,
9235                 .chain_id = ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
9236         },
9237         [ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE] = {
9238                 .type = HDA_FIXUP_FUNC,
9239                 .v.func = alc287_fixup_legion_15imhg05_speakers,
9240                 .chained = true,
9241                 .chain_id = ALC269_FIXUP_HEADSET_MODE,
9242         },
9243         [ALC287_FIXUP_YOGA7_14ITL_SPEAKERS] = {
9244                 .type = HDA_FIXUP_VERBS,
9245                 .v.verbs = (const struct hda_verb[]) {
9246                          // set left speaker Yoga 7i.
9247                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9248                          { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
9249
9250                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9251                          { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9252                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9253                          { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
9254                          { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9255
9256                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9257                          { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9258                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9259                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9260                          { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9261
9262                          // set right speaker Yoga 7i.
9263                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9264                          { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
9265
9266                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9267                          { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9268                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9269                          { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
9270                          { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9271
9272                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9273                          { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9274                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9275                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9276                          { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9277                          {}
9278                 },
9279                 .chained = true,
9280                 .chain_id = ALC269_FIXUP_HEADSET_MODE,
9281         },
9282         [ALC298_FIXUP_LENOVO_C940_DUET7] = {
9283                 .type = HDA_FIXUP_FUNC,
9284                 .v.func = alc298_fixup_lenovo_c940_duet7,
9285         },
9286         [ALC287_FIXUP_13S_GEN2_SPEAKERS] = {
9287                 .type = HDA_FIXUP_VERBS,
9288                 .v.verbs = (const struct hda_verb[]) {
9289                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9290                         { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
9291                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9292                         { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9293                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9294                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9295                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9296                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9297                         { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
9298                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9299                         { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9300                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9301                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9302                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9303                         {}
9304                 },
9305                 .chained = true,
9306                 .chain_id = ALC269_FIXUP_HEADSET_MODE,
9307         },
9308         [ALC256_FIXUP_SET_COEF_DEFAULTS] = {
9309                 .type = HDA_FIXUP_FUNC,
9310                 .v.func = alc256_fixup_set_coef_defaults,
9311         },
9312         [ALC245_FIXUP_HP_GPIO_LED] = {
9313                 .type = HDA_FIXUP_FUNC,
9314                 .v.func = alc245_fixup_hp_gpio_led,
9315         },
9316         [ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
9317                 .type = HDA_FIXUP_PINS,
9318                 .v.pins = (const struct hda_pintbl[]) {
9319                         { 0x19, 0x03a11120 }, /* use as headset mic, without its own jack detect */
9320                         { }
9321                 },
9322                 .chained = true,
9323                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
9324         },
9325         [ALC233_FIXUP_NO_AUDIO_JACK] = {
9326                 .type = HDA_FIXUP_FUNC,
9327                 .v.func = alc233_fixup_no_audio_jack,
9328         },
9329         [ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME] = {
9330                 .type = HDA_FIXUP_FUNC,
9331                 .v.func = alc256_fixup_mic_no_presence_and_resume,
9332                 .chained = true,
9333                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
9334         },
9335         [ALC287_FIXUP_LEGION_16ACHG6] = {
9336                 .type = HDA_FIXUP_FUNC,
9337                 .v.func = alc287_fixup_legion_16achg6_speakers,
9338         },
9339         [ALC287_FIXUP_CS35L41_I2C_2] = {
9340                 .type = HDA_FIXUP_FUNC,
9341                 .v.func = cs35l41_fixup_i2c_two,
9342         },
9343         [ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED] = {
9344                 .type = HDA_FIXUP_FUNC,
9345                 .v.func = cs35l41_fixup_i2c_two,
9346                 .chained = true,
9347                 .chain_id = ALC285_FIXUP_HP_MUTE_LED,
9348         },
9349         [ALC245_FIXUP_CS35L41_SPI_2] = {
9350                 .type = HDA_FIXUP_FUNC,
9351                 .v.func = cs35l41_fixup_spi_two,
9352         },
9353         [ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED] = {
9354                 .type = HDA_FIXUP_FUNC,
9355                 .v.func = cs35l41_fixup_spi_two,
9356                 .chained = true,
9357                 .chain_id = ALC285_FIXUP_HP_GPIO_LED,
9358         },
9359         [ALC245_FIXUP_CS35L41_SPI_4] = {
9360                 .type = HDA_FIXUP_FUNC,
9361                 .v.func = cs35l41_fixup_spi_four,
9362         },
9363         [ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED] = {
9364                 .type = HDA_FIXUP_FUNC,
9365                 .v.func = cs35l41_fixup_spi_four,
9366                 .chained = true,
9367                 .chain_id = ALC285_FIXUP_HP_GPIO_LED,
9368         },
9369         [ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED] = {
9370                 .type = HDA_FIXUP_VERBS,
9371                 .v.verbs = (const struct hda_verb[]) {
9372                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x19 },
9373                          { 0x20, AC_VERB_SET_PROC_COEF, 0x8e11 },
9374                          { }
9375                 },
9376                 .chained = true,
9377                 .chain_id = ALC285_FIXUP_HP_MUTE_LED,
9378         },
9379         [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET] = {
9380                 .type = HDA_FIXUP_FUNC,
9381                 .v.func = alc_fixup_dell4_mic_no_presence_quiet,
9382                 .chained = true,
9383                 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
9384         },
9385         [ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE] = {
9386                 .type = HDA_FIXUP_PINS,
9387                 .v.pins = (const struct hda_pintbl[]) {
9388                         { 0x19, 0x02a1112c }, /* use as headset mic, without its own jack detect */
9389                         { }
9390                 },
9391                 .chained = true,
9392                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
9393         },
9394         [ALC287_FIXUP_LEGION_16ITHG6] = {
9395                 .type = HDA_FIXUP_FUNC,
9396                 .v.func = alc287_fixup_legion_16ithg6_speakers,
9397         },
9398         [ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK] = {
9399                 .type = HDA_FIXUP_VERBS,
9400                 .v.verbs = (const struct hda_verb[]) {
9401                         // enable left speaker
9402                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9403                         { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
9404
9405                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9406                         { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9407                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9408                         { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
9409                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9410
9411                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9412                         { 0x20, AC_VERB_SET_PROC_COEF, 0xf },
9413                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9414                         { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
9415                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9416
9417                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9418                         { 0x20, AC_VERB_SET_PROC_COEF, 0x10 },
9419                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9420                         { 0x20, AC_VERB_SET_PROC_COEF, 0x40 },
9421                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9422
9423                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9424                         { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9425                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9426                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9427                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9428
9429                         // enable right speaker
9430                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9431                         { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
9432
9433                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9434                         { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9435                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9436                         { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
9437                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9438
9439                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9440                         { 0x20, AC_VERB_SET_PROC_COEF, 0xf },
9441                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9442                         { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
9443                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9444
9445                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9446                         { 0x20, AC_VERB_SET_PROC_COEF, 0x10 },
9447                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9448                         { 0x20, AC_VERB_SET_PROC_COEF, 0x44 },
9449                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9450
9451                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9452                         { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9453                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9454                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9455                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9456
9457                         { },
9458                 },
9459         },
9460         [ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN] = {
9461                 .type = HDA_FIXUP_FUNC,
9462                 .v.func = alc287_fixup_yoga9_14iap7_bass_spk_pin,
9463                 .chained = true,
9464                 .chain_id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK,
9465         },
9466         [ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS] = {
9467                 .type = HDA_FIXUP_FUNC,
9468                 .v.func = alc295_fixup_dell_inspiron_top_speakers,
9469                 .chained = true,
9470                 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
9471         },
9472         [ALC236_FIXUP_DELL_DUAL_CODECS] = {
9473                 .type = HDA_FIXUP_PINS,
9474                 .v.func = alc1220_fixup_gb_dual_codecs,
9475                 .chained = true,
9476                 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9477         },
9478         [ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI] = {
9479                 .type = HDA_FIXUP_FUNC,
9480                 .v.func = cs35l41_fixup_i2c_two,
9481                 .chained = true,
9482                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
9483         },
9484         [ALC287_FIXUP_TAS2781_I2C] = {
9485                 .type = HDA_FIXUP_FUNC,
9486                 .v.func = tas2781_fixup_i2c,
9487                 .chained = true,
9488                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
9489         },
9490         [ALC245_FIXUP_HP_MUTE_LED_COEFBIT] = {
9491                 .type = HDA_FIXUP_FUNC,
9492                 .v.func = alc245_fixup_hp_mute_led_coefbit,
9493         },
9494         [ALC245_FIXUP_HP_X360_MUTE_LEDS] = {
9495                 .type = HDA_FIXUP_FUNC,
9496                 .v.func = alc245_fixup_hp_mute_led_coefbit,
9497                 .chained = true,
9498                 .chain_id = ALC245_FIXUP_HP_GPIO_LED
9499         },
9500         [ALC287_FIXUP_THINKPAD_I2S_SPK] = {
9501                 .type = HDA_FIXUP_FUNC,
9502                 .v.func = alc287_fixup_bind_dacs,
9503         },
9504         [ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD] = {
9505                 .type = HDA_FIXUP_FUNC,
9506                 .v.func = alc287_fixup_bind_dacs,
9507                 .chained = true,
9508                 .chain_id = ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI,
9509         },
9510         [ALC2XX_FIXUP_HEADSET_MIC] = {
9511                 .type = HDA_FIXUP_FUNC,
9512                 .v.func = alc_fixup_headset_mic,
9513         },
9514         [ALC289_FIXUP_DELL_CS35L41_SPI_2] = {
9515                 .type = HDA_FIXUP_FUNC,
9516                 .v.func = cs35l41_fixup_spi_two,
9517                 .chained = true,
9518                 .chain_id = ALC289_FIXUP_DUAL_SPK
9519         },
9520         [ALC294_FIXUP_CS35L41_I2C_2] = {
9521                 .type = HDA_FIXUP_FUNC,
9522                 .v.func = cs35l41_fixup_i2c_two,
9523         },
9524 };
9525
9526 static const struct snd_pci_quirk alc269_fixup_tbl[] = {
9527         SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC),
9528         SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC),
9529         SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC),
9530         SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700),
9531         SND_PCI_QUIRK(0x1025, 0x072d, "Acer Aspire V5-571G", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
9532         SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK),
9533         SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK),
9534         SND_PCI_QUIRK(0x1025, 0x0762, "Acer Aspire E1-472", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
9535         SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
9536         SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),
9537         SND_PCI_QUIRK(0x1025, 0x080d, "Acer Aspire V5-122P", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
9538         SND_PCI_QUIRK(0x1025, 0x0840, "Acer Aspire E1", ALC269VB_FIXUP_ASPIRE_E1_COEF),
9539         SND_PCI_QUIRK(0x1025, 0x101c, "Acer Veriton N2510G", ALC269_FIXUP_LIFEBOOK),
9540         SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE),
9541         SND_PCI_QUIRK(0x1025, 0x1065, "Acer Aspire C20-820", ALC269VC_FIXUP_ACER_HEADSET_MIC),
9542         SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),
9543         SND_PCI_QUIRK(0x1025, 0x1094, "Acer Aspire E5-575T", ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST),
9544         SND_PCI_QUIRK(0x1025, 0x1099, "Acer Aspire E5-523G", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9545         SND_PCI_QUIRK(0x1025, 0x110e, "Acer Aspire ES1-432", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9546         SND_PCI_QUIRK(0x1025, 0x1166, "Acer Veriton N4640G", ALC269_FIXUP_LIFEBOOK),
9547         SND_PCI_QUIRK(0x1025, 0x1167, "Acer Veriton N6640G", ALC269_FIXUP_LIFEBOOK),
9548         SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", ALC299_FIXUP_PREDATOR_SPK),
9549         SND_PCI_QUIRK(0x1025, 0x1247, "Acer vCopperbox", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),
9550         SND_PCI_QUIRK(0x1025, 0x1248, "Acer Veriton N4660G", ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE),
9551         SND_PCI_QUIRK(0x1025, 0x1269, "Acer SWIFT SF314-54", ALC256_FIXUP_ACER_HEADSET_MIC),
9552         SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9553         SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9554         SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9555         SND_PCI_QUIRK(0x1025, 0x129c, "Acer SWIFT SF314-55", ALC256_FIXUP_ACER_HEADSET_MIC),
9556         SND_PCI_QUIRK(0x1025, 0x129d, "Acer SWIFT SF313-51", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
9557         SND_PCI_QUIRK(0x1025, 0x1300, "Acer SWIFT SF314-56", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
9558         SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9559         SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC),
9560         SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),
9561         SND_PCI_QUIRK(0x1025, 0x141f, "Acer Spin SP513-54N", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9562         SND_PCI_QUIRK(0x1025, 0x142b, "Acer Swift SF314-42", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9563         SND_PCI_QUIRK(0x1025, 0x1430, "Acer TravelMate B311R-31", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
9564         SND_PCI_QUIRK(0x1025, 0x1466, "Acer Aspire A515-56", ALC255_FIXUP_ACER_HEADPHONE_AND_MIC),
9565         SND_PCI_QUIRK(0x1025, 0x1534, "Acer Predator PH315-54", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9566         SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
9567         SND_PCI_QUIRK(0x1028, 0x053c, "Dell Latitude E5430", ALC292_FIXUP_DELL_E7X),
9568         SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),
9569         SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X),
9570         SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X),
9571         SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X),
9572         SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X),
9573         SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
9574         SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
9575         SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
9576         SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
9577         SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
9578         SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
9579         SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X),
9580         SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X),
9581         SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
9582         SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9583         SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9584         SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),
9585         SND_PCI_QUIRK(0x1028, 0x0669, "Dell Optiplex 9020m", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
9586         SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
9587         SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
9588         SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9589         SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9590         SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9591         SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9592         SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9593         SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9594         SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9595         SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
9596         SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE),
9597         SND_PCI_QUIRK(0x1028, 0x0738, "Dell Precision 5820", ALC269_FIXUP_NO_SHUTUP),
9598         SND_PCI_QUIRK(0x1028, 0x075c, "Dell XPS 27 7760", ALC298_FIXUP_SPK_VOLUME),
9599         SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME),
9600         SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
9601         SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3),
9602         SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE),
9603         SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
9604         SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
9605         SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
9606         SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
9607         SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB),
9608         SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE),
9609         SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE),
9610         SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
9611         SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
9612         SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
9613         SND_PCI_QUIRK(0x1028, 0x098d, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
9614         SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
9615         SND_PCI_QUIRK(0x1028, 0x0a2e, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
9616         SND_PCI_QUIRK(0x1028, 0x0a30, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
9617         SND_PCI_QUIRK(0x1028, 0x0a38, "Dell Latitude 7520", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET),
9618         SND_PCI_QUIRK(0x1028, 0x0a58, "Dell", ALC255_FIXUP_DELL_HEADSET_MIC),
9619         SND_PCI_QUIRK(0x1028, 0x0a61, "Dell XPS 15 9510", ALC289_FIXUP_DUAL_SPK),
9620         SND_PCI_QUIRK(0x1028, 0x0a62, "Dell Precision 5560", ALC289_FIXUP_DUAL_SPK),
9621         SND_PCI_QUIRK(0x1028, 0x0a9d, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
9622         SND_PCI_QUIRK(0x1028, 0x0a9e, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
9623         SND_PCI_QUIRK(0x1028, 0x0b19, "Dell XPS 15 9520", ALC289_FIXUP_DUAL_SPK),
9624         SND_PCI_QUIRK(0x1028, 0x0b1a, "Dell Precision 5570", ALC289_FIXUP_DUAL_SPK),
9625         SND_PCI_QUIRK(0x1028, 0x0b37, "Dell Inspiron 16 Plus 7620 2-in-1", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS),
9626         SND_PCI_QUIRK(0x1028, 0x0b71, "Dell Inspiron 16 Plus 7620", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS),
9627         SND_PCI_QUIRK(0x1028, 0x0beb, "Dell XPS 15 9530 (2023)", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9628         SND_PCI_QUIRK(0x1028, 0x0c03, "Dell Precision 5340", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
9629         SND_PCI_QUIRK(0x1028, 0x0c19, "Dell Precision 3340", ALC236_FIXUP_DELL_DUAL_CODECS),
9630         SND_PCI_QUIRK(0x1028, 0x0c1a, "Dell Precision 3340", ALC236_FIXUP_DELL_DUAL_CODECS),
9631         SND_PCI_QUIRK(0x1028, 0x0c1b, "Dell Precision 3440", ALC236_FIXUP_DELL_DUAL_CODECS),
9632         SND_PCI_QUIRK(0x1028, 0x0c1c, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS),
9633         SND_PCI_QUIRK(0x1028, 0x0c1d, "Dell Precision 3440", ALC236_FIXUP_DELL_DUAL_CODECS),
9634         SND_PCI_QUIRK(0x1028, 0x0c1e, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS),
9635         SND_PCI_QUIRK(0x1028, 0x0cbd, "Dell Oasis 13 CS MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9636         SND_PCI_QUIRK(0x1028, 0x0cbe, "Dell Oasis 13 2-IN-1 MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9637         SND_PCI_QUIRK(0x1028, 0x0cbf, "Dell Oasis 13 Low Weight MTU-L", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9638         SND_PCI_QUIRK(0x1028, 0x0cc0, "Dell Oasis 13", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
9639         SND_PCI_QUIRK(0x1028, 0x0cc1, "Dell Oasis 14 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9640         SND_PCI_QUIRK(0x1028, 0x0cc2, "Dell Oasis 14 2-in-1 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9641         SND_PCI_QUIRK(0x1028, 0x0cc3, "Dell Oasis 14 Low Weight MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9642         SND_PCI_QUIRK(0x1028, 0x0cc4, "Dell Oasis 16 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9643         SND_PCI_QUIRK(0x1028, 0x0cc5, "Dell Oasis 14", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
9644         SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9645         SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9646         SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
9647         SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
9648         SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
9649         SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9650         SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9651         SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9652         SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9653         SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC),
9654         SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9655         SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9656         SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9657         SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9658         SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9659         SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9660         SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
9661         SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9662         SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9663         SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9664         SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9665         SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9666         SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9667         SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
9668         SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
9669         SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9670         SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9671         SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9672         SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9673         SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9674         SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9675         SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9676         SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9677         SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED),
9678         SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9679         SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS),
9680         SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9681         SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS),
9682         SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9683         SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9684         SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9685         SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9686         SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9687         SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9688         SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9689         SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9690         SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9691         SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9692         SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9693         SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9694         SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9695         SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9696         SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),
9697         SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9698         SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9699         SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9700         SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9701         SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9702         SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9703         SND_PCI_QUIRK(0x103c, 0x2b5e, "HP 288 Pro G2 MT", ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE),
9704         SND_PCI_QUIRK(0x103c, 0x802e, "HP Z240 SFF", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9705         SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9706         SND_PCI_QUIRK(0x103c, 0x8077, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
9707         SND_PCI_QUIRK(0x103c, 0x8158, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
9708         SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC295_FIXUP_HP_X360),
9709         SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
9710         SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),
9711         SND_PCI_QUIRK(0x103c, 0x827f, "HP x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9712         SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9713         SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
9714         SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9715         SND_PCI_QUIRK(0x103c, 0x841c, "HP Pavilion 15-CK0xx", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9716         SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9717         SND_PCI_QUIRK(0x103c, 0x84ae, "HP 15-db0403ng", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
9718         SND_PCI_QUIRK(0x103c, 0x84da, "HP OMEN dc0019-ur", ALC295_FIXUP_HP_OMEN),
9719         SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
9720         SND_PCI_QUIRK(0x103c, 0x8519, "HP Spectre x360 15-df0xxx", ALC285_FIXUP_HP_SPECTRE_X360),
9721         SND_PCI_QUIRK(0x103c, 0x8537, "HP ProBook 440 G6", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9722         SND_PCI_QUIRK(0x103c, 0x860f, "HP ZBook 15 G6", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9723         SND_PCI_QUIRK(0x103c, 0x861f, "HP Elite Dragonfly G1", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9724         SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),
9725         SND_PCI_QUIRK(0x103c, 0x86c7, "HP Envy AiO 32", ALC274_FIXUP_HP_ENVY_GPIO),
9726         SND_PCI_QUIRK(0x103c, 0x86e7, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9727         SND_PCI_QUIRK(0x103c, 0x86e8, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9728         SND_PCI_QUIRK(0x103c, 0x86f9, "HP Spectre x360 13-aw0xxx", ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED),
9729         SND_PCI_QUIRK(0x103c, 0x8716, "HP Elite Dragonfly G2 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9730         SND_PCI_QUIRK(0x103c, 0x8720, "HP EliteBook x360 1040 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9731         SND_PCI_QUIRK(0x103c, 0x8724, "HP EliteBook 850 G7", ALC285_FIXUP_HP_GPIO_LED),
9732         SND_PCI_QUIRK(0x103c, 0x8728, "HP EliteBook 840 G7", ALC285_FIXUP_HP_GPIO_LED),
9733         SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED),
9734         SND_PCI_QUIRK(0x103c, 0x8730, "HP ProBook 445 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9735         SND_PCI_QUIRK(0x103c, 0x8735, "HP ProBook 435 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9736         SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9737         SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED),
9738         SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED),
9739         SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED),
9740         SND_PCI_QUIRK(0x103c, 0x8780, "HP ZBook Fury 17 G7 Mobile Workstation",
9741                       ALC285_FIXUP_HP_GPIO_AMP_INIT),
9742         SND_PCI_QUIRK(0x103c, 0x8783, "HP ZBook Fury 15 G7 Mobile Workstation",
9743                       ALC285_FIXUP_HP_GPIO_AMP_INIT),
9744         SND_PCI_QUIRK(0x103c, 0x8786, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
9745         SND_PCI_QUIRK(0x103c, 0x8787, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
9746         SND_PCI_QUIRK(0x103c, 0x8788, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
9747         SND_PCI_QUIRK(0x103c, 0x87c8, "HP", ALC287_FIXUP_HP_GPIO_LED),
9748         SND_PCI_QUIRK(0x103c, 0x87e5, "HP ProBook 440 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9749         SND_PCI_QUIRK(0x103c, 0x87e7, "HP ProBook 450 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9750         SND_PCI_QUIRK(0x103c, 0x87f1, "HP ProBook 630 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9751         SND_PCI_QUIRK(0x103c, 0x87f2, "HP ProBook 640 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9752         SND_PCI_QUIRK(0x103c, 0x87f4, "HP", ALC287_FIXUP_HP_GPIO_LED),
9753         SND_PCI_QUIRK(0x103c, 0x87f5, "HP", ALC287_FIXUP_HP_GPIO_LED),
9754         SND_PCI_QUIRK(0x103c, 0x87f6, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
9755         SND_PCI_QUIRK(0x103c, 0x87f7, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
9756         SND_PCI_QUIRK(0x103c, 0x8805, "HP ProBook 650 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
9757         SND_PCI_QUIRK(0x103c, 0x880d, "HP EliteBook 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9758         SND_PCI_QUIRK(0x103c, 0x8811, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9759         SND_PCI_QUIRK(0x103c, 0x8812, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
9760         SND_PCI_QUIRK(0x103c, 0x881d, "HP 250 G8 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
9761         SND_PCI_QUIRK(0x103c, 0x8846, "HP EliteBook 850 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9762         SND_PCI_QUIRK(0x103c, 0x8847, "HP EliteBook x360 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9763         SND_PCI_QUIRK(0x103c, 0x884b, "HP EliteBook 840 Aero G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9764         SND_PCI_QUIRK(0x103c, 0x884c, "HP EliteBook 840 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
9765         SND_PCI_QUIRK(0x103c, 0x8862, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9766         SND_PCI_QUIRK(0x103c, 0x8863, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9767         SND_PCI_QUIRK(0x103c, 0x886d, "HP ZBook Fury 17.3 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9768         SND_PCI_QUIRK(0x103c, 0x8870, "HP ZBook Fury 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9769         SND_PCI_QUIRK(0x103c, 0x8873, "HP ZBook Studio 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
9770         SND_PCI_QUIRK(0x103c, 0x887a, "HP Laptop 15s-eq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
9771         SND_PCI_QUIRK(0x103c, 0x888a, "HP ENVY x360 Convertible 15-eu0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS),
9772         SND_PCI_QUIRK(0x103c, 0x888d, "HP ZBook Power 15.6 inch G8 Mobile Workstation PC", ALC236_FIXUP_HP_GPIO_LED),
9773         SND_PCI_QUIRK(0x103c, 0x8895, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED),
9774         SND_PCI_QUIRK(0x103c, 0x8896, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_MUTE_LED),
9775         SND_PCI_QUIRK(0x103c, 0x8898, "HP EliteBook 845 G8 Notebook PC", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9776         SND_PCI_QUIRK(0x103c, 0x88d0, "HP Pavilion 15-eh1xxx (mainboard 88D0)", ALC287_FIXUP_HP_GPIO_LED),
9777         SND_PCI_QUIRK(0x103c, 0x8902, "HP OMEN 16", ALC285_FIXUP_HP_MUTE_LED),
9778         SND_PCI_QUIRK(0x103c, 0x890e, "HP 255 G8 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
9779         SND_PCI_QUIRK(0x103c, 0x8919, "HP Pavilion Aero Laptop 13-be0xxx", ALC287_FIXUP_HP_GPIO_LED),
9780         SND_PCI_QUIRK(0x103c, 0x896d, "HP ZBook Firefly 16 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9781         SND_PCI_QUIRK(0x103c, 0x896e, "HP EliteBook x360 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9782         SND_PCI_QUIRK(0x103c, 0x8971, "HP EliteBook 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9783         SND_PCI_QUIRK(0x103c, 0x8972, "HP EliteBook 840 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9784         SND_PCI_QUIRK(0x103c, 0x8973, "HP EliteBook 860 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9785         SND_PCI_QUIRK(0x103c, 0x8974, "HP EliteBook 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9786         SND_PCI_QUIRK(0x103c, 0x8975, "HP EliteBook x360 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9787         SND_PCI_QUIRK(0x103c, 0x8981, "HP Elite Dragonfly G3", ALC245_FIXUP_CS35L41_SPI_4),
9788         SND_PCI_QUIRK(0x103c, 0x898e, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),
9789         SND_PCI_QUIRK(0x103c, 0x898f, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),
9790         SND_PCI_QUIRK(0x103c, 0x8991, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9791         SND_PCI_QUIRK(0x103c, 0x8992, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2),
9792         SND_PCI_QUIRK(0x103c, 0x8994, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9793         SND_PCI_QUIRK(0x103c, 0x8995, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2),
9794         SND_PCI_QUIRK(0x103c, 0x89a4, "HP ProBook 440 G9", ALC236_FIXUP_HP_GPIO_LED),
9795         SND_PCI_QUIRK(0x103c, 0x89a6, "HP ProBook 450 G9", ALC236_FIXUP_HP_GPIO_LED),
9796         SND_PCI_QUIRK(0x103c, 0x89aa, "HP EliteBook 630 G9", ALC236_FIXUP_HP_GPIO_LED),
9797         SND_PCI_QUIRK(0x103c, 0x89ac, "HP EliteBook 640 G9", ALC236_FIXUP_HP_GPIO_LED),
9798         SND_PCI_QUIRK(0x103c, 0x89ae, "HP EliteBook 650 G9", ALC236_FIXUP_HP_GPIO_LED),
9799         SND_PCI_QUIRK(0x103c, 0x89c0, "HP ZBook Power 15.6 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9800         SND_PCI_QUIRK(0x103c, 0x89c3, "Zbook Studio G9", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
9801         SND_PCI_QUIRK(0x103c, 0x89c6, "Zbook Fury 17 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9802         SND_PCI_QUIRK(0x103c, 0x89ca, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9803         SND_PCI_QUIRK(0x103c, 0x89d3, "HP EliteBook 645 G9 (MB 89D2)", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9804         SND_PCI_QUIRK(0x103c, 0x8a0f, "HP Pavilion 14-ec1xxx", ALC287_FIXUP_HP_GPIO_LED),
9805         SND_PCI_QUIRK(0x103c, 0x8a20, "HP Laptop 15s-fq5xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
9806         SND_PCI_QUIRK(0x103c, 0x8a25, "HP Victus 16-d1xxx (MB 8A25)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),
9807         SND_PCI_QUIRK(0x103c, 0x8a78, "HP Dev One", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
9808         SND_PCI_QUIRK(0x103c, 0x8aa0, "HP ProBook 440 G9 (MB 8A9E)", ALC236_FIXUP_HP_GPIO_LED),
9809         SND_PCI_QUIRK(0x103c, 0x8aa3, "HP ProBook 450 G9 (MB 8AA1)", ALC236_FIXUP_HP_GPIO_LED),
9810         SND_PCI_QUIRK(0x103c, 0x8aa8, "HP EliteBook 640 G9 (MB 8AA6)", ALC236_FIXUP_HP_GPIO_LED),
9811         SND_PCI_QUIRK(0x103c, 0x8aab, "HP EliteBook 650 G9 (MB 8AA9)", ALC236_FIXUP_HP_GPIO_LED),
9812         SND_PCI_QUIRK(0x103c, 0x8abb, "HP ZBook Firefly 14 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9813         SND_PCI_QUIRK(0x103c, 0x8ad1, "HP EliteBook 840 14 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9814         SND_PCI_QUIRK(0x103c, 0x8ad2, "HP EliteBook 860 16 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9815         SND_PCI_QUIRK(0x103c, 0x8b2f, "HP 255 15.6 inch G10 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
9816         SND_PCI_QUIRK(0x103c, 0x8b42, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9817         SND_PCI_QUIRK(0x103c, 0x8b43, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9818         SND_PCI_QUIRK(0x103c, 0x8b44, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9819         SND_PCI_QUIRK(0x103c, 0x8b45, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9820         SND_PCI_QUIRK(0x103c, 0x8b46, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9821         SND_PCI_QUIRK(0x103c, 0x8b47, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9822         SND_PCI_QUIRK(0x103c, 0x8b5d, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9823         SND_PCI_QUIRK(0x103c, 0x8b5e, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9824         SND_PCI_QUIRK(0x103c, 0x8b63, "HP Elite Dragonfly 13.5 inch G4", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
9825         SND_PCI_QUIRK(0x103c, 0x8b65, "HP ProBook 455 15.6 inch G10 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9826         SND_PCI_QUIRK(0x103c, 0x8b66, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9827         SND_PCI_QUIRK(0x103c, 0x8b70, "HP EliteBook 835 G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9828         SND_PCI_QUIRK(0x103c, 0x8b72, "HP EliteBook 845 G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9829         SND_PCI_QUIRK(0x103c, 0x8b74, "HP EliteBook 845W G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9830         SND_PCI_QUIRK(0x103c, 0x8b77, "HP ElieBook 865 G10", ALC287_FIXUP_CS35L41_I2C_2),
9831         SND_PCI_QUIRK(0x103c, 0x8b7a, "HP", ALC236_FIXUP_HP_GPIO_LED),
9832         SND_PCI_QUIRK(0x103c, 0x8b7d, "HP", ALC236_FIXUP_HP_GPIO_LED),
9833         SND_PCI_QUIRK(0x103c, 0x8b87, "HP", ALC236_FIXUP_HP_GPIO_LED),
9834         SND_PCI_QUIRK(0x103c, 0x8b8a, "HP", ALC236_FIXUP_HP_GPIO_LED),
9835         SND_PCI_QUIRK(0x103c, 0x8b8b, "HP", ALC236_FIXUP_HP_GPIO_LED),
9836         SND_PCI_QUIRK(0x103c, 0x8b8d, "HP", ALC236_FIXUP_HP_GPIO_LED),
9837         SND_PCI_QUIRK(0x103c, 0x8b8f, "HP", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
9838         SND_PCI_QUIRK(0x103c, 0x8b92, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9839         SND_PCI_QUIRK(0x103c, 0x8b96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9840         SND_PCI_QUIRK(0x103c, 0x8b97, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9841         SND_PCI_QUIRK(0x103c, 0x8bf0, "HP", ALC236_FIXUP_HP_GPIO_LED),
9842         SND_PCI_QUIRK(0x103c, 0x8c46, "HP EliteBook 830 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9843         SND_PCI_QUIRK(0x103c, 0x8c47, "HP EliteBook 840 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9844         SND_PCI_QUIRK(0x103c, 0x8c48, "HP EliteBook 860 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9845         SND_PCI_QUIRK(0x103c, 0x8c49, "HP Elite x360 830 2-in-1 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9846         SND_PCI_QUIRK(0x103c, 0x8c70, "HP EliteBook 835 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9847         SND_PCI_QUIRK(0x103c, 0x8c71, "HP EliteBook 845 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9848         SND_PCI_QUIRK(0x103c, 0x8c72, "HP EliteBook 865 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
9849         SND_PCI_QUIRK(0x103c, 0x8c96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
9850         SND_PCI_QUIRK(0x103c, 0x8ca4, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9851         SND_PCI_QUIRK(0x103c, 0x8ca7, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
9852         SND_PCI_QUIRK(0x103c, 0x8cf5, "HP ZBook Studio 16", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
9853         SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
9854         SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
9855         SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9856         SND_PCI_QUIRK(0x1043, 0x10a1, "ASUS UX391UA", ALC294_FIXUP_ASUS_SPK),
9857         SND_PCI_QUIRK(0x1043, 0x10c0, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
9858         SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9859         SND_PCI_QUIRK(0x1043, 0x10d3, "ASUS K6500ZC", ALC294_FIXUP_ASUS_SPK),
9860         SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9861         SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9862         SND_PCI_QUIRK(0x1043, 0x125e, "ASUS Q524UQK", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9863         SND_PCI_QUIRK(0x1043, 0x1271, "ASUS X430UN", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
9864         SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
9865         SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
9866         SND_PCI_QUIRK(0x1043, 0x12a3, "Asus N7691ZM", ALC269_FIXUP_ASUS_N7601ZM),
9867         SND_PCI_QUIRK(0x1043, 0x12af, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),
9868         SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
9869         SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
9870         SND_PCI_QUIRK(0x1043, 0x1313, "Asus K42JZ", ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE),
9871         SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
9872         SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
9873         SND_PCI_QUIRK(0x1043, 0x1433, "ASUS GX650P", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
9874         SND_PCI_QUIRK(0x1043, 0x1463, "Asus GA402X", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
9875         SND_PCI_QUIRK(0x1043, 0x1473, "ASUS GU604V", ALC285_FIXUP_ASUS_HEADSET_MIC),
9876         SND_PCI_QUIRK(0x1043, 0x1483, "ASUS GU603V", ALC285_FIXUP_ASUS_HEADSET_MIC),
9877         SND_PCI_QUIRK(0x1043, 0x1493, "ASUS GV601V", ALC285_FIXUP_ASUS_HEADSET_MIC),
9878         SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
9879         SND_PCI_QUIRK(0x1043, 0x1533, "ASUS GV302XA", ALC287_FIXUP_CS35L41_I2C_2),
9880         SND_PCI_QUIRK(0x1043, 0x1573, "ASUS GZ301V", ALC285_FIXUP_ASUS_HEADSET_MIC),
9881         SND_PCI_QUIRK(0x1043, 0x1662, "ASUS GV301QH", ALC294_FIXUP_ASUS_DUAL_SPK),
9882         SND_PCI_QUIRK(0x1043, 0x1663, "ASUS GU603ZV", ALC285_FIXUP_ASUS_HEADSET_MIC),
9883         SND_PCI_QUIRK(0x1043, 0x1683, "ASUS UM3402YAR", ALC287_FIXUP_CS35L41_I2C_2),
9884         SND_PCI_QUIRK(0x1043, 0x16b2, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
9885         SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
9886         SND_PCI_QUIRK(0x1043, 0x1740, "ASUS UX430UA", ALC295_FIXUP_ASUS_DACS),
9887         SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK),
9888         SND_PCI_QUIRK(0x1043, 0x17f3, "ROG Ally RC71L_RC71L", ALC294_FIXUP_ASUS_ALLY),
9889         SND_PCI_QUIRK(0x1043, 0x1881, "ASUS Zephyrus S/M", ALC294_FIXUP_ASUS_GX502_PINS),
9890         SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC),
9891         SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS UM3504DA", ALC294_FIXUP_CS35L41_I2C_2),
9892         SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC),
9893         SND_PCI_QUIRK(0x1043, 0x194e, "ASUS UX563FD", ALC294_FIXUP_ASUS_HPE),
9894         SND_PCI_QUIRK(0x1043, 0x1970, "ASUS UX550VE", ALC289_FIXUP_ASUS_GA401),
9895         SND_PCI_QUIRK(0x1043, 0x1982, "ASUS B1400CEPE", ALC256_FIXUP_ASUS_HPE),
9896         SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE),
9897         SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE),
9898         SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
9899         SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
9900         SND_PCI_QUIRK(0x1043, 0x1a63, "ASUS UX3405MA", ALC245_FIXUP_CS35L41_SPI_2),
9901         SND_PCI_QUIRK(0x1043, 0x1a83, "ASUS UM5302LA", ALC294_FIXUP_CS35L41_I2C_2),
9902         SND_PCI_QUIRK(0x1043, 0x1a8f, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),
9903         SND_PCI_QUIRK(0x1043, 0x1b11, "ASUS UX431DA", ALC294_FIXUP_ASUS_COEF_1B),
9904         SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC),
9905         SND_PCI_QUIRK(0x1043, 0x1b93, "ASUS G614JVR/JIR", ALC245_FIXUP_CS35L41_SPI_2),
9906         SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
9907         SND_PCI_QUIRK(0x1043, 0x1c03, "ASUS UM3406HA", ALC287_FIXUP_CS35L41_I2C_2),
9908         SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
9909         SND_PCI_QUIRK(0x1043, 0x1c33, "ASUS UX5304MA", ALC245_FIXUP_CS35L41_SPI_2),
9910         SND_PCI_QUIRK(0x1043, 0x1c43, "ASUS UX8406MA", ALC245_FIXUP_CS35L41_SPI_2),
9911         SND_PCI_QUIRK(0x1043, 0x1c62, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
9912         SND_PCI_QUIRK(0x1043, 0x1c92, "ASUS ROG Strix G15", ALC285_FIXUP_ASUS_G533Z_PINS),
9913         SND_PCI_QUIRK(0x1043, 0x1c9f, "ASUS G614JI", ALC285_FIXUP_ASUS_HEADSET_MIC),
9914         SND_PCI_QUIRK(0x1043, 0x1caf, "ASUS G634JYR/JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
9915         SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
9916         SND_PCI_QUIRK(0x1043, 0x1d1f, "ASUS ROG Strix G17 2023 (G713PV)", ALC287_FIXUP_CS35L41_I2C_2),
9917         SND_PCI_QUIRK(0x1043, 0x1d42, "ASUS Zephyrus G14 2022", ALC289_FIXUP_ASUS_GA401),
9918         SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),
9919         SND_PCI_QUIRK(0x1043, 0x1da2, "ASUS UP6502ZA/ZD", ALC245_FIXUP_CS35L41_SPI_2),
9920         SND_PCI_QUIRK(0x1043, 0x1e02, "ASUS UX3402ZA", ALC245_FIXUP_CS35L41_SPI_2),
9921         SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS UX3402VA", ALC245_FIXUP_CS35L41_SPI_2),
9922         SND_PCI_QUIRK(0x1043, 0x1f62, "ASUS UX7602ZM", ALC245_FIXUP_CS35L41_SPI_2),
9923         SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502),
9924         SND_PCI_QUIRK(0x1043, 0x1e12, "ASUS UM6702RA/RC", ALC287_FIXUP_CS35L41_I2C_2),
9925         SND_PCI_QUIRK(0x1043, 0x1e51, "ASUS Zephyrus M15", ALC294_FIXUP_ASUS_GU502_PINS),
9926         SND_PCI_QUIRK(0x1043, 0x1e5e, "ASUS ROG Strix G513", ALC294_FIXUP_ASUS_G513_PINS),
9927         SND_PCI_QUIRK(0x1043, 0x1e8e, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA401),
9928         SND_PCI_QUIRK(0x1043, 0x1ee2, "ASUS UM3402", ALC287_FIXUP_CS35L41_I2C_2),
9929         SND_PCI_QUIRK(0x1043, 0x1c52, "ASUS Zephyrus G15 2022", ALC289_FIXUP_ASUS_GA401),
9930         SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),
9931         SND_PCI_QUIRK(0x1043, 0x1f12, "ASUS UM5302", ALC287_FIXUP_CS35L41_I2C_2),
9932         SND_PCI_QUIRK(0x1043, 0x1f62, "ASUS UX7602ZM", ALC245_FIXUP_CS35L41_SPI_2),
9933         SND_PCI_QUIRK(0x1043, 0x1f92, "ASUS ROG Flow X16", ALC289_FIXUP_ASUS_GA401),
9934         SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
9935         SND_PCI_QUIRK(0x1043, 0x3a20, "ASUS G614JZR", ALC245_FIXUP_CS35L41_SPI_2),
9936         SND_PCI_QUIRK(0x1043, 0x3a30, "ASUS G814JVR/JIR", ALC245_FIXUP_CS35L41_SPI_2),
9937         SND_PCI_QUIRK(0x1043, 0x3a40, "ASUS G814JZR", ALC245_FIXUP_CS35L41_SPI_2),
9938         SND_PCI_QUIRK(0x1043, 0x3a50, "ASUS G834JYR/JZR", ALC245_FIXUP_CS35L41_SPI_2),
9939         SND_PCI_QUIRK(0x1043, 0x3a60, "ASUS G634JYR/JZR", ALC245_FIXUP_CS35L41_SPI_2),
9940         SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
9941         SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
9942         SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
9943         SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
9944         SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
9945         SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
9946         SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
9947         SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
9948         SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),
9949         SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
9950         SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
9951         SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
9952         SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),
9953         SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),
9954         SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),
9955         SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN),
9956         SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
9957         SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE),
9958         SND_PCI_QUIRK(0x10ec, 0x118c, "Medion EE4254 MD62100", ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE),
9959         SND_PCI_QUIRK(0x10ec, 0x1230, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
9960         SND_PCI_QUIRK(0x10ec, 0x124c, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
9961         SND_PCI_QUIRK(0x10ec, 0x1252, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
9962         SND_PCI_QUIRK(0x10ec, 0x1254, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
9963         SND_PCI_QUIRK(0x10ec, 0x12cc, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
9964         SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_HEADSET_MODE),
9965         SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
9966         SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_AMP),
9967         SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_AMP),
9968         SND_PCI_QUIRK(0x144d, 0xc189, "Samsung Galaxy Flex Book (NT950QCG-X716)", ALC298_FIXUP_SAMSUNG_AMP),
9969         SND_PCI_QUIRK(0x144d, 0xc18a, "Samsung Galaxy Book Ion (NP930XCJ-K01US)", ALC298_FIXUP_SAMSUNG_AMP),
9970         SND_PCI_QUIRK(0x144d, 0xc1a3, "Samsung Galaxy Book Pro (NP935XDB-KC1SE)", ALC298_FIXUP_SAMSUNG_AMP),
9971         SND_PCI_QUIRK(0x144d, 0xc1a6, "Samsung Galaxy Book Pro 360 (NP930QBD)", ALC298_FIXUP_SAMSUNG_AMP),
9972         SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
9973         SND_PCI_QUIRK(0x144d, 0xc812, "Samsung Notebook Pen S (NT950SBE-X58)", ALC298_FIXUP_SAMSUNG_AMP),
9974         SND_PCI_QUIRK(0x144d, 0xc830, "Samsung Galaxy Book Ion (NT950XCJ-X716A)", ALC298_FIXUP_SAMSUNG_AMP),
9975         SND_PCI_QUIRK(0x144d, 0xc832, "Samsung Galaxy Book Flex Alpha (NP730QCJ)", ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
9976         SND_PCI_QUIRK(0x144d, 0xca03, "Samsung Galaxy Book2 Pro 360 (NP930QED)", ALC298_FIXUP_SAMSUNG_AMP),
9977         SND_PCI_QUIRK(0x144d, 0xc868, "Samsung Galaxy Book2 Pro (NP930XED)", ALC298_FIXUP_SAMSUNG_AMP),
9978         SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
9979         SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
9980         SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
9981         SND_PCI_QUIRK(0x152d, 0x1082, "Quanta NL3", ALC269_FIXUP_LIFEBOOK),
9982         SND_PCI_QUIRK(0x1558, 0x1323, "Clevo N130ZU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9983         SND_PCI_QUIRK(0x1558, 0x1325, "Clevo N15[01][CW]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9984         SND_PCI_QUIRK(0x1558, 0x1401, "Clevo L140[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9985         SND_PCI_QUIRK(0x1558, 0x1403, "Clevo N140CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9986         SND_PCI_QUIRK(0x1558, 0x1404, "Clevo N150CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9987         SND_PCI_QUIRK(0x1558, 0x14a1, "Clevo L141MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9988         SND_PCI_QUIRK(0x1558, 0x4018, "Clevo NV40M[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9989         SND_PCI_QUIRK(0x1558, 0x4019, "Clevo NV40MZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9990         SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9991         SND_PCI_QUIRK(0x1558, 0x4041, "Clevo NV4[15]PZ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9992         SND_PCI_QUIRK(0x1558, 0x40a1, "Clevo NL40GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9993         SND_PCI_QUIRK(0x1558, 0x40c1, "Clevo NL40[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9994         SND_PCI_QUIRK(0x1558, 0x40d1, "Clevo NL41DU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9995         SND_PCI_QUIRK(0x1558, 0x5015, "Clevo NH5[58]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9996         SND_PCI_QUIRK(0x1558, 0x5017, "Clevo NH7[79]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9997         SND_PCI_QUIRK(0x1558, 0x50a3, "Clevo NJ51GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9998         SND_PCI_QUIRK(0x1558, 0x50b3, "Clevo NK50S[BEZ]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
9999         SND_PCI_QUIRK(0x1558, 0x50b6, "Clevo NK50S5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10000         SND_PCI_QUIRK(0x1558, 0x50b8, "Clevo NK50SZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10001         SND_PCI_QUIRK(0x1558, 0x50d5, "Clevo NP50D5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10002         SND_PCI_QUIRK(0x1558, 0x50e1, "Clevo NH5[58]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10003         SND_PCI_QUIRK(0x1558, 0x50e2, "Clevo NH7[79]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10004         SND_PCI_QUIRK(0x1558, 0x50f0, "Clevo NH50A[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10005         SND_PCI_QUIRK(0x1558, 0x50f2, "Clevo NH50E[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10006         SND_PCI_QUIRK(0x1558, 0x50f3, "Clevo NH58DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10007         SND_PCI_QUIRK(0x1558, 0x50f5, "Clevo NH55EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10008         SND_PCI_QUIRK(0x1558, 0x50f6, "Clevo NH55DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10009         SND_PCI_QUIRK(0x1558, 0x5101, "Clevo S510WU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10010         SND_PCI_QUIRK(0x1558, 0x5157, "Clevo W517GU1", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10011         SND_PCI_QUIRK(0x1558, 0x51a1, "Clevo NS50MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10012         SND_PCI_QUIRK(0x1558, 0x51b1, "Clevo NS50AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10013         SND_PCI_QUIRK(0x1558, 0x51b3, "Clevo NS70AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10014         SND_PCI_QUIRK(0x1558, 0x5630, "Clevo NP50RNJS", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10015         SND_PCI_QUIRK(0x1558, 0x70a1, "Clevo NB70T[HJK]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10016         SND_PCI_QUIRK(0x1558, 0x70b3, "Clevo NK70SB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10017         SND_PCI_QUIRK(0x1558, 0x70f2, "Clevo NH79EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10018         SND_PCI_QUIRK(0x1558, 0x70f3, "Clevo NH77DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10019         SND_PCI_QUIRK(0x1558, 0x70f4, "Clevo NH77EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10020         SND_PCI_QUIRK(0x1558, 0x70f6, "Clevo NH77DPQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10021         SND_PCI_QUIRK(0x1558, 0x7716, "Clevo NS50PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10022         SND_PCI_QUIRK(0x1558, 0x7717, "Clevo NS70PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10023         SND_PCI_QUIRK(0x1558, 0x7718, "Clevo L140PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10024         SND_PCI_QUIRK(0x1558, 0x7724, "Clevo L140AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10025         SND_PCI_QUIRK(0x1558, 0x8228, "Clevo NR40BU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10026         SND_PCI_QUIRK(0x1558, 0x8520, "Clevo NH50D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10027         SND_PCI_QUIRK(0x1558, 0x8521, "Clevo NH77D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10028         SND_PCI_QUIRK(0x1558, 0x8535, "Clevo NH50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10029         SND_PCI_QUIRK(0x1558, 0x8536, "Clevo NH79D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10030         SND_PCI_QUIRK(0x1558, 0x8550, "Clevo NH[57][0-9][ER][ACDH]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10031         SND_PCI_QUIRK(0x1558, 0x8551, "Clevo NH[57][0-9][ER][ACDH]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10032         SND_PCI_QUIRK(0x1558, 0x8560, "Clevo NH[57][0-9][ER][ACDH]Q", ALC269_FIXUP_HEADSET_MIC),
10033         SND_PCI_QUIRK(0x1558, 0x8561, "Clevo NH[57][0-9][ER][ACDH]Q", ALC269_FIXUP_HEADSET_MIC),
10034         SND_PCI_QUIRK(0x1558, 0x8562, "Clevo NH[57][0-9]RZ[Q]", ALC269_FIXUP_DMIC),
10035         SND_PCI_QUIRK(0x1558, 0x8668, "Clevo NP50B[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10036         SND_PCI_QUIRK(0x1558, 0x866d, "Clevo NP5[05]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10037         SND_PCI_QUIRK(0x1558, 0x867c, "Clevo NP7[01]PNP", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10038         SND_PCI_QUIRK(0x1558, 0x867d, "Clevo NP7[01]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10039         SND_PCI_QUIRK(0x1558, 0x8680, "Clevo NJ50LU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10040         SND_PCI_QUIRK(0x1558, 0x8686, "Clevo NH50[CZ]U", ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME),
10041         SND_PCI_QUIRK(0x1558, 0x8a20, "Clevo NH55DCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10042         SND_PCI_QUIRK(0x1558, 0x8a51, "Clevo NH70RCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10043         SND_PCI_QUIRK(0x1558, 0x8d50, "Clevo NH55RCQ-M", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10044         SND_PCI_QUIRK(0x1558, 0x951d, "Clevo N950T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10045         SND_PCI_QUIRK(0x1558, 0x9600, "Clevo N960K[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10046         SND_PCI_QUIRK(0x1558, 0x961d, "Clevo N960S[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10047         SND_PCI_QUIRK(0x1558, 0x971d, "Clevo N970T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10048         SND_PCI_QUIRK(0x1558, 0xa500, "Clevo NL5[03]RU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10049         SND_PCI_QUIRK(0x1558, 0xa600, "Clevo NL50NU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10050         SND_PCI_QUIRK(0x1558, 0xa650, "Clevo NP[567]0SN[CD]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10051         SND_PCI_QUIRK(0x1558, 0xa671, "Clevo NP70SN[CDE]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10052         SND_PCI_QUIRK(0x1558, 0xb018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10053         SND_PCI_QUIRK(0x1558, 0xb019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10054         SND_PCI_QUIRK(0x1558, 0xb022, "Clevo NH77D[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10055         SND_PCI_QUIRK(0x1558, 0xc018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10056         SND_PCI_QUIRK(0x1558, 0xc019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10057         SND_PCI_QUIRK(0x1558, 0xc022, "Clevo NH77[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10058         SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
10059         SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
10060         SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
10061         SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
10062         SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
10063         SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
10064         SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
10065         SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
10066         SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST),
10067         SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
10068         SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
10069         SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
10070         SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
10071         SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440),
10072         SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK),
10073         SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK),
10074         SND_PCI_QUIRK(0x17aa, 0x2211, "Thinkpad W541", ALC292_FIXUP_TPT440_DOCK),
10075         SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),
10076         SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK),
10077         SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10078         SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK),
10079         SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
10080         SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
10081         SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10082         SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10083         SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460),
10084         SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),
10085         SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK),
10086         SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10087         SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10088         SND_PCI_QUIRK(0x17aa, 0x2249, "Thinkpad", ALC292_FIXUP_TPT460),
10089         SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10090         SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10091         SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10092         SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10093         SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
10094         SND_PCI_QUIRK(0x17aa, 0x22be, "Thinkpad X1 Carbon 8th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
10095         SND_PCI_QUIRK(0x17aa, 0x22c1, "Thinkpad P1 Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
10096         SND_PCI_QUIRK(0x17aa, 0x22c2, "Thinkpad X1 Extreme Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
10097         SND_PCI_QUIRK(0x17aa, 0x22f1, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10098         SND_PCI_QUIRK(0x17aa, 0x22f2, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10099         SND_PCI_QUIRK(0x17aa, 0x22f3, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10100         SND_PCI_QUIRK(0x17aa, 0x2316, "Thinkpad P1 Gen 6", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10101         SND_PCI_QUIRK(0x17aa, 0x2317, "Thinkpad P1 Gen 6", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10102         SND_PCI_QUIRK(0x17aa, 0x2318, "Thinkpad Z13 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10103         SND_PCI_QUIRK(0x17aa, 0x2319, "Thinkpad Z16 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10104         SND_PCI_QUIRK(0x17aa, 0x231a, "Thinkpad Z16 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10105         SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
10106         SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
10107         SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
10108         SND_PCI_QUIRK(0x17aa, 0x3111, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
10109         SND_PCI_QUIRK(0x17aa, 0x312a, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
10110         SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
10111         SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
10112         SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
10113         SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
10114         SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
10115         SND_PCI_QUIRK(0x17aa, 0x31af, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
10116         SND_PCI_QUIRK(0x17aa, 0x3801, "Lenovo Yoga9 14IAP7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
10117         SND_PCI_QUIRK(0x17aa, 0x3802, "Lenovo Yoga DuetITL 2021", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
10118         SND_PCI_QUIRK(0x17aa, 0x3813, "Legion 7i 15IMHG05", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
10119         SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940 / Yoga Duet 7", ALC298_FIXUP_LENOVO_C940_DUET7),
10120         SND_PCI_QUIRK(0x17aa, 0x3819, "Lenovo 13s Gen2 ITL", ALC287_FIXUP_13S_GEN2_SPEAKERS),
10121         SND_PCI_QUIRK(0x17aa, 0x3820, "Yoga Duet 7 13ITL6", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
10122         SND_PCI_QUIRK(0x17aa, 0x3824, "Legion Y9000X 2020", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
10123         SND_PCI_QUIRK(0x17aa, 0x3827, "Ideapad S740", ALC285_FIXUP_IDEAPAD_S740_COEF),
10124         SND_PCI_QUIRK(0x17aa, 0x3834, "Lenovo IdeaPad Slim 9i 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
10125         SND_PCI_QUIRK(0x17aa, 0x383d, "Legion Y9000X 2019", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
10126         SND_PCI_QUIRK(0x17aa, 0x3843, "Yoga 9i", ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP),
10127         SND_PCI_QUIRK(0x17aa, 0x3847, "Legion 7 16ACHG6", ALC287_FIXUP_LEGION_16ACHG6),
10128         SND_PCI_QUIRK(0x17aa, 0x384a, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
10129         SND_PCI_QUIRK(0x17aa, 0x3852, "Lenovo Yoga 7 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
10130         SND_PCI_QUIRK(0x17aa, 0x3853, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
10131         SND_PCI_QUIRK(0x17aa, 0x3855, "Legion 7 16ITHG6", ALC287_FIXUP_LEGION_16ITHG6),
10132         SND_PCI_QUIRK(0x17aa, 0x3869, "Lenovo Yoga7 14IAL7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
10133         SND_PCI_QUIRK(0x17aa, 0x387d, "Yoga S780-16 pro Quad AAC", ALC287_FIXUP_TAS2781_I2C),
10134         SND_PCI_QUIRK(0x17aa, 0x387e, "Yoga S780-16 pro Quad YC", ALC287_FIXUP_TAS2781_I2C),
10135         SND_PCI_QUIRK(0x17aa, 0x3881, "YB9 dual power mode2 YC", ALC287_FIXUP_TAS2781_I2C),
10136         SND_PCI_QUIRK(0x17aa, 0x3882, "Lenovo Yoga Pro 7 14APH8", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
10137         SND_PCI_QUIRK(0x17aa, 0x3884, "Y780 YG DUAL", ALC287_FIXUP_TAS2781_I2C),
10138         SND_PCI_QUIRK(0x17aa, 0x3886, "Y780 VECO DUAL", ALC287_FIXUP_TAS2781_I2C),
10139         SND_PCI_QUIRK(0x17aa, 0x38a7, "Y780P AMD YG dual", ALC287_FIXUP_TAS2781_I2C),
10140         SND_PCI_QUIRK(0x17aa, 0x38a8, "Y780P AMD VECO dual", ALC287_FIXUP_TAS2781_I2C),
10141         SND_PCI_QUIRK(0x17aa, 0x38ba, "Yoga S780-14.5 Air AMD quad YC", ALC287_FIXUP_TAS2781_I2C),
10142         SND_PCI_QUIRK(0x17aa, 0x38bb, "Yoga S780-14.5 Air AMD quad AAC", ALC287_FIXUP_TAS2781_I2C),
10143         SND_PCI_QUIRK(0x17aa, 0x38be, "Yoga S980-14.5 proX YC Dual", ALC287_FIXUP_TAS2781_I2C),
10144         SND_PCI_QUIRK(0x17aa, 0x38bf, "Yoga S980-14.5 proX LX Dual", ALC287_FIXUP_TAS2781_I2C),
10145         SND_PCI_QUIRK(0x17aa, 0x38c3, "Y980 DUAL", ALC287_FIXUP_TAS2781_I2C),
10146         SND_PCI_QUIRK(0x17aa, 0x38cb, "Y790 YG DUAL", ALC287_FIXUP_TAS2781_I2C),
10147         SND_PCI_QUIRK(0x17aa, 0x38cd, "Y790 VECO DUAL", ALC287_FIXUP_TAS2781_I2C),
10148         SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
10149         SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
10150         SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
10151         SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
10152         SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10153         SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
10154         SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
10155         SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10156         SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK),
10157         SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK),
10158         SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK),
10159         SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK),
10160         SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
10161         SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),
10162         SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),
10163         SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460),
10164         SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10165         SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10166         SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10167         SND_PCI_QUIRK(0x17aa, 0x508b, "Thinkpad X12 Gen 1", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
10168         SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10169         SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10170         SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10171         SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
10172         SND_PCI_QUIRK(0x17aa, 0x9e56, "Lenovo ZhaoYang CF4620Z", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
10173         SND_PCI_QUIRK(0x1849, 0x1233, "ASRock NUC Box 1100", ALC233_FIXUP_NO_AUDIO_JACK),
10174         SND_PCI_QUIRK(0x1849, 0xa233, "Positivo Master C6300", ALC269_FIXUP_HEADSET_MIC),
10175         SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
10176         SND_PCI_QUIRK(0x19e5, 0x320f, "Huawei WRT-WX9 ", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
10177         SND_PCI_QUIRK(0x1b35, 0x1235, "CZC B20", ALC269_FIXUP_CZC_B20),
10178         SND_PCI_QUIRK(0x1b35, 0x1236, "CZC TMI", ALC269_FIXUP_CZC_TMI),
10179         SND_PCI_QUIRK(0x1b35, 0x1237, "CZC L101", ALC269_FIXUP_CZC_L101),
10180         SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
10181         SND_PCI_QUIRK(0x1c06, 0x2013, "Lemote A1802", ALC269_FIXUP_LEMOTE_A1802),
10182         SND_PCI_QUIRK(0x1c06, 0x2015, "Lemote A190X", ALC269_FIXUP_LEMOTE_A190X),
10183         SND_PCI_QUIRK(0x1c6c, 0x1251, "Positivo N14KP6-TG", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE),
10184         SND_PCI_QUIRK(0x1d05, 0x1132, "TongFang PHxTxX1", ALC256_FIXUP_SET_COEF_DEFAULTS),
10185         SND_PCI_QUIRK(0x1d05, 0x1096, "TongFang GMxMRxx", ALC269_FIXUP_NO_SHUTUP),
10186         SND_PCI_QUIRK(0x1d05, 0x1100, "TongFang GKxNRxx", ALC269_FIXUP_NO_SHUTUP),
10187         SND_PCI_QUIRK(0x1d05, 0x1111, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
10188         SND_PCI_QUIRK(0x1d05, 0x1119, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
10189         SND_PCI_QUIRK(0x1d05, 0x1129, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
10190         SND_PCI_QUIRK(0x1d05, 0x1147, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
10191         SND_PCI_QUIRK(0x1d05, 0x115c, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
10192         SND_PCI_QUIRK(0x1d05, 0x121b, "TongFang GMxAGxx", ALC269_FIXUP_NO_SHUTUP),
10193         SND_PCI_QUIRK(0x1d72, 0x1602, "RedmiBook", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
10194         SND_PCI_QUIRK(0x1d72, 0x1701, "XiaomiNotebook Pro", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE),
10195         SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC),
10196         SND_PCI_QUIRK(0x1d72, 0x1945, "Redmi G", ALC256_FIXUP_ASUS_HEADSET_MIC),
10197         SND_PCI_QUIRK(0x1d72, 0x1947, "RedmiBook Air", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
10198         SND_PCI_QUIRK(0x2782, 0x0232, "CHUWI CoreBook XPro", ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO),
10199         SND_PCI_QUIRK(0x8086, 0x2074, "Intel NUC 8", ALC233_FIXUP_INTEL_NUC8_DMIC),
10200         SND_PCI_QUIRK(0x8086, 0x2080, "Intel NUC 8 Rugged", ALC256_FIXUP_INTEL_NUC8_RUGGED),
10201         SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", ALC256_FIXUP_INTEL_NUC10),
10202         SND_PCI_QUIRK(0x8086, 0x3038, "Intel NUC 13", ALC295_FIXUP_CHROME_BOOK),
10203         SND_PCI_QUIRK(0xf111, 0x0001, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
10204         SND_PCI_QUIRK(0xf111, 0x0005, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
10205         SND_PCI_QUIRK(0xf111, 0x0006, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
10206
10207 #if 0
10208         /* Below is a quirk table taken from the old code.
10209          * Basically the device should work as is without the fixup table.
10210          * If BIOS doesn't give a proper info, enable the corresponding
10211          * fixup entry.
10212          */
10213         SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
10214                       ALC269_FIXUP_AMIC),
10215         SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
10216         SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),
10217         SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),
10218         SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),
10219         SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC),
10220         SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC),
10221         SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC),
10222         SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC),
10223         SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC),
10224         SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC),
10225         SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC),
10226         SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC),
10227         SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC),
10228         SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC),
10229         SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC),
10230         SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC),
10231         SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC),
10232         SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC),
10233         SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC),
10234         SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC),
10235         SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC),
10236         SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC),
10237         SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC),
10238         SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC),
10239         SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC),
10240         SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC),
10241         SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC),
10242         SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC),
10243         SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC),
10244         SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC),
10245         SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC),
10246         SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC),
10247         SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC),
10248         SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC),
10249         SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC),
10250         SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC),
10251         SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC),
10252         SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC),
10253         SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC),
10254 #endif
10255         {}
10256 };
10257
10258 static const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = {
10259         SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
10260         SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),
10261         SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
10262         SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI),
10263         SND_PCI_QUIRK_VENDOR(0x19e5, "Huawei Matebook", ALC255_FIXUP_MIC_MUTE_LED),
10264         {}
10265 };
10266
10267 static const struct hda_model_fixup alc269_fixup_models[] = {
10268         {.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
10269         {.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
10270         {.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},
10271         {.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},
10272         {.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
10273         {.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"},
10274         {.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"},
10275         {.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"},
10276         {.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
10277         {.id = ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST, .name = "lenovo-dock-limit-boost"},
10278         {.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
10279         {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"},
10280         {.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
10281         {.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
10282         {.id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, .name = "dell-headset3"},
10283         {.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, .name = "dell-headset4"},
10284         {.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
10285         {.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},
10286         {.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
10287         {.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
10288         {.id = ALC292_FIXUP_TPT460, .name = "tpt460"},
10289         {.id = ALC298_FIXUP_TPT470_DOCK_FIX, .name = "tpt470-dock-fix"},
10290         {.id = ALC298_FIXUP_TPT470_DOCK, .name = "tpt470-dock"},
10291         {.id = ALC233_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
10292         {.id = ALC700_FIXUP_INTEL_REFERENCE, .name = "alc700-ref"},
10293         {.id = ALC269_FIXUP_SONY_VAIO, .name = "vaio"},
10294         {.id = ALC269_FIXUP_DELL_M101Z, .name = "dell-m101z"},
10295         {.id = ALC269_FIXUP_ASUS_G73JW, .name = "asus-g73jw"},
10296         {.id = ALC269_FIXUP_LENOVO_EAPD, .name = "lenovo-eapd"},
10297         {.id = ALC275_FIXUP_SONY_HWEQ, .name = "sony-hweq"},
10298         {.id = ALC269_FIXUP_PCM_44K, .name = "pcm44k"},
10299         {.id = ALC269_FIXUP_LIFEBOOK, .name = "lifebook"},
10300         {.id = ALC269_FIXUP_LIFEBOOK_EXTMIC, .name = "lifebook-extmic"},
10301         {.id = ALC269_FIXUP_LIFEBOOK_HP_PIN, .name = "lifebook-hp-pin"},
10302         {.id = ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC, .name = "lifebook-u7x7"},
10303         {.id = ALC269VB_FIXUP_AMIC, .name = "alc269vb-amic"},
10304         {.id = ALC269VB_FIXUP_DMIC, .name = "alc269vb-dmic"},
10305         {.id = ALC269_FIXUP_HP_MUTE_LED_MIC1, .name = "hp-mute-led-mic1"},
10306         {.id = ALC269_FIXUP_HP_MUTE_LED_MIC2, .name = "hp-mute-led-mic2"},
10307         {.id = ALC269_FIXUP_HP_MUTE_LED_MIC3, .name = "hp-mute-led-mic3"},
10308         {.id = ALC269_FIXUP_HP_GPIO_MIC1_LED, .name = "hp-gpio-mic1"},
10309         {.id = ALC269_FIXUP_HP_LINE1_MIC1_LED, .name = "hp-line1-mic1"},
10310         {.id = ALC269_FIXUP_NO_SHUTUP, .name = "noshutup"},
10311         {.id = ALC286_FIXUP_SONY_MIC_NO_PRESENCE, .name = "sony-nomic"},
10312         {.id = ALC269_FIXUP_ASPIRE_HEADSET_MIC, .name = "aspire-headset-mic"},
10313         {.id = ALC269_FIXUP_ASUS_X101, .name = "asus-x101"},
10314         {.id = ALC271_FIXUP_HP_GATE_MIC_JACK, .name = "acer-ao7xx"},
10315         {.id = ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572, .name = "acer-aspire-e1"},
10316         {.id = ALC269_FIXUP_ACER_AC700, .name = "acer-ac700"},
10317         {.id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST, .name = "limit-mic-boost"},
10318         {.id = ALC269VB_FIXUP_ASUS_ZENBOOK, .name = "asus-zenbook"},
10319         {.id = ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A, .name = "asus-zenbook-ux31a"},
10320         {.id = ALC269VB_FIXUP_ORDISSIMO_EVE2, .name = "ordissimo"},
10321         {.id = ALC282_FIXUP_ASUS_TX300, .name = "asus-tx300"},
10322         {.id = ALC283_FIXUP_INT_MIC, .name = "alc283-int-mic"},
10323         {.id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK, .name = "mono-speakers"},
10324         {.id = ALC290_FIXUP_SUBWOOFER_HSJACK, .name = "alc290-subwoofer"},
10325         {.id = ALC269_FIXUP_THINKPAD_ACPI, .name = "thinkpad"},
10326         {.id = ALC269_FIXUP_DMIC_THINKPAD_ACPI, .name = "dmic-thinkpad"},
10327         {.id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE, .name = "alc255-acer"},
10328         {.id = ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc255-asus"},
10329         {.id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc255-dell1"},
10330         {.id = ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "alc255-dell2"},
10331         {.id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc293-dell1"},
10332         {.id = ALC283_FIXUP_HEADSET_MIC, .name = "alc283-headset"},
10333         {.id = ALC255_FIXUP_MIC_MUTE_LED, .name = "alc255-dell-mute"},
10334         {.id = ALC282_FIXUP_ASPIRE_V5_PINS, .name = "aspire-v5"},
10335         {.id = ALC269VB_FIXUP_ASPIRE_E1_COEF, .name = "aspire-e1-coef"},
10336         {.id = ALC280_FIXUP_HP_GPIO4, .name = "hp-gpio4"},
10337         {.id = ALC286_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
10338         {.id = ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, .name = "hp-gpio2-hotkey"},
10339         {.id = ALC280_FIXUP_HP_DOCK_PINS, .name = "hp-dock-pins"},
10340         {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic"},
10341         {.id = ALC280_FIXUP_HP_9480M, .name = "hp-9480m"},
10342         {.id = ALC288_FIXUP_DELL_HEADSET_MODE, .name = "alc288-dell-headset"},
10343         {.id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc288-dell1"},
10344         {.id = ALC288_FIXUP_DELL_XPS_13, .name = "alc288-dell-xps13"},
10345         {.id = ALC292_FIXUP_DELL_E7X, .name = "dell-e7x"},
10346         {.id = ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK, .name = "alc293-dell"},
10347         {.id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc298-dell1"},
10348         {.id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, .name = "alc298-dell-aio"},
10349         {.id = ALC275_FIXUP_DELL_XPS, .name = "alc275-dell-xps"},
10350         {.id = ALC293_FIXUP_LENOVO_SPK_NOISE, .name = "lenovo-spk-noise"},
10351         {.id = ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, .name = "lenovo-hotkey"},
10352         {.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"},
10353         {.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc225-dell1"},
10354         {.id = ALC295_FIXUP_DISABLE_DAC3, .name = "alc295-disable-dac3"},
10355         {.id = ALC285_FIXUP_SPEAKER2_TO_DAC1, .name = "alc285-speaker2-to-dac1"},
10356         {.id = ALC280_FIXUP_HP_HEADSET_MIC, .name = "alc280-hp-headset"},
10357         {.id = ALC221_FIXUP_HP_FRONT_MIC, .name = "alc221-hp-mic"},
10358         {.id = ALC298_FIXUP_SPK_VOLUME, .name = "alc298-spk-volume"},
10359         {.id = ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER, .name = "dell-inspiron-7559"},
10360         {.id = ALC269_FIXUP_ATIV_BOOK_8, .name = "ativ-book"},
10361         {.id = ALC221_FIXUP_HP_MIC_NO_PRESENCE, .name = "alc221-hp-mic"},
10362         {.id = ALC256_FIXUP_ASUS_HEADSET_MODE, .name = "alc256-asus-headset"},
10363         {.id = ALC256_FIXUP_ASUS_MIC, .name = "alc256-asus-mic"},
10364         {.id = ALC256_FIXUP_ASUS_AIO_GPIO2, .name = "alc256-asus-aio"},
10365         {.id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc233-asus"},
10366         {.id = ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE, .name = "alc233-eapd"},
10367         {.id = ALC294_FIXUP_LENOVO_MIC_LOCATION, .name = "alc294-lenovo-mic"},
10368         {.id = ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE, .name = "alc225-wyse"},
10369         {.id = ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, .name = "alc274-dell-aio"},
10370         {.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"},
10371         {.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"},
10372         {.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"},
10373         {.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-headset-jack"},
10374         {.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-chrome-book"},
10375         {.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"},
10376         {.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"},
10377         {.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"},
10378         {.id = ALC298_FIXUP_SAMSUNG_AMP, .name = "alc298-samsung-amp"},
10379         {.id = ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, .name = "alc256-samsung-headphone"},
10380         {.id = ALC255_FIXUP_XIAOMI_HEADSET_MIC, .name = "alc255-xiaomi-headset"},
10381         {.id = ALC274_FIXUP_HP_MIC, .name = "alc274-hp-mic-detect"},
10382         {.id = ALC245_FIXUP_HP_X360_AMP, .name = "alc245-hp-x360-amp"},
10383         {.id = ALC295_FIXUP_HP_OMEN, .name = "alc295-hp-omen"},
10384         {.id = ALC285_FIXUP_HP_SPECTRE_X360, .name = "alc285-hp-spectre-x360"},
10385         {.id = ALC285_FIXUP_HP_SPECTRE_X360_EB1, .name = "alc285-hp-spectre-x360-eb1"},
10386         {.id = ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP, .name = "alc287-ideapad-bass-spk-amp"},
10387         {.id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN, .name = "alc287-yoga9-bass-spk-pin"},
10388         {.id = ALC623_FIXUP_LENOVO_THINKSTATION_P340, .name = "alc623-lenovo-thinkstation-p340"},
10389         {.id = ALC255_FIXUP_ACER_HEADPHONE_AND_MIC, .name = "alc255-acer-headphone-and-mic"},
10390         {.id = ALC285_FIXUP_HP_GPIO_AMP_INIT, .name = "alc285-hp-amp-init"},
10391         {}
10392 };
10393 #define ALC225_STANDARD_PINS \
10394         {0x21, 0x04211020}
10395
10396 #define ALC256_STANDARD_PINS \
10397         {0x12, 0x90a60140}, \
10398         {0x14, 0x90170110}, \
10399         {0x21, 0x02211020}
10400
10401 #define ALC282_STANDARD_PINS \
10402         {0x14, 0x90170110}
10403
10404 #define ALC290_STANDARD_PINS \
10405         {0x12, 0x99a30130}
10406
10407 #define ALC292_STANDARD_PINS \
10408         {0x14, 0x90170110}, \
10409         {0x15, 0x0221401f}
10410
10411 #define ALC295_STANDARD_PINS \
10412         {0x12, 0xb7a60130}, \
10413         {0x14, 0x90170110}, \
10414         {0x21, 0x04211020}
10415
10416 #define ALC298_STANDARD_PINS \
10417         {0x12, 0x90a60130}, \
10418         {0x21, 0x03211020}
10419
10420 static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
10421         SND_HDA_PIN_QUIRK(0x10ec0221, 0x103c, "HP Workstation", ALC221_FIXUP_HP_HEADSET_MIC,
10422                 {0x14, 0x01014020},
10423                 {0x17, 0x90170110},
10424                 {0x18, 0x02a11030},
10425                 {0x19, 0x0181303F},
10426                 {0x21, 0x0221102f}),
10427         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
10428                 {0x12, 0x90a601c0},
10429                 {0x14, 0x90171120},
10430                 {0x21, 0x02211030}),
10431         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
10432                 {0x14, 0x90170110},
10433                 {0x1b, 0x90a70130},
10434                 {0x21, 0x03211020}),
10435         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
10436                 {0x1a, 0x90a70130},
10437                 {0x1b, 0x90170110},
10438                 {0x21, 0x03211020}),
10439         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10440                 ALC225_STANDARD_PINS,
10441                 {0x12, 0xb7a60130},
10442                 {0x14, 0x901701a0}),
10443         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10444                 ALC225_STANDARD_PINS,
10445                 {0x12, 0xb7a60130},
10446                 {0x14, 0x901701b0}),
10447         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10448                 ALC225_STANDARD_PINS,
10449                 {0x12, 0xb7a60150},
10450                 {0x14, 0x901701a0}),
10451         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10452                 ALC225_STANDARD_PINS,
10453                 {0x12, 0xb7a60150},
10454                 {0x14, 0x901701b0}),
10455         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10456                 ALC225_STANDARD_PINS,
10457                 {0x12, 0xb7a60130},
10458                 {0x1b, 0x90170110}),
10459         SND_HDA_PIN_QUIRK(0x10ec0233, 0x8086, "Intel NUC Skull Canyon", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10460                 {0x1b, 0x01111010},
10461                 {0x1e, 0x01451130},
10462                 {0x21, 0x02211020}),
10463         SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
10464                 {0x12, 0x90a60140},
10465                 {0x14, 0x90170110},
10466                 {0x19, 0x02a11030},
10467                 {0x21, 0x02211020}),
10468         SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
10469                 {0x14, 0x90170110},
10470                 {0x19, 0x02a11030},
10471                 {0x1a, 0x02a11040},
10472                 {0x1b, 0x01014020},
10473                 {0x21, 0x0221101f}),
10474         SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
10475                 {0x14, 0x90170110},
10476                 {0x19, 0x02a11030},
10477                 {0x1a, 0x02a11040},
10478                 {0x1b, 0x01011020},
10479                 {0x21, 0x0221101f}),
10480         SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
10481                 {0x14, 0x90170110},
10482                 {0x19, 0x02a11020},
10483                 {0x1a, 0x02a11030},
10484                 {0x21, 0x0221101f}),
10485         SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
10486                 {0x21, 0x02211010}),
10487         SND_HDA_PIN_QUIRK(0x10ec0236, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
10488                 {0x14, 0x90170110},
10489                 {0x19, 0x02a11020},
10490                 {0x21, 0x02211030}),
10491         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
10492                 {0x14, 0x90170110},
10493                 {0x21, 0x02211020}),
10494         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10495                 {0x14, 0x90170130},
10496                 {0x21, 0x02211040}),
10497         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10498                 {0x12, 0x90a60140},
10499                 {0x14, 0x90170110},
10500                 {0x21, 0x02211020}),
10501         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10502                 {0x12, 0x90a60160},
10503                 {0x14, 0x90170120},
10504                 {0x21, 0x02211030}),
10505         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10506                 {0x14, 0x90170110},
10507                 {0x1b, 0x02011020},
10508                 {0x21, 0x0221101f}),
10509         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10510                 {0x14, 0x90170110},
10511                 {0x1b, 0x01011020},
10512                 {0x21, 0x0221101f}),
10513         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10514                 {0x14, 0x90170130},
10515                 {0x1b, 0x01014020},
10516                 {0x21, 0x0221103f}),
10517         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10518                 {0x14, 0x90170130},
10519                 {0x1b, 0x01011020},
10520                 {0x21, 0x0221103f}),
10521         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10522                 {0x14, 0x90170130},
10523                 {0x1b, 0x02011020},
10524                 {0x21, 0x0221103f}),
10525         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10526                 {0x14, 0x90170150},
10527                 {0x1b, 0x02011020},
10528                 {0x21, 0x0221105f}),
10529         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10530                 {0x14, 0x90170110},
10531                 {0x1b, 0x01014020},
10532                 {0x21, 0x0221101f}),
10533         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10534                 {0x12, 0x90a60160},
10535                 {0x14, 0x90170120},
10536                 {0x17, 0x90170140},
10537                 {0x21, 0x0321102f}),
10538         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10539                 {0x12, 0x90a60160},
10540                 {0x14, 0x90170130},
10541                 {0x21, 0x02211040}),
10542         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10543                 {0x12, 0x90a60160},
10544                 {0x14, 0x90170140},
10545                 {0x21, 0x02211050}),
10546         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10547                 {0x12, 0x90a60170},
10548                 {0x14, 0x90170120},
10549                 {0x21, 0x02211030}),
10550         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10551                 {0x12, 0x90a60170},
10552                 {0x14, 0x90170130},
10553                 {0x21, 0x02211040}),
10554         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10555                 {0x12, 0x90a60170},
10556                 {0x14, 0x90171130},
10557                 {0x21, 0x02211040}),
10558         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10559                 {0x12, 0x90a60170},
10560                 {0x14, 0x90170140},
10561                 {0x21, 0x02211050}),
10562         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10563                 {0x12, 0x90a60180},
10564                 {0x14, 0x90170130},
10565                 {0x21, 0x02211040}),
10566         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5565", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10567                 {0x12, 0x90a60180},
10568                 {0x14, 0x90170120},
10569                 {0x21, 0x02211030}),
10570         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10571                 {0x1b, 0x01011020},
10572                 {0x21, 0x02211010}),
10573         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
10574                 {0x14, 0x90170110},
10575                 {0x1b, 0x90a70130},
10576                 {0x21, 0x04211020}),
10577         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
10578                 {0x14, 0x90170110},
10579                 {0x1b, 0x90a70130},
10580                 {0x21, 0x03211020}),
10581         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
10582                 {0x12, 0x90a60130},
10583                 {0x14, 0x90170110},
10584                 {0x21, 0x03211020}),
10585         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
10586                 {0x12, 0x90a60130},
10587                 {0x14, 0x90170110},
10588                 {0x21, 0x04211020}),
10589         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
10590                 {0x1a, 0x90a70130},
10591                 {0x1b, 0x90170110},
10592                 {0x21, 0x03211020}),
10593        SND_HDA_PIN_QUIRK(0x10ec0256, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
10594                 {0x14, 0x90170110},
10595                 {0x19, 0x02a11020},
10596                 {0x21, 0x0221101f}),
10597        SND_HDA_PIN_QUIRK(0x10ec0274, 0x103c, "HP", ALC274_FIXUP_HP_HEADSET_MIC,
10598                 {0x17, 0x90170110},
10599                 {0x19, 0x03a11030},
10600                 {0x21, 0x03211020}),
10601         SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
10602                 {0x12, 0x90a60130},
10603                 {0x14, 0x90170110},
10604                 {0x15, 0x0421101f},
10605                 {0x1a, 0x04a11020}),
10606         SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED,
10607                 {0x12, 0x90a60140},
10608                 {0x14, 0x90170110},
10609                 {0x15, 0x0421101f},
10610                 {0x18, 0x02811030},
10611                 {0x1a, 0x04a1103f},
10612                 {0x1b, 0x02011020}),
10613         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10614                 ALC282_STANDARD_PINS,
10615                 {0x12, 0x99a30130},
10616                 {0x19, 0x03a11020},
10617                 {0x21, 0x0321101f}),
10618         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10619                 ALC282_STANDARD_PINS,
10620                 {0x12, 0x99a30130},
10621                 {0x19, 0x03a11020},
10622                 {0x21, 0x03211040}),
10623         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10624                 ALC282_STANDARD_PINS,
10625                 {0x12, 0x99a30130},
10626                 {0x19, 0x03a11030},
10627                 {0x21, 0x03211020}),
10628         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10629                 ALC282_STANDARD_PINS,
10630                 {0x12, 0x99a30130},
10631                 {0x19, 0x04a11020},
10632                 {0x21, 0x0421101f}),
10633         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED,
10634                 ALC282_STANDARD_PINS,
10635                 {0x12, 0x90a60140},
10636                 {0x19, 0x04a11030},
10637                 {0x21, 0x04211020}),
10638         SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
10639                 ALC282_STANDARD_PINS,
10640                 {0x12, 0x90a609c0},
10641                 {0x18, 0x03a11830},
10642                 {0x19, 0x04a19831},
10643                 {0x1a, 0x0481303f},
10644                 {0x1b, 0x04211020},
10645                 {0x21, 0x0321101f}),
10646         SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
10647                 ALC282_STANDARD_PINS,
10648                 {0x12, 0x90a60940},
10649                 {0x18, 0x03a11830},
10650                 {0x19, 0x04a19831},
10651                 {0x1a, 0x0481303f},
10652                 {0x1b, 0x04211020},
10653                 {0x21, 0x0321101f}),
10654         SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10655                 ALC282_STANDARD_PINS,
10656                 {0x12, 0x90a60130},
10657                 {0x21, 0x0321101f}),
10658         SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10659                 {0x12, 0x90a60160},
10660                 {0x14, 0x90170120},
10661                 {0x21, 0x02211030}),
10662         SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10663                 ALC282_STANDARD_PINS,
10664                 {0x12, 0x90a60130},
10665                 {0x19, 0x03a11020},
10666                 {0x21, 0x0321101f}),
10667         SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
10668                 {0x12, 0x90a60130},
10669                 {0x14, 0x90170110},
10670                 {0x19, 0x04a11040},
10671                 {0x21, 0x04211020}),
10672         SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
10673                 {0x14, 0x90170110},
10674                 {0x19, 0x04a11040},
10675                 {0x1d, 0x40600001},
10676                 {0x21, 0x04211020}),
10677         SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
10678                 {0x14, 0x90170110},
10679                 {0x19, 0x04a11040},
10680                 {0x21, 0x04211020}),
10681         SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_HEADSET_JACK,
10682                 {0x14, 0x90170110},
10683                 {0x17, 0x90170111},
10684                 {0x19, 0x03a11030},
10685                 {0x21, 0x03211020}),
10686         SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC287_FIXUP_THINKPAD_I2S_SPK,
10687                 {0x17, 0x90170110},
10688                 {0x19, 0x03a11030},
10689                 {0x21, 0x03211020}),
10690         SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC287_FIXUP_THINKPAD_I2S_SPK,
10691                 {0x17, 0x90170110}, /* 0x231f with RTK I2S AMP */
10692                 {0x19, 0x04a11040},
10693                 {0x21, 0x04211020}),
10694         SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
10695                 {0x12, 0x90a60130},
10696                 {0x17, 0x90170110},
10697                 {0x21, 0x02211020}),
10698         SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
10699                 {0x12, 0x90a60120},
10700                 {0x14, 0x90170110},
10701                 {0x21, 0x0321101f}),
10702         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10703                 ALC290_STANDARD_PINS,
10704                 {0x15, 0x04211040},
10705                 {0x18, 0x90170112},
10706                 {0x1a, 0x04a11020}),
10707         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10708                 ALC290_STANDARD_PINS,
10709                 {0x15, 0x04211040},
10710                 {0x18, 0x90170110},
10711                 {0x1a, 0x04a11020}),
10712         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10713                 ALC290_STANDARD_PINS,
10714                 {0x15, 0x0421101f},
10715                 {0x1a, 0x04a11020}),
10716         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10717                 ALC290_STANDARD_PINS,
10718                 {0x15, 0x04211020},
10719                 {0x1a, 0x04a11040}),
10720         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10721                 ALC290_STANDARD_PINS,
10722                 {0x14, 0x90170110},
10723                 {0x15, 0x04211020},
10724                 {0x1a, 0x04a11040}),
10725         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10726                 ALC290_STANDARD_PINS,
10727                 {0x14, 0x90170110},
10728                 {0x15, 0x04211020},
10729                 {0x1a, 0x04a11020}),
10730         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
10731                 ALC290_STANDARD_PINS,
10732                 {0x14, 0x90170110},
10733                 {0x15, 0x0421101f},
10734                 {0x1a, 0x04a11020}),
10735         SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
10736                 ALC292_STANDARD_PINS,
10737                 {0x12, 0x90a60140},
10738                 {0x16, 0x01014020},
10739                 {0x19, 0x01a19030}),
10740         SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
10741                 ALC292_STANDARD_PINS,
10742                 {0x12, 0x90a60140},
10743                 {0x16, 0x01014020},
10744                 {0x18, 0x02a19031},
10745                 {0x19, 0x01a1903e}),
10746         SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
10747                 ALC292_STANDARD_PINS,
10748                 {0x12, 0x90a60140}),
10749         SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
10750                 ALC292_STANDARD_PINS,
10751                 {0x13, 0x90a60140},
10752                 {0x16, 0x21014020},
10753                 {0x19, 0x21a19030}),
10754         SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
10755                 ALC292_STANDARD_PINS,
10756                 {0x13, 0x90a60140}),
10757         SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_HPE,
10758                 {0x17, 0x90170110},
10759                 {0x21, 0x04211020}),
10760         SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC,
10761                 {0x14, 0x90170110},
10762                 {0x1b, 0x90a70130},
10763                 {0x21, 0x04211020}),
10764         SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
10765                 {0x12, 0x90a60130},
10766                 {0x17, 0x90170110},
10767                 {0x21, 0x03211020}),
10768         SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
10769                 {0x12, 0x90a60130},
10770                 {0x17, 0x90170110},
10771                 {0x21, 0x04211020}),
10772         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
10773                 {0x12, 0x90a60130},
10774                 {0x17, 0x90170110},
10775                 {0x21, 0x03211020}),
10776         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
10777                 {0x12, 0x90a60120},
10778                 {0x17, 0x90170110},
10779                 {0x21, 0x04211030}),
10780         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
10781                 {0x12, 0x90a60130},
10782                 {0x17, 0x90170110},
10783                 {0x21, 0x03211020}),
10784         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
10785                 {0x12, 0x90a60130},
10786                 {0x17, 0x90170110},
10787                 {0x21, 0x03211020}),
10788         SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
10789                 ALC298_STANDARD_PINS,
10790                 {0x17, 0x90170110}),
10791         SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
10792                 ALC298_STANDARD_PINS,
10793                 {0x17, 0x90170140}),
10794         SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
10795                 ALC298_STANDARD_PINS,
10796                 {0x17, 0x90170150}),
10797         SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_SPK_VOLUME,
10798                 {0x12, 0xb7a60140},
10799                 {0x13, 0xb7a60150},
10800                 {0x17, 0x90170110},
10801                 {0x1a, 0x03011020},
10802                 {0x21, 0x03211030}),
10803         SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
10804                 {0x12, 0xb7a60140},
10805                 {0x17, 0x90170110},
10806                 {0x1a, 0x03a11030},
10807                 {0x21, 0x03211020}),
10808         SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
10809                 ALC225_STANDARD_PINS,
10810                 {0x12, 0xb7a60130},
10811                 {0x17, 0x90170110}),
10812         SND_HDA_PIN_QUIRK(0x10ec0623, 0x17aa, "Lenovo", ALC283_FIXUP_HEADSET_MIC,
10813                 {0x14, 0x01014010},
10814                 {0x17, 0x90170120},
10815                 {0x18, 0x02a11030},
10816                 {0x19, 0x02a1103f},
10817                 {0x21, 0x0221101f}),
10818         {}
10819 };
10820
10821 /* This is the fallback pin_fixup_tbl for alc269 family, to make the tbl match
10822  * more machines, don't need to match all valid pins, just need to match
10823  * all the pins defined in the tbl. Just because of this reason, it is possible
10824  * that a single machine matches multiple tbls, so there is one limitation:
10825  *   at most one tbl is allowed to define for the same vendor and same codec
10826  */
10827 static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = {
10828         SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
10829                 {0x19, 0x40000000},
10830                 {0x1b, 0x40000000}),
10831         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
10832                 {0x19, 0x40000000},
10833                 {0x1b, 0x40000000}),
10834         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10835                 {0x19, 0x40000000},
10836                 {0x1a, 0x40000000}),
10837         SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10838                 {0x19, 0x40000000},
10839                 {0x1a, 0x40000000}),
10840         SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
10841                 {0x19, 0x40000000},
10842                 {0x1a, 0x40000000}),
10843         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC2XX_FIXUP_HEADSET_MIC,
10844                 {0x19, 0x40000000}),
10845         {}
10846 };
10847
10848 static void alc269_fill_coef(struct hda_codec *codec)
10849 {
10850         struct alc_spec *spec = codec->spec;
10851         int val;
10852
10853         if (spec->codec_variant != ALC269_TYPE_ALC269VB)
10854                 return;
10855
10856         if ((alc_get_coef0(codec) & 0x00ff) < 0x015) {
10857                 alc_write_coef_idx(codec, 0xf, 0x960b);
10858                 alc_write_coef_idx(codec, 0xe, 0x8817);
10859         }
10860
10861         if ((alc_get_coef0(codec) & 0x00ff) == 0x016) {
10862                 alc_write_coef_idx(codec, 0xf, 0x960b);
10863                 alc_write_coef_idx(codec, 0xe, 0x8814);
10864         }
10865
10866         if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
10867                 /* Power up output pin */
10868                 alc_update_coef_idx(codec, 0x04, 0, 1<<11);
10869         }
10870
10871         if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
10872                 val = alc_read_coef_idx(codec, 0xd);
10873                 if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {
10874                         /* Capless ramp up clock control */
10875                         alc_write_coef_idx(codec, 0xd, val | (1<<10));
10876                 }
10877                 val = alc_read_coef_idx(codec, 0x17);
10878                 if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {
10879                         /* Class D power on reset */
10880                         alc_write_coef_idx(codec, 0x17, val | (1<<7));
10881                 }
10882         }
10883
10884         /* HP */
10885         alc_update_coef_idx(codec, 0x4, 0, 1<<11);
10886 }
10887
10888 /*
10889  */
10890 static int patch_alc269(struct hda_codec *codec)
10891 {
10892         struct alc_spec *spec;
10893         int err;
10894
10895         err = alc_alloc_spec(codec, 0x0b);
10896         if (err < 0)
10897                 return err;
10898
10899         spec = codec->spec;
10900         spec->gen.shared_mic_vref_pin = 0x18;
10901         codec->power_save_node = 0;
10902         spec->en_3kpull_low = true;
10903
10904 #ifdef CONFIG_PM
10905         codec->patch_ops.suspend = alc269_suspend;
10906         codec->patch_ops.resume = alc269_resume;
10907 #endif
10908         spec->shutup = alc_default_shutup;
10909         spec->init_hook = alc_default_init;
10910
10911         switch (codec->core.vendor_id) {
10912         case 0x10ec0269:
10913                 spec->codec_variant = ALC269_TYPE_ALC269VA;
10914                 switch (alc_get_coef0(codec) & 0x00f0) {
10915                 case 0x0010:
10916                         if (codec->bus->pci &&
10917                             codec->bus->pci->subsystem_vendor == 0x1025 &&
10918                             spec->cdefine.platform_type == 1)
10919                                 err = alc_codec_rename(codec, "ALC271X");
10920                         spec->codec_variant = ALC269_TYPE_ALC269VB;
10921                         break;
10922                 case 0x0020:
10923                         if (codec->bus->pci &&
10924                             codec->bus->pci->subsystem_vendor == 0x17aa &&
10925                             codec->bus->pci->subsystem_device == 0x21f3)
10926                                 err = alc_codec_rename(codec, "ALC3202");
10927                         spec->codec_variant = ALC269_TYPE_ALC269VC;
10928                         break;
10929                 case 0x0030:
10930                         spec->codec_variant = ALC269_TYPE_ALC269VD;
10931                         break;
10932                 default:
10933                         alc_fix_pll_init(codec, 0x20, 0x04, 15);
10934                 }
10935                 if (err < 0)
10936                         goto error;
10937                 spec->shutup = alc269_shutup;
10938                 spec->init_hook = alc269_fill_coef;
10939                 alc269_fill_coef(codec);
10940                 break;
10941
10942         case 0x10ec0280:
10943         case 0x10ec0290:
10944                 spec->codec_variant = ALC269_TYPE_ALC280;
10945                 break;
10946         case 0x10ec0282:
10947                 spec->codec_variant = ALC269_TYPE_ALC282;
10948                 spec->shutup = alc282_shutup;
10949                 spec->init_hook = alc282_init;
10950                 break;
10951         case 0x10ec0233:
10952         case 0x10ec0283:
10953                 spec->codec_variant = ALC269_TYPE_ALC283;
10954                 spec->shutup = alc283_shutup;
10955                 spec->init_hook = alc283_init;
10956                 break;
10957         case 0x10ec0284:
10958         case 0x10ec0292:
10959                 spec->codec_variant = ALC269_TYPE_ALC284;
10960                 break;
10961         case 0x10ec0293:
10962                 spec->codec_variant = ALC269_TYPE_ALC293;
10963                 break;
10964         case 0x10ec0286:
10965         case 0x10ec0288:
10966                 spec->codec_variant = ALC269_TYPE_ALC286;
10967                 break;
10968         case 0x10ec0298:
10969                 spec->codec_variant = ALC269_TYPE_ALC298;
10970                 break;
10971         case 0x10ec0235:
10972         case 0x10ec0255:
10973                 spec->codec_variant = ALC269_TYPE_ALC255;
10974                 spec->shutup = alc256_shutup;
10975                 spec->init_hook = alc256_init;
10976                 break;
10977         case 0x10ec0230:
10978         case 0x10ec0236:
10979         case 0x10ec0256:
10980         case 0x19e58326:
10981                 spec->codec_variant = ALC269_TYPE_ALC256;
10982                 spec->shutup = alc256_shutup;
10983                 spec->init_hook = alc256_init;
10984                 spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */
10985                 if (codec->core.vendor_id == 0x10ec0236 &&
10986                     codec->bus->pci->vendor != PCI_VENDOR_ID_AMD)
10987                         spec->en_3kpull_low = false;
10988                 break;
10989         case 0x10ec0257:
10990                 spec->codec_variant = ALC269_TYPE_ALC257;
10991                 spec->shutup = alc256_shutup;
10992                 spec->init_hook = alc256_init;
10993                 spec->gen.mixer_nid = 0;
10994                 spec->en_3kpull_low = false;
10995                 break;
10996         case 0x10ec0215:
10997         case 0x10ec0245:
10998         case 0x10ec0285:
10999         case 0x10ec0289:
11000                 if (alc_get_coef0(codec) & 0x0010)
11001                         spec->codec_variant = ALC269_TYPE_ALC245;
11002                 else
11003                         spec->codec_variant = ALC269_TYPE_ALC215;
11004                 spec->shutup = alc225_shutup;
11005                 spec->init_hook = alc225_init;
11006                 spec->gen.mixer_nid = 0;
11007                 break;
11008         case 0x10ec0225:
11009         case 0x10ec0295:
11010         case 0x10ec0299:
11011                 spec->codec_variant = ALC269_TYPE_ALC225;
11012                 spec->shutup = alc225_shutup;
11013                 spec->init_hook = alc225_init;
11014                 spec->gen.mixer_nid = 0; /* no loopback on ALC225, ALC295 and ALC299 */
11015                 break;
11016         case 0x10ec0287:
11017                 spec->codec_variant = ALC269_TYPE_ALC287;
11018                 spec->shutup = alc225_shutup;
11019                 spec->init_hook = alc225_init;
11020                 spec->gen.mixer_nid = 0; /* no loopback on ALC287 */
11021                 break;
11022         case 0x10ec0234:
11023         case 0x10ec0274:
11024         case 0x10ec0294:
11025                 spec->codec_variant = ALC269_TYPE_ALC294;
11026                 spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */
11027                 alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */
11028                 spec->init_hook = alc294_init;
11029                 break;
11030         case 0x10ec0300:
11031                 spec->codec_variant = ALC269_TYPE_ALC300;
11032                 spec->gen.mixer_nid = 0; /* no loopback on ALC300 */
11033                 break;
11034         case 0x10ec0623:
11035                 spec->codec_variant = ALC269_TYPE_ALC623;
11036                 break;
11037         case 0x10ec0700:
11038         case 0x10ec0701:
11039         case 0x10ec0703:
11040         case 0x10ec0711:
11041                 spec->codec_variant = ALC269_TYPE_ALC700;
11042                 spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */
11043                 alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */
11044                 spec->init_hook = alc294_init;
11045                 break;
11046
11047         }
11048
11049         if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {
11050                 spec->has_alc5505_dsp = 1;
11051                 spec->init_hook = alc5505_dsp_init;
11052         }
11053
11054         alc_pre_init(codec);
11055
11056         snd_hda_pick_fixup(codec, alc269_fixup_models,
11057                        alc269_fixup_tbl, alc269_fixups);
11058         /* FIXME: both TX300 and ROG Strix G17 have the same SSID, and
11059          * the quirk breaks the latter (bko#214101).
11060          * Clear the wrong entry.
11061          */
11062         if (codec->fixup_id == ALC282_FIXUP_ASUS_TX300 &&
11063             codec->core.vendor_id == 0x10ec0294) {
11064                 codec_dbg(codec, "Clear wrong fixup for ASUS ROG Strix G17\n");
11065                 codec->fixup_id = HDA_FIXUP_ID_NOT_SET;
11066         }
11067
11068         snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups, true);
11069         snd_hda_pick_pin_fixup(codec, alc269_fallback_pin_fixup_tbl, alc269_fixups, false);
11070         snd_hda_pick_fixup(codec, NULL, alc269_fixup_vendor_tbl,
11071                            alc269_fixups);
11072         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
11073
11074         alc_auto_parse_customize_define(codec);
11075
11076         if (has_cdefine_beep(codec))
11077                 spec->gen.beep_nid = 0x01;
11078
11079         /* automatic parse from the BIOS config */
11080         err = alc269_parse_auto_config(codec);
11081         if (err < 0)
11082                 goto error;
11083
11084         if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid) {
11085                 err = set_beep_amp(spec, spec->gen.mixer_nid, 0x04, HDA_INPUT);
11086                 if (err < 0)
11087                         goto error;
11088         }
11089
11090         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
11091
11092         return 0;
11093
11094  error:
11095         alc_free(codec);
11096         return err;
11097 }
11098
11099 /*
11100  * ALC861
11101  */
11102
11103 static int alc861_parse_auto_config(struct hda_codec *codec)
11104 {
11105         static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
11106         static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 };
11107         return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids);
11108 }
11109
11110 /* Pin config fixes */
11111 enum {
11112         ALC861_FIXUP_FSC_AMILO_PI1505,
11113         ALC861_FIXUP_AMP_VREF_0F,
11114         ALC861_FIXUP_NO_JACK_DETECT,
11115         ALC861_FIXUP_ASUS_A6RP,
11116         ALC660_FIXUP_ASUS_W7J,
11117 };
11118
11119 /* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */
11120 static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,
11121                         const struct hda_fixup *fix, int action)
11122 {
11123         struct alc_spec *spec = codec->spec;
11124         unsigned int val;
11125
11126         if (action != HDA_FIXUP_ACT_INIT)
11127                 return;
11128         val = snd_hda_codec_get_pin_target(codec, 0x0f);
11129         if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)))
11130                 val |= AC_PINCTL_IN_EN;
11131         val |= AC_PINCTL_VREF_50;
11132         snd_hda_set_pin_ctl(codec, 0x0f, val);
11133         spec->gen.keep_vref_in_automute = 1;
11134 }
11135
11136 /* suppress the jack-detection */
11137 static void alc_fixup_no_jack_detect(struct hda_codec *codec,
11138                                      const struct hda_fixup *fix, int action)
11139 {
11140         if (action == HDA_FIXUP_ACT_PRE_PROBE)
11141                 codec->no_jack_detect = 1;
11142 }
11143
11144 static const struct hda_fixup alc861_fixups[] = {
11145         [ALC861_FIXUP_FSC_AMILO_PI1505] = {
11146                 .type = HDA_FIXUP_PINS,
11147                 .v.pins = (const struct hda_pintbl[]) {
11148                         { 0x0b, 0x0221101f }, /* HP */
11149                         { 0x0f, 0x90170310 }, /* speaker */
11150                         { }
11151                 }
11152         },
11153         [ALC861_FIXUP_AMP_VREF_0F] = {
11154                 .type = HDA_FIXUP_FUNC,
11155                 .v.func = alc861_fixup_asus_amp_vref_0f,
11156         },
11157         [ALC861_FIXUP_NO_JACK_DETECT] = {
11158                 .type = HDA_FIXUP_FUNC,
11159                 .v.func = alc_fixup_no_jack_detect,
11160         },
11161         [ALC861_FIXUP_ASUS_A6RP] = {
11162                 .type = HDA_FIXUP_FUNC,
11163                 .v.func = alc861_fixup_asus_amp_vref_0f,
11164                 .chained = true,
11165                 .chain_id = ALC861_FIXUP_NO_JACK_DETECT,
11166         },
11167         [ALC660_FIXUP_ASUS_W7J] = {
11168                 .type = HDA_FIXUP_VERBS,
11169                 .v.verbs = (const struct hda_verb[]) {
11170                         /* ASUS W7J needs a magic pin setup on unused NID 0x10
11171                          * for enabling outputs
11172                          */
11173                         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11174                         { }
11175                 },
11176         }
11177 };
11178
11179 static const struct snd_pci_quirk alc861_fixup_tbl[] = {
11180         SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J),
11181         SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J),
11182         SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),
11183         SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),
11184         SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),
11185         SND_PCI_QUIRK_VENDOR(0x1584, "Haier/Uniwill", ALC861_FIXUP_AMP_VREF_0F),
11186         SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505),
11187         {}
11188 };
11189
11190 /*
11191  */
11192 static int patch_alc861(struct hda_codec *codec)
11193 {
11194         struct alc_spec *spec;
11195         int err;
11196
11197         err = alc_alloc_spec(codec, 0x15);
11198         if (err < 0)
11199                 return err;
11200
11201         spec = codec->spec;
11202         if (has_cdefine_beep(codec))
11203                 spec->gen.beep_nid = 0x23;
11204
11205 #ifdef CONFIG_PM
11206         spec->power_hook = alc_power_eapd;
11207 #endif
11208
11209         alc_pre_init(codec);
11210
11211         snd_hda_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
11212         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
11213
11214         /* automatic parse from the BIOS config */
11215         err = alc861_parse_auto_config(codec);
11216         if (err < 0)
11217                 goto error;
11218
11219         if (!spec->gen.no_analog) {
11220                 err = set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
11221                 if (err < 0)
11222                         goto error;
11223         }
11224
11225         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
11226
11227         return 0;
11228
11229  error:
11230         alc_free(codec);
11231         return err;
11232 }
11233
11234 /*
11235  * ALC861-VD support
11236  *
11237  * Based on ALC882
11238  *
11239  * In addition, an independent DAC
11240  */
11241 static int alc861vd_parse_auto_config(struct hda_codec *codec)
11242 {
11243         static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
11244         static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 };
11245         return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids);
11246 }
11247
11248 enum {
11249         ALC660VD_FIX_ASUS_GPIO1,
11250         ALC861VD_FIX_DALLAS,
11251 };
11252
11253 /* exclude VREF80 */
11254 static void alc861vd_fixup_dallas(struct hda_codec *codec,
11255                                   const struct hda_fixup *fix, int action)
11256 {
11257         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11258                 snd_hda_override_pin_caps(codec, 0x18, 0x00000734);
11259                 snd_hda_override_pin_caps(codec, 0x19, 0x0000073c);
11260         }
11261 }
11262
11263 /* reset GPIO1 */
11264 static void alc660vd_fixup_asus_gpio1(struct hda_codec *codec,
11265                                       const struct hda_fixup *fix, int action)
11266 {
11267         struct alc_spec *spec = codec->spec;
11268
11269         if (action == HDA_FIXUP_ACT_PRE_PROBE)
11270                 spec->gpio_mask |= 0x02;
11271         alc_fixup_gpio(codec, action, 0x01);
11272 }
11273
11274 static const struct hda_fixup alc861vd_fixups[] = {
11275         [ALC660VD_FIX_ASUS_GPIO1] = {
11276                 .type = HDA_FIXUP_FUNC,
11277                 .v.func = alc660vd_fixup_asus_gpio1,
11278         },
11279         [ALC861VD_FIX_DALLAS] = {
11280                 .type = HDA_FIXUP_FUNC,
11281                 .v.func = alc861vd_fixup_dallas,
11282         },
11283 };
11284
11285 static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
11286         SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS),
11287         SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
11288         SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS),
11289         {}
11290 };
11291
11292 /*
11293  */
11294 static int patch_alc861vd(struct hda_codec *codec)
11295 {
11296         struct alc_spec *spec;
11297         int err;
11298
11299         err = alc_alloc_spec(codec, 0x0b);
11300         if (err < 0)
11301                 return err;
11302
11303         spec = codec->spec;
11304         if (has_cdefine_beep(codec))
11305                 spec->gen.beep_nid = 0x23;
11306
11307         spec->shutup = alc_eapd_shutup;
11308
11309         alc_pre_init(codec);
11310
11311         snd_hda_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
11312         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
11313
11314         /* automatic parse from the BIOS config */
11315         err = alc861vd_parse_auto_config(codec);
11316         if (err < 0)
11317                 goto error;
11318
11319         if (!spec->gen.no_analog) {
11320                 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
11321                 if (err < 0)
11322                         goto error;
11323         }
11324
11325         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
11326
11327         return 0;
11328
11329  error:
11330         alc_free(codec);
11331         return err;
11332 }
11333
11334 /*
11335  * ALC662 support
11336  *
11337  * ALC662 is almost identical with ALC880 but has cleaner and more flexible
11338  * configuration.  Each pin widget can choose any input DACs and a mixer.
11339  * Each ADC is connected from a mixer of all inputs.  This makes possible
11340  * 6-channel independent captures.
11341  *
11342  * In addition, an independent DAC for the multi-playback (not used in this
11343  * driver yet).
11344  */
11345
11346 /*
11347  * BIOS auto configuration
11348  */
11349
11350 static int alc662_parse_auto_config(struct hda_codec *codec)
11351 {
11352         static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
11353         static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 };
11354         static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 };
11355         const hda_nid_t *ssids;
11356
11357         if (codec->core.vendor_id == 0x10ec0272 || codec->core.vendor_id == 0x10ec0663 ||
11358             codec->core.vendor_id == 0x10ec0665 || codec->core.vendor_id == 0x10ec0670 ||
11359             codec->core.vendor_id == 0x10ec0671)
11360                 ssids = alc663_ssids;
11361         else
11362                 ssids = alc662_ssids;
11363         return alc_parse_auto_config(codec, alc662_ignore, ssids);
11364 }
11365
11366 static void alc272_fixup_mario(struct hda_codec *codec,
11367                                const struct hda_fixup *fix, int action)
11368 {
11369         if (action != HDA_FIXUP_ACT_PRE_PROBE)
11370                 return;
11371         if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
11372                                       (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
11373                                       (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
11374                                       (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
11375                                       (0 << AC_AMPCAP_MUTE_SHIFT)))
11376                 codec_warn(codec, "failed to override amp caps for NID 0x2\n");
11377 }
11378
11379 static const struct snd_pcm_chmap_elem asus_pcm_2_1_chmaps[] = {
11380         { .channels = 2,
11381           .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
11382         { .channels = 4,
11383           .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
11384                    SNDRV_CHMAP_NA, SNDRV_CHMAP_LFE } }, /* LFE only on right */
11385         { }
11386 };
11387
11388 /* override the 2.1 chmap */
11389 static void alc_fixup_bass_chmap(struct hda_codec *codec,
11390                                     const struct hda_fixup *fix, int action)
11391 {
11392         if (action == HDA_FIXUP_ACT_BUILD) {
11393                 struct alc_spec *spec = codec->spec;
11394                 spec->gen.pcm_rec[0]->stream[0].chmap = asus_pcm_2_1_chmaps;
11395         }
11396 }
11397
11398 /* avoid D3 for keeping GPIO up */
11399 static unsigned int gpio_led_power_filter(struct hda_codec *codec,
11400                                           hda_nid_t nid,
11401                                           unsigned int power_state)
11402 {
11403         struct alc_spec *spec = codec->spec;
11404         if (nid == codec->core.afg && power_state == AC_PWRST_D3 && spec->gpio_data)
11405                 return AC_PWRST_D0;
11406         return power_state;
11407 }
11408
11409 static void alc662_fixup_led_gpio1(struct hda_codec *codec,
11410                                    const struct hda_fixup *fix, int action)
11411 {
11412         struct alc_spec *spec = codec->spec;
11413
11414         alc_fixup_hp_gpio_led(codec, action, 0x01, 0);
11415         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11416                 spec->mute_led_polarity = 1;
11417                 codec->power_filter = gpio_led_power_filter;
11418         }
11419 }
11420
11421 static void alc662_usi_automute_hook(struct hda_codec *codec,
11422                                          struct hda_jack_callback *jack)
11423 {
11424         struct alc_spec *spec = codec->spec;
11425         int vref;
11426         msleep(200);
11427         snd_hda_gen_hp_automute(codec, jack);
11428
11429         vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
11430         msleep(100);
11431         snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
11432                             vref);
11433 }
11434
11435 static void alc662_fixup_usi_headset_mic(struct hda_codec *codec,
11436                                      const struct hda_fixup *fix, int action)
11437 {
11438         struct alc_spec *spec = codec->spec;
11439         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11440                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
11441                 spec->gen.hp_automute_hook = alc662_usi_automute_hook;
11442         }
11443 }
11444
11445 static void alc662_aspire_ethos_mute_speakers(struct hda_codec *codec,
11446                                         struct hda_jack_callback *cb)
11447 {
11448         /* surround speakers at 0x1b already get muted automatically when
11449          * headphones are plugged in, but we have to mute/unmute the remaining
11450          * channels manually:
11451          * 0x15 - front left/front right
11452          * 0x18 - front center/ LFE
11453          */
11454         if (snd_hda_jack_detect_state(codec, 0x1b) == HDA_JACK_PRESENT) {
11455                 snd_hda_set_pin_ctl_cache(codec, 0x15, 0);
11456                 snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
11457         } else {
11458                 snd_hda_set_pin_ctl_cache(codec, 0x15, PIN_OUT);
11459                 snd_hda_set_pin_ctl_cache(codec, 0x18, PIN_OUT);
11460         }
11461 }
11462
11463 static void alc662_fixup_aspire_ethos_hp(struct hda_codec *codec,
11464                                         const struct hda_fixup *fix, int action)
11465 {
11466     /* Pin 0x1b: shared headphones jack and surround speakers */
11467         if (!is_jack_detectable(codec, 0x1b))
11468                 return;
11469
11470         switch (action) {
11471         case HDA_FIXUP_ACT_PRE_PROBE:
11472                 snd_hda_jack_detect_enable_callback(codec, 0x1b,
11473                                 alc662_aspire_ethos_mute_speakers);
11474                 /* subwoofer needs an extra GPIO setting to become audible */
11475                 alc_setup_gpio(codec, 0x02);
11476                 break;
11477         case HDA_FIXUP_ACT_INIT:
11478                 /* Make sure to start in a correct state, i.e. if
11479                  * headphones have been plugged in before powering up the system
11480                  */
11481                 alc662_aspire_ethos_mute_speakers(codec, NULL);
11482                 break;
11483         }
11484 }
11485
11486 static void alc671_fixup_hp_headset_mic2(struct hda_codec *codec,
11487                                              const struct hda_fixup *fix, int action)
11488 {
11489         struct alc_spec *spec = codec->spec;
11490
11491         static const struct hda_pintbl pincfgs[] = {
11492                 { 0x19, 0x02a11040 }, /* use as headset mic, with its own jack detect */
11493                 { 0x1b, 0x0181304f },
11494                 { }
11495         };
11496
11497         switch (action) {
11498         case HDA_FIXUP_ACT_PRE_PROBE:
11499                 spec->gen.mixer_nid = 0;
11500                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
11501                 snd_hda_apply_pincfgs(codec, pincfgs);
11502                 break;
11503         case HDA_FIXUP_ACT_INIT:
11504                 alc_write_coef_idx(codec, 0x19, 0xa054);
11505                 break;
11506         }
11507 }
11508
11509 static void alc897_hp_automute_hook(struct hda_codec *codec,
11510                                          struct hda_jack_callback *jack)
11511 {
11512         struct alc_spec *spec = codec->spec;
11513         int vref;
11514
11515         snd_hda_gen_hp_automute(codec, jack);
11516         vref = spec->gen.hp_jack_present ? (PIN_HP | AC_PINCTL_VREF_100) : PIN_HP;
11517         snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
11518                             vref);
11519 }
11520
11521 static void alc897_fixup_lenovo_headset_mic(struct hda_codec *codec,
11522                                      const struct hda_fixup *fix, int action)
11523 {
11524         struct alc_spec *spec = codec->spec;
11525         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11526                 spec->gen.hp_automute_hook = alc897_hp_automute_hook;
11527         }
11528 }
11529
11530 static void alc897_fixup_lenovo_headset_mode(struct hda_codec *codec,
11531                                      const struct hda_fixup *fix, int action)
11532 {
11533         struct alc_spec *spec = codec->spec;
11534
11535         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11536                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
11537                 spec->gen.hp_automute_hook = alc897_hp_automute_hook;
11538         }
11539 }
11540
11541 static const struct coef_fw alc668_coefs[] = {
11542         WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03,    0x0),
11543         WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06,    0x0), WRITE_COEF(0x07, 0x0f80),
11544         WRITE_COEF(0x08, 0x0031), WRITE_COEF(0x0a, 0x0060), WRITE_COEF(0x0b,    0x0),
11545         WRITE_COEF(0x0c, 0x7cf7), WRITE_COEF(0x0d, 0x1080), WRITE_COEF(0x0e, 0x7f7f),
11546         WRITE_COEF(0x0f, 0xcccc), WRITE_COEF(0x10, 0xddcc), WRITE_COEF(0x11, 0x0001),
11547         WRITE_COEF(0x13,    0x0), WRITE_COEF(0x14, 0x2aa0), WRITE_COEF(0x17, 0xa940),
11548         WRITE_COEF(0x19,    0x0), WRITE_COEF(0x1a,    0x0), WRITE_COEF(0x1b,    0x0),
11549         WRITE_COEF(0x1c,    0x0), WRITE_COEF(0x1d,    0x0), WRITE_COEF(0x1e, 0x7418),
11550         WRITE_COEF(0x1f, 0x0804), WRITE_COEF(0x20, 0x4200), WRITE_COEF(0x21, 0x0468),
11551         WRITE_COEF(0x22, 0x8ccc), WRITE_COEF(0x23, 0x0250), WRITE_COEF(0x24, 0x7418),
11552         WRITE_COEF(0x27,    0x0), WRITE_COEF(0x28, 0x8ccc), WRITE_COEF(0x2a, 0xff00),
11553         WRITE_COEF(0x2b, 0x8000), WRITE_COEF(0xa7, 0xff00), WRITE_COEF(0xa8, 0x8000),
11554         WRITE_COEF(0xaa, 0x2e17), WRITE_COEF(0xab, 0xa0c0), WRITE_COEF(0xac,    0x0),
11555         WRITE_COEF(0xad,    0x0), WRITE_COEF(0xae, 0x2ac6), WRITE_COEF(0xaf, 0xa480),
11556         WRITE_COEF(0xb0,    0x0), WRITE_COEF(0xb1,    0x0), WRITE_COEF(0xb2,    0x0),
11557         WRITE_COEF(0xb3,    0x0), WRITE_COEF(0xb4,    0x0), WRITE_COEF(0xb5, 0x1040),
11558         WRITE_COEF(0xb6, 0xd697), WRITE_COEF(0xb7, 0x902b), WRITE_COEF(0xb8, 0xd697),
11559         WRITE_COEF(0xb9, 0x902b), WRITE_COEF(0xba, 0xb8ba), WRITE_COEF(0xbb, 0xaaab),
11560         WRITE_COEF(0xbc, 0xaaaf), WRITE_COEF(0xbd, 0x6aaa), WRITE_COEF(0xbe, 0x1c02),
11561         WRITE_COEF(0xc0, 0x00ff), WRITE_COEF(0xc1, 0x0fa6),
11562         {}
11563 };
11564
11565 static void alc668_restore_default_value(struct hda_codec *codec)
11566 {
11567         alc_process_coef_fw(codec, alc668_coefs);
11568 }
11569
11570 enum {
11571         ALC662_FIXUP_ASPIRE,
11572         ALC662_FIXUP_LED_GPIO1,
11573         ALC662_FIXUP_IDEAPAD,
11574         ALC272_FIXUP_MARIO,
11575         ALC662_FIXUP_CZC_ET26,
11576         ALC662_FIXUP_CZC_P10T,
11577         ALC662_FIXUP_SKU_IGNORE,
11578         ALC662_FIXUP_HP_RP5800,
11579         ALC662_FIXUP_ASUS_MODE1,
11580         ALC662_FIXUP_ASUS_MODE2,
11581         ALC662_FIXUP_ASUS_MODE3,
11582         ALC662_FIXUP_ASUS_MODE4,
11583         ALC662_FIXUP_ASUS_MODE5,
11584         ALC662_FIXUP_ASUS_MODE6,
11585         ALC662_FIXUP_ASUS_MODE7,
11586         ALC662_FIXUP_ASUS_MODE8,
11587         ALC662_FIXUP_NO_JACK_DETECT,
11588         ALC662_FIXUP_ZOTAC_Z68,
11589         ALC662_FIXUP_INV_DMIC,
11590         ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
11591         ALC668_FIXUP_DELL_MIC_NO_PRESENCE,
11592         ALC662_FIXUP_HEADSET_MODE,
11593         ALC668_FIXUP_HEADSET_MODE,
11594         ALC662_FIXUP_BASS_MODE4_CHMAP,
11595         ALC662_FIXUP_BASS_16,
11596         ALC662_FIXUP_BASS_1A,
11597         ALC662_FIXUP_BASS_CHMAP,
11598         ALC668_FIXUP_AUTO_MUTE,
11599         ALC668_FIXUP_DELL_DISABLE_AAMIX,
11600         ALC668_FIXUP_DELL_XPS13,
11601         ALC662_FIXUP_ASUS_Nx50,
11602         ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
11603         ALC668_FIXUP_ASUS_Nx51,
11604         ALC668_FIXUP_MIC_COEF,
11605         ALC668_FIXUP_ASUS_G751,
11606         ALC891_FIXUP_HEADSET_MODE,
11607         ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
11608         ALC662_FIXUP_ACER_VERITON,
11609         ALC892_FIXUP_ASROCK_MOBO,
11610         ALC662_FIXUP_USI_FUNC,
11611         ALC662_FIXUP_USI_HEADSET_MODE,
11612         ALC662_FIXUP_LENOVO_MULTI_CODECS,
11613         ALC669_FIXUP_ACER_ASPIRE_ETHOS,
11614         ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET,
11615         ALC671_FIXUP_HP_HEADSET_MIC2,
11616         ALC662_FIXUP_ACER_X2660G_HEADSET_MODE,
11617         ALC662_FIXUP_ACER_NITRO_HEADSET_MODE,
11618         ALC668_FIXUP_ASUS_NO_HEADSET_MIC,
11619         ALC668_FIXUP_HEADSET_MIC,
11620         ALC668_FIXUP_MIC_DET_COEF,
11621         ALC897_FIXUP_LENOVO_HEADSET_MIC,
11622         ALC897_FIXUP_HEADSET_MIC_PIN,
11623         ALC897_FIXUP_HP_HSMIC_VERB,
11624         ALC897_FIXUP_LENOVO_HEADSET_MODE,
11625         ALC897_FIXUP_HEADSET_MIC_PIN2,
11626         ALC897_FIXUP_UNIS_H3C_X500S,
11627 };
11628
11629 static const struct hda_fixup alc662_fixups[] = {
11630         [ALC662_FIXUP_ASPIRE] = {
11631                 .type = HDA_FIXUP_PINS,
11632                 .v.pins = (const struct hda_pintbl[]) {
11633                         { 0x15, 0x99130112 }, /* subwoofer */
11634                         { }
11635                 }
11636         },
11637         [ALC662_FIXUP_LED_GPIO1] = {
11638                 .type = HDA_FIXUP_FUNC,
11639                 .v.func = alc662_fixup_led_gpio1,
11640         },
11641         [ALC662_FIXUP_IDEAPAD] = {
11642                 .type = HDA_FIXUP_PINS,
11643                 .v.pins = (const struct hda_pintbl[]) {
11644                         { 0x17, 0x99130112 }, /* subwoofer */
11645                         { }
11646                 },
11647                 .chained = true,
11648                 .chain_id = ALC662_FIXUP_LED_GPIO1,
11649         },
11650         [ALC272_FIXUP_MARIO] = {
11651                 .type = HDA_FIXUP_FUNC,
11652                 .v.func = alc272_fixup_mario,
11653         },
11654         [ALC662_FIXUP_CZC_ET26] = {
11655                 .type = HDA_FIXUP_PINS,
11656                 .v.pins = (const struct hda_pintbl[]) {
11657                         {0x12, 0x403cc000},
11658                         {0x14, 0x90170110}, /* speaker */
11659                         {0x15, 0x411111f0},
11660                         {0x16, 0x411111f0},
11661                         {0x18, 0x01a19030}, /* mic */
11662                         {0x19, 0x90a7013f}, /* int-mic */
11663                         {0x1a, 0x01014020},
11664                         {0x1b, 0x0121401f},
11665                         {0x1c, 0x411111f0},
11666                         {0x1d, 0x411111f0},
11667                         {0x1e, 0x40478e35},
11668                         {}
11669                 },
11670                 .chained = true,
11671                 .chain_id = ALC662_FIXUP_SKU_IGNORE
11672         },
11673         [ALC662_FIXUP_CZC_P10T] = {
11674                 .type = HDA_FIXUP_VERBS,
11675                 .v.verbs = (const struct hda_verb[]) {
11676                         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
11677                         {}
11678                 }
11679         },
11680         [ALC662_FIXUP_SKU_IGNORE] = {
11681                 .type = HDA_FIXUP_FUNC,
11682                 .v.func = alc_fixup_sku_ignore,
11683         },
11684         [ALC662_FIXUP_HP_RP5800] = {
11685                 .type = HDA_FIXUP_PINS,
11686                 .v.pins = (const struct hda_pintbl[]) {
11687                         { 0x14, 0x0221201f }, /* HP out */
11688                         { }
11689                 },
11690                 .chained = true,
11691                 .chain_id = ALC662_FIXUP_SKU_IGNORE
11692         },
11693         [ALC662_FIXUP_ASUS_MODE1] = {
11694                 .type = HDA_FIXUP_PINS,
11695                 .v.pins = (const struct hda_pintbl[]) {
11696                         { 0x14, 0x99130110 }, /* speaker */
11697                         { 0x18, 0x01a19c20 }, /* mic */
11698                         { 0x19, 0x99a3092f }, /* int-mic */
11699                         { 0x21, 0x0121401f }, /* HP out */
11700                         { }
11701                 },
11702                 .chained = true,
11703                 .chain_id = ALC662_FIXUP_SKU_IGNORE
11704         },
11705         [ALC662_FIXUP_ASUS_MODE2] = {
11706                 .type = HDA_FIXUP_PINS,
11707                 .v.pins = (const struct hda_pintbl[]) {
11708                         { 0x14, 0x99130110 }, /* speaker */
11709                         { 0x18, 0x01a19820 }, /* mic */
11710                         { 0x19, 0x99a3092f }, /* int-mic */
11711                         { 0x1b, 0x0121401f }, /* HP out */
11712                         { }
11713                 },
11714                 .chained = true,
11715                 .chain_id = ALC662_FIXUP_SKU_IGNORE
11716         },
11717         [ALC662_FIXUP_ASUS_MODE3] = {
11718                 .type = HDA_FIXUP_PINS,
11719                 .v.pins = (const struct hda_pintbl[]) {
11720                         { 0x14, 0x99130110 }, /* speaker */
11721                         { 0x15, 0x0121441f }, /* HP */
11722                         { 0x18, 0x01a19840 }, /* mic */
11723                         { 0x19, 0x99a3094f }, /* int-mic */
11724                         { 0x21, 0x01211420 }, /* HP2 */
11725                         { }
11726                 },
11727                 .chained = true,
11728                 .chain_id = ALC662_FIXUP_SKU_IGNORE
11729         },
11730         [ALC662_FIXUP_ASUS_MODE4] = {
11731                 .type = HDA_FIXUP_PINS,
11732                 .v.pins = (const struct hda_pintbl[]) {
11733                         { 0x14, 0x99130110 }, /* speaker */
11734                         { 0x16, 0x99130111 }, /* speaker */
11735                         { 0x18, 0x01a19840 }, /* mic */
11736                         { 0x19, 0x99a3094f }, /* int-mic */
11737                         { 0x21, 0x0121441f }, /* HP */
11738                         { }
11739                 },
11740                 .chained = true,
11741                 .chain_id = ALC662_FIXUP_SKU_IGNORE
11742         },
11743         [ALC662_FIXUP_ASUS_MODE5] = {
11744                 .type = HDA_FIXUP_PINS,
11745                 .v.pins = (const struct hda_pintbl[]) {
11746                         { 0x14, 0x99130110 }, /* speaker */
11747                         { 0x15, 0x0121441f }, /* HP */
11748                         { 0x16, 0x99130111 }, /* speaker */
11749                         { 0x18, 0x01a19840 }, /* mic */
11750                         { 0x19, 0x99a3094f }, /* int-mic */
11751                         { }
11752                 },
11753                 .chained = true,
11754                 .chain_id = ALC662_FIXUP_SKU_IGNORE
11755         },
11756         [ALC662_FIXUP_ASUS_MODE6] = {
11757                 .type = HDA_FIXUP_PINS,
11758                 .v.pins = (const struct hda_pintbl[]) {
11759                         { 0x14, 0x99130110 }, /* speaker */
11760                         { 0x15, 0x01211420 }, /* HP2 */
11761                         { 0x18, 0x01a19840 }, /* mic */
11762                         { 0x19, 0x99a3094f }, /* int-mic */
11763                         { 0x1b, 0x0121441f }, /* HP */
11764                         { }
11765                 },
11766                 .chained = true,
11767                 .chain_id = ALC662_FIXUP_SKU_IGNORE
11768         },
11769         [ALC662_FIXUP_ASUS_MODE7] = {
11770                 .type = HDA_FIXUP_PINS,
11771                 .v.pins = (const struct hda_pintbl[]) {
11772                         { 0x14, 0x99130110 }, /* speaker */
11773                         { 0x17, 0x99130111 }, /* speaker */
11774                         { 0x18, 0x01a19840 }, /* mic */
11775                         { 0x19, 0x99a3094f }, /* int-mic */
11776                         { 0x1b, 0x01214020 }, /* HP */
11777                         { 0x21, 0x0121401f }, /* HP */
11778                         { }
11779                 },
11780                 .chained = true,
11781                 .chain_id = ALC662_FIXUP_SKU_IGNORE
11782         },
11783         [ALC662_FIXUP_ASUS_MODE8] = {
11784                 .type = HDA_FIXUP_PINS,
11785                 .v.pins = (const struct hda_pintbl[]) {
11786                         { 0x14, 0x99130110 }, /* speaker */
11787                         { 0x12, 0x99a30970 }, /* int-mic */
11788                         { 0x15, 0x01214020 }, /* HP */
11789                         { 0x17, 0x99130111 }, /* speaker */
11790                         { 0x18, 0x01a19840 }, /* mic */
11791                         { 0x21, 0x0121401f }, /* HP */
11792                         { }
11793                 },
11794                 .chained = true,
11795                 .chain_id = ALC662_FIXUP_SKU_IGNORE
11796         },
11797         [ALC662_FIXUP_NO_JACK_DETECT] = {
11798                 .type = HDA_FIXUP_FUNC,
11799                 .v.func = alc_fixup_no_jack_detect,
11800         },
11801         [ALC662_FIXUP_ZOTAC_Z68] = {
11802                 .type = HDA_FIXUP_PINS,
11803                 .v.pins = (const struct hda_pintbl[]) {
11804                         { 0x1b, 0x02214020 }, /* Front HP */
11805                         { }
11806                 }
11807         },
11808         [ALC662_FIXUP_INV_DMIC] = {
11809                 .type = HDA_FIXUP_FUNC,
11810                 .v.func = alc_fixup_inv_dmic,
11811         },
11812         [ALC668_FIXUP_DELL_XPS13] = {
11813                 .type = HDA_FIXUP_FUNC,
11814                 .v.func = alc_fixup_dell_xps13,
11815                 .chained = true,
11816                 .chain_id = ALC668_FIXUP_DELL_DISABLE_AAMIX
11817         },
11818         [ALC668_FIXUP_DELL_DISABLE_AAMIX] = {
11819                 .type = HDA_FIXUP_FUNC,
11820                 .v.func = alc_fixup_disable_aamix,
11821                 .chained = true,
11822                 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
11823         },
11824         [ALC668_FIXUP_AUTO_MUTE] = {
11825                 .type = HDA_FIXUP_FUNC,
11826                 .v.func = alc_fixup_auto_mute_via_amp,
11827                 .chained = true,
11828                 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
11829         },
11830         [ALC662_FIXUP_DELL_MIC_NO_PRESENCE] = {
11831                 .type = HDA_FIXUP_PINS,
11832                 .v.pins = (const struct hda_pintbl[]) {
11833                         { 0x19, 0x03a1113c }, /* use as headset mic, without its own jack detect */
11834                         /* headphone mic by setting pin control of 0x1b (headphone out) to in + vref_50 */
11835                         { }
11836                 },
11837                 .chained = true,
11838                 .chain_id = ALC662_FIXUP_HEADSET_MODE
11839         },
11840         [ALC662_FIXUP_HEADSET_MODE] = {
11841                 .type = HDA_FIXUP_FUNC,
11842                 .v.func = alc_fixup_headset_mode_alc662,
11843         },
11844         [ALC668_FIXUP_DELL_MIC_NO_PRESENCE] = {
11845                 .type = HDA_FIXUP_PINS,
11846                 .v.pins = (const struct hda_pintbl[]) {
11847                         { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
11848                         { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
11849                         { }
11850                 },
11851                 .chained = true,
11852                 .chain_id = ALC668_FIXUP_HEADSET_MODE
11853         },
11854         [ALC668_FIXUP_HEADSET_MODE] = {
11855                 .type = HDA_FIXUP_FUNC,
11856                 .v.func = alc_fixup_headset_mode_alc668,
11857         },
11858         [ALC662_FIXUP_BASS_MODE4_CHMAP] = {
11859                 .type = HDA_FIXUP_FUNC,
11860                 .v.func = alc_fixup_bass_chmap,
11861                 .chained = true,
11862                 .chain_id = ALC662_FIXUP_ASUS_MODE4
11863         },
11864         [ALC662_FIXUP_BASS_16] = {
11865                 .type = HDA_FIXUP_PINS,
11866                 .v.pins = (const struct hda_pintbl[]) {
11867                         {0x16, 0x80106111}, /* bass speaker */
11868                         {}
11869                 },
11870                 .chained = true,
11871                 .chain_id = ALC662_FIXUP_BASS_CHMAP,
11872         },
11873         [ALC662_FIXUP_BASS_1A] = {
11874                 .type = HDA_FIXUP_PINS,
11875                 .v.pins = (const struct hda_pintbl[]) {
11876                         {0x1a, 0x80106111}, /* bass speaker */
11877                         {}
11878                 },
11879                 .chained = true,
11880                 .chain_id = ALC662_FIXUP_BASS_CHMAP,
11881         },
11882         [ALC662_FIXUP_BASS_CHMAP] = {
11883                 .type = HDA_FIXUP_FUNC,
11884                 .v.func = alc_fixup_bass_chmap,
11885         },
11886         [ALC662_FIXUP_ASUS_Nx50] = {
11887                 .type = HDA_FIXUP_FUNC,
11888                 .v.func = alc_fixup_auto_mute_via_amp,
11889                 .chained = true,
11890                 .chain_id = ALC662_FIXUP_BASS_1A
11891         },
11892         [ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE] = {
11893                 .type = HDA_FIXUP_FUNC,
11894                 .v.func = alc_fixup_headset_mode_alc668,
11895                 .chain_id = ALC662_FIXUP_BASS_CHMAP
11896         },
11897         [ALC668_FIXUP_ASUS_Nx51] = {
11898                 .type = HDA_FIXUP_PINS,
11899                 .v.pins = (const struct hda_pintbl[]) {
11900                         { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
11901                         { 0x1a, 0x90170151 }, /* bass speaker */
11902                         { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
11903                         {}
11904                 },
11905                 .chained = true,
11906                 .chain_id = ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
11907         },
11908         [ALC668_FIXUP_MIC_COEF] = {
11909                 .type = HDA_FIXUP_VERBS,
11910                 .v.verbs = (const struct hda_verb[]) {
11911                         { 0x20, AC_VERB_SET_COEF_INDEX, 0xc3 },
11912                         { 0x20, AC_VERB_SET_PROC_COEF, 0x4000 },
11913                         {}
11914                 },
11915         },
11916         [ALC668_FIXUP_ASUS_G751] = {
11917                 .type = HDA_FIXUP_PINS,
11918                 .v.pins = (const struct hda_pintbl[]) {
11919                         { 0x16, 0x0421101f }, /* HP */
11920                         {}
11921                 },
11922                 .chained = true,
11923                 .chain_id = ALC668_FIXUP_MIC_COEF
11924         },
11925         [ALC891_FIXUP_HEADSET_MODE] = {
11926                 .type = HDA_FIXUP_FUNC,
11927                 .v.func = alc_fixup_headset_mode,
11928         },
11929         [ALC891_FIXUP_DELL_MIC_NO_PRESENCE] = {
11930                 .type = HDA_FIXUP_PINS,
11931                 .v.pins = (const struct hda_pintbl[]) {
11932                         { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
11933                         { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
11934                         { }
11935                 },
11936                 .chained = true,
11937                 .chain_id = ALC891_FIXUP_HEADSET_MODE
11938         },
11939         [ALC662_FIXUP_ACER_VERITON] = {
11940                 .type = HDA_FIXUP_PINS,
11941                 .v.pins = (const struct hda_pintbl[]) {
11942                         { 0x15, 0x50170120 }, /* no internal speaker */
11943                         { }
11944                 }
11945         },
11946         [ALC892_FIXUP_ASROCK_MOBO] = {
11947                 .type = HDA_FIXUP_PINS,
11948                 .v.pins = (const struct hda_pintbl[]) {
11949                         { 0x15, 0x40f000f0 }, /* disabled */
11950                         { 0x16, 0x40f000f0 }, /* disabled */
11951                         { }
11952                 }
11953         },
11954         [ALC662_FIXUP_USI_FUNC] = {
11955                 .type = HDA_FIXUP_FUNC,
11956                 .v.func = alc662_fixup_usi_headset_mic,
11957         },
11958         [ALC662_FIXUP_USI_HEADSET_MODE] = {
11959                 .type = HDA_FIXUP_PINS,
11960                 .v.pins = (const struct hda_pintbl[]) {
11961                         { 0x19, 0x02a1913c }, /* use as headset mic, without its own jack detect */
11962                         { 0x18, 0x01a1903d },
11963                         { }
11964                 },
11965                 .chained = true,
11966                 .chain_id = ALC662_FIXUP_USI_FUNC
11967         },
11968         [ALC662_FIXUP_LENOVO_MULTI_CODECS] = {
11969                 .type = HDA_FIXUP_FUNC,
11970                 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
11971         },
11972         [ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET] = {
11973                 .type = HDA_FIXUP_FUNC,
11974                 .v.func = alc662_fixup_aspire_ethos_hp,
11975         },
11976         [ALC669_FIXUP_ACER_ASPIRE_ETHOS] = {
11977                 .type = HDA_FIXUP_PINS,
11978                 .v.pins = (const struct hda_pintbl[]) {
11979                         { 0x15, 0x92130110 }, /* front speakers */
11980                         { 0x18, 0x99130111 }, /* center/subwoofer */
11981                         { 0x1b, 0x11130012 }, /* surround plus jack for HP */
11982                         { }
11983                 },
11984                 .chained = true,
11985                 .chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET
11986         },
11987         [ALC671_FIXUP_HP_HEADSET_MIC2] = {
11988                 .type = HDA_FIXUP_FUNC,
11989                 .v.func = alc671_fixup_hp_headset_mic2,
11990         },
11991         [ALC662_FIXUP_ACER_X2660G_HEADSET_MODE] = {
11992                 .type = HDA_FIXUP_PINS,
11993                 .v.pins = (const struct hda_pintbl[]) {
11994                         { 0x1a, 0x02a1113c }, /* use as headset mic, without its own jack detect */
11995                         { }
11996                 },
11997                 .chained = true,
11998                 .chain_id = ALC662_FIXUP_USI_FUNC
11999         },
12000         [ALC662_FIXUP_ACER_NITRO_HEADSET_MODE] = {
12001                 .type = HDA_FIXUP_PINS,
12002                 .v.pins = (const struct hda_pintbl[]) {
12003                         { 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */
12004                         { 0x1b, 0x0221144f },
12005                         { }
12006                 },
12007                 .chained = true,
12008                 .chain_id = ALC662_FIXUP_USI_FUNC
12009         },
12010         [ALC668_FIXUP_ASUS_NO_HEADSET_MIC] = {
12011                 .type = HDA_FIXUP_PINS,
12012                 .v.pins = (const struct hda_pintbl[]) {
12013                         { 0x1b, 0x04a1112c },
12014                         { }
12015                 },
12016                 .chained = true,
12017                 .chain_id = ALC668_FIXUP_HEADSET_MIC
12018         },
12019         [ALC668_FIXUP_HEADSET_MIC] = {
12020                 .type = HDA_FIXUP_FUNC,
12021                 .v.func = alc269_fixup_headset_mic,
12022                 .chained = true,
12023                 .chain_id = ALC668_FIXUP_MIC_DET_COEF
12024         },
12025         [ALC668_FIXUP_MIC_DET_COEF] = {
12026                 .type = HDA_FIXUP_VERBS,
12027                 .v.verbs = (const struct hda_verb[]) {
12028                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x15 },
12029                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0d60 },
12030                         {}
12031                 },
12032         },
12033         [ALC897_FIXUP_LENOVO_HEADSET_MIC] = {
12034                 .type = HDA_FIXUP_FUNC,
12035                 .v.func = alc897_fixup_lenovo_headset_mic,
12036         },
12037         [ALC897_FIXUP_HEADSET_MIC_PIN] = {
12038                 .type = HDA_FIXUP_PINS,
12039                 .v.pins = (const struct hda_pintbl[]) {
12040                         { 0x1a, 0x03a11050 },
12041                         { }
12042                 },
12043                 .chained = true,
12044                 .chain_id = ALC897_FIXUP_LENOVO_HEADSET_MIC
12045         },
12046         [ALC897_FIXUP_HP_HSMIC_VERB] = {
12047                 .type = HDA_FIXUP_PINS,
12048                 .v.pins = (const struct hda_pintbl[]) {
12049                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
12050                         { }
12051                 },
12052         },
12053         [ALC897_FIXUP_LENOVO_HEADSET_MODE] = {
12054                 .type = HDA_FIXUP_FUNC,
12055                 .v.func = alc897_fixup_lenovo_headset_mode,
12056         },
12057         [ALC897_FIXUP_HEADSET_MIC_PIN2] = {
12058                 .type = HDA_FIXUP_PINS,
12059                 .v.pins = (const struct hda_pintbl[]) {
12060                         { 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */
12061                         { }
12062                 },
12063                 .chained = true,
12064                 .chain_id = ALC897_FIXUP_LENOVO_HEADSET_MODE
12065         },
12066         [ALC897_FIXUP_UNIS_H3C_X500S] = {
12067                 .type = HDA_FIXUP_VERBS,
12068                 .v.verbs = (const struct hda_verb[]) {
12069                         { 0x14, AC_VERB_SET_EAPD_BTLENABLE, 0 },
12070                         {}
12071                 },
12072         },
12073 };
12074
12075 static const struct snd_pci_quirk alc662_fixup_tbl[] = {
12076         SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2),
12077         SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC),
12078         SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", ALC662_FIXUP_INV_DMIC),
12079         SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
12080         SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
12081         SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC),
12082         SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC),
12083         SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
12084         SND_PCI_QUIRK(0x1025, 0x0566, "Acer Aspire Ethos 8951G", ALC669_FIXUP_ACER_ASPIRE_ETHOS),
12085         SND_PCI_QUIRK(0x1025, 0x123c, "Acer Nitro N50-600", ALC662_FIXUP_ACER_NITRO_HEADSET_MODE),
12086         SND_PCI_QUIRK(0x1025, 0x124e, "Acer 2660G", ALC662_FIXUP_ACER_X2660G_HEADSET_MODE),
12087         SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
12088         SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
12089         SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13),
12090         SND_PCI_QUIRK(0x1028, 0x060a, "Dell XPS 13", ALC668_FIXUP_DELL_XPS13),
12091         SND_PCI_QUIRK(0x1028, 0x060d, "Dell M3800", ALC668_FIXUP_DELL_XPS13),
12092         SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
12093         SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
12094         SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
12095         SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
12096         SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
12097         SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
12098         SND_PCI_QUIRK(0x103c, 0x870c, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
12099         SND_PCI_QUIRK(0x103c, 0x8719, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
12100         SND_PCI_QUIRK(0x103c, 0x872b, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
12101         SND_PCI_QUIRK(0x103c, 0x873e, "HP", ALC671_FIXUP_HP_HEADSET_MIC2),
12102         SND_PCI_QUIRK(0x103c, 0x8768, "HP Slim Desktop S01", ALC671_FIXUP_HP_HEADSET_MIC2),
12103         SND_PCI_QUIRK(0x103c, 0x877e, "HP 288 Pro G6", ALC671_FIXUP_HP_HEADSET_MIC2),
12104         SND_PCI_QUIRK(0x103c, 0x885f, "HP 288 Pro G8", ALC671_FIXUP_HP_HEADSET_MIC2),
12105         SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE),
12106         SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50),
12107         SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50),
12108         SND_PCI_QUIRK(0x1043, 0x12ff, "ASUS G751", ALC668_FIXUP_ASUS_G751),
12109         SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A),
12110         SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
12111         SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16),
12112         SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51),
12113         SND_PCI_QUIRK(0x1043, 0x17bd, "ASUS N751", ALC668_FIXUP_ASUS_Nx51),
12114         SND_PCI_QUIRK(0x1043, 0x185d, "ASUS G551JW", ALC668_FIXUP_ASUS_NO_HEADSET_MIC),
12115         SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71SL", ALC662_FIXUP_ASUS_MODE8),
12116         SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16),
12117         SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
12118         SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
12119         SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
12120         SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
12121         SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE),
12122         SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC662_FIXUP_LENOVO_MULTI_CODECS),
12123         SND_PCI_QUIRK(0x17aa, 0x1057, "Lenovo P360", ALC897_FIXUP_HEADSET_MIC_PIN),
12124         SND_PCI_QUIRK(0x17aa, 0x1064, "Lenovo P3 Tower", ALC897_FIXUP_HEADSET_MIC_PIN),
12125         SND_PCI_QUIRK(0x17aa, 0x32ca, "Lenovo ThinkCentre M80", ALC897_FIXUP_HEADSET_MIC_PIN),
12126         SND_PCI_QUIRK(0x17aa, 0x32cb, "Lenovo ThinkCentre M70", ALC897_FIXUP_HEADSET_MIC_PIN),
12127         SND_PCI_QUIRK(0x17aa, 0x32cf, "Lenovo ThinkCentre M950", ALC897_FIXUP_HEADSET_MIC_PIN),
12128         SND_PCI_QUIRK(0x17aa, 0x32f7, "Lenovo ThinkCentre M90", ALC897_FIXUP_HEADSET_MIC_PIN),
12129         SND_PCI_QUIRK(0x17aa, 0x3321, "Lenovo ThinkCentre M70 Gen4", ALC897_FIXUP_HEADSET_MIC_PIN),
12130         SND_PCI_QUIRK(0x17aa, 0x331b, "Lenovo ThinkCentre M90 Gen4", ALC897_FIXUP_HEADSET_MIC_PIN),
12131         SND_PCI_QUIRK(0x17aa, 0x3364, "Lenovo ThinkCentre M90 Gen5", ALC897_FIXUP_HEADSET_MIC_PIN),
12132         SND_PCI_QUIRK(0x17aa, 0x3742, "Lenovo TianYi510Pro-14IOB", ALC897_FIXUP_HEADSET_MIC_PIN2),
12133         SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
12134         SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
12135         SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),
12136         SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68),
12137         SND_PCI_QUIRK(0x1b0a, 0x01b8, "ACER Veriton", ALC662_FIXUP_ACER_VERITON),
12138         SND_PCI_QUIRK(0x1b35, 0x1234, "CZC ET26", ALC662_FIXUP_CZC_ET26),
12139         SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
12140         SND_PCI_QUIRK(0x1c6c, 0x1239, "Compaq N14JP6-V2", ALC897_FIXUP_HP_HSMIC_VERB),
12141
12142 #if 0
12143         /* Below is a quirk table taken from the old code.
12144          * Basically the device should work as is without the fixup table.
12145          * If BIOS doesn't give a proper info, enable the corresponding
12146          * fixup entry.
12147          */
12148         SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),
12149         SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),
12150         SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1),
12151         SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC662_FIXUP_ASUS_MODE3),
12152         SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
12153         SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12154         SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
12155         SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC662_FIXUP_ASUS_MODE1),
12156         SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC662_FIXUP_ASUS_MODE1),
12157         SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12158         SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC662_FIXUP_ASUS_MODE7),
12159         SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC662_FIXUP_ASUS_MODE7),
12160         SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC662_FIXUP_ASUS_MODE8),
12161         SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC662_FIXUP_ASUS_MODE3),
12162         SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC662_FIXUP_ASUS_MODE1),
12163         SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12164         SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_FIXUP_ASUS_MODE2),
12165         SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC662_FIXUP_ASUS_MODE1),
12166         SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12167         SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
12168         SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
12169         SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12170         SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC662_FIXUP_ASUS_MODE1),
12171         SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC662_FIXUP_ASUS_MODE3),
12172         SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_FIXUP_ASUS_MODE2),
12173         SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12174         SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC662_FIXUP_ASUS_MODE5),
12175         SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
12176         SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12177         SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC662_FIXUP_ASUS_MODE1),
12178         SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12179         SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12180         SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC662_FIXUP_ASUS_MODE3),
12181         SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC662_FIXUP_ASUS_MODE3),
12182         SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC662_FIXUP_ASUS_MODE1),
12183         SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC662_FIXUP_ASUS_MODE1),
12184         SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC662_FIXUP_ASUS_MODE1),
12185         SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC662_FIXUP_ASUS_MODE1),
12186         SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC662_FIXUP_ASUS_MODE1),
12187         SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12188         SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_FIXUP_ASUS_MODE2),
12189         SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC662_FIXUP_ASUS_MODE1),
12190         SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
12191         SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC662_FIXUP_ASUS_MODE3),
12192         SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC662_FIXUP_ASUS_MODE1),
12193         SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC662_FIXUP_ASUS_MODE1),
12194         SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC662_FIXUP_ASUS_MODE1),
12195         SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_FIXUP_ASUS_MODE2),
12196         SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
12197         SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE4),
12198 #endif
12199         {}
12200 };
12201
12202 static const struct hda_model_fixup alc662_fixup_models[] = {
12203         {.id = ALC662_FIXUP_ASPIRE, .name = "aspire"},
12204         {.id = ALC662_FIXUP_IDEAPAD, .name = "ideapad"},
12205         {.id = ALC272_FIXUP_MARIO, .name = "mario"},
12206         {.id = ALC662_FIXUP_HP_RP5800, .name = "hp-rp5800"},
12207         {.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"},
12208         {.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"},
12209         {.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"},
12210         {.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"},
12211         {.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"},
12212         {.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
12213         {.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
12214         {.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
12215         {.id = ALC662_FIXUP_ZOTAC_Z68, .name = "zotac-z68"},
12216         {.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},
12217         {.id = ALC662_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc662-headset-multi"},
12218         {.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
12219         {.id = ALC662_FIXUP_HEADSET_MODE, .name = "alc662-headset"},
12220         {.id = ALC668_FIXUP_HEADSET_MODE, .name = "alc668-headset"},
12221         {.id = ALC662_FIXUP_BASS_16, .name = "bass16"},
12222         {.id = ALC662_FIXUP_BASS_1A, .name = "bass1a"},
12223         {.id = ALC668_FIXUP_AUTO_MUTE, .name = "automute"},
12224         {.id = ALC668_FIXUP_DELL_XPS13, .name = "dell-xps13"},
12225         {.id = ALC662_FIXUP_ASUS_Nx50, .name = "asus-nx50"},
12226         {.id = ALC668_FIXUP_ASUS_Nx51, .name = "asus-nx51"},
12227         {.id = ALC668_FIXUP_ASUS_G751, .name = "asus-g751"},
12228         {.id = ALC891_FIXUP_HEADSET_MODE, .name = "alc891-headset"},
12229         {.id = ALC891_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc891-headset-multi"},
12230         {.id = ALC662_FIXUP_ACER_VERITON, .name = "acer-veriton"},
12231         {.id = ALC892_FIXUP_ASROCK_MOBO, .name = "asrock-mobo"},
12232         {.id = ALC662_FIXUP_USI_HEADSET_MODE, .name = "usi-headset"},
12233         {.id = ALC662_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
12234         {.id = ALC669_FIXUP_ACER_ASPIRE_ETHOS, .name = "aspire-ethos"},
12235         {.id = ALC897_FIXUP_UNIS_H3C_X500S, .name = "unis-h3c-x500s"},
12236         {}
12237 };
12238
12239 static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {
12240         SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
12241                 {0x17, 0x02211010},
12242                 {0x18, 0x01a19030},
12243                 {0x1a, 0x01813040},
12244                 {0x21, 0x01014020}),
12245         SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
12246                 {0x16, 0x01813030},
12247                 {0x17, 0x02211010},
12248                 {0x18, 0x01a19040},
12249                 {0x21, 0x01014020}),
12250         SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
12251                 {0x14, 0x01014010},
12252                 {0x18, 0x01a19020},
12253                 {0x1a, 0x0181302f},
12254                 {0x1b, 0x0221401f}),
12255         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
12256                 {0x12, 0x99a30130},
12257                 {0x14, 0x90170110},
12258                 {0x15, 0x0321101f},
12259                 {0x16, 0x03011020}),
12260         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
12261                 {0x12, 0x99a30140},
12262                 {0x14, 0x90170110},
12263                 {0x15, 0x0321101f},
12264                 {0x16, 0x03011020}),
12265         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
12266                 {0x12, 0x99a30150},
12267                 {0x14, 0x90170110},
12268                 {0x15, 0x0321101f},
12269                 {0x16, 0x03011020}),
12270         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
12271                 {0x14, 0x90170110},
12272                 {0x15, 0x0321101f},
12273                 {0x16, 0x03011020}),
12274         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell XPS 15", ALC668_FIXUP_AUTO_MUTE,
12275                 {0x12, 0x90a60130},
12276                 {0x14, 0x90170110},
12277                 {0x15, 0x0321101f}),
12278         SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
12279                 {0x14, 0x01014010},
12280                 {0x17, 0x90170150},
12281                 {0x19, 0x02a11060},
12282                 {0x1b, 0x01813030},
12283                 {0x21, 0x02211020}),
12284         SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
12285                 {0x14, 0x01014010},
12286                 {0x18, 0x01a19040},
12287                 {0x1b, 0x01813030},
12288                 {0x21, 0x02211020}),
12289         SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
12290                 {0x14, 0x01014020},
12291                 {0x17, 0x90170110},
12292                 {0x18, 0x01a19050},
12293                 {0x1b, 0x01813040},
12294                 {0x21, 0x02211030}),
12295         {}
12296 };
12297
12298 /*
12299  */
12300 static int patch_alc662(struct hda_codec *codec)
12301 {
12302         struct alc_spec *spec;
12303         int err;
12304
12305         err = alc_alloc_spec(codec, 0x0b);
12306         if (err < 0)
12307                 return err;
12308
12309         spec = codec->spec;
12310
12311         spec->shutup = alc_eapd_shutup;
12312
12313         /* handle multiple HPs as is */
12314         spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
12315
12316         alc_fix_pll_init(codec, 0x20, 0x04, 15);
12317
12318         switch (codec->core.vendor_id) {
12319         case 0x10ec0668:
12320                 spec->init_hook = alc668_restore_default_value;
12321                 break;
12322         }
12323
12324         alc_pre_init(codec);
12325
12326         snd_hda_pick_fixup(codec, alc662_fixup_models,
12327                        alc662_fixup_tbl, alc662_fixups);
12328         snd_hda_pick_pin_fixup(codec, alc662_pin_fixup_tbl, alc662_fixups, true);
12329         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
12330
12331         alc_auto_parse_customize_define(codec);
12332
12333         if (has_cdefine_beep(codec))
12334                 spec->gen.beep_nid = 0x01;
12335
12336         if ((alc_get_coef0(codec) & (1 << 14)) &&
12337             codec->bus->pci && codec->bus->pci->subsystem_vendor == 0x1025 &&
12338             spec->cdefine.platform_type == 1) {
12339                 err = alc_codec_rename(codec, "ALC272X");
12340                 if (err < 0)
12341                         goto error;
12342         }
12343
12344         /* automatic parse from the BIOS config */
12345         err = alc662_parse_auto_config(codec);
12346         if (err < 0)
12347                 goto error;
12348
12349         if (!spec->gen.no_analog && spec->gen.beep_nid) {
12350                 switch (codec->core.vendor_id) {
12351                 case 0x10ec0662:
12352                         err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
12353                         break;
12354                 case 0x10ec0272:
12355                 case 0x10ec0663:
12356                 case 0x10ec0665:
12357                 case 0x10ec0668:
12358                         err = set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
12359                         break;
12360                 case 0x10ec0273:
12361                         err = set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
12362                         break;
12363                 }
12364                 if (err < 0)
12365                         goto error;
12366         }
12367
12368         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
12369
12370         return 0;
12371
12372  error:
12373         alc_free(codec);
12374         return err;
12375 }
12376
12377 /*
12378  * ALC680 support
12379  */
12380
12381 static int alc680_parse_auto_config(struct hda_codec *codec)
12382 {
12383         return alc_parse_auto_config(codec, NULL, NULL);
12384 }
12385
12386 /*
12387  */
12388 static int patch_alc680(struct hda_codec *codec)
12389 {
12390         int err;
12391
12392         /* ALC680 has no aa-loopback mixer */
12393         err = alc_alloc_spec(codec, 0);
12394         if (err < 0)
12395                 return err;
12396
12397         /* automatic parse from the BIOS config */
12398         err = alc680_parse_auto_config(codec);
12399         if (err < 0) {
12400                 alc_free(codec);
12401                 return err;
12402         }
12403
12404         return 0;
12405 }
12406
12407 /*
12408  * patch entries
12409  */
12410 static const struct hda_device_id snd_hda_id_realtek[] = {
12411         HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269),
12412         HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),
12413         HDA_CODEC_ENTRY(0x10ec0222, "ALC222", patch_alc269),
12414         HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),
12415         HDA_CODEC_ENTRY(0x10ec0230, "ALC236", patch_alc269),
12416         HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),
12417         HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269),
12418         HDA_CODEC_ENTRY(0x10ec0234, "ALC234", patch_alc269),
12419         HDA_CODEC_ENTRY(0x10ec0235, "ALC233", patch_alc269),
12420         HDA_CODEC_ENTRY(0x10ec0236, "ALC236", patch_alc269),
12421         HDA_CODEC_ENTRY(0x10ec0245, "ALC245", patch_alc269),
12422         HDA_CODEC_ENTRY(0x10ec0255, "ALC255", patch_alc269),
12423         HDA_CODEC_ENTRY(0x10ec0256, "ALC256", patch_alc269),
12424         HDA_CODEC_ENTRY(0x10ec0257, "ALC257", patch_alc269),
12425         HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260),
12426         HDA_CODEC_ENTRY(0x10ec0262, "ALC262", patch_alc262),
12427         HDA_CODEC_ENTRY(0x10ec0267, "ALC267", patch_alc268),
12428         HDA_CODEC_ENTRY(0x10ec0268, "ALC268", patch_alc268),
12429         HDA_CODEC_ENTRY(0x10ec0269, "ALC269", patch_alc269),
12430         HDA_CODEC_ENTRY(0x10ec0270, "ALC270", patch_alc269),
12431         HDA_CODEC_ENTRY(0x10ec0272, "ALC272", patch_alc662),
12432         HDA_CODEC_ENTRY(0x10ec0274, "ALC274", patch_alc269),
12433         HDA_CODEC_ENTRY(0x10ec0275, "ALC275", patch_alc269),
12434         HDA_CODEC_ENTRY(0x10ec0276, "ALC276", patch_alc269),
12435         HDA_CODEC_ENTRY(0x10ec0280, "ALC280", patch_alc269),
12436         HDA_CODEC_ENTRY(0x10ec0282, "ALC282", patch_alc269),
12437         HDA_CODEC_ENTRY(0x10ec0283, "ALC283", patch_alc269),
12438         HDA_CODEC_ENTRY(0x10ec0284, "ALC284", patch_alc269),
12439         HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269),
12440         HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269),
12441         HDA_CODEC_ENTRY(0x10ec0287, "ALC287", patch_alc269),
12442         HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269),
12443         HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269),
12444         HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269),
12445         HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269),
12446         HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269),
12447         HDA_CODEC_ENTRY(0x10ec0294, "ALC294", patch_alc269),
12448         HDA_CODEC_ENTRY(0x10ec0295, "ALC295", patch_alc269),
12449         HDA_CODEC_ENTRY(0x10ec0298, "ALC298", patch_alc269),
12450         HDA_CODEC_ENTRY(0x10ec0299, "ALC299", patch_alc269),
12451         HDA_CODEC_ENTRY(0x10ec0300, "ALC300", patch_alc269),
12452         HDA_CODEC_ENTRY(0x10ec0623, "ALC623", patch_alc269),
12453         HDA_CODEC_REV_ENTRY(0x10ec0861, 0x100340, "ALC660", patch_alc861),
12454         HDA_CODEC_ENTRY(0x10ec0660, "ALC660-VD", patch_alc861vd),
12455         HDA_CODEC_ENTRY(0x10ec0861, "ALC861", patch_alc861),
12456         HDA_CODEC_ENTRY(0x10ec0862, "ALC861-VD", patch_alc861vd),
12457         HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100002, "ALC662 rev2", patch_alc882),
12458         HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100101, "ALC662 rev1", patch_alc662),
12459         HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100300, "ALC662 rev3", patch_alc662),
12460         HDA_CODEC_ENTRY(0x10ec0663, "ALC663", patch_alc662),
12461         HDA_CODEC_ENTRY(0x10ec0665, "ALC665", patch_alc662),
12462         HDA_CODEC_ENTRY(0x10ec0667, "ALC667", patch_alc662),
12463         HDA_CODEC_ENTRY(0x10ec0668, "ALC668", patch_alc662),
12464         HDA_CODEC_ENTRY(0x10ec0670, "ALC670", patch_alc662),
12465         HDA_CODEC_ENTRY(0x10ec0671, "ALC671", patch_alc662),
12466         HDA_CODEC_ENTRY(0x10ec0680, "ALC680", patch_alc680),
12467         HDA_CODEC_ENTRY(0x10ec0700, "ALC700", patch_alc269),
12468         HDA_CODEC_ENTRY(0x10ec0701, "ALC701", patch_alc269),
12469         HDA_CODEC_ENTRY(0x10ec0703, "ALC703", patch_alc269),
12470         HDA_CODEC_ENTRY(0x10ec0711, "ALC711", patch_alc269),
12471         HDA_CODEC_ENTRY(0x10ec0867, "ALC891", patch_alc662),
12472         HDA_CODEC_ENTRY(0x10ec0880, "ALC880", patch_alc880),
12473         HDA_CODEC_ENTRY(0x10ec0882, "ALC882", patch_alc882),
12474         HDA_CODEC_ENTRY(0x10ec0883, "ALC883", patch_alc882),
12475         HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100101, "ALC889A", patch_alc882),
12476         HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100103, "ALC889A", patch_alc882),
12477         HDA_CODEC_ENTRY(0x10ec0885, "ALC885", patch_alc882),
12478         HDA_CODEC_ENTRY(0x10ec0887, "ALC887", patch_alc882),
12479         HDA_CODEC_REV_ENTRY(0x10ec0888, 0x100101, "ALC1200", patch_alc882),
12480         HDA_CODEC_ENTRY(0x10ec0888, "ALC888", patch_alc882),
12481         HDA_CODEC_ENTRY(0x10ec0889, "ALC889", patch_alc882),
12482         HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662),
12483         HDA_CODEC_ENTRY(0x10ec0897, "ALC897", patch_alc662),
12484         HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882),
12485         HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882),
12486         HDA_CODEC_ENTRY(0x10ec0b00, "ALCS1200A", patch_alc882),
12487         HDA_CODEC_ENTRY(0x10ec1168, "ALC1220", patch_alc882),
12488         HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882),
12489         HDA_CODEC_ENTRY(0x19e58326, "HW8326", patch_alc269),
12490         {} /* terminator */
12491 };
12492 MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_realtek);
12493
12494 MODULE_LICENSE("GPL");
12495 MODULE_DESCRIPTION("Realtek HD-audio codec");
12496
12497 static struct hda_codec_driver realtek_driver = {
12498         .id = snd_hda_id_realtek,
12499 };
12500
12501 module_hda_codec_driver(realtek_driver);