~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/sound/pci/hda/patch_realtek.c

Version: ~ [ linux-6.11-rc3 ] ~ [ linux-6.10.4 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.45 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.104 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.164 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.223 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.281 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.319 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  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/acpi.h>
 14 #include <linux/init.h>
 15 #include <linux/delay.h>
 16 #include <linux/slab.h>
 17 #include <linux/pci.h>
 18 #include <linux/dmi.h>
 19 #include <linux/module.h>
 20 #include <linux/input.h>
 21 #include <linux/leds.h>
 22 #include <linux/ctype.h>
 23 #include <sound/core.h>
 24 #include <sound/jack.h>
 25 #include <sound/hda_codec.h>
 26 #include "hda_local.h"
 27 #include "hda_auto_parser.h"
 28 #include "hda_jack.h"
 29 #include "hda_generic.h"
 30 #include "hda_component.h"
 31 
 32 /* keep halting ALC5505 DSP, for power saving */
 33 #define HALT_REALTEK_ALC5505
 34 
 35 /* extra amp-initialization sequence types */
 36 enum {
 37         ALC_INIT_UNDEFINED,
 38         ALC_INIT_NONE,
 39         ALC_INIT_DEFAULT,
 40 };
 41 
 42 enum {
 43         ALC_HEADSET_MODE_UNKNOWN,
 44         ALC_HEADSET_MODE_UNPLUGGED,
 45         ALC_HEADSET_MODE_HEADSET,
 46         ALC_HEADSET_MODE_MIC,
 47         ALC_HEADSET_MODE_HEADPHONE,
 48 };
 49 
 50 enum {
 51         ALC_HEADSET_TYPE_UNKNOWN,
 52         ALC_HEADSET_TYPE_CTIA,
 53         ALC_HEADSET_TYPE_OMTP,
 54 };
 55 
 56 enum {
 57         ALC_KEY_MICMUTE_INDEX,
 58 };
 59 
 60 struct alc_customize_define {
 61         unsigned int  sku_cfg;
 62         unsigned char port_connectivity;
 63         unsigned char check_sum;
 64         unsigned char customization;
 65         unsigned char external_amp;
 66         unsigned int  enable_pcbeep:1;
 67         unsigned int  platform_type:1;
 68         unsigned int  swap:1;
 69         unsigned int  override:1;
 70         unsigned int  fixup:1; /* Means that this sku is set by driver, not read from hw */
 71 };
 72 
 73 struct alc_coef_led {
 74         unsigned int idx;
 75         unsigned int mask;
 76         unsigned int on;
 77         unsigned int off;
 78 };
 79 
 80 struct alc_spec {
 81         struct hda_gen_spec gen; /* must be at head */
 82 
 83         /* codec parameterization */
 84         struct alc_customize_define cdefine;
 85         unsigned int parse_flags; /* flag for snd_hda_parse_pin_defcfg() */
 86 
 87         /* GPIO bits */
 88         unsigned int gpio_mask;
 89         unsigned int gpio_dir;
 90         unsigned int gpio_data;
 91         bool gpio_write_delay;  /* add a delay before writing gpio_data */
 92 
 93         /* mute LED for HP laptops, see vref_mute_led_set() */
 94         int mute_led_polarity;
 95         int micmute_led_polarity;
 96         hda_nid_t mute_led_nid;
 97         hda_nid_t cap_mute_led_nid;
 98 
 99         unsigned int gpio_mute_led_mask;
100         unsigned int gpio_mic_led_mask;
101         struct alc_coef_led mute_led_coef;
102         struct alc_coef_led mic_led_coef;
103         struct mutex coef_mutex;
104 
105         hda_nid_t headset_mic_pin;
106         hda_nid_t headphone_mic_pin;
107         int current_headset_mode;
108         int current_headset_type;
109 
110         /* hooks */
111         void (*init_hook)(struct hda_codec *codec);
112         void (*power_hook)(struct hda_codec *codec);
113         void (*shutup)(struct hda_codec *codec);
114 
115         int init_amp;
116         int codec_variant;      /* flag for other variants */
117         unsigned int has_alc5505_dsp:1;
118         unsigned int no_depop_delay:1;
119         unsigned int done_hp_init:1;
120         unsigned int no_shutup_pins:1;
121         unsigned int ultra_low_power:1;
122         unsigned int has_hs_key:1;
123         unsigned int no_internal_mic_pin:1;
124         unsigned int en_3kpull_low:1;
125 
126         /* for PLL fix */
127         hda_nid_t pll_nid;
128         unsigned int pll_coef_idx, pll_coef_bit;
129         unsigned int coef0;
130         struct input_dev *kb_dev;
131         u8 alc_mute_keycode_map[1];
132 
133         /* component binding */
134         struct hda_component_parent comps;
135 };
136 
137 /*
138  * COEF access helper functions
139  */
140 
141 static void coef_mutex_lock(struct hda_codec *codec)
142 {
143         struct alc_spec *spec = codec->spec;
144 
145         snd_hda_power_up_pm(codec);
146         mutex_lock(&spec->coef_mutex);
147 }
148 
149 static void coef_mutex_unlock(struct hda_codec *codec)
150 {
151         struct alc_spec *spec = codec->spec;
152 
153         mutex_unlock(&spec->coef_mutex);
154         snd_hda_power_down_pm(codec);
155 }
156 
157 static int __alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
158                                  unsigned int coef_idx)
159 {
160         unsigned int val;
161 
162         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
163         val = snd_hda_codec_read(codec, nid, 0, AC_VERB_GET_PROC_COEF, 0);
164         return val;
165 }
166 
167 static int alc_read_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
168                                unsigned int coef_idx)
169 {
170         unsigned int val;
171 
172         coef_mutex_lock(codec);
173         val = __alc_read_coefex_idx(codec, nid, coef_idx);
174         coef_mutex_unlock(codec);
175         return val;
176 }
177 
178 #define alc_read_coef_idx(codec, coef_idx) \
179         alc_read_coefex_idx(codec, 0x20, coef_idx)
180 
181 static void __alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
182                                    unsigned int coef_idx, unsigned int coef_val)
183 {
184         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_COEF_INDEX, coef_idx);
185         snd_hda_codec_write(codec, nid, 0, AC_VERB_SET_PROC_COEF, coef_val);
186 }
187 
188 static void alc_write_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
189                                  unsigned int coef_idx, unsigned int coef_val)
190 {
191         coef_mutex_lock(codec);
192         __alc_write_coefex_idx(codec, nid, coef_idx, coef_val);
193         coef_mutex_unlock(codec);
194 }
195 
196 #define alc_write_coef_idx(codec, coef_idx, coef_val) \
197         alc_write_coefex_idx(codec, 0x20, coef_idx, coef_val)
198 
199 static void __alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
200                                     unsigned int coef_idx, unsigned int mask,
201                                     unsigned int bits_set)
202 {
203         unsigned int val = __alc_read_coefex_idx(codec, nid, coef_idx);
204 
205         if (val != -1)
206                 __alc_write_coefex_idx(codec, nid, coef_idx,
207                                        (val & ~mask) | bits_set);
208 }
209 
210 static void alc_update_coefex_idx(struct hda_codec *codec, hda_nid_t nid,
211                                   unsigned int coef_idx, unsigned int mask,
212                                   unsigned int bits_set)
213 {
214         coef_mutex_lock(codec);
215         __alc_update_coefex_idx(codec, nid, coef_idx, mask, bits_set);
216         coef_mutex_unlock(codec);
217 }
218 
219 #define alc_update_coef_idx(codec, coef_idx, mask, bits_set)    \
220         alc_update_coefex_idx(codec, 0x20, coef_idx, mask, bits_set)
221 
222 /* a special bypass for COEF 0; read the cached value at the second time */
223 static unsigned int alc_get_coef0(struct hda_codec *codec)
224 {
225         struct alc_spec *spec = codec->spec;
226 
227         if (!spec->coef0)
228                 spec->coef0 = alc_read_coef_idx(codec, 0);
229         return spec->coef0;
230 }
231 
232 /* coef writes/updates batch */
233 struct coef_fw {
234         unsigned char nid;
235         unsigned char idx;
236         unsigned short mask;
237         unsigned short val;
238 };
239 
240 #define UPDATE_COEFEX(_nid, _idx, _mask, _val) \
241         { .nid = (_nid), .idx = (_idx), .mask = (_mask), .val = (_val) }
242 #define WRITE_COEFEX(_nid, _idx, _val) UPDATE_COEFEX(_nid, _idx, -1, _val)
243 #define WRITE_COEF(_idx, _val) WRITE_COEFEX(0x20, _idx, _val)
244 #define UPDATE_COEF(_idx, _mask, _val) UPDATE_COEFEX(0x20, _idx, _mask, _val)
245 
246 static void alc_process_coef_fw(struct hda_codec *codec,
247                                 const struct coef_fw *fw)
248 {
249         coef_mutex_lock(codec);
250         for (; fw->nid; fw++) {
251                 if (fw->mask == (unsigned short)-1)
252                         __alc_write_coefex_idx(codec, fw->nid, fw->idx, fw->val);
253                 else
254                         __alc_update_coefex_idx(codec, fw->nid, fw->idx,
255                                                 fw->mask, fw->val);
256         }
257         coef_mutex_unlock(codec);
258 }
259 
260 /*
261  * GPIO setup tables, used in initialization
262  */
263 
264 /* Enable GPIO mask and set output */
265 static void alc_setup_gpio(struct hda_codec *codec, unsigned int mask)
266 {
267         struct alc_spec *spec = codec->spec;
268 
269         spec->gpio_mask |= mask;
270         spec->gpio_dir |= mask;
271         spec->gpio_data |= mask;
272 }
273 
274 static void alc_write_gpio_data(struct hda_codec *codec)
275 {
276         struct alc_spec *spec = codec->spec;
277 
278         snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
279                             spec->gpio_data);
280 }
281 
282 static void alc_update_gpio_data(struct hda_codec *codec, unsigned int mask,
283                                  bool on)
284 {
285         struct alc_spec *spec = codec->spec;
286         unsigned int oldval = spec->gpio_data;
287 
288         if (on)
289                 spec->gpio_data |= mask;
290         else
291                 spec->gpio_data &= ~mask;
292         if (oldval != spec->gpio_data)
293                 alc_write_gpio_data(codec);
294 }
295 
296 static void alc_write_gpio(struct hda_codec *codec)
297 {
298         struct alc_spec *spec = codec->spec;
299 
300         if (!spec->gpio_mask)
301                 return;
302 
303         snd_hda_codec_write(codec, codec->core.afg, 0,
304                             AC_VERB_SET_GPIO_MASK, spec->gpio_mask);
305         snd_hda_codec_write(codec, codec->core.afg, 0,
306                             AC_VERB_SET_GPIO_DIRECTION, spec->gpio_dir);
307         if (spec->gpio_write_delay)
308                 msleep(1);
309         alc_write_gpio_data(codec);
310 }
311 
312 static void alc_fixup_gpio(struct hda_codec *codec, int action,
313                            unsigned int mask)
314 {
315         if (action == HDA_FIXUP_ACT_PRE_PROBE)
316                 alc_setup_gpio(codec, mask);
317 }
318 
319 static void alc_fixup_gpio1(struct hda_codec *codec,
320                             const struct hda_fixup *fix, int action)
321 {
322         alc_fixup_gpio(codec, action, 0x01);
323 }
324 
325 static void alc_fixup_gpio2(struct hda_codec *codec,
326                             const struct hda_fixup *fix, int action)
327 {
328         alc_fixup_gpio(codec, action, 0x02);
329 }
330 
331 static void alc_fixup_gpio3(struct hda_codec *codec,
332                             const struct hda_fixup *fix, int action)
333 {
334         alc_fixup_gpio(codec, action, 0x03);
335 }
336 
337 static void alc_fixup_gpio4(struct hda_codec *codec,
338                             const struct hda_fixup *fix, int action)
339 {
340         alc_fixup_gpio(codec, action, 0x04);
341 }
342 
343 static void alc_fixup_micmute_led(struct hda_codec *codec,
344                                   const struct hda_fixup *fix, int action)
345 {
346         if (action == HDA_FIXUP_ACT_PRE_PROBE)
347                 snd_hda_gen_add_micmute_led_cdev(codec, NULL);
348 }
349 
350 /*
351  * Fix hardware PLL issue
352  * On some codecs, the analog PLL gating control must be off while
353  * the default value is 1.
354  */
355 static void alc_fix_pll(struct hda_codec *codec)
356 {
357         struct alc_spec *spec = codec->spec;
358 
359         if (spec->pll_nid)
360                 alc_update_coefex_idx(codec, spec->pll_nid, spec->pll_coef_idx,
361                                       1 << spec->pll_coef_bit, 0);
362 }
363 
364 static void alc_fix_pll_init(struct hda_codec *codec, hda_nid_t nid,
365                              unsigned int coef_idx, unsigned int coef_bit)
366 {
367         struct alc_spec *spec = codec->spec;
368         spec->pll_nid = nid;
369         spec->pll_coef_idx = coef_idx;
370         spec->pll_coef_bit = coef_bit;
371         alc_fix_pll(codec);
372 }
373 
374 /* update the master volume per volume-knob's unsol event */
375 static void alc_update_knob_master(struct hda_codec *codec,
376                                    struct hda_jack_callback *jack)
377 {
378         unsigned int val;
379         struct snd_kcontrol *kctl;
380         struct snd_ctl_elem_value *uctl;
381 
382         kctl = snd_hda_find_mixer_ctl(codec, "Master Playback Volume");
383         if (!kctl)
384                 return;
385         uctl = kzalloc(sizeof(*uctl), GFP_KERNEL);
386         if (!uctl)
387                 return;
388         val = snd_hda_codec_read(codec, jack->nid, 0,
389                                  AC_VERB_GET_VOLUME_KNOB_CONTROL, 0);
390         val &= HDA_AMP_VOLMASK;
391         uctl->value.integer.value[0] = val;
392         uctl->value.integer.value[1] = val;
393         kctl->put(kctl, uctl);
394         kfree(uctl);
395 }
396 
397 static void alc880_unsol_event(struct hda_codec *codec, unsigned int res)
398 {
399         /* For some reason, the res given from ALC880 is broken.
400            Here we adjust it properly. */
401         snd_hda_jack_unsol_event(codec, res >> 2);
402 }
403 
404 /* Change EAPD to verb control */
405 static void alc_fill_eapd_coef(struct hda_codec *codec)
406 {
407         int coef;
408 
409         coef = alc_get_coef0(codec);
410 
411         switch (codec->core.vendor_id) {
412         case 0x10ec0262:
413                 alc_update_coef_idx(codec, 0x7, 0, 1<<5);
414                 break;
415         case 0x10ec0267:
416         case 0x10ec0268:
417                 alc_update_coef_idx(codec, 0x7, 0, 1<<13);
418                 break;
419         case 0x10ec0269:
420                 if ((coef & 0x00f0) == 0x0010)
421                         alc_update_coef_idx(codec, 0xd, 0, 1<<14);
422                 if ((coef & 0x00f0) == 0x0020)
423                         alc_update_coef_idx(codec, 0x4, 1<<15, 0);
424                 if ((coef & 0x00f0) == 0x0030)
425                         alc_update_coef_idx(codec, 0x10, 1<<9, 0);
426                 break;
427         case 0x10ec0280:
428         case 0x10ec0284:
429         case 0x10ec0290:
430         case 0x10ec0292:
431                 alc_update_coef_idx(codec, 0x4, 1<<15, 0);
432                 break;
433         case 0x10ec0225:
434         case 0x10ec0295:
435         case 0x10ec0299:
436                 alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
437                 fallthrough;
438         case 0x10ec0215:
439         case 0x10ec0285:
440         case 0x10ec0289:
441                 alc_update_coef_idx(codec, 0x36, 1<<13, 0);
442                 fallthrough;
443         case 0x10ec0230:
444         case 0x10ec0233:
445         case 0x10ec0235:
446         case 0x10ec0236:
447         case 0x10ec0245:
448         case 0x10ec0255:
449         case 0x10ec0256:
450         case 0x19e58326:
451         case 0x10ec0257:
452         case 0x10ec0282:
453         case 0x10ec0283:
454         case 0x10ec0286:
455         case 0x10ec0288:
456         case 0x10ec0298:
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 0x10ec0257:
587         case 0x19e58326:
588         case 0x10ec0283:
589         case 0x10ec0285:
590         case 0x10ec0286:
591         case 0x10ec0287:
592         case 0x10ec0288:
593         case 0x10ec0295:
594         case 0x10ec0298:
595                 alc_headset_mic_no_shutup(codec);
596                 break;
597         default:
598                 if (!spec->no_shutup_pins)
599                         snd_hda_shutup_pins(codec);
600                 break;
601         }
602 }
603 
604 /* generic shutup callback;
605  * just turning off EAPD and a little pause for avoiding pop-noise
606  */
607 static void alc_eapd_shutup(struct hda_codec *codec)
608 {
609         struct alc_spec *spec = codec->spec;
610 
611         alc_auto_setup_eapd(codec, false);
612         if (!spec->no_depop_delay)
613                 msleep(200);
614         alc_shutup_pins(codec);
615 }
616 
617 /* generic EAPD initialization */
618 static void alc_auto_init_amp(struct hda_codec *codec, int type)
619 {
620         alc_auto_setup_eapd(codec, true);
621         alc_write_gpio(codec);
622         switch (type) {
623         case ALC_INIT_DEFAULT:
624                 switch (codec->core.vendor_id) {
625                 case 0x10ec0260:
626                         alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x2010);
627                         break;
628                 case 0x10ec0880:
629                 case 0x10ec0882:
630                 case 0x10ec0883:
631                 case 0x10ec0885:
632                         alc_update_coef_idx(codec, 7, 0, 0x2030);
633                         break;
634                 case 0x10ec0888:
635                         alc888_coef_init(codec);
636                         break;
637                 }
638                 break;
639         }
640 }
641 
642 /* get a primary headphone pin if available */
643 static hda_nid_t alc_get_hp_pin(struct alc_spec *spec)
644 {
645         if (spec->gen.autocfg.hp_pins[0])
646                 return spec->gen.autocfg.hp_pins[0];
647         if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
648                 return spec->gen.autocfg.line_out_pins[0];
649         return 0;
650 }
651 
652 /*
653  * Realtek SSID verification
654  */
655 
656 /* Could be any non-zero and even value. When used as fixup, tells
657  * the driver to ignore any present sku defines.
658  */
659 #define ALC_FIXUP_SKU_IGNORE (2)
660 
661 static void alc_fixup_sku_ignore(struct hda_codec *codec,
662                                  const struct hda_fixup *fix, int action)
663 {
664         struct alc_spec *spec = codec->spec;
665         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
666                 spec->cdefine.fixup = 1;
667                 spec->cdefine.sku_cfg = ALC_FIXUP_SKU_IGNORE;
668         }
669 }
670 
671 static void alc_fixup_no_depop_delay(struct hda_codec *codec,
672                                     const struct hda_fixup *fix, int action)
673 {
674         struct alc_spec *spec = codec->spec;
675 
676         if (action == HDA_FIXUP_ACT_PROBE) {
677                 spec->no_depop_delay = 1;
678                 codec->depop_delay = 0;
679         }
680 }
681 
682 static int alc_auto_parse_customize_define(struct hda_codec *codec)
683 {
684         unsigned int ass, tmp, i;
685         unsigned nid = 0;
686         struct alc_spec *spec = codec->spec;
687 
688         spec->cdefine.enable_pcbeep = 1; /* assume always enabled */
689 
690         if (spec->cdefine.fixup) {
691                 ass = spec->cdefine.sku_cfg;
692                 if (ass == ALC_FIXUP_SKU_IGNORE)
693                         return -1;
694                 goto do_sku;
695         }
696 
697         if (!codec->bus->pci)
698                 return -1;
699         ass = codec->core.subsystem_id & 0xffff;
700         if (ass != codec->bus->pci->subsystem_device && (ass & 1))
701                 goto do_sku;
702 
703         nid = 0x1d;
704         if (codec->core.vendor_id == 0x10ec0260)
705                 nid = 0x17;
706         ass = snd_hda_codec_get_pincfg(codec, nid);
707 
708         if (!(ass & 1)) {
709                 codec_info(codec, "%s: SKU not ready 0x%08x\n",
710                            codec->core.chip_name, ass);
711                 return -1;
712         }
713 
714         /* check sum */
715         tmp = 0;
716         for (i = 1; i < 16; i++) {
717                 if ((ass >> i) & 1)
718                         tmp++;
719         }
720         if (((ass >> 16) & 0xf) != tmp)
721                 return -1;
722 
723         spec->cdefine.port_connectivity = ass >> 30;
724         spec->cdefine.enable_pcbeep = (ass & 0x100000) >> 20;
725         spec->cdefine.check_sum = (ass >> 16) & 0xf;
726         spec->cdefine.customization = ass >> 8;
727 do_sku:
728         spec->cdefine.sku_cfg = ass;
729         spec->cdefine.external_amp = (ass & 0x38) >> 3;
730         spec->cdefine.platform_type = (ass & 0x4) >> 2;
731         spec->cdefine.swap = (ass & 0x2) >> 1;
732         spec->cdefine.override = ass & 0x1;
733 
734         codec_dbg(codec, "SKU: Nid=0x%x sku_cfg=0x%08x\n",
735                    nid, spec->cdefine.sku_cfg);
736         codec_dbg(codec, "SKU: port_connectivity=0x%x\n",
737                    spec->cdefine.port_connectivity);
738         codec_dbg(codec, "SKU: enable_pcbeep=0x%x\n", spec->cdefine.enable_pcbeep);
739         codec_dbg(codec, "SKU: check_sum=0x%08x\n", spec->cdefine.check_sum);
740         codec_dbg(codec, "SKU: customization=0x%08x\n", spec->cdefine.customization);
741         codec_dbg(codec, "SKU: external_amp=0x%x\n", spec->cdefine.external_amp);
742         codec_dbg(codec, "SKU: platform_type=0x%x\n", spec->cdefine.platform_type);
743         codec_dbg(codec, "SKU: swap=0x%x\n", spec->cdefine.swap);
744         codec_dbg(codec, "SKU: override=0x%x\n", spec->cdefine.override);
745 
746         return 0;
747 }
748 
749 /* return the position of NID in the list, or -1 if not found */
750 static int find_idx_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
751 {
752         int i;
753         for (i = 0; i < nums; i++)
754                 if (list[i] == nid)
755                         return i;
756         return -1;
757 }
758 /* return true if the given NID is found in the list */
759 static bool found_in_nid_list(hda_nid_t nid, const hda_nid_t *list, int nums)
760 {
761         return find_idx_in_nid_list(nid, list, nums) >= 0;
762 }
763 
764 /* check subsystem ID and set up device-specific initialization;
765  * return 1 if initialized, 0 if invalid SSID
766  */
767 /* 32-bit subsystem ID for BIOS loading in HD Audio codec.
768  *      31 ~ 16 :       Manufacture ID
769  *      15 ~ 8  :       SKU ID
770  *      7  ~ 0  :       Assembly ID
771  *      port-A --> pin 39/41, port-E --> pin 14/15, port-D --> pin 35/36
772  */
773 static int alc_subsystem_id(struct hda_codec *codec, const hda_nid_t *ports)
774 {
775         unsigned int ass, tmp, i;
776         unsigned nid;
777         struct alc_spec *spec = codec->spec;
778 
779         if (spec->cdefine.fixup) {
780                 ass = spec->cdefine.sku_cfg;
781                 if (ass == ALC_FIXUP_SKU_IGNORE)
782                         return 0;
783                 goto do_sku;
784         }
785 
786         ass = codec->core.subsystem_id & 0xffff;
787         if (codec->bus->pci &&
788             ass != codec->bus->pci->subsystem_device && (ass & 1))
789                 goto do_sku;
790 
791         /* invalid SSID, check the special NID pin defcfg instead */
792         /*
793          * 31~30        : port connectivity
794          * 29~21        : reserve
795          * 20           : PCBEEP input
796          * 19~16        : Check sum (15:1)
797          * 15~1         : Custom
798          * 0            : override
799         */
800         nid = 0x1d;
801         if (codec->core.vendor_id == 0x10ec0260)
802                 nid = 0x17;
803         ass = snd_hda_codec_get_pincfg(codec, nid);
804         codec_dbg(codec,
805                   "realtek: No valid SSID, checking pincfg 0x%08x for NID 0x%x\n",
806                    ass, nid);
807         if (!(ass & 1))
808                 return 0;
809         if ((ass >> 30) != 1)   /* no physical connection */
810                 return 0;
811 
812         /* check sum */
813         tmp = 0;
814         for (i = 1; i < 16; i++) {
815                 if ((ass >> i) & 1)
816                         tmp++;
817         }
818         if (((ass >> 16) & 0xf) != tmp)
819                 return 0;
820 do_sku:
821         codec_dbg(codec, "realtek: Enabling init ASM_ID=0x%04x CODEC_ID=%08x\n",
822                    ass & 0xffff, codec->core.vendor_id);
823         /*
824          * 0 : override
825          * 1 :  Swap Jack
826          * 2 : 0 --> Desktop, 1 --> Laptop
827          * 3~5 : External Amplifier control
828          * 7~6 : Reserved
829         */
830         tmp = (ass & 0x38) >> 3;        /* external Amp control */
831         if (spec->init_amp == ALC_INIT_UNDEFINED) {
832                 switch (tmp) {
833                 case 1:
834                         alc_setup_gpio(codec, 0x01);
835                         break;
836                 case 3:
837                         alc_setup_gpio(codec, 0x02);
838                         break;
839                 case 7:
840                         alc_setup_gpio(codec, 0x04);
841                         break;
842                 case 5:
843                 default:
844                         spec->init_amp = ALC_INIT_DEFAULT;
845                         break;
846                 }
847         }
848 
849         /* is laptop or Desktop and enable the function "Mute internal speaker
850          * when the external headphone out jack is plugged"
851          */
852         if (!(ass & 0x8000))
853                 return 1;
854         /*
855          * 10~8 : Jack location
856          * 12~11: Headphone out -> 00: PortA, 01: PortE, 02: PortD, 03: Resvered
857          * 14~13: Resvered
858          * 15   : 1 --> enable the function "Mute internal speaker
859          *              when the external headphone out jack is plugged"
860          */
861         if (!alc_get_hp_pin(spec)) {
862                 hda_nid_t nid;
863                 tmp = (ass >> 11) & 0x3;        /* HP to chassis */
864                 nid = ports[tmp];
865                 if (found_in_nid_list(nid, spec->gen.autocfg.line_out_pins,
866                                       spec->gen.autocfg.line_outs))
867                         return 1;
868                 spec->gen.autocfg.hp_pins[0] = nid;
869         }
870         return 1;
871 }
872 
873 /* Check the validity of ALC subsystem-id
874  * ports contains an array of 4 pin NIDs for port-A, E, D and I */
875 static void alc_ssid_check(struct hda_codec *codec, const hda_nid_t *ports)
876 {
877         if (!alc_subsystem_id(codec, ports)) {
878                 struct alc_spec *spec = codec->spec;
879                 if (spec->init_amp == ALC_INIT_UNDEFINED) {
880                         codec_dbg(codec,
881                                   "realtek: Enable default setup for auto mode as fallback\n");
882                         spec->init_amp = ALC_INIT_DEFAULT;
883                 }
884         }
885 }
886 
887 /*
888  */
889 
890 static void alc_fixup_inv_dmic(struct hda_codec *codec,
891                                const struct hda_fixup *fix, int action)
892 {
893         struct alc_spec *spec = codec->spec;
894 
895         spec->gen.inv_dmic_split = 1;
896 }
897 
898 
899 static int alc_build_controls(struct hda_codec *codec)
900 {
901         int err;
902 
903         err = snd_hda_gen_build_controls(codec);
904         if (err < 0)
905                 return err;
906 
907         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_BUILD);
908         return 0;
909 }
910 
911 
912 /*
913  * Common callbacks
914  */
915 
916 static void alc_pre_init(struct hda_codec *codec)
917 {
918         alc_fill_eapd_coef(codec);
919 }
920 
921 #define is_s3_resume(codec) \
922         ((codec)->core.dev.power.power_state.event == PM_EVENT_RESUME)
923 #define is_s4_resume(codec) \
924         ((codec)->core.dev.power.power_state.event == PM_EVENT_RESTORE)
925 #define is_s4_suspend(codec) \
926         ((codec)->core.dev.power.power_state.event == PM_EVENT_FREEZE)
927 
928 static int alc_init(struct hda_codec *codec)
929 {
930         struct alc_spec *spec = codec->spec;
931 
932         /* hibernation resume needs the full chip initialization */
933         if (is_s4_resume(codec))
934                 alc_pre_init(codec);
935 
936         if (spec->init_hook)
937                 spec->init_hook(codec);
938 
939         spec->gen.skip_verbs = 1; /* applied in below */
940         snd_hda_gen_init(codec);
941         alc_fix_pll(codec);
942         alc_auto_init_amp(codec, spec->init_amp);
943         snd_hda_apply_verbs(codec); /* apply verbs here after own init */
944 
945         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_INIT);
946 
947         return 0;
948 }
949 
950 #define alc_free        snd_hda_gen_free
951 
952 static inline void alc_shutup(struct hda_codec *codec)
953 {
954         struct alc_spec *spec = codec->spec;
955 
956         if (!snd_hda_get_bool_hint(codec, "shutup"))
957                 return; /* disabled explicitly by hints */
958 
959         if (spec && spec->shutup)
960                 spec->shutup(codec);
961         else
962                 alc_shutup_pins(codec);
963 }
964 
965 static void alc_power_eapd(struct hda_codec *codec)
966 {
967         alc_auto_setup_eapd(codec, false);
968 }
969 
970 static int alc_suspend(struct hda_codec *codec)
971 {
972         struct alc_spec *spec = codec->spec;
973         alc_shutup(codec);
974         if (spec && spec->power_hook)
975                 spec->power_hook(codec);
976         return 0;
977 }
978 
979 static int alc_resume(struct hda_codec *codec)
980 {
981         struct alc_spec *spec = codec->spec;
982 
983         if (!spec->no_depop_delay)
984                 msleep(150); /* to avoid pop noise */
985         codec->patch_ops.init(codec);
986         snd_hda_regmap_sync(codec);
987         hda_call_check_power_status(codec, 0x01);
988         return 0;
989 }
990 
991 /*
992  */
993 static const struct hda_codec_ops alc_patch_ops = {
994         .build_controls = alc_build_controls,
995         .build_pcms = snd_hda_gen_build_pcms,
996         .init = alc_init,
997         .free = alc_free,
998         .unsol_event = snd_hda_jack_unsol_event,
999         .resume = alc_resume,
1000         .suspend = alc_suspend,
1001         .check_power_status = snd_hda_gen_check_power_status,
1002 };
1003 
1004 
1005 #define alc_codec_rename(codec, name) snd_hda_codec_set_name(codec, name)
1006 
1007 /*
1008  * Rename codecs appropriately from COEF value or subvendor id
1009  */
1010 struct alc_codec_rename_table {
1011         unsigned int vendor_id;
1012         unsigned short coef_mask;
1013         unsigned short coef_bits;
1014         const char *name;
1015 };
1016 
1017 struct alc_codec_rename_pci_table {
1018         unsigned int codec_vendor_id;
1019         unsigned short pci_subvendor;
1020         unsigned short pci_subdevice;
1021         const char *name;
1022 };
1023 
1024 static const struct alc_codec_rename_table rename_tbl[] = {
1025         { 0x10ec0221, 0xf00f, 0x1003, "ALC231" },
1026         { 0x10ec0269, 0xfff0, 0x3010, "ALC277" },
1027         { 0x10ec0269, 0xf0f0, 0x2010, "ALC259" },
1028         { 0x10ec0269, 0xf0f0, 0x3010, "ALC258" },
1029         { 0x10ec0269, 0x00f0, 0x0010, "ALC269VB" },
1030         { 0x10ec0269, 0xffff, 0xa023, "ALC259" },
1031         { 0x10ec0269, 0xffff, 0x6023, "ALC281X" },
1032         { 0x10ec0269, 0x00f0, 0x0020, "ALC269VC" },
1033         { 0x10ec0269, 0x00f0, 0x0030, "ALC269VD" },
1034         { 0x10ec0662, 0xffff, 0x4020, "ALC656" },
1035         { 0x10ec0887, 0x00f0, 0x0030, "ALC887-VD" },
1036         { 0x10ec0888, 0x00f0, 0x0030, "ALC888-VD" },
1037         { 0x10ec0888, 0xf0f0, 0x3020, "ALC886" },
1038         { 0x10ec0899, 0x2000, 0x2000, "ALC899" },
1039         { 0x10ec0892, 0xffff, 0x8020, "ALC661" },
1040         { 0x10ec0892, 0xffff, 0x8011, "ALC661" },
1041         { 0x10ec0892, 0xffff, 0x4011, "ALC656" },
1042         { } /* terminator */
1043 };
1044 
1045 static const struct alc_codec_rename_pci_table rename_pci_tbl[] = {
1046         { 0x10ec0280, 0x1028, 0, "ALC3220" },
1047         { 0x10ec0282, 0x1028, 0, "ALC3221" },
1048         { 0x10ec0283, 0x1028, 0, "ALC3223" },
1049         { 0x10ec0288, 0x1028, 0, "ALC3263" },
1050         { 0x10ec0292, 0x1028, 0, "ALC3226" },
1051         { 0x10ec0293, 0x1028, 0, "ALC3235" },
1052         { 0x10ec0255, 0x1028, 0, "ALC3234" },
1053         { 0x10ec0668, 0x1028, 0, "ALC3661" },
1054         { 0x10ec0275, 0x1028, 0, "ALC3260" },
1055         { 0x10ec0899, 0x1028, 0, "ALC3861" },
1056         { 0x10ec0298, 0x1028, 0, "ALC3266" },
1057         { 0x10ec0236, 0x1028, 0, "ALC3204" },
1058         { 0x10ec0256, 0x1028, 0, "ALC3246" },
1059         { 0x10ec0225, 0x1028, 0, "ALC3253" },
1060         { 0x10ec0295, 0x1028, 0, "ALC3254" },
1061         { 0x10ec0299, 0x1028, 0, "ALC3271" },
1062         { 0x10ec0670, 0x1025, 0, "ALC669X" },
1063         { 0x10ec0676, 0x1025, 0, "ALC679X" },
1064         { 0x10ec0282, 0x1043, 0, "ALC3229" },
1065         { 0x10ec0233, 0x1043, 0, "ALC3236" },
1066         { 0x10ec0280, 0x103c, 0, "ALC3228" },
1067         { 0x10ec0282, 0x103c, 0, "ALC3227" },
1068         { 0x10ec0286, 0x103c, 0, "ALC3242" },
1069         { 0x10ec0290, 0x103c, 0, "ALC3241" },
1070         { 0x10ec0668, 0x103c, 0, "ALC3662" },
1071         { 0x10ec0283, 0x17aa, 0, "ALC3239" },
1072         { 0x10ec0292, 0x17aa, 0, "ALC3232" },
1073         { } /* terminator */
1074 };
1075 
1076 static int alc_codec_rename_from_preset(struct hda_codec *codec)
1077 {
1078         const struct alc_codec_rename_table *p;
1079         const struct alc_codec_rename_pci_table *q;
1080 
1081         for (p = rename_tbl; p->vendor_id; p++) {
1082                 if (p->vendor_id != codec->core.vendor_id)
1083                         continue;
1084                 if ((alc_get_coef0(codec) & p->coef_mask) == p->coef_bits)
1085                         return alc_codec_rename(codec, p->name);
1086         }
1087 
1088         if (!codec->bus->pci)
1089                 return 0;
1090         for (q = rename_pci_tbl; q->codec_vendor_id; q++) {
1091                 if (q->codec_vendor_id != codec->core.vendor_id)
1092                         continue;
1093                 if (q->pci_subvendor != codec->bus->pci->subsystem_vendor)
1094                         continue;
1095                 if (!q->pci_subdevice ||
1096                     q->pci_subdevice == codec->bus->pci->subsystem_device)
1097                         return alc_codec_rename(codec, q->name);
1098         }
1099 
1100         return 0;
1101 }
1102 
1103 
1104 /*
1105  * Digital-beep handlers
1106  */
1107 #ifdef CONFIG_SND_HDA_INPUT_BEEP
1108 
1109 /* additional beep mixers; private_value will be overwritten */
1110 static const struct snd_kcontrol_new alc_beep_mixer[] = {
1111         HDA_CODEC_VOLUME("Beep Playback Volume", 0, 0, HDA_INPUT),
1112         HDA_CODEC_MUTE_BEEP("Beep Playback Switch", 0, 0, HDA_INPUT),
1113 };
1114 
1115 /* set up and create beep controls */
1116 static int set_beep_amp(struct alc_spec *spec, hda_nid_t nid,
1117                         int idx, int dir)
1118 {
1119         struct snd_kcontrol_new *knew;
1120         unsigned int beep_amp = HDA_COMPOSE_AMP_VAL(nid, 3, idx, dir);
1121         int i;
1122 
1123         for (i = 0; i < ARRAY_SIZE(alc_beep_mixer); i++) {
1124                 knew = snd_hda_gen_add_kctl(&spec->gen, NULL,
1125                                             &alc_beep_mixer[i]);
1126                 if (!knew)
1127                         return -ENOMEM;
1128                 knew->private_value = beep_amp;
1129         }
1130         return 0;
1131 }
1132 
1133 static const struct snd_pci_quirk beep_allow_list[] = {
1134         SND_PCI_QUIRK(0x1043, 0x103c, "ASUS", 1),
1135         SND_PCI_QUIRK(0x1043, 0x115d, "ASUS", 1),
1136         SND_PCI_QUIRK(0x1043, 0x829f, "ASUS", 1),
1137         SND_PCI_QUIRK(0x1043, 0x8376, "EeePC", 1),
1138         SND_PCI_QUIRK(0x1043, 0x83ce, "EeePC", 1),
1139         SND_PCI_QUIRK(0x1043, 0x831a, "EeePC", 1),
1140         SND_PCI_QUIRK(0x1043, 0x834a, "EeePC", 1),
1141         SND_PCI_QUIRK(0x1458, 0xa002, "GA-MA790X", 1),
1142         SND_PCI_QUIRK(0x8086, 0xd613, "Intel", 1),
1143         /* denylist -- no beep available */
1144         SND_PCI_QUIRK(0x17aa, 0x309e, "Lenovo ThinkCentre M73", 0),
1145         SND_PCI_QUIRK(0x17aa, 0x30a3, "Lenovo ThinkCentre M93", 0),
1146         {}
1147 };
1148 
1149 static inline int has_cdefine_beep(struct hda_codec *codec)
1150 {
1151         struct alc_spec *spec = codec->spec;
1152         const struct snd_pci_quirk *q;
1153         q = snd_pci_quirk_lookup(codec->bus->pci, beep_allow_list);
1154         if (q)
1155                 return q->value;
1156         return spec->cdefine.enable_pcbeep;
1157 }
1158 #else
1159 #define set_beep_amp(spec, nid, idx, dir)       0
1160 #define has_cdefine_beep(codec)         0
1161 #endif
1162 
1163 /* parse the BIOS configuration and set up the alc_spec */
1164 /* return 1 if successful, 0 if the proper config is not found,
1165  * or a negative error code
1166  */
1167 static int alc_parse_auto_config(struct hda_codec *codec,
1168                                  const hda_nid_t *ignore_nids,
1169                                  const hda_nid_t *ssid_nids)
1170 {
1171         struct alc_spec *spec = codec->spec;
1172         struct auto_pin_cfg *cfg = &spec->gen.autocfg;
1173         int err;
1174 
1175         err = snd_hda_parse_pin_defcfg(codec, cfg, ignore_nids,
1176                                        spec->parse_flags);
1177         if (err < 0)
1178                 return err;
1179 
1180         if (ssid_nids)
1181                 alc_ssid_check(codec, ssid_nids);
1182 
1183         err = snd_hda_gen_parse_auto_config(codec, cfg);
1184         if (err < 0)
1185                 return err;
1186 
1187         return 1;
1188 }
1189 
1190 /* common preparation job for alc_spec */
1191 static int alc_alloc_spec(struct hda_codec *codec, hda_nid_t mixer_nid)
1192 {
1193         struct alc_spec *spec = kzalloc(sizeof(*spec), GFP_KERNEL);
1194         int err;
1195 
1196         if (!spec)
1197                 return -ENOMEM;
1198         codec->spec = spec;
1199         snd_hda_gen_spec_init(&spec->gen);
1200         spec->gen.mixer_nid = mixer_nid;
1201         spec->gen.own_eapd_ctl = 1;
1202         codec->single_adc_amp = 1;
1203         /* FIXME: do we need this for all Realtek codec models? */
1204         codec->spdif_status_reset = 1;
1205         codec->forced_resume = 1;
1206         codec->patch_ops = alc_patch_ops;
1207         mutex_init(&spec->coef_mutex);
1208 
1209         err = alc_codec_rename_from_preset(codec);
1210         if (err < 0) {
1211                 kfree(spec);
1212                 return err;
1213         }
1214         return 0;
1215 }
1216 
1217 static int alc880_parse_auto_config(struct hda_codec *codec)
1218 {
1219         static const hda_nid_t alc880_ignore[] = { 0x1d, 0 };
1220         static const hda_nid_t alc880_ssids[] = { 0x15, 0x1b, 0x14, 0 };
1221         return alc_parse_auto_config(codec, alc880_ignore, alc880_ssids);
1222 }
1223 
1224 /*
1225  * ALC880 fix-ups
1226  */
1227 enum {
1228         ALC880_FIXUP_GPIO1,
1229         ALC880_FIXUP_GPIO2,
1230         ALC880_FIXUP_MEDION_RIM,
1231         ALC880_FIXUP_LG,
1232         ALC880_FIXUP_LG_LW25,
1233         ALC880_FIXUP_W810,
1234         ALC880_FIXUP_EAPD_COEF,
1235         ALC880_FIXUP_TCL_S700,
1236         ALC880_FIXUP_VOL_KNOB,
1237         ALC880_FIXUP_FUJITSU,
1238         ALC880_FIXUP_F1734,
1239         ALC880_FIXUP_UNIWILL,
1240         ALC880_FIXUP_UNIWILL_DIG,
1241         ALC880_FIXUP_Z71V,
1242         ALC880_FIXUP_ASUS_W5A,
1243         ALC880_FIXUP_3ST_BASE,
1244         ALC880_FIXUP_3ST,
1245         ALC880_FIXUP_3ST_DIG,
1246         ALC880_FIXUP_5ST_BASE,
1247         ALC880_FIXUP_5ST,
1248         ALC880_FIXUP_5ST_DIG,
1249         ALC880_FIXUP_6ST_BASE,
1250         ALC880_FIXUP_6ST,
1251         ALC880_FIXUP_6ST_DIG,
1252         ALC880_FIXUP_6ST_AUTOMUTE,
1253 };
1254 
1255 /* enable the volume-knob widget support on NID 0x21 */
1256 static void alc880_fixup_vol_knob(struct hda_codec *codec,
1257                                   const struct hda_fixup *fix, int action)
1258 {
1259         if (action == HDA_FIXUP_ACT_PROBE)
1260                 snd_hda_jack_detect_enable_callback(codec, 0x21,
1261                                                     alc_update_knob_master);
1262 }
1263 
1264 static const struct hda_fixup alc880_fixups[] = {
1265         [ALC880_FIXUP_GPIO1] = {
1266                 .type = HDA_FIXUP_FUNC,
1267                 .v.func = alc_fixup_gpio1,
1268         },
1269         [ALC880_FIXUP_GPIO2] = {
1270                 .type = HDA_FIXUP_FUNC,
1271                 .v.func = alc_fixup_gpio2,
1272         },
1273         [ALC880_FIXUP_MEDION_RIM] = {
1274                 .type = HDA_FIXUP_VERBS,
1275                 .v.verbs = (const struct hda_verb[]) {
1276                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1277                         { 0x20, AC_VERB_SET_PROC_COEF,  0x3060 },
1278                         { }
1279                 },
1280                 .chained = true,
1281                 .chain_id = ALC880_FIXUP_GPIO2,
1282         },
1283         [ALC880_FIXUP_LG] = {
1284                 .type = HDA_FIXUP_PINS,
1285                 .v.pins = (const struct hda_pintbl[]) {
1286                         /* disable bogus unused pins */
1287                         { 0x16, 0x411111f0 },
1288                         { 0x18, 0x411111f0 },
1289                         { 0x1a, 0x411111f0 },
1290                         { }
1291                 }
1292         },
1293         [ALC880_FIXUP_LG_LW25] = {
1294                 .type = HDA_FIXUP_PINS,
1295                 .v.pins = (const struct hda_pintbl[]) {
1296                         { 0x1a, 0x0181344f }, /* line-in */
1297                         { 0x1b, 0x0321403f }, /* headphone */
1298                         { }
1299                 }
1300         },
1301         [ALC880_FIXUP_W810] = {
1302                 .type = HDA_FIXUP_PINS,
1303                 .v.pins = (const struct hda_pintbl[]) {
1304                         /* disable bogus unused pins */
1305                         { 0x17, 0x411111f0 },
1306                         { }
1307                 },
1308                 .chained = true,
1309                 .chain_id = ALC880_FIXUP_GPIO2,
1310         },
1311         [ALC880_FIXUP_EAPD_COEF] = {
1312                 .type = HDA_FIXUP_VERBS,
1313                 .v.verbs = (const struct hda_verb[]) {
1314                         /* change to EAPD mode */
1315                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1316                         { 0x20, AC_VERB_SET_PROC_COEF,  0x3060 },
1317                         {}
1318                 },
1319         },
1320         [ALC880_FIXUP_TCL_S700] = {
1321                 .type = HDA_FIXUP_VERBS,
1322                 .v.verbs = (const struct hda_verb[]) {
1323                         /* change to EAPD mode */
1324                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
1325                         { 0x20, AC_VERB_SET_PROC_COEF,  0x3070 },
1326                         {}
1327                 },
1328                 .chained = true,
1329                 .chain_id = ALC880_FIXUP_GPIO2,
1330         },
1331         [ALC880_FIXUP_VOL_KNOB] = {
1332                 .type = HDA_FIXUP_FUNC,
1333                 .v.func = alc880_fixup_vol_knob,
1334         },
1335         [ALC880_FIXUP_FUJITSU] = {
1336                 /* override all pins as BIOS on old Amilo is broken */
1337                 .type = HDA_FIXUP_PINS,
1338                 .v.pins = (const struct hda_pintbl[]) {
1339                         { 0x14, 0x0121401f }, /* HP */
1340                         { 0x15, 0x99030120 }, /* speaker */
1341                         { 0x16, 0x99030130 }, /* bass speaker */
1342                         { 0x17, 0x411111f0 }, /* N/A */
1343                         { 0x18, 0x411111f0 }, /* N/A */
1344                         { 0x19, 0x01a19950 }, /* mic-in */
1345                         { 0x1a, 0x411111f0 }, /* N/A */
1346                         { 0x1b, 0x411111f0 }, /* N/A */
1347                         { 0x1c, 0x411111f0 }, /* N/A */
1348                         { 0x1d, 0x411111f0 }, /* N/A */
1349                         { 0x1e, 0x01454140 }, /* SPDIF out */
1350                         { }
1351                 },
1352                 .chained = true,
1353                 .chain_id = ALC880_FIXUP_VOL_KNOB,
1354         },
1355         [ALC880_FIXUP_F1734] = {
1356                 /* almost compatible with FUJITSU, but no bass and SPDIF */
1357                 .type = HDA_FIXUP_PINS,
1358                 .v.pins = (const struct hda_pintbl[]) {
1359                         { 0x14, 0x0121401f }, /* HP */
1360                         { 0x15, 0x99030120 }, /* speaker */
1361                         { 0x16, 0x411111f0 }, /* N/A */
1362                         { 0x17, 0x411111f0 }, /* N/A */
1363                         { 0x18, 0x411111f0 }, /* N/A */
1364                         { 0x19, 0x01a19950 }, /* mic-in */
1365                         { 0x1a, 0x411111f0 }, /* N/A */
1366                         { 0x1b, 0x411111f0 }, /* N/A */
1367                         { 0x1c, 0x411111f0 }, /* N/A */
1368                         { 0x1d, 0x411111f0 }, /* N/A */
1369                         { 0x1e, 0x411111f0 }, /* N/A */
1370                         { }
1371                 },
1372                 .chained = true,
1373                 .chain_id = ALC880_FIXUP_VOL_KNOB,
1374         },
1375         [ALC880_FIXUP_UNIWILL] = {
1376                 /* need to fix HP and speaker pins to be parsed correctly */
1377                 .type = HDA_FIXUP_PINS,
1378                 .v.pins = (const struct hda_pintbl[]) {
1379                         { 0x14, 0x0121411f }, /* HP */
1380                         { 0x15, 0x99030120 }, /* speaker */
1381                         { 0x16, 0x99030130 }, /* bass speaker */
1382                         { }
1383                 },
1384         },
1385         [ALC880_FIXUP_UNIWILL_DIG] = {
1386                 .type = HDA_FIXUP_PINS,
1387                 .v.pins = (const struct hda_pintbl[]) {
1388                         /* disable bogus unused pins */
1389                         { 0x17, 0x411111f0 },
1390                         { 0x19, 0x411111f0 },
1391                         { 0x1b, 0x411111f0 },
1392                         { 0x1f, 0x411111f0 },
1393                         { }
1394                 }
1395         },
1396         [ALC880_FIXUP_Z71V] = {
1397                 .type = HDA_FIXUP_PINS,
1398                 .v.pins = (const struct hda_pintbl[]) {
1399                         /* set up the whole pins as BIOS is utterly broken */
1400                         { 0x14, 0x99030120 }, /* speaker */
1401                         { 0x15, 0x0121411f }, /* HP */
1402                         { 0x16, 0x411111f0 }, /* N/A */
1403                         { 0x17, 0x411111f0 }, /* N/A */
1404                         { 0x18, 0x01a19950 }, /* mic-in */
1405                         { 0x19, 0x411111f0 }, /* N/A */
1406                         { 0x1a, 0x01813031 }, /* line-in */
1407                         { 0x1b, 0x411111f0 }, /* N/A */
1408                         { 0x1c, 0x411111f0 }, /* N/A */
1409                         { 0x1d, 0x411111f0 }, /* N/A */
1410                         { 0x1e, 0x0144111e }, /* SPDIF */
1411                         { }
1412                 }
1413         },
1414         [ALC880_FIXUP_ASUS_W5A] = {
1415                 .type = HDA_FIXUP_PINS,
1416                 .v.pins = (const struct hda_pintbl[]) {
1417                         /* set up the whole pins as BIOS is utterly broken */
1418                         { 0x14, 0x0121411f }, /* HP */
1419                         { 0x15, 0x411111f0 }, /* N/A */
1420                         { 0x16, 0x411111f0 }, /* N/A */
1421                         { 0x17, 0x411111f0 }, /* N/A */
1422                         { 0x18, 0x90a60160 }, /* mic */
1423                         { 0x19, 0x411111f0 }, /* N/A */
1424                         { 0x1a, 0x411111f0 }, /* N/A */
1425                         { 0x1b, 0x411111f0 }, /* N/A */
1426                         { 0x1c, 0x411111f0 }, /* N/A */
1427                         { 0x1d, 0x411111f0 }, /* N/A */
1428                         { 0x1e, 0xb743111e }, /* SPDIF out */
1429                         { }
1430                 },
1431                 .chained = true,
1432                 .chain_id = ALC880_FIXUP_GPIO1,
1433         },
1434         [ALC880_FIXUP_3ST_BASE] = {
1435                 .type = HDA_FIXUP_PINS,
1436                 .v.pins = (const struct hda_pintbl[]) {
1437                         { 0x14, 0x01014010 }, /* line-out */
1438                         { 0x15, 0x411111f0 }, /* N/A */
1439                         { 0x16, 0x411111f0 }, /* N/A */
1440                         { 0x17, 0x411111f0 }, /* N/A */
1441                         { 0x18, 0x01a19c30 }, /* mic-in */
1442                         { 0x19, 0x0121411f }, /* HP */
1443                         { 0x1a, 0x01813031 }, /* line-in */
1444                         { 0x1b, 0x02a19c40 }, /* front-mic */
1445                         { 0x1c, 0x411111f0 }, /* N/A */
1446                         { 0x1d, 0x411111f0 }, /* N/A */
1447                         /* 0x1e is filled in below */
1448                         { 0x1f, 0x411111f0 }, /* N/A */
1449                         { }
1450                 }
1451         },
1452         [ALC880_FIXUP_3ST] = {
1453                 .type = HDA_FIXUP_PINS,
1454                 .v.pins = (const struct hda_pintbl[]) {
1455                         { 0x1e, 0x411111f0 }, /* N/A */
1456                         { }
1457                 },
1458                 .chained = true,
1459                 .chain_id = ALC880_FIXUP_3ST_BASE,
1460         },
1461         [ALC880_FIXUP_3ST_DIG] = {
1462                 .type = HDA_FIXUP_PINS,
1463                 .v.pins = (const struct hda_pintbl[]) {
1464                         { 0x1e, 0x0144111e }, /* SPDIF */
1465                         { }
1466                 },
1467                 .chained = true,
1468                 .chain_id = ALC880_FIXUP_3ST_BASE,
1469         },
1470         [ALC880_FIXUP_5ST_BASE] = {
1471                 .type = HDA_FIXUP_PINS,
1472                 .v.pins = (const struct hda_pintbl[]) {
1473                         { 0x14, 0x01014010 }, /* front */
1474                         { 0x15, 0x411111f0 }, /* N/A */
1475                         { 0x16, 0x01011411 }, /* CLFE */
1476                         { 0x17, 0x01016412 }, /* surr */
1477                         { 0x18, 0x01a19c30 }, /* mic-in */
1478                         { 0x19, 0x0121411f }, /* HP */
1479                         { 0x1a, 0x01813031 }, /* line-in */
1480                         { 0x1b, 0x02a19c40 }, /* front-mic */
1481                         { 0x1c, 0x411111f0 }, /* N/A */
1482                         { 0x1d, 0x411111f0 }, /* N/A */
1483                         /* 0x1e is filled in below */
1484                         { 0x1f, 0x411111f0 }, /* N/A */
1485                         { }
1486                 }
1487         },
1488         [ALC880_FIXUP_5ST] = {
1489                 .type = HDA_FIXUP_PINS,
1490                 .v.pins = (const struct hda_pintbl[]) {
1491                         { 0x1e, 0x411111f0 }, /* N/A */
1492                         { }
1493                 },
1494                 .chained = true,
1495                 .chain_id = ALC880_FIXUP_5ST_BASE,
1496         },
1497         [ALC880_FIXUP_5ST_DIG] = {
1498                 .type = HDA_FIXUP_PINS,
1499                 .v.pins = (const struct hda_pintbl[]) {
1500                         { 0x1e, 0x0144111e }, /* SPDIF */
1501                         { }
1502                 },
1503                 .chained = true,
1504                 .chain_id = ALC880_FIXUP_5ST_BASE,
1505         },
1506         [ALC880_FIXUP_6ST_BASE] = {
1507                 .type = HDA_FIXUP_PINS,
1508                 .v.pins = (const struct hda_pintbl[]) {
1509                         { 0x14, 0x01014010 }, /* front */
1510                         { 0x15, 0x01016412 }, /* surr */
1511                         { 0x16, 0x01011411 }, /* CLFE */
1512                         { 0x17, 0x01012414 }, /* side */
1513                         { 0x18, 0x01a19c30 }, /* mic-in */
1514                         { 0x19, 0x02a19c40 }, /* front-mic */
1515                         { 0x1a, 0x01813031 }, /* line-in */
1516                         { 0x1b, 0x0121411f }, /* HP */
1517                         { 0x1c, 0x411111f0 }, /* N/A */
1518                         { 0x1d, 0x411111f0 }, /* N/A */
1519                         /* 0x1e is filled in below */
1520                         { 0x1f, 0x411111f0 }, /* N/A */
1521                         { }
1522                 }
1523         },
1524         [ALC880_FIXUP_6ST] = {
1525                 .type = HDA_FIXUP_PINS,
1526                 .v.pins = (const struct hda_pintbl[]) {
1527                         { 0x1e, 0x411111f0 }, /* N/A */
1528                         { }
1529                 },
1530                 .chained = true,
1531                 .chain_id = ALC880_FIXUP_6ST_BASE,
1532         },
1533         [ALC880_FIXUP_6ST_DIG] = {
1534                 .type = HDA_FIXUP_PINS,
1535                 .v.pins = (const struct hda_pintbl[]) {
1536                         { 0x1e, 0x0144111e }, /* SPDIF */
1537                         { }
1538                 },
1539                 .chained = true,
1540                 .chain_id = ALC880_FIXUP_6ST_BASE,
1541         },
1542         [ALC880_FIXUP_6ST_AUTOMUTE] = {
1543                 .type = HDA_FIXUP_PINS,
1544                 .v.pins = (const struct hda_pintbl[]) {
1545                         { 0x1b, 0x0121401f }, /* HP with jack detect */
1546                         { }
1547                 },
1548                 .chained_before = true,
1549                 .chain_id = ALC880_FIXUP_6ST_BASE,
1550         },
1551 };
1552 
1553 static const struct snd_pci_quirk alc880_fixup_tbl[] = {
1554         SND_PCI_QUIRK(0x1019, 0x0f69, "Coeus G610P", ALC880_FIXUP_W810),
1555         SND_PCI_QUIRK(0x1043, 0x10c3, "ASUS W5A", ALC880_FIXUP_ASUS_W5A),
1556         SND_PCI_QUIRK(0x1043, 0x1964, "ASUS Z71V", ALC880_FIXUP_Z71V),
1557         SND_PCI_QUIRK_VENDOR(0x1043, "ASUS", ALC880_FIXUP_GPIO1),
1558         SND_PCI_QUIRK(0x147b, 0x1045, "ABit AA8XE", ALC880_FIXUP_6ST_AUTOMUTE),
1559         SND_PCI_QUIRK(0x1558, 0x5401, "Clevo GPIO2", ALC880_FIXUP_GPIO2),
1560         SND_PCI_QUIRK_VENDOR(0x1558, "Clevo", ALC880_FIXUP_EAPD_COEF),
1561         SND_PCI_QUIRK(0x1584, 0x9050, "Uniwill", ALC880_FIXUP_UNIWILL_DIG),
1562         SND_PCI_QUIRK(0x1584, 0x9054, "Uniwill", ALC880_FIXUP_F1734),
1563         SND_PCI_QUIRK(0x1584, 0x9070, "Uniwill", ALC880_FIXUP_UNIWILL),
1564         SND_PCI_QUIRK(0x1584, 0x9077, "Uniwill P53", ALC880_FIXUP_VOL_KNOB),
1565         SND_PCI_QUIRK(0x161f, 0x203d, "W810", ALC880_FIXUP_W810),
1566         SND_PCI_QUIRK(0x161f, 0x205d, "Medion Rim 2150", ALC880_FIXUP_MEDION_RIM),
1567         SND_PCI_QUIRK(0x1631, 0xe011, "PB 13201056", ALC880_FIXUP_6ST_AUTOMUTE),
1568         SND_PCI_QUIRK(0x1734, 0x107c, "FSC Amilo M1437", ALC880_FIXUP_FUJITSU),
1569         SND_PCI_QUIRK(0x1734, 0x1094, "FSC Amilo M1451G", ALC880_FIXUP_FUJITSU),
1570         SND_PCI_QUIRK(0x1734, 0x10ac, "FSC AMILO Xi 1526", ALC880_FIXUP_F1734),
1571         SND_PCI_QUIRK(0x1734, 0x10b0, "FSC Amilo Pi1556", ALC880_FIXUP_FUJITSU),
1572         SND_PCI_QUIRK(0x1854, 0x003b, "LG", ALC880_FIXUP_LG),
1573         SND_PCI_QUIRK(0x1854, 0x005f, "LG P1 Express", ALC880_FIXUP_LG),
1574         SND_PCI_QUIRK(0x1854, 0x0068, "LG w1", ALC880_FIXUP_LG),
1575         SND_PCI_QUIRK(0x1854, 0x0077, "LG LW25", ALC880_FIXUP_LG_LW25),
1576         SND_PCI_QUIRK(0x19db, 0x4188, "TCL S700", ALC880_FIXUP_TCL_S700),
1577 
1578         /* Below is the copied entries from alc880_quirks.c.
1579          * It's not quite sure whether BIOS sets the correct pin-config table
1580          * on these machines, thus they are kept to be compatible with
1581          * the old static quirks.  Once when it's confirmed to work without
1582          * these overrides, it'd be better to remove.
1583          */
1584         SND_PCI_QUIRK(0x1019, 0xa880, "ECS", ALC880_FIXUP_5ST_DIG),
1585         SND_PCI_QUIRK(0x1019, 0xa884, "Acer APFV", ALC880_FIXUP_6ST),
1586         SND_PCI_QUIRK(0x1025, 0x0070, "ULI", ALC880_FIXUP_3ST_DIG),
1587         SND_PCI_QUIRK(0x1025, 0x0077, "ULI", ALC880_FIXUP_6ST_DIG),
1588         SND_PCI_QUIRK(0x1025, 0x0078, "ULI", ALC880_FIXUP_6ST_DIG),
1589         SND_PCI_QUIRK(0x1025, 0x0087, "ULI", ALC880_FIXUP_6ST_DIG),
1590         SND_PCI_QUIRK(0x1025, 0xe309, "ULI", ALC880_FIXUP_3ST_DIG),
1591         SND_PCI_QUIRK(0x1025, 0xe310, "ULI", ALC880_FIXUP_3ST),
1592         SND_PCI_QUIRK(0x1039, 0x1234, NULL, ALC880_FIXUP_6ST_DIG),
1593         SND_PCI_QUIRK(0x104d, 0x81a0, "Sony", ALC880_FIXUP_3ST),
1594         SND_PCI_QUIRK(0x104d, 0x81d6, "Sony", ALC880_FIXUP_3ST),
1595         SND_PCI_QUIRK(0x107b, 0x3032, "Gateway", ALC880_FIXUP_5ST),
1596         SND_PCI_QUIRK(0x107b, 0x3033, "Gateway", ALC880_FIXUP_5ST),
1597         SND_PCI_QUIRK(0x107b, 0x4039, "Gateway", ALC880_FIXUP_5ST),
1598         SND_PCI_QUIRK(0x1297, 0xc790, "Shuttle ST20G5", ALC880_FIXUP_6ST_DIG),
1599         SND_PCI_QUIRK(0x1458, 0xa102, "Gigabyte K8", ALC880_FIXUP_6ST_DIG),
1600         SND_PCI_QUIRK(0x1462, 0x1150, "MSI", ALC880_FIXUP_6ST_DIG),
1601         SND_PCI_QUIRK(0x1509, 0x925d, "FIC P4M", ALC880_FIXUP_6ST_DIG),
1602         SND_PCI_QUIRK(0x1565, 0x8202, "Biostar", ALC880_FIXUP_5ST_DIG),
1603         SND_PCI_QUIRK(0x1695, 0x400d, "EPoX", ALC880_FIXUP_5ST_DIG),
1604         SND_PCI_QUIRK(0x1695, 0x4012, "EPox EP-5LDA", ALC880_FIXUP_5ST_DIG),
1605         SND_PCI_QUIRK(0x2668, 0x8086, NULL, ALC880_FIXUP_6ST_DIG), /* broken BIOS */
1606         SND_PCI_QUIRK(0x8086, 0x2668, NULL, ALC880_FIXUP_6ST_DIG),
1607         SND_PCI_QUIRK(0x8086, 0xa100, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1608         SND_PCI_QUIRK(0x8086, 0xd400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1609         SND_PCI_QUIRK(0x8086, 0xd401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1610         SND_PCI_QUIRK(0x8086, 0xd402, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1611         SND_PCI_QUIRK(0x8086, 0xe224, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1612         SND_PCI_QUIRK(0x8086, 0xe305, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1613         SND_PCI_QUIRK(0x8086, 0xe308, "Intel mobo", ALC880_FIXUP_3ST_DIG),
1614         SND_PCI_QUIRK(0x8086, 0xe400, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1615         SND_PCI_QUIRK(0x8086, 0xe401, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1616         SND_PCI_QUIRK(0x8086, 0xe402, "Intel mobo", ALC880_FIXUP_5ST_DIG),
1617         /* default Intel */
1618         SND_PCI_QUIRK_VENDOR(0x8086, "Intel mobo", ALC880_FIXUP_3ST),
1619         SND_PCI_QUIRK(0xa0a0, 0x0560, "AOpen i915GMm-HFS", ALC880_FIXUP_5ST_DIG),
1620         SND_PCI_QUIRK(0xe803, 0x1019, NULL, ALC880_FIXUP_6ST_DIG),
1621         {}
1622 };
1623 
1624 static const struct hda_model_fixup alc880_fixup_models[] = {
1625         {.id = ALC880_FIXUP_3ST, .name = "3stack"},
1626         {.id = ALC880_FIXUP_3ST_DIG, .name = "3stack-digout"},
1627         {.id = ALC880_FIXUP_5ST, .name = "5stack"},
1628         {.id = ALC880_FIXUP_5ST_DIG, .name = "5stack-digout"},
1629         {.id = ALC880_FIXUP_6ST, .name = "6stack"},
1630         {.id = ALC880_FIXUP_6ST_DIG, .name = "6stack-digout"},
1631         {.id = ALC880_FIXUP_6ST_AUTOMUTE, .name = "6stack-automute"},
1632         {}
1633 };
1634 
1635 
1636 /*
1637  * OK, here we have finally the patch for ALC880
1638  */
1639 static int patch_alc880(struct hda_codec *codec)
1640 {
1641         struct alc_spec *spec;
1642         int err;
1643 
1644         err = alc_alloc_spec(codec, 0x0b);
1645         if (err < 0)
1646                 return err;
1647 
1648         spec = codec->spec;
1649         spec->gen.need_dac_fix = 1;
1650         spec->gen.beep_nid = 0x01;
1651 
1652         codec->patch_ops.unsol_event = alc880_unsol_event;
1653 
1654         alc_pre_init(codec);
1655 
1656         snd_hda_pick_fixup(codec, alc880_fixup_models, alc880_fixup_tbl,
1657                        alc880_fixups);
1658         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1659 
1660         /* automatic parse from the BIOS config */
1661         err = alc880_parse_auto_config(codec);
1662         if (err < 0)
1663                 goto error;
1664 
1665         if (!spec->gen.no_analog) {
1666                 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
1667                 if (err < 0)
1668                         goto error;
1669         }
1670 
1671         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1672 
1673         return 0;
1674 
1675  error:
1676         alc_free(codec);
1677         return err;
1678 }
1679 
1680 
1681 /*
1682  * ALC260 support
1683  */
1684 static int alc260_parse_auto_config(struct hda_codec *codec)
1685 {
1686         static const hda_nid_t alc260_ignore[] = { 0x17, 0 };
1687         static const hda_nid_t alc260_ssids[] = { 0x10, 0x15, 0x0f, 0 };
1688         return alc_parse_auto_config(codec, alc260_ignore, alc260_ssids);
1689 }
1690 
1691 /*
1692  * Pin config fixes
1693  */
1694 enum {
1695         ALC260_FIXUP_HP_DC5750,
1696         ALC260_FIXUP_HP_PIN_0F,
1697         ALC260_FIXUP_COEF,
1698         ALC260_FIXUP_GPIO1,
1699         ALC260_FIXUP_GPIO1_TOGGLE,
1700         ALC260_FIXUP_REPLACER,
1701         ALC260_FIXUP_HP_B1900,
1702         ALC260_FIXUP_KN1,
1703         ALC260_FIXUP_FSC_S7020,
1704         ALC260_FIXUP_FSC_S7020_JWSE,
1705         ALC260_FIXUP_VAIO_PINS,
1706 };
1707 
1708 static void alc260_gpio1_automute(struct hda_codec *codec)
1709 {
1710         struct alc_spec *spec = codec->spec;
1711 
1712         alc_update_gpio_data(codec, 0x01, spec->gen.hp_jack_present);
1713 }
1714 
1715 static void alc260_fixup_gpio1_toggle(struct hda_codec *codec,
1716                                       const struct hda_fixup *fix, int action)
1717 {
1718         struct alc_spec *spec = codec->spec;
1719         if (action == HDA_FIXUP_ACT_PROBE) {
1720                 /* although the machine has only one output pin, we need to
1721                  * toggle GPIO1 according to the jack state
1722                  */
1723                 spec->gen.automute_hook = alc260_gpio1_automute;
1724                 spec->gen.detect_hp = 1;
1725                 spec->gen.automute_speaker = 1;
1726                 spec->gen.autocfg.hp_pins[0] = 0x0f; /* copy it for automute */
1727                 snd_hda_jack_detect_enable_callback(codec, 0x0f,
1728                                                     snd_hda_gen_hp_automute);
1729                 alc_setup_gpio(codec, 0x01);
1730         }
1731 }
1732 
1733 static void alc260_fixup_kn1(struct hda_codec *codec,
1734                              const struct hda_fixup *fix, int action)
1735 {
1736         struct alc_spec *spec = codec->spec;
1737         static const struct hda_pintbl pincfgs[] = {
1738                 { 0x0f, 0x02214000 }, /* HP/speaker */
1739                 { 0x12, 0x90a60160 }, /* int mic */
1740                 { 0x13, 0x02a19000 }, /* ext mic */
1741                 { 0x18, 0x01446000 }, /* SPDIF out */
1742                 /* disable bogus I/O pins */
1743                 { 0x10, 0x411111f0 },
1744                 { 0x11, 0x411111f0 },
1745                 { 0x14, 0x411111f0 },
1746                 { 0x15, 0x411111f0 },
1747                 { 0x16, 0x411111f0 },
1748                 { 0x17, 0x411111f0 },
1749                 { 0x19, 0x411111f0 },
1750                 { }
1751         };
1752 
1753         switch (action) {
1754         case HDA_FIXUP_ACT_PRE_PROBE:
1755                 snd_hda_apply_pincfgs(codec, pincfgs);
1756                 spec->init_amp = ALC_INIT_NONE;
1757                 break;
1758         }
1759 }
1760 
1761 static void alc260_fixup_fsc_s7020(struct hda_codec *codec,
1762                                    const struct hda_fixup *fix, int action)
1763 {
1764         struct alc_spec *spec = codec->spec;
1765         if (action == HDA_FIXUP_ACT_PRE_PROBE)
1766                 spec->init_amp = ALC_INIT_NONE;
1767 }
1768 
1769 static void alc260_fixup_fsc_s7020_jwse(struct hda_codec *codec,
1770                                    const struct hda_fixup *fix, int action)
1771 {
1772         struct alc_spec *spec = codec->spec;
1773         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
1774                 spec->gen.add_jack_modes = 1;
1775                 spec->gen.hp_mic = 1;
1776         }
1777 }
1778 
1779 static const struct hda_fixup alc260_fixups[] = {
1780         [ALC260_FIXUP_HP_DC5750] = {
1781                 .type = HDA_FIXUP_PINS,
1782                 .v.pins = (const struct hda_pintbl[]) {
1783                         { 0x11, 0x90130110 }, /* speaker */
1784                         { }
1785                 }
1786         },
1787         [ALC260_FIXUP_HP_PIN_0F] = {
1788                 .type = HDA_FIXUP_PINS,
1789                 .v.pins = (const struct hda_pintbl[]) {
1790                         { 0x0f, 0x01214000 }, /* HP */
1791                         { }
1792                 }
1793         },
1794         [ALC260_FIXUP_COEF] = {
1795                 .type = HDA_FIXUP_VERBS,
1796                 .v.verbs = (const struct hda_verb[]) {
1797                         { 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1798                         { 0x1a, AC_VERB_SET_PROC_COEF,  0x3040 },
1799                         { }
1800                 },
1801         },
1802         [ALC260_FIXUP_GPIO1] = {
1803                 .type = HDA_FIXUP_FUNC,
1804                 .v.func = alc_fixup_gpio1,
1805         },
1806         [ALC260_FIXUP_GPIO1_TOGGLE] = {
1807                 .type = HDA_FIXUP_FUNC,
1808                 .v.func = alc260_fixup_gpio1_toggle,
1809                 .chained = true,
1810                 .chain_id = ALC260_FIXUP_HP_PIN_0F,
1811         },
1812         [ALC260_FIXUP_REPLACER] = {
1813                 .type = HDA_FIXUP_VERBS,
1814                 .v.verbs = (const struct hda_verb[]) {
1815                         { 0x1a, AC_VERB_SET_COEF_INDEX, 0x07 },
1816                         { 0x1a, AC_VERB_SET_PROC_COEF,  0x3050 },
1817                         { }
1818                 },
1819                 .chained = true,
1820                 .chain_id = ALC260_FIXUP_GPIO1_TOGGLE,
1821         },
1822         [ALC260_FIXUP_HP_B1900] = {
1823                 .type = HDA_FIXUP_FUNC,
1824                 .v.func = alc260_fixup_gpio1_toggle,
1825                 .chained = true,
1826                 .chain_id = ALC260_FIXUP_COEF,
1827         },
1828         [ALC260_FIXUP_KN1] = {
1829                 .type = HDA_FIXUP_FUNC,
1830                 .v.func = alc260_fixup_kn1,
1831         },
1832         [ALC260_FIXUP_FSC_S7020] = {
1833                 .type = HDA_FIXUP_FUNC,
1834                 .v.func = alc260_fixup_fsc_s7020,
1835         },
1836         [ALC260_FIXUP_FSC_S7020_JWSE] = {
1837                 .type = HDA_FIXUP_FUNC,
1838                 .v.func = alc260_fixup_fsc_s7020_jwse,
1839                 .chained = true,
1840                 .chain_id = ALC260_FIXUP_FSC_S7020,
1841         },
1842         [ALC260_FIXUP_VAIO_PINS] = {
1843                 .type = HDA_FIXUP_PINS,
1844                 .v.pins = (const struct hda_pintbl[]) {
1845                         /* Pin configs are missing completely on some VAIOs */
1846                         { 0x0f, 0x01211020 },
1847                         { 0x10, 0x0001003f },
1848                         { 0x11, 0x411111f0 },
1849                         { 0x12, 0x01a15930 },
1850                         { 0x13, 0x411111f0 },
1851                         { 0x14, 0x411111f0 },
1852                         { 0x15, 0x411111f0 },
1853                         { 0x16, 0x411111f0 },
1854                         { 0x17, 0x411111f0 },
1855                         { 0x18, 0x411111f0 },
1856                         { 0x19, 0x411111f0 },
1857                         { }
1858                 }
1859         },
1860 };
1861 
1862 static const struct snd_pci_quirk alc260_fixup_tbl[] = {
1863         SND_PCI_QUIRK(0x1025, 0x007b, "Acer C20x", ALC260_FIXUP_GPIO1),
1864         SND_PCI_QUIRK(0x1025, 0x007f, "Acer Aspire 9500", ALC260_FIXUP_COEF),
1865         SND_PCI_QUIRK(0x1025, 0x008f, "Acer", ALC260_FIXUP_GPIO1),
1866         SND_PCI_QUIRK(0x103c, 0x280a, "HP dc5750", ALC260_FIXUP_HP_DC5750),
1867         SND_PCI_QUIRK(0x103c, 0x30ba, "HP Presario B1900", ALC260_FIXUP_HP_B1900),
1868         SND_PCI_QUIRK(0x104d, 0x81bb, "Sony VAIO", ALC260_FIXUP_VAIO_PINS),
1869         SND_PCI_QUIRK(0x104d, 0x81e2, "Sony VAIO TX", ALC260_FIXUP_HP_PIN_0F),
1870         SND_PCI_QUIRK(0x10cf, 0x1326, "FSC LifeBook S7020", ALC260_FIXUP_FSC_S7020),
1871         SND_PCI_QUIRK(0x1509, 0x4540, "Favorit 100XS", ALC260_FIXUP_GPIO1),
1872         SND_PCI_QUIRK(0x152d, 0x0729, "Quanta KN1", ALC260_FIXUP_KN1),
1873         SND_PCI_QUIRK(0x161f, 0x2057, "Replacer 672V", ALC260_FIXUP_REPLACER),
1874         SND_PCI_QUIRK(0x1631, 0xc017, "PB V7900", ALC260_FIXUP_COEF),
1875         {}
1876 };
1877 
1878 static const struct hda_model_fixup alc260_fixup_models[] = {
1879         {.id = ALC260_FIXUP_GPIO1, .name = "gpio1"},
1880         {.id = ALC260_FIXUP_COEF, .name = "coef"},
1881         {.id = ALC260_FIXUP_FSC_S7020, .name = "fujitsu"},
1882         {.id = ALC260_FIXUP_FSC_S7020_JWSE, .name = "fujitsu-jwse"},
1883         {}
1884 };
1885 
1886 /*
1887  */
1888 static int patch_alc260(struct hda_codec *codec)
1889 {
1890         struct alc_spec *spec;
1891         int err;
1892 
1893         err = alc_alloc_spec(codec, 0x07);
1894         if (err < 0)
1895                 return err;
1896 
1897         spec = codec->spec;
1898         /* as quite a few machines require HP amp for speaker outputs,
1899          * it's easier to enable it unconditionally; even if it's unneeded,
1900          * it's almost harmless.
1901          */
1902         spec->gen.prefer_hp_amp = 1;
1903         spec->gen.beep_nid = 0x01;
1904 
1905         spec->shutup = alc_eapd_shutup;
1906 
1907         alc_pre_init(codec);
1908 
1909         snd_hda_pick_fixup(codec, alc260_fixup_models, alc260_fixup_tbl,
1910                            alc260_fixups);
1911         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
1912 
1913         /* automatic parse from the BIOS config */
1914         err = alc260_parse_auto_config(codec);
1915         if (err < 0)
1916                 goto error;
1917 
1918         if (!spec->gen.no_analog) {
1919                 err = set_beep_amp(spec, 0x07, 0x05, HDA_INPUT);
1920                 if (err < 0)
1921                         goto error;
1922         }
1923 
1924         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
1925 
1926         return 0;
1927 
1928  error:
1929         alc_free(codec);
1930         return err;
1931 }
1932 
1933 
1934 /*
1935  * ALC882/883/885/888/889 support
1936  *
1937  * ALC882 is almost identical with ALC880 but has cleaner and more flexible
1938  * configuration.  Each pin widget can choose any input DACs and a mixer.
1939  * Each ADC is connected from a mixer of all inputs.  This makes possible
1940  * 6-channel independent captures.
1941  *
1942  * In addition, an independent DAC for the multi-playback (not used in this
1943  * driver yet).
1944  */
1945 
1946 /*
1947  * Pin config fixes
1948  */
1949 enum {
1950         ALC882_FIXUP_ABIT_AW9D_MAX,
1951         ALC882_FIXUP_LENOVO_Y530,
1952         ALC882_FIXUP_PB_M5210,
1953         ALC882_FIXUP_ACER_ASPIRE_7736,
1954         ALC882_FIXUP_ASUS_W90V,
1955         ALC889_FIXUP_CD,
1956         ALC889_FIXUP_FRONT_HP_NO_PRESENCE,
1957         ALC889_FIXUP_VAIO_TT,
1958         ALC888_FIXUP_EEE1601,
1959         ALC886_FIXUP_EAPD,
1960         ALC882_FIXUP_EAPD,
1961         ALC883_FIXUP_EAPD,
1962         ALC883_FIXUP_ACER_EAPD,
1963         ALC882_FIXUP_GPIO1,
1964         ALC882_FIXUP_GPIO2,
1965         ALC882_FIXUP_GPIO3,
1966         ALC889_FIXUP_COEF,
1967         ALC882_FIXUP_ASUS_W2JC,
1968         ALC882_FIXUP_ACER_ASPIRE_4930G,
1969         ALC882_FIXUP_ACER_ASPIRE_8930G,
1970         ALC882_FIXUP_ASPIRE_8930G_VERBS,
1971         ALC885_FIXUP_MACPRO_GPIO,
1972         ALC889_FIXUP_DAC_ROUTE,
1973         ALC889_FIXUP_MBP_VREF,
1974         ALC889_FIXUP_IMAC91_VREF,
1975         ALC889_FIXUP_MBA11_VREF,
1976         ALC889_FIXUP_MBA21_VREF,
1977         ALC889_FIXUP_MP11_VREF,
1978         ALC889_FIXUP_MP41_VREF,
1979         ALC882_FIXUP_INV_DMIC,
1980         ALC882_FIXUP_NO_PRIMARY_HP,
1981         ALC887_FIXUP_ASUS_BASS,
1982         ALC887_FIXUP_BASS_CHMAP,
1983         ALC1220_FIXUP_GB_DUAL_CODECS,
1984         ALC1220_FIXUP_GB_X570,
1985         ALC1220_FIXUP_CLEVO_P950,
1986         ALC1220_FIXUP_CLEVO_PB51ED,
1987         ALC1220_FIXUP_CLEVO_PB51ED_PINS,
1988         ALC887_FIXUP_ASUS_AUDIO,
1989         ALC887_FIXUP_ASUS_HMIC,
1990         ALCS1200A_FIXUP_MIC_VREF,
1991         ALC888VD_FIXUP_MIC_100VREF,
1992 };
1993 
1994 static void alc889_fixup_coef(struct hda_codec *codec,
1995                               const struct hda_fixup *fix, int action)
1996 {
1997         if (action != HDA_FIXUP_ACT_INIT)
1998                 return;
1999         alc_update_coef_idx(codec, 7, 0, 0x2030);
2000 }
2001 
2002 /* set up GPIO at initialization */
2003 static void alc885_fixup_macpro_gpio(struct hda_codec *codec,
2004                                      const struct hda_fixup *fix, int action)
2005 {
2006         struct alc_spec *spec = codec->spec;
2007 
2008         spec->gpio_write_delay = true;
2009         alc_fixup_gpio3(codec, fix, action);
2010 }
2011 
2012 /* Fix the connection of some pins for ALC889:
2013  * At least, Acer Aspire 5935 shows the connections to DAC3/4 don't
2014  * work correctly (bko#42740)
2015  */
2016 static void alc889_fixup_dac_route(struct hda_codec *codec,
2017                                    const struct hda_fixup *fix, int action)
2018 {
2019         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2020                 /* fake the connections during parsing the tree */
2021                 static const hda_nid_t conn1[] = { 0x0c, 0x0d };
2022                 static const hda_nid_t conn2[] = { 0x0e, 0x0f };
2023                 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2024                 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
2025                 snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn2), conn2);
2026                 snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn2), conn2);
2027         } else if (action == HDA_FIXUP_ACT_PROBE) {
2028                 /* restore the connections */
2029                 static const hda_nid_t conn[] = { 0x0c, 0x0d, 0x0e, 0x0f, 0x26 };
2030                 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
2031                 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn), conn);
2032                 snd_hda_override_conn_list(codec, 0x18, ARRAY_SIZE(conn), conn);
2033                 snd_hda_override_conn_list(codec, 0x1a, ARRAY_SIZE(conn), conn);
2034         }
2035 }
2036 
2037 /* Set VREF on HP pin */
2038 static void alc889_fixup_mbp_vref(struct hda_codec *codec,
2039                                   const struct hda_fixup *fix, int action)
2040 {
2041         static const hda_nid_t nids[] = { 0x14, 0x15, 0x19 };
2042         struct alc_spec *spec = codec->spec;
2043         int i;
2044 
2045         if (action != HDA_FIXUP_ACT_INIT)
2046                 return;
2047         for (i = 0; i < ARRAY_SIZE(nids); i++) {
2048                 unsigned int val = snd_hda_codec_get_pincfg(codec, nids[i]);
2049                 if (get_defcfg_device(val) != AC_JACK_HP_OUT)
2050                         continue;
2051                 val = snd_hda_codec_get_pin_target(codec, nids[i]);
2052                 val |= AC_PINCTL_VREF_80;
2053                 snd_hda_set_pin_ctl(codec, nids[i], val);
2054                 spec->gen.keep_vref_in_automute = 1;
2055                 break;
2056         }
2057 }
2058 
2059 static void alc889_fixup_mac_pins(struct hda_codec *codec,
2060                                   const hda_nid_t *nids, int num_nids)
2061 {
2062         struct alc_spec *spec = codec->spec;
2063         int i;
2064 
2065         for (i = 0; i < num_nids; i++) {
2066                 unsigned int val;
2067                 val = snd_hda_codec_get_pin_target(codec, nids[i]);
2068                 val |= AC_PINCTL_VREF_50;
2069                 snd_hda_set_pin_ctl(codec, nids[i], val);
2070         }
2071         spec->gen.keep_vref_in_automute = 1;
2072 }
2073 
2074 /* Set VREF on speaker pins on imac91 */
2075 static void alc889_fixup_imac91_vref(struct hda_codec *codec,
2076                                      const struct hda_fixup *fix, int action)
2077 {
2078         static const hda_nid_t nids[] = { 0x18, 0x1a };
2079 
2080         if (action == HDA_FIXUP_ACT_INIT)
2081                 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2082 }
2083 
2084 /* Set VREF on speaker pins on mba11 */
2085 static void alc889_fixup_mba11_vref(struct hda_codec *codec,
2086                                     const struct hda_fixup *fix, int action)
2087 {
2088         static const hda_nid_t nids[] = { 0x18 };
2089 
2090         if (action == HDA_FIXUP_ACT_INIT)
2091                 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2092 }
2093 
2094 /* Set VREF on speaker pins on mba21 */
2095 static void alc889_fixup_mba21_vref(struct hda_codec *codec,
2096                                     const struct hda_fixup *fix, int action)
2097 {
2098         static const hda_nid_t nids[] = { 0x18, 0x19 };
2099 
2100         if (action == HDA_FIXUP_ACT_INIT)
2101                 alc889_fixup_mac_pins(codec, nids, ARRAY_SIZE(nids));
2102 }
2103 
2104 /* Don't take HP output as primary
2105  * Strangely, the speaker output doesn't work on Vaio Z and some Vaio
2106  * all-in-one desktop PCs (for example VGC-LN51JGB) through DAC 0x05
2107  */
2108 static void alc882_fixup_no_primary_hp(struct hda_codec *codec,
2109                                        const struct hda_fixup *fix, int action)
2110 {
2111         struct alc_spec *spec = codec->spec;
2112         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
2113                 spec->gen.no_primary_hp = 1;
2114                 spec->gen.no_multi_io = 1;
2115         }
2116 }
2117 
2118 static void alc_fixup_bass_chmap(struct hda_codec *codec,
2119                                  const struct hda_fixup *fix, int action);
2120 
2121 /* For dual-codec configuration, we need to disable some features to avoid
2122  * conflicts of kctls and PCM streams
2123  */
2124 static void alc_fixup_dual_codecs(struct hda_codec *codec,
2125                                   const struct hda_fixup *fix, int action)
2126 {
2127         struct alc_spec *spec = codec->spec;
2128 
2129         if (action != HDA_FIXUP_ACT_PRE_PROBE)
2130                 return;
2131         /* disable vmaster */
2132         spec->gen.suppress_vmaster = 1;
2133         /* auto-mute and auto-mic switch don't work with multiple codecs */
2134         spec->gen.suppress_auto_mute = 1;
2135         spec->gen.suppress_auto_mic = 1;
2136         /* disable aamix as well */
2137         spec->gen.mixer_nid = 0;
2138         /* add location prefix to avoid conflicts */
2139         codec->force_pin_prefix = 1;
2140 }
2141 
2142 static void rename_ctl(struct hda_codec *codec, const char *oldname,
2143                        const char *newname)
2144 {
2145         struct snd_kcontrol *kctl;
2146 
2147         kctl = snd_hda_find_mixer_ctl(codec, oldname);
2148         if (kctl)
2149                 snd_ctl_rename(codec->card, kctl, newname);
2150 }
2151 
2152 static void alc1220_fixup_gb_dual_codecs(struct hda_codec *codec,
2153                                          const struct hda_fixup *fix,
2154                                          int action)
2155 {
2156         alc_fixup_dual_codecs(codec, fix, action);
2157         switch (action) {
2158         case HDA_FIXUP_ACT_PRE_PROBE:
2159                 /* override card longname to provide a unique UCM profile */
2160                 strcpy(codec->card->longname, "HDAudio-Gigabyte-ALC1220DualCodecs");
2161                 break;
2162         case HDA_FIXUP_ACT_BUILD:
2163                 /* rename Capture controls depending on the codec */
2164                 rename_ctl(codec, "Capture Volume",
2165                            codec->addr == 0 ?
2166                            "Rear-Panel Capture Volume" :
2167                            "Front-Panel Capture Volume");
2168                 rename_ctl(codec, "Capture Switch",
2169                            codec->addr == 0 ?
2170                            "Rear-Panel Capture Switch" :
2171                            "Front-Panel Capture Switch");
2172                 break;
2173         }
2174 }
2175 
2176 static void alc1220_fixup_gb_x570(struct hda_codec *codec,
2177                                      const struct hda_fixup *fix,
2178                                      int action)
2179 {
2180         static const hda_nid_t conn1[] = { 0x0c };
2181         static const struct coef_fw gb_x570_coefs[] = {
2182                 WRITE_COEF(0x07, 0x03c0),
2183                 WRITE_COEF(0x1a, 0x01c1),
2184                 WRITE_COEF(0x1b, 0x0202),
2185                 WRITE_COEF(0x43, 0x3005),
2186                 {}
2187         };
2188 
2189         switch (action) {
2190         case HDA_FIXUP_ACT_PRE_PROBE:
2191                 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2192                 snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
2193                 break;
2194         case HDA_FIXUP_ACT_INIT:
2195                 alc_process_coef_fw(codec, gb_x570_coefs);
2196                 break;
2197         }
2198 }
2199 
2200 static void alc1220_fixup_clevo_p950(struct hda_codec *codec,
2201                                      const struct hda_fixup *fix,
2202                                      int action)
2203 {
2204         static const hda_nid_t conn1[] = { 0x0c };
2205 
2206         if (action != HDA_FIXUP_ACT_PRE_PROBE)
2207                 return;
2208 
2209         alc_update_coef_idx(codec, 0x7, 0, 0x3c3);
2210         /* We therefore want to make sure 0x14 (front headphone) and
2211          * 0x1b (speakers) use the stereo DAC 0x02
2212          */
2213         snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
2214         snd_hda_override_conn_list(codec, 0x1b, ARRAY_SIZE(conn1), conn1);
2215 }
2216 
2217 static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
2218                                 const struct hda_fixup *fix, int action);
2219 
2220 static void alc1220_fixup_clevo_pb51ed(struct hda_codec *codec,
2221                                      const struct hda_fixup *fix,
2222                                      int action)
2223 {
2224         alc1220_fixup_clevo_p950(codec, fix, action);
2225         alc_fixup_headset_mode_no_hp_mic(codec, fix, action);
2226 }
2227 
2228 static void alc887_asus_hp_automute_hook(struct hda_codec *codec,
2229                                          struct hda_jack_callback *jack)
2230 {
2231         struct alc_spec *spec = codec->spec;
2232         unsigned int vref;
2233 
2234         snd_hda_gen_hp_automute(codec, jack);
2235 
2236         if (spec->gen.hp_jack_present)
2237                 vref = AC_PINCTL_VREF_80;
2238         else
2239                 vref = AC_PINCTL_VREF_HIZ;
2240         snd_hda_set_pin_ctl(codec, 0x19, PIN_HP | vref);
2241 }
2242 
2243 static void alc887_fixup_asus_jack(struct hda_codec *codec,
2244                                      const struct hda_fixup *fix, int action)
2245 {
2246         struct alc_spec *spec = codec->spec;
2247         if (action != HDA_FIXUP_ACT_PROBE)
2248                 return;
2249         snd_hda_set_pin_ctl_cache(codec, 0x1b, PIN_HP);
2250         spec->gen.hp_automute_hook = alc887_asus_hp_automute_hook;
2251 }
2252 
2253 static const struct hda_fixup alc882_fixups[] = {
2254         [ALC882_FIXUP_ABIT_AW9D_MAX] = {
2255                 .type = HDA_FIXUP_PINS,
2256                 .v.pins = (const struct hda_pintbl[]) {
2257                         { 0x15, 0x01080104 }, /* side */
2258                         { 0x16, 0x01011012 }, /* rear */
2259                         { 0x17, 0x01016011 }, /* clfe */
2260                         { }
2261                 }
2262         },
2263         [ALC882_FIXUP_LENOVO_Y530] = {
2264                 .type = HDA_FIXUP_PINS,
2265                 .v.pins = (const struct hda_pintbl[]) {
2266                         { 0x15, 0x99130112 }, /* rear int speakers */
2267                         { 0x16, 0x99130111 }, /* subwoofer */
2268                         { }
2269                 }
2270         },
2271         [ALC882_FIXUP_PB_M5210] = {
2272                 .type = HDA_FIXUP_PINCTLS,
2273                 .v.pins = (const struct hda_pintbl[]) {
2274                         { 0x19, PIN_VREF50 },
2275                         {}
2276                 }
2277         },
2278         [ALC882_FIXUP_ACER_ASPIRE_7736] = {
2279                 .type = HDA_FIXUP_FUNC,
2280                 .v.func = alc_fixup_sku_ignore,
2281         },
2282         [ALC882_FIXUP_ASUS_W90V] = {
2283                 .type = HDA_FIXUP_PINS,
2284                 .v.pins = (const struct hda_pintbl[]) {
2285                         { 0x16, 0x99130110 }, /* fix sequence for CLFE */
2286                         { }
2287                 }
2288         },
2289         [ALC889_FIXUP_CD] = {
2290                 .type = HDA_FIXUP_PINS,
2291                 .v.pins = (const struct hda_pintbl[]) {
2292                         { 0x1c, 0x993301f0 }, /* CD */
2293                         { }
2294                 }
2295         },
2296         [ALC889_FIXUP_FRONT_HP_NO_PRESENCE] = {
2297                 .type = HDA_FIXUP_PINS,
2298                 .v.pins = (const struct hda_pintbl[]) {
2299                         { 0x1b, 0x02214120 }, /* Front HP jack is flaky, disable jack detect */
2300                         { }
2301                 },
2302                 .chained = true,
2303                 .chain_id = ALC889_FIXUP_CD,
2304         },
2305         [ALC889_FIXUP_VAIO_TT] = {
2306                 .type = HDA_FIXUP_PINS,
2307                 .v.pins = (const struct hda_pintbl[]) {
2308                         { 0x17, 0x90170111 }, /* hidden surround speaker */
2309                         { }
2310                 }
2311         },
2312         [ALC888_FIXUP_EEE1601] = {
2313                 .type = HDA_FIXUP_VERBS,
2314                 .v.verbs = (const struct hda_verb[]) {
2315                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2316                         { 0x20, AC_VERB_SET_PROC_COEF,  0x0838 },
2317                         { }
2318                 }
2319         },
2320         [ALC886_FIXUP_EAPD] = {
2321                 .type = HDA_FIXUP_VERBS,
2322                 .v.verbs = (const struct hda_verb[]) {
2323                         /* change to EAPD mode */
2324                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2325                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0068 },
2326                         { }
2327                 }
2328         },
2329         [ALC882_FIXUP_EAPD] = {
2330                 .type = HDA_FIXUP_VERBS,
2331                 .v.verbs = (const struct hda_verb[]) {
2332                         /* change to EAPD mode */
2333                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2334                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3060 },
2335                         { }
2336                 }
2337         },
2338         [ALC883_FIXUP_EAPD] = {
2339                 .type = HDA_FIXUP_VERBS,
2340                 .v.verbs = (const struct hda_verb[]) {
2341                         /* change to EAPD mode */
2342                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2343                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2344                         { }
2345                 }
2346         },
2347         [ALC883_FIXUP_ACER_EAPD] = {
2348                 .type = HDA_FIXUP_VERBS,
2349                 .v.verbs = (const struct hda_verb[]) {
2350                         /* eanable EAPD on Acer laptops */
2351                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2352                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2353                         { }
2354                 }
2355         },
2356         [ALC882_FIXUP_GPIO1] = {
2357                 .type = HDA_FIXUP_FUNC,
2358                 .v.func = alc_fixup_gpio1,
2359         },
2360         [ALC882_FIXUP_GPIO2] = {
2361                 .type = HDA_FIXUP_FUNC,
2362                 .v.func = alc_fixup_gpio2,
2363         },
2364         [ALC882_FIXUP_GPIO3] = {
2365                 .type = HDA_FIXUP_FUNC,
2366                 .v.func = alc_fixup_gpio3,
2367         },
2368         [ALC882_FIXUP_ASUS_W2JC] = {
2369                 .type = HDA_FIXUP_FUNC,
2370                 .v.func = alc_fixup_gpio1,
2371                 .chained = true,
2372                 .chain_id = ALC882_FIXUP_EAPD,
2373         },
2374         [ALC889_FIXUP_COEF] = {
2375                 .type = HDA_FIXUP_FUNC,
2376                 .v.func = alc889_fixup_coef,
2377         },
2378         [ALC882_FIXUP_ACER_ASPIRE_4930G] = {
2379                 .type = HDA_FIXUP_PINS,
2380                 .v.pins = (const struct hda_pintbl[]) {
2381                         { 0x16, 0x99130111 }, /* CLFE speaker */
2382                         { 0x17, 0x99130112 }, /* surround speaker */
2383                         { }
2384                 },
2385                 .chained = true,
2386                 .chain_id = ALC882_FIXUP_GPIO1,
2387         },
2388         [ALC882_FIXUP_ACER_ASPIRE_8930G] = {
2389                 .type = HDA_FIXUP_PINS,
2390                 .v.pins = (const struct hda_pintbl[]) {
2391                         { 0x16, 0x99130111 }, /* CLFE speaker */
2392                         { 0x1b, 0x99130112 }, /* surround speaker */
2393                         { }
2394                 },
2395                 .chained = true,
2396                 .chain_id = ALC882_FIXUP_ASPIRE_8930G_VERBS,
2397         },
2398         [ALC882_FIXUP_ASPIRE_8930G_VERBS] = {
2399                 /* additional init verbs for Acer Aspire 8930G */
2400                 .type = HDA_FIXUP_VERBS,
2401                 .v.verbs = (const struct hda_verb[]) {
2402                         /* Enable all DACs */
2403                         /* DAC DISABLE/MUTE 1? */
2404                         /*  setting bits 1-5 disables DAC nids 0x02-0x06
2405                          *  apparently. Init=0x38 */
2406                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x03 },
2407                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2408                         /* DAC DISABLE/MUTE 2? */
2409                         /*  some bit here disables the other DACs.
2410                          *  Init=0x4900 */
2411                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x08 },
2412                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0000 },
2413                         /* DMIC fix
2414                          * This laptop has a stereo digital microphone.
2415                          * The mics are only 1cm apart which makes the stereo
2416                          * useless. However, either the mic or the ALC889
2417                          * makes the signal become a difference/sum signal
2418                          * instead of standard stereo, which is annoying.
2419                          * So instead we flip this bit which makes the
2420                          * codec replicate the sum signal to both channels,
2421                          * turning it into a normal mono mic.
2422                          */
2423                         /* DMIC_CONTROL? Init value = 0x0001 */
2424                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x0b },
2425                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0003 },
2426                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2427                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2428                         { }
2429                 },
2430                 .chained = true,
2431                 .chain_id = ALC882_FIXUP_GPIO1,
2432         },
2433         [ALC885_FIXUP_MACPRO_GPIO] = {
2434                 .type = HDA_FIXUP_FUNC,
2435                 .v.func = alc885_fixup_macpro_gpio,
2436         },
2437         [ALC889_FIXUP_DAC_ROUTE] = {
2438                 .type = HDA_FIXUP_FUNC,
2439                 .v.func = alc889_fixup_dac_route,
2440         },
2441         [ALC889_FIXUP_MBP_VREF] = {
2442                 .type = HDA_FIXUP_FUNC,
2443                 .v.func = alc889_fixup_mbp_vref,
2444                 .chained = true,
2445                 .chain_id = ALC882_FIXUP_GPIO1,
2446         },
2447         [ALC889_FIXUP_IMAC91_VREF] = {
2448                 .type = HDA_FIXUP_FUNC,
2449                 .v.func = alc889_fixup_imac91_vref,
2450                 .chained = true,
2451                 .chain_id = ALC882_FIXUP_GPIO1,
2452         },
2453         [ALC889_FIXUP_MBA11_VREF] = {
2454                 .type = HDA_FIXUP_FUNC,
2455                 .v.func = alc889_fixup_mba11_vref,
2456                 .chained = true,
2457                 .chain_id = ALC889_FIXUP_MBP_VREF,
2458         },
2459         [ALC889_FIXUP_MBA21_VREF] = {
2460                 .type = HDA_FIXUP_FUNC,
2461                 .v.func = alc889_fixup_mba21_vref,
2462                 .chained = true,
2463                 .chain_id = ALC889_FIXUP_MBP_VREF,
2464         },
2465         [ALC889_FIXUP_MP11_VREF] = {
2466                 .type = HDA_FIXUP_FUNC,
2467                 .v.func = alc889_fixup_mba11_vref,
2468                 .chained = true,
2469                 .chain_id = ALC885_FIXUP_MACPRO_GPIO,
2470         },
2471         [ALC889_FIXUP_MP41_VREF] = {
2472                 .type = HDA_FIXUP_FUNC,
2473                 .v.func = alc889_fixup_mbp_vref,
2474                 .chained = true,
2475                 .chain_id = ALC885_FIXUP_MACPRO_GPIO,
2476         },
2477         [ALC882_FIXUP_INV_DMIC] = {
2478                 .type = HDA_FIXUP_FUNC,
2479                 .v.func = alc_fixup_inv_dmic,
2480         },
2481         [ALC882_FIXUP_NO_PRIMARY_HP] = {
2482                 .type = HDA_FIXUP_FUNC,
2483                 .v.func = alc882_fixup_no_primary_hp,
2484         },
2485         [ALC887_FIXUP_ASUS_BASS] = {
2486                 .type = HDA_FIXUP_PINS,
2487                 .v.pins = (const struct hda_pintbl[]) {
2488                         {0x16, 0x99130130}, /* bass speaker */
2489                         {}
2490                 },
2491                 .chained = true,
2492                 .chain_id = ALC887_FIXUP_BASS_CHMAP,
2493         },
2494         [ALC887_FIXUP_BASS_CHMAP] = {
2495                 .type = HDA_FIXUP_FUNC,
2496                 .v.func = alc_fixup_bass_chmap,
2497         },
2498         [ALC1220_FIXUP_GB_DUAL_CODECS] = {
2499                 .type = HDA_FIXUP_FUNC,
2500                 .v.func = alc1220_fixup_gb_dual_codecs,
2501         },
2502         [ALC1220_FIXUP_GB_X570] = {
2503                 .type = HDA_FIXUP_FUNC,
2504                 .v.func = alc1220_fixup_gb_x570,
2505         },
2506         [ALC1220_FIXUP_CLEVO_P950] = {
2507                 .type = HDA_FIXUP_FUNC,
2508                 .v.func = alc1220_fixup_clevo_p950,
2509         },
2510         [ALC1220_FIXUP_CLEVO_PB51ED] = {
2511                 .type = HDA_FIXUP_FUNC,
2512                 .v.func = alc1220_fixup_clevo_pb51ed,
2513         },
2514         [ALC1220_FIXUP_CLEVO_PB51ED_PINS] = {
2515                 .type = HDA_FIXUP_PINS,
2516                 .v.pins = (const struct hda_pintbl[]) {
2517                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
2518                         {}
2519                 },
2520                 .chained = true,
2521                 .chain_id = ALC1220_FIXUP_CLEVO_PB51ED,
2522         },
2523         [ALC887_FIXUP_ASUS_AUDIO] = {
2524                 .type = HDA_FIXUP_PINS,
2525                 .v.pins = (const struct hda_pintbl[]) {
2526                         { 0x15, 0x02a14150 }, /* use as headset mic, without its own jack detect */
2527                         { 0x19, 0x22219420 },
2528                         {}
2529                 },
2530         },
2531         [ALC887_FIXUP_ASUS_HMIC] = {
2532                 .type = HDA_FIXUP_FUNC,
2533                 .v.func = alc887_fixup_asus_jack,
2534                 .chained = true,
2535                 .chain_id = ALC887_FIXUP_ASUS_AUDIO,
2536         },
2537         [ALCS1200A_FIXUP_MIC_VREF] = {
2538                 .type = HDA_FIXUP_PINCTLS,
2539                 .v.pins = (const struct hda_pintbl[]) {
2540                         { 0x18, PIN_VREF50 }, /* rear mic */
2541                         { 0x19, PIN_VREF50 }, /* front mic */
2542                         {}
2543                 }
2544         },
2545         [ALC888VD_FIXUP_MIC_100VREF] = {
2546                 .type = HDA_FIXUP_PINCTLS,
2547                 .v.pins = (const struct hda_pintbl[]) {
2548                         { 0x18, PIN_VREF100 }, /* headset mic */
2549                         {}
2550                 }
2551         },
2552 };
2553 
2554 static const struct snd_pci_quirk alc882_fixup_tbl[] = {
2555         SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_FIXUP_ACER_EAPD),
2556         SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2557         SND_PCI_QUIRK(0x1025, 0x0107, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2558         SND_PCI_QUIRK(0x1025, 0x010a, "Acer Ferrari 5000", ALC883_FIXUP_ACER_EAPD),
2559         SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_FIXUP_ACER_EAPD),
2560         SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_FIXUP_ACER_EAPD),
2561         SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_FIXUP_ACER_EAPD),
2562         SND_PCI_QUIRK(0x1025, 0x013e, "Acer Aspire 4930G",
2563                       ALC882_FIXUP_ACER_ASPIRE_4930G),
2564         SND_PCI_QUIRK(0x1025, 0x013f, "Acer Aspire 5930G",
2565                       ALC882_FIXUP_ACER_ASPIRE_4930G),
2566         SND_PCI_QUIRK(0x1025, 0x0145, "Acer Aspire 8930G",
2567                       ALC882_FIXUP_ACER_ASPIRE_8930G),
2568         SND_PCI_QUIRK(0x1025, 0x0146, "Acer Aspire 6935G",
2569                       ALC882_FIXUP_ACER_ASPIRE_8930G),
2570         SND_PCI_QUIRK(0x1025, 0x0142, "Acer Aspire 7730G",
2571                       ALC882_FIXUP_ACER_ASPIRE_4930G),
2572         SND_PCI_QUIRK(0x1025, 0x0155, "Packard-Bell M5120", ALC882_FIXUP_PB_M5210),
2573         SND_PCI_QUIRK(0x1025, 0x015e, "Acer Aspire 6930G",
2574                       ALC882_FIXUP_ACER_ASPIRE_4930G),
2575         SND_PCI_QUIRK(0x1025, 0x0166, "Acer Aspire 6530G",
2576                       ALC882_FIXUP_ACER_ASPIRE_4930G),
2577         SND_PCI_QUIRK(0x1025, 0x021e, "Acer Aspire 5739G",
2578                       ALC882_FIXUP_ACER_ASPIRE_4930G),
2579         SND_PCI_QUIRK(0x1025, 0x0259, "Acer Aspire 5935", ALC889_FIXUP_DAC_ROUTE),
2580         SND_PCI_QUIRK(0x1025, 0x026b, "Acer Aspire 8940G", ALC882_FIXUP_ACER_ASPIRE_8930G),
2581         SND_PCI_QUIRK(0x1025, 0x0296, "Acer Aspire 7736z", ALC882_FIXUP_ACER_ASPIRE_7736),
2582         SND_PCI_QUIRK(0x1043, 0x13c2, "Asus A7M", ALC882_FIXUP_EAPD),
2583         SND_PCI_QUIRK(0x1043, 0x1873, "ASUS W90V", ALC882_FIXUP_ASUS_W90V),
2584         SND_PCI_QUIRK(0x1043, 0x1971, "Asus W2JC", ALC882_FIXUP_ASUS_W2JC),
2585         SND_PCI_QUIRK(0x1043, 0x2390, "Asus D700SA", ALC887_FIXUP_ASUS_HMIC),
2586         SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_FIXUP_EEE1601),
2587         SND_PCI_QUIRK(0x1043, 0x84bc, "ASUS ET2700", ALC887_FIXUP_ASUS_BASS),
2588         SND_PCI_QUIRK(0x1043, 0x8691, "ASUS ROG Ranger VIII", ALC882_FIXUP_GPIO3),
2589         SND_PCI_QUIRK(0x1043, 0x8797, "ASUS TUF B550M-PLUS", ALCS1200A_FIXUP_MIC_VREF),
2590         SND_PCI_QUIRK(0x104d, 0x9043, "Sony Vaio VGC-LN51JGB", ALC882_FIXUP_NO_PRIMARY_HP),
2591         SND_PCI_QUIRK(0x104d, 0x9044, "Sony VAIO AiO", ALC882_FIXUP_NO_PRIMARY_HP),
2592         SND_PCI_QUIRK(0x104d, 0x9047, "Sony Vaio TT", ALC889_FIXUP_VAIO_TT),
2593         SND_PCI_QUIRK(0x104d, 0x905a, "Sony Vaio Z", ALC882_FIXUP_NO_PRIMARY_HP),
2594         SND_PCI_QUIRK(0x104d, 0x9060, "Sony Vaio VPCL14M1R", ALC882_FIXUP_NO_PRIMARY_HP),
2595 
2596         /* All Apple entries are in codec SSIDs */
2597         SND_PCI_QUIRK(0x106b, 0x00a0, "MacBookPro 3,1", ALC889_FIXUP_MBP_VREF),
2598         SND_PCI_QUIRK(0x106b, 0x00a1, "Macbook", ALC889_FIXUP_MBP_VREF),
2599         SND_PCI_QUIRK(0x106b, 0x00a4, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
2600         SND_PCI_QUIRK(0x106b, 0x0c00, "Mac Pro", ALC889_FIXUP_MP11_VREF),
2601         SND_PCI_QUIRK(0x106b, 0x1000, "iMac 24", ALC885_FIXUP_MACPRO_GPIO),
2602         SND_PCI_QUIRK(0x106b, 0x2800, "AppleTV", ALC885_FIXUP_MACPRO_GPIO),
2603         SND_PCI_QUIRK(0x106b, 0x2c00, "MacbookPro rev3", ALC889_FIXUP_MBP_VREF),
2604         SND_PCI_QUIRK(0x106b, 0x3000, "iMac", ALC889_FIXUP_MBP_VREF),
2605         SND_PCI_QUIRK(0x106b, 0x3200, "iMac 7,1 Aluminum", ALC882_FIXUP_EAPD),
2606         SND_PCI_QUIRK(0x106b, 0x3400, "MacBookAir 1,1", ALC889_FIXUP_MBA11_VREF),
2607         SND_PCI_QUIRK(0x106b, 0x3500, "MacBookAir 2,1", ALC889_FIXUP_MBA21_VREF),
2608         SND_PCI_QUIRK(0x106b, 0x3600, "Macbook 3,1", ALC889_FIXUP_MBP_VREF),
2609         SND_PCI_QUIRK(0x106b, 0x3800, "MacbookPro 4,1", ALC889_FIXUP_MBP_VREF),
2610         SND_PCI_QUIRK(0x106b, 0x3e00, "iMac 24 Aluminum", ALC885_FIXUP_MACPRO_GPIO),
2611         SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),
2612         SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", ALC889_FIXUP_IMAC91_VREF),
2613         SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),
2614         SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 4,1/5,1", ALC889_FIXUP_MP41_VREF),
2615         SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
2616         SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
2617         SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
2618         SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF),
2619 
2620         SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
2621         SND_PCI_QUIRK(0x10ec, 0x12d8, "iBase Elo Touch", ALC888VD_FIXUP_MIC_100VREF),
2622         SND_PCI_QUIRK(0x13fe, 0x1009, "Advantech MIT-W101", ALC886_FIXUP_EAPD),
2623         SND_PCI_QUIRK(0x1458, 0xa002, "Gigabyte EP45-DS3/Z87X-UD3H", ALC889_FIXUP_FRONT_HP_NO_PRESENCE),
2624         SND_PCI_QUIRK(0x1458, 0xa0b8, "Gigabyte AZ370-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
2625         SND_PCI_QUIRK(0x1458, 0xa0cd, "Gigabyte X570 Aorus Master", ALC1220_FIXUP_GB_X570),
2626         SND_PCI_QUIRK(0x1458, 0xa0ce, "Gigabyte X570 Aorus Xtreme", ALC1220_FIXUP_GB_X570),
2627         SND_PCI_QUIRK(0x1458, 0xa0d5, "Gigabyte X570S Aorus Master", ALC1220_FIXUP_GB_X570),
2628         SND_PCI_QUIRK(0x1462, 0x11f7, "MSI-GE63", ALC1220_FIXUP_CLEVO_P950),
2629         SND_PCI_QUIRK(0x1462, 0x1228, "MSI-GP63", ALC1220_FIXUP_CLEVO_P950),
2630         SND_PCI_QUIRK(0x1462, 0x1229, "MSI-GP73", ALC1220_FIXUP_CLEVO_P950),
2631         SND_PCI_QUIRK(0x1462, 0x1275, "MSI-GL63", ALC1220_FIXUP_CLEVO_P950),
2632         SND_PCI_QUIRK(0x1462, 0x1276, "MSI-GL73", ALC1220_FIXUP_CLEVO_P950),
2633         SND_PCI_QUIRK(0x1462, 0x1293, "MSI-GP65", ALC1220_FIXUP_CLEVO_P950),
2634         SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
2635         SND_PCI_QUIRK(0x1462, 0xcc34, "MSI Godlike X570", ALC1220_FIXUP_GB_DUAL_CODECS),
2636         SND_PCI_QUIRK(0x1462, 0xda57, "MSI Z270-Gaming", ALC1220_FIXUP_GB_DUAL_CODECS),
2637         SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
2638         SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
2639         SND_PCI_QUIRK(0x1558, 0x3702, "Clevo X370SN[VW]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2640         SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2641         SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2642         SND_PCI_QUIRK(0x1558, 0x65d2, "Clevo PB51R[CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2643         SND_PCI_QUIRK(0x1558, 0x65e1, "Clevo PB51[ED][DF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2644         SND_PCI_QUIRK(0x1558, 0x65e5, "Clevo PC50D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2645         SND_PCI_QUIRK(0x1558, 0x65f1, "Clevo PC50HS", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2646         SND_PCI_QUIRK(0x1558, 0x65f5, "Clevo PD50PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2647         SND_PCI_QUIRK(0x1558, 0x66a2, "Clevo PE60RNE", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2648         SND_PCI_QUIRK(0x1558, 0x66a6, "Clevo PE60SN[CDE]-[GS]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2649         SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2650         SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2651         SND_PCI_QUIRK(0x1558, 0x67e5, "Clevo PC70D[PRS](?:-D|-G)?", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2652         SND_PCI_QUIRK(0x1558, 0x67f1, "Clevo PC70H[PRS]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2653         SND_PCI_QUIRK(0x1558, 0x67f5, "Clevo PD70PN[NRT]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2654         SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2655         SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170SM", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2656         SND_PCI_QUIRK(0x1558, 0x7715, "Clevo X170KM-G", ALC1220_FIXUP_CLEVO_PB51ED),
2657         SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
2658         SND_PCI_QUIRK(0x1558, 0x9506, "Clevo P955HQ", ALC1220_FIXUP_CLEVO_P950),
2659         SND_PCI_QUIRK(0x1558, 0x950a, "Clevo P955H[PR]", ALC1220_FIXUP_CLEVO_P950),
2660         SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),
2661         SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950),
2662         SND_PCI_QUIRK(0x1558, 0x95e3, "Clevo P955[ER]T", ALC1220_FIXUP_CLEVO_P950),
2663         SND_PCI_QUIRK(0x1558, 0x95e4, "Clevo P955ER", ALC1220_FIXUP_CLEVO_P950),
2664         SND_PCI_QUIRK(0x1558, 0x95e5, "Clevo P955EE6", ALC1220_FIXUP_CLEVO_P950),
2665         SND_PCI_QUIRK(0x1558, 0x95e6, "Clevo P950R[CDF]", ALC1220_FIXUP_CLEVO_P950),
2666         SND_PCI_QUIRK(0x1558, 0x96e1, "Clevo P960[ER][CDFN]-K", ALC1220_FIXUP_CLEVO_P950),
2667         SND_PCI_QUIRK(0x1558, 0x97e1, "Clevo P970[ER][CDFN]", ALC1220_FIXUP_CLEVO_P950),
2668         SND_PCI_QUIRK(0x1558, 0x97e2, "Clevo P970RC-M", ALC1220_FIXUP_CLEVO_P950),
2669         SND_PCI_QUIRK(0x1558, 0xd502, "Clevo PD50SNE", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
2670         SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
2671         SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
2672         SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
2673         SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF),
2674         {}
2675 };
2676 
2677 static const struct hda_model_fixup alc882_fixup_models[] = {
2678         {.id = ALC882_FIXUP_ABIT_AW9D_MAX, .name = "abit-aw9d"},
2679         {.id = ALC882_FIXUP_LENOVO_Y530, .name = "lenovo-y530"},
2680         {.id = ALC882_FIXUP_ACER_ASPIRE_7736, .name = "acer-aspire-7736"},
2681         {.id = ALC882_FIXUP_ASUS_W90V, .name = "asus-w90v"},
2682         {.id = ALC889_FIXUP_CD, .name = "cd"},
2683         {.id = ALC889_FIXUP_FRONT_HP_NO_PRESENCE, .name = "no-front-hp"},
2684         {.id = ALC889_FIXUP_VAIO_TT, .name = "vaio-tt"},
2685         {.id = ALC888_FIXUP_EEE1601, .name = "eee1601"},
2686         {.id = ALC882_FIXUP_EAPD, .name = "alc882-eapd"},
2687         {.id = ALC883_FIXUP_EAPD, .name = "alc883-eapd"},
2688         {.id = ALC882_FIXUP_GPIO1, .name = "gpio1"},
2689         {.id = ALC882_FIXUP_GPIO2, .name = "gpio2"},
2690         {.id = ALC882_FIXUP_GPIO3, .name = "gpio3"},
2691         {.id = ALC889_FIXUP_COEF, .name = "alc889-coef"},
2692         {.id = ALC882_FIXUP_ASUS_W2JC, .name = "asus-w2jc"},
2693         {.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"},
2694         {.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"},
2695         {.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"},
2696         {.id = ALC885_FIXUP_MACPRO_GPIO, .name = "macpro-gpio"},
2697         {.id = ALC889_FIXUP_DAC_ROUTE, .name = "dac-route"},
2698         {.id = ALC889_FIXUP_MBP_VREF, .name = "mbp-vref"},
2699         {.id = ALC889_FIXUP_IMAC91_VREF, .name = "imac91-vref"},
2700         {.id = ALC889_FIXUP_MBA11_VREF, .name = "mba11-vref"},
2701         {.id = ALC889_FIXUP_MBA21_VREF, .name = "mba21-vref"},
2702         {.id = ALC889_FIXUP_MP11_VREF, .name = "mp11-vref"},
2703         {.id = ALC889_FIXUP_MP41_VREF, .name = "mp41-vref"},
2704         {.id = ALC882_FIXUP_INV_DMIC, .name = "inv-dmic"},
2705         {.id = ALC882_FIXUP_NO_PRIMARY_HP, .name = "no-primary-hp"},
2706         {.id = ALC887_FIXUP_ASUS_BASS, .name = "asus-bass"},
2707         {.id = ALC1220_FIXUP_GB_DUAL_CODECS, .name = "dual-codecs"},
2708         {.id = ALC1220_FIXUP_GB_X570, .name = "gb-x570"},
2709         {.id = ALC1220_FIXUP_CLEVO_P950, .name = "clevo-p950"},
2710         {}
2711 };
2712 
2713 static const struct snd_hda_pin_quirk alc882_pin_fixup_tbl[] = {
2714         SND_HDA_PIN_QUIRK(0x10ec1220, 0x1043, "ASUS", ALC1220_FIXUP_CLEVO_P950,
2715                 {0x14, 0x01014010},
2716                 {0x15, 0x01011012},
2717                 {0x16, 0x01016011},
2718                 {0x18, 0x01a19040},
2719                 {0x19, 0x02a19050},
2720                 {0x1a, 0x0181304f},
2721                 {0x1b, 0x0221401f},
2722                 {0x1e, 0x01456130}),
2723         SND_HDA_PIN_QUIRK(0x10ec1220, 0x1462, "MS-7C35", ALC1220_FIXUP_CLEVO_P950,
2724                 {0x14, 0x01015010},
2725                 {0x15, 0x01011012},
2726                 {0x16, 0x01011011},
2727                 {0x18, 0x01a11040},
2728                 {0x19, 0x02a19050},
2729                 {0x1a, 0x0181104f},
2730                 {0x1b, 0x0221401f},
2731                 {0x1e, 0x01451130}),
2732         {}
2733 };
2734 
2735 /*
2736  * BIOS auto configuration
2737  */
2738 /* almost identical with ALC880 parser... */
2739 static int alc882_parse_auto_config(struct hda_codec *codec)
2740 {
2741         static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };
2742         static const hda_nid_t alc882_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2743         return alc_parse_auto_config(codec, alc882_ignore, alc882_ssids);
2744 }
2745 
2746 /*
2747  */
2748 static int patch_alc882(struct hda_codec *codec)
2749 {
2750         struct alc_spec *spec;
2751         int err;
2752 
2753         err = alc_alloc_spec(codec, 0x0b);
2754         if (err < 0)
2755                 return err;
2756 
2757         spec = codec->spec;
2758 
2759         switch (codec->core.vendor_id) {
2760         case 0x10ec0882:
2761         case 0x10ec0885:
2762         case 0x10ec0900:
2763         case 0x10ec0b00:
2764         case 0x10ec1220:
2765                 break;
2766         default:
2767                 /* ALC883 and variants */
2768                 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2769                 break;
2770         }
2771 
2772         alc_pre_init(codec);
2773 
2774         snd_hda_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl,
2775                        alc882_fixups);
2776         snd_hda_pick_pin_fixup(codec, alc882_pin_fixup_tbl, alc882_fixups, true);
2777         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2778 
2779         alc_auto_parse_customize_define(codec);
2780 
2781         if (has_cdefine_beep(codec))
2782                 spec->gen.beep_nid = 0x01;
2783 
2784         /* automatic parse from the BIOS config */
2785         err = alc882_parse_auto_config(codec);
2786         if (err < 0)
2787                 goto error;
2788 
2789         if (!spec->gen.no_analog && spec->gen.beep_nid) {
2790                 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2791                 if (err < 0)
2792                         goto error;
2793         }
2794 
2795         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2796 
2797         return 0;
2798 
2799  error:
2800         alc_free(codec);
2801         return err;
2802 }
2803 
2804 
2805 /*
2806  * ALC262 support
2807  */
2808 static int alc262_parse_auto_config(struct hda_codec *codec)
2809 {
2810         static const hda_nid_t alc262_ignore[] = { 0x1d, 0 };
2811         static const hda_nid_t alc262_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2812         return alc_parse_auto_config(codec, alc262_ignore, alc262_ssids);
2813 }
2814 
2815 /*
2816  * Pin config fixes
2817  */
2818 enum {
2819         ALC262_FIXUP_FSC_H270,
2820         ALC262_FIXUP_FSC_S7110,
2821         ALC262_FIXUP_HP_Z200,
2822         ALC262_FIXUP_TYAN,
2823         ALC262_FIXUP_LENOVO_3000,
2824         ALC262_FIXUP_BENQ,
2825         ALC262_FIXUP_BENQ_T31,
2826         ALC262_FIXUP_INV_DMIC,
2827         ALC262_FIXUP_INTEL_BAYLEYBAY,
2828 };
2829 
2830 static const struct hda_fixup alc262_fixups[] = {
2831         [ALC262_FIXUP_FSC_H270] = {
2832                 .type = HDA_FIXUP_PINS,
2833                 .v.pins = (const struct hda_pintbl[]) {
2834                         { 0x14, 0x99130110 }, /* speaker */
2835                         { 0x15, 0x0221142f }, /* front HP */
2836                         { 0x1b, 0x0121141f }, /* rear HP */
2837                         { }
2838                 }
2839         },
2840         [ALC262_FIXUP_FSC_S7110] = {
2841                 .type = HDA_FIXUP_PINS,
2842                 .v.pins = (const struct hda_pintbl[]) {
2843                         { 0x15, 0x90170110 }, /* speaker */
2844                         { }
2845                 },
2846                 .chained = true,
2847                 .chain_id = ALC262_FIXUP_BENQ,
2848         },
2849         [ALC262_FIXUP_HP_Z200] = {
2850                 .type = HDA_FIXUP_PINS,
2851                 .v.pins = (const struct hda_pintbl[]) {
2852                         { 0x16, 0x99130120 }, /* internal speaker */
2853                         { }
2854                 }
2855         },
2856         [ALC262_FIXUP_TYAN] = {
2857                 .type = HDA_FIXUP_PINS,
2858                 .v.pins = (const struct hda_pintbl[]) {
2859                         { 0x14, 0x1993e1f0 }, /* int AUX */
2860                         { }
2861                 }
2862         },
2863         [ALC262_FIXUP_LENOVO_3000] = {
2864                 .type = HDA_FIXUP_PINCTLS,
2865                 .v.pins = (const struct hda_pintbl[]) {
2866                         { 0x19, PIN_VREF50 },
2867                         {}
2868                 },
2869                 .chained = true,
2870                 .chain_id = ALC262_FIXUP_BENQ,
2871         },
2872         [ALC262_FIXUP_BENQ] = {
2873                 .type = HDA_FIXUP_VERBS,
2874                 .v.verbs = (const struct hda_verb[]) {
2875                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2876                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2877                         {}
2878                 }
2879         },
2880         [ALC262_FIXUP_BENQ_T31] = {
2881                 .type = HDA_FIXUP_VERBS,
2882                 .v.verbs = (const struct hda_verb[]) {
2883                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2884                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2885                         {}
2886                 }
2887         },
2888         [ALC262_FIXUP_INV_DMIC] = {
2889                 .type = HDA_FIXUP_FUNC,
2890                 .v.func = alc_fixup_inv_dmic,
2891         },
2892         [ALC262_FIXUP_INTEL_BAYLEYBAY] = {
2893                 .type = HDA_FIXUP_FUNC,
2894                 .v.func = alc_fixup_no_depop_delay,
2895         },
2896 };
2897 
2898 static const struct snd_pci_quirk alc262_fixup_tbl[] = {
2899         SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", ALC262_FIXUP_HP_Z200),
2900         SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu Lifebook S7110", ALC262_FIXUP_FSC_S7110),
2901         SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ),
2902         SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN),
2903         SND_PCI_QUIRK(0x1734, 0x1141, "FSC ESPRIMO U9210", ALC262_FIXUP_FSC_H270),
2904         SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270),
2905         SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000),
2906         SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ),
2907         SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_FIXUP_BENQ_T31),
2908         SND_PCI_QUIRK(0x8086, 0x7270, "BayleyBay", ALC262_FIXUP_INTEL_BAYLEYBAY),
2909         {}
2910 };
2911 
2912 static const struct hda_model_fixup alc262_fixup_models[] = {
2913         {.id = ALC262_FIXUP_INV_DMIC, .name = "inv-dmic"},
2914         {.id = ALC262_FIXUP_FSC_H270, .name = "fsc-h270"},
2915         {.id = ALC262_FIXUP_FSC_S7110, .name = "fsc-s7110"},
2916         {.id = ALC262_FIXUP_HP_Z200, .name = "hp-z200"},
2917         {.id = ALC262_FIXUP_TYAN, .name = "tyan"},
2918         {.id = ALC262_FIXUP_LENOVO_3000, .name = "lenovo-3000"},
2919         {.id = ALC262_FIXUP_BENQ, .name = "benq"},
2920         {.id = ALC262_FIXUP_BENQ_T31, .name = "benq-t31"},
2921         {.id = ALC262_FIXUP_INTEL_BAYLEYBAY, .name = "bayleybay"},
2922         {}
2923 };
2924 
2925 /*
2926  */
2927 static int patch_alc262(struct hda_codec *codec)
2928 {
2929         struct alc_spec *spec;
2930         int err;
2931 
2932         err = alc_alloc_spec(codec, 0x0b);
2933         if (err < 0)
2934                 return err;
2935 
2936         spec = codec->spec;
2937         spec->gen.shared_mic_vref_pin = 0x18;
2938 
2939         spec->shutup = alc_eapd_shutup;
2940 
2941 #if 0
2942         /* pshou 07/11/05  set a zero PCM sample to DAC when FIFO is
2943          * under-run
2944          */
2945         alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x80);
2946 #endif
2947         alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2948 
2949         alc_pre_init(codec);
2950 
2951         snd_hda_pick_fixup(codec, alc262_fixup_models, alc262_fixup_tbl,
2952                        alc262_fixups);
2953         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2954 
2955         alc_auto_parse_customize_define(codec);
2956 
2957         if (has_cdefine_beep(codec))
2958                 spec->gen.beep_nid = 0x01;
2959 
2960         /* automatic parse from the BIOS config */
2961         err = alc262_parse_auto_config(codec);
2962         if (err < 0)
2963                 goto error;
2964 
2965         if (!spec->gen.no_analog && spec->gen.beep_nid) {
2966                 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2967                 if (err < 0)
2968                         goto error;
2969         }
2970 
2971         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2972 
2973         return 0;
2974 
2975  error:
2976         alc_free(codec);
2977         return err;
2978 }
2979 
2980 /*
2981  *  ALC268
2982  */
2983 /* bind Beep switches of both NID 0x0f and 0x10 */
2984 static int alc268_beep_switch_put(struct snd_kcontrol *kcontrol,
2985                                   struct snd_ctl_elem_value *ucontrol)
2986 {
2987         struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
2988         unsigned long pval;
2989         int err;
2990 
2991         mutex_lock(&codec->control_mutex);
2992         pval = kcontrol->private_value;
2993         kcontrol->private_value = (pval & ~0xff) | 0x0f;
2994         err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2995         if (err >= 0) {
2996                 kcontrol->private_value = (pval & ~0xff) | 0x10;
2997                 err = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
2998         }
2999         kcontrol->private_value = pval;
3000         mutex_unlock(&codec->control_mutex);
3001         return err;
3002 }
3003 
3004 static const struct snd_kcontrol_new alc268_beep_mixer[] = {
3005         HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
3006         {
3007                 .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
3008                 .name = "Beep Playback Switch",
3009                 .subdevice = HDA_SUBDEV_AMP_FLAG,
3010                 .info = snd_hda_mixer_amp_switch_info,
3011                 .get = snd_hda_mixer_amp_switch_get,
3012                 .put = alc268_beep_switch_put,
3013                 .private_value = HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT)
3014         },
3015 };
3016 
3017 /* set PCBEEP vol = 0, mute connections */
3018 static const struct hda_verb alc268_beep_init_verbs[] = {
3019         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
3020         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3021         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
3022         { }
3023 };
3024 
3025 enum {
3026         ALC268_FIXUP_INV_DMIC,
3027         ALC268_FIXUP_HP_EAPD,
3028         ALC268_FIXUP_SPDIF,
3029 };
3030 
3031 static const struct hda_fixup alc268_fixups[] = {
3032         [ALC268_FIXUP_INV_DMIC] = {
3033                 .type = HDA_FIXUP_FUNC,
3034                 .v.func = alc_fixup_inv_dmic,
3035         },
3036         [ALC268_FIXUP_HP_EAPD] = {
3037                 .type = HDA_FIXUP_VERBS,
3038                 .v.verbs = (const struct hda_verb[]) {
3039                         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 0},
3040                         {}
3041                 }
3042         },
3043         [ALC268_FIXUP_SPDIF] = {
3044                 .type = HDA_FIXUP_PINS,
3045                 .v.pins = (const struct hda_pintbl[]) {
3046                         { 0x1e, 0x014b1180 }, /* enable SPDIF out */
3047                         {}
3048                 }
3049         },
3050 };
3051 
3052 static const struct hda_model_fixup alc268_fixup_models[] = {
3053         {.id = ALC268_FIXUP_INV_DMIC, .name = "inv-dmic"},
3054         {.id = ALC268_FIXUP_HP_EAPD, .name = "hp-eapd"},
3055         {.id = ALC268_FIXUP_SPDIF, .name = "spdif"},
3056         {}
3057 };
3058 
3059 static const struct snd_pci_quirk alc268_fixup_tbl[] = {
3060         SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF),
3061         SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC),
3062         /* below is codec SSID since multiple Toshiba laptops have the
3063          * same PCI SSID 1179:ff00
3064          */
3065         SND_PCI_QUIRK(0x1179, 0xff06, "Toshiba P200", ALC268_FIXUP_HP_EAPD),
3066         {}
3067 };
3068 
3069 /*
3070  * BIOS auto configuration
3071  */
3072 static int alc268_parse_auto_config(struct hda_codec *codec)
3073 {
3074         static const hda_nid_t alc268_ssids[] = { 0x15, 0x1b, 0x14, 0 };
3075         return alc_parse_auto_config(codec, NULL, alc268_ssids);
3076 }
3077 
3078 /*
3079  */
3080 static int patch_alc268(struct hda_codec *codec)
3081 {
3082         struct alc_spec *spec;
3083         int i, err;
3084 
3085         /* ALC268 has no aa-loopback mixer */
3086         err = alc_alloc_spec(codec, 0);
3087         if (err < 0)
3088                 return err;
3089 
3090         spec = codec->spec;
3091         if (has_cdefine_beep(codec))
3092                 spec->gen.beep_nid = 0x01;
3093 
3094         spec->shutup = alc_eapd_shutup;
3095 
3096         alc_pre_init(codec);
3097 
3098         snd_hda_pick_fixup(codec, alc268_fixup_models, alc268_fixup_tbl, alc268_fixups);
3099         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
3100 
3101         /* automatic parse from the BIOS config */
3102         err = alc268_parse_auto_config(codec);
3103         if (err < 0)
3104                 goto error;
3105 
3106         if (err > 0 && !spec->gen.no_analog &&
3107             spec->gen.autocfg.speaker_pins[0] != 0x1d) {
3108                 for (i = 0; i < ARRAY_SIZE(alc268_beep_mixer); i++) {
3109                         if (!snd_hda_gen_add_kctl(&spec->gen, NULL,
3110                                                   &alc268_beep_mixer[i])) {
3111                                 err = -ENOMEM;
3112                                 goto error;
3113                         }
3114                 }
3115                 snd_hda_add_verbs(codec, alc268_beep_init_verbs);
3116                 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
3117                         /* override the amp caps for beep generator */
3118                         snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
3119                                           (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
3120                                           (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
3121                                           (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
3122                                           (0 << AC_AMPCAP_MUTE_SHIFT));
3123         }
3124 
3125         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
3126 
3127         return 0;
3128 
3129  error:
3130         alc_free(codec);
3131         return err;
3132 }
3133 
3134 /*
3135  * ALC269
3136  */
3137 
3138 static const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
3139         .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
3140 };
3141 
3142 static const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
3143         .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
3144 };
3145 
3146 /* different alc269-variants */
3147 enum {
3148         ALC269_TYPE_ALC269VA,
3149         ALC269_TYPE_ALC269VB,
3150         ALC269_TYPE_ALC269VC,
3151         ALC269_TYPE_ALC269VD,
3152         ALC269_TYPE_ALC280,
3153         ALC269_TYPE_ALC282,
3154         ALC269_TYPE_ALC283,
3155         ALC269_TYPE_ALC284,
3156         ALC269_TYPE_ALC293,
3157         ALC269_TYPE_ALC286,
3158         ALC269_TYPE_ALC298,
3159         ALC269_TYPE_ALC255,
3160         ALC269_TYPE_ALC256,
3161         ALC269_TYPE_ALC257,
3162         ALC269_TYPE_ALC215,
3163         ALC269_TYPE_ALC225,
3164         ALC269_TYPE_ALC245,
3165         ALC269_TYPE_ALC287,
3166         ALC269_TYPE_ALC294,
3167         ALC269_TYPE_ALC300,
3168         ALC269_TYPE_ALC623,
3169         ALC269_TYPE_ALC700,
3170 };
3171 
3172 /*
3173  * BIOS auto configuration
3174  */
3175 static int alc269_parse_auto_config(struct hda_codec *codec)
3176 {
3177         static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };
3178         static const hda_nid_t alc269_ssids[] = { 0, 0x1b, 0x14, 0x21 };
3179         static const hda_nid_t alc269va_ssids[] = { 0x15, 0x1b, 0x14, 0 };
3180         struct alc_spec *spec = codec->spec;
3181         const hda_nid_t *ssids;
3182 
3183         switch (spec->codec_variant) {
3184         case ALC269_TYPE_ALC269VA:
3185         case ALC269_TYPE_ALC269VC:
3186         case ALC269_TYPE_ALC280:
3187         case ALC269_TYPE_ALC284:
3188         case ALC269_TYPE_ALC293:
3189                 ssids = alc269va_ssids;
3190                 break;
3191         case ALC269_TYPE_ALC269VB:
3192         case ALC269_TYPE_ALC269VD:
3193         case ALC269_TYPE_ALC282:
3194         case ALC269_TYPE_ALC283:
3195         case ALC269_TYPE_ALC286:
3196         case ALC269_TYPE_ALC298:
3197         case ALC269_TYPE_ALC255:
3198         case ALC269_TYPE_ALC256:
3199         case ALC269_TYPE_ALC257:
3200         case ALC269_TYPE_ALC215:
3201         case ALC269_TYPE_ALC225:
3202         case ALC269_TYPE_ALC245:
3203         case ALC269_TYPE_ALC287:
3204         case ALC269_TYPE_ALC294:
3205         case ALC269_TYPE_ALC300:
3206         case ALC269_TYPE_ALC623:
3207         case ALC269_TYPE_ALC700:
3208                 ssids = alc269_ssids;
3209                 break;
3210         default:
3211                 ssids = alc269_ssids;
3212                 break;
3213         }
3214 
3215         return alc_parse_auto_config(codec, alc269_ignore, ssids);
3216 }
3217 
3218 static const struct hda_jack_keymap alc_headset_btn_keymap[] = {
3219         { SND_JACK_BTN_0, KEY_PLAYPAUSE },
3220         { SND_JACK_BTN_1, KEY_VOICECOMMAND },
3221         { SND_JACK_BTN_2, KEY_VOLUMEUP },
3222         { SND_JACK_BTN_3, KEY_VOLUMEDOWN },
3223         {}
3224 };
3225 
3226 static void alc_headset_btn_callback(struct hda_codec *codec,
3227                                      struct hda_jack_callback *jack)
3228 {
3229         int report = 0;
3230 
3231         if (jack->unsol_res & (7 << 13))
3232                 report |= SND_JACK_BTN_0;
3233 
3234         if (jack->unsol_res  & (1 << 16 | 3 << 8))
3235                 report |= SND_JACK_BTN_1;
3236 
3237         /* Volume up key */
3238         if (jack->unsol_res & (7 << 23))
3239                 report |= SND_JACK_BTN_2;
3240 
3241         /* Volume down key */
3242         if (jack->unsol_res & (7 << 10))
3243                 report |= SND_JACK_BTN_3;
3244 
3245         snd_hda_jack_set_button_state(codec, jack->nid, report);
3246 }
3247 
3248 static void alc_disable_headset_jack_key(struct hda_codec *codec)
3249 {
3250         struct alc_spec *spec = codec->spec;
3251 
3252         if (!spec->has_hs_key)
3253                 return;
3254 
3255         switch (codec->core.vendor_id) {
3256         case 0x10ec0215:
3257         case 0x10ec0225:
3258         case 0x10ec0285:
3259         case 0x10ec0287:
3260         case 0x10ec0295:
3261         case 0x10ec0289:
3262         case 0x10ec0299:
3263                 alc_write_coef_idx(codec, 0x48, 0x0);
3264                 alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3265                 alc_update_coef_idx(codec, 0x44, 0x0045 << 8, 0x0);
3266                 break;
3267         case 0x10ec0230:
3268         case 0x10ec0236:
3269         case 0x10ec0256:
3270         case 0x10ec0257:
3271         case 0x19e58326:
3272                 alc_write_coef_idx(codec, 0x48, 0x0);
3273                 alc_update_coef_idx(codec, 0x49, 0x0045, 0x0);
3274                 break;
3275         }
3276 }
3277 
3278 static void alc_enable_headset_jack_key(struct hda_codec *codec)
3279 {
3280         struct alc_spec *spec = codec->spec;
3281 
3282         if (!spec->has_hs_key)
3283                 return;
3284 
3285         switch (codec->core.vendor_id) {
3286         case 0x10ec0215:
3287         case 0x10ec0225:
3288         case 0x10ec0285:
3289         case 0x10ec0287:
3290         case 0x10ec0295:
3291         case 0x10ec0289:
3292         case 0x10ec0299:
3293                 alc_write_coef_idx(codec, 0x48, 0xd011);
3294                 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3295                 alc_update_coef_idx(codec, 0x44, 0x007f << 8, 0x0045 << 8);
3296                 break;
3297         case 0x10ec0230:
3298         case 0x10ec0236:
3299         case 0x10ec0256:
3300         case 0x10ec0257:
3301         case 0x19e58326:
3302                 alc_write_coef_idx(codec, 0x48, 0xd011);
3303                 alc_update_coef_idx(codec, 0x49, 0x007f, 0x0045);
3304                 break;
3305         }
3306 }
3307 
3308 static void alc_fixup_headset_jack(struct hda_codec *codec,
3309                                     const struct hda_fixup *fix, int action)
3310 {
3311         struct alc_spec *spec = codec->spec;
3312         hda_nid_t hp_pin;
3313 
3314         switch (action) {
3315         case HDA_FIXUP_ACT_PRE_PROBE:
3316                 spec->has_hs_key = 1;
3317                 snd_hda_jack_detect_enable_callback(codec, 0x55,
3318                                                     alc_headset_btn_callback);
3319                 break;
3320         case HDA_FIXUP_ACT_BUILD:
3321                 hp_pin = alc_get_hp_pin(spec);
3322                 if (!hp_pin || snd_hda_jack_bind_keymap(codec, 0x55,
3323                                                         alc_headset_btn_keymap,
3324                                                         hp_pin))
3325                         snd_hda_jack_add_kctl(codec, 0x55, "Headset Jack",
3326                                               false, SND_JACK_HEADSET,
3327                                               alc_headset_btn_keymap);
3328 
3329                 alc_enable_headset_jack_key(codec);
3330                 break;
3331         }
3332 }
3333 
3334 static void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)
3335 {
3336         alc_update_coef_idx(codec, 0x04, 1 << 11, power_up ? (1 << 11) : 0);
3337 }
3338 
3339 static void alc269_shutup(struct hda_codec *codec)
3340 {
3341         struct alc_spec *spec = codec->spec;
3342 
3343         if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3344                 alc269vb_toggle_power_output(codec, 0);
3345         if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3346                         (alc_get_coef0(codec) & 0x00ff) == 0x018) {
3347                 msleep(150);
3348         }
3349         alc_shutup_pins(codec);
3350 }
3351 
3352 static const struct coef_fw alc282_coefs[] = {
3353         WRITE_COEF(0x03, 0x0002), /* Power Down Control */
3354         UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
3355         WRITE_COEF(0x07, 0x0200), /* DMIC control */
3356         UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3357         UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3358         WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3359         WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3360         WRITE_COEF(0x0e, 0x6e00), /* LDO1/2/3, DAC/ADC */
3361         UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3362         UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3363         WRITE_COEF(0x6f, 0x0), /* Class D test 4 */
3364         UPDATE_COEF(0x0c, 0xfe00, 0), /* IO power down directly */
3365         WRITE_COEF(0x34, 0xa0c0), /* ANC */
3366         UPDATE_COEF(0x16, 0x0008, 0), /* AGC MUX */
3367         UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3368         UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3369         WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3370         WRITE_COEF(0x63, 0x2902), /* PLL */
3371         WRITE_COEF(0x68, 0xa080), /* capless control 2 */
3372         WRITE_COEF(0x69, 0x3400), /* capless control 3 */
3373         WRITE_COEF(0x6a, 0x2f3e), /* capless control 4 */
3374         WRITE_COEF(0x6b, 0x0), /* capless control 5 */
3375         UPDATE_COEF(0x6d, 0x0fff, 0x0900), /* class D test 2 */
3376         WRITE_COEF(0x6e, 0x110a), /* class D test 3 */
3377         UPDATE_COEF(0x70, 0x00f8, 0x00d8), /* class D test 5 */
3378         WRITE_COEF(0x71, 0x0014), /* class D test 6 */
3379         WRITE_COEF(0x72, 0xc2ba), /* classD OCP */
3380         UPDATE_COEF(0x77, 0x0f80, 0), /* classD pure DC test */
3381         WRITE_COEF(0x6c, 0xfc06), /* Class D amp control */
3382         {}
3383 };
3384 
3385 static void alc282_restore_default_value(struct hda_codec *codec)
3386 {
3387         alc_process_coef_fw(codec, alc282_coefs);
3388 }
3389 
3390 static void alc282_init(struct hda_codec *codec)
3391 {
3392         struct alc_spec *spec = codec->spec;
3393         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3394         bool hp_pin_sense;
3395         int coef78;
3396 
3397         alc282_restore_default_value(codec);
3398 
3399         if (!hp_pin)
3400                 return;
3401         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3402         coef78 = alc_read_coef_idx(codec, 0x78);
3403 
3404         /* Index 0x78 Direct Drive HP AMP LPM Control 1 */
3405         /* Headphone capless set to high power mode */
3406         alc_write_coef_idx(codec, 0x78, 0x9004);
3407 
3408         if (hp_pin_sense)
3409                 msleep(2);
3410 
3411         snd_hda_codec_write(codec, hp_pin, 0,
3412                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3413 
3414         if (hp_pin_sense)
3415                 msleep(85);
3416 
3417         snd_hda_codec_write(codec, hp_pin, 0,
3418                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3419 
3420         if (hp_pin_sense)
3421                 msleep(100);
3422 
3423         /* Headphone capless set to normal mode */
3424         alc_write_coef_idx(codec, 0x78, coef78);
3425 }
3426 
3427 static void alc282_shutup(struct hda_codec *codec)
3428 {
3429         struct alc_spec *spec = codec->spec;
3430         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3431         bool hp_pin_sense;
3432         int coef78;
3433 
3434         if (!hp_pin) {
3435                 alc269_shutup(codec);
3436                 return;
3437         }
3438 
3439         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3440         coef78 = alc_read_coef_idx(codec, 0x78);
3441         alc_write_coef_idx(codec, 0x78, 0x9004);
3442 
3443         if (hp_pin_sense)
3444                 msleep(2);
3445 
3446         snd_hda_codec_write(codec, hp_pin, 0,
3447                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3448 
3449         if (hp_pin_sense)
3450                 msleep(85);
3451 
3452         if (!spec->no_shutup_pins)
3453                 snd_hda_codec_write(codec, hp_pin, 0,
3454                                     AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3455 
3456         if (hp_pin_sense)
3457                 msleep(100);
3458 
3459         alc_auto_setup_eapd(codec, false);
3460         alc_shutup_pins(codec);
3461         alc_write_coef_idx(codec, 0x78, coef78);
3462 }
3463 
3464 static const struct coef_fw alc283_coefs[] = {
3465         WRITE_COEF(0x03, 0x0002), /* Power Down Control */
3466         UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
3467         WRITE_COEF(0x07, 0x0200), /* DMIC control */
3468         UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
3469         UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
3470         WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
3471         WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
3472         WRITE_COEF(0x0e, 0x6fc0), /* LDO1/2/3, DAC/ADC */
3473         UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
3474         UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
3475         WRITE_COEF(0x3a, 0x0), /* Class D test 4 */
3476         UPDATE_COEF(0x0c, 0xfe00, 0x0), /* IO power down directly */
3477         WRITE_COEF(0x22, 0xa0c0), /* ANC */
3478         UPDATE_COEFEX(0x53, 0x01, 0x000f, 0x0008), /* AGC MUX */
3479         UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
3480         UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
3481         WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
3482         WRITE_COEF(0x2e, 0x2902), /* PLL */
3483         WRITE_COEF(0x33, 0xa080), /* capless control 2 */
3484         WRITE_COEF(0x34, 0x3400), /* capless control 3 */
3485         WRITE_COEF(0x35, 0x2f3e), /* capless control 4 */
3486         WRITE_COEF(0x36, 0x0), /* capless control 5 */
3487         UPDATE_COEF(0x38, 0x0fff, 0x0900), /* class D test 2 */
3488         WRITE_COEF(0x39, 0x110a), /* class D test 3 */
3489         UPDATE_COEF(0x3b, 0x00f8, 0x00d8), /* class D test 5 */
3490         WRITE_COEF(0x3c, 0x0014), /* class D test 6 */
3491         WRITE_COEF(0x3d, 0xc2ba), /* classD OCP */
3492         UPDATE_COEF(0x42, 0x0f80, 0x0), /* classD pure DC test */
3493         WRITE_COEF(0x49, 0x0), /* test mode */
3494         UPDATE_COEF(0x40, 0xf800, 0x9800), /* Class D DC enable */
3495         UPDATE_COEF(0x42, 0xf000, 0x2000), /* DC offset */
3496         WRITE_COEF(0x37, 0xfc06), /* Class D amp control */
3497         UPDATE_COEF(0x1b, 0x8000, 0), /* HP JD control */
3498         {}
3499 };
3500 
3501 static void alc283_restore_default_value(struct hda_codec *codec)
3502 {
3503         alc_process_coef_fw(codec, alc283_coefs);
3504 }
3505 
3506 static void alc283_init(struct hda_codec *codec)
3507 {
3508         struct alc_spec *spec = codec->spec;
3509         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3510         bool hp_pin_sense;
3511 
3512         alc283_restore_default_value(codec);
3513 
3514         if (!hp_pin)
3515                 return;
3516 
3517         msleep(30);
3518         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3519 
3520         /* Index 0x43 Direct Drive HP AMP LPM Control 1 */
3521         /* Headphone capless set to high power mode */
3522         alc_write_coef_idx(codec, 0x43, 0x9004);
3523 
3524         snd_hda_codec_write(codec, hp_pin, 0,
3525                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3526 
3527         if (hp_pin_sense)
3528                 msleep(85);
3529 
3530         snd_hda_codec_write(codec, hp_pin, 0,
3531                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3532 
3533         if (hp_pin_sense)
3534                 msleep(85);
3535         /* Index 0x46 Combo jack auto switch control 2 */
3536         /* 3k pull low control for Headset jack. */
3537         alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3538         /* Headphone capless set to normal mode */
3539         alc_write_coef_idx(codec, 0x43, 0x9614);
3540 }
3541 
3542 static void alc283_shutup(struct hda_codec *codec)
3543 {
3544         struct alc_spec *spec = codec->spec;
3545         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3546         bool hp_pin_sense;
3547 
3548         if (!hp_pin) {
3549                 alc269_shutup(codec);
3550                 return;
3551         }
3552 
3553         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3554 
3555         alc_write_coef_idx(codec, 0x43, 0x9004);
3556 
3557         /*depop hp during suspend*/
3558         alc_write_coef_idx(codec, 0x06, 0x2100);
3559 
3560         snd_hda_codec_write(codec, hp_pin, 0,
3561                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3562 
3563         if (hp_pin_sense)
3564                 msleep(100);
3565 
3566         if (!spec->no_shutup_pins)
3567                 snd_hda_codec_write(codec, hp_pin, 0,
3568                                     AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3569 
3570         alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
3571 
3572         if (hp_pin_sense)
3573                 msleep(100);
3574         alc_auto_setup_eapd(codec, false);
3575         alc_shutup_pins(codec);
3576         alc_write_coef_idx(codec, 0x43, 0x9614);
3577 }
3578 
3579 static void alc256_init(struct hda_codec *codec)
3580 {
3581         struct alc_spec *spec = codec->spec;
3582         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3583         bool hp_pin_sense;
3584 
3585         if (spec->ultra_low_power) {
3586                 alc_update_coef_idx(codec, 0x03, 1<<1, 1<<1);
3587                 alc_update_coef_idx(codec, 0x08, 3<<2, 3<<2);
3588                 alc_update_coef_idx(codec, 0x08, 7<<4, 0);
3589                 alc_update_coef_idx(codec, 0x3b, 1<<15, 0);
3590                 alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3591                 msleep(30);
3592         }
3593 
3594         if (!hp_pin)
3595                 hp_pin = 0x21;
3596 
3597         msleep(30);
3598 
3599         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3600 
3601         if (hp_pin_sense)
3602                 msleep(2);
3603 
3604         alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3605 
3606         snd_hda_codec_write(codec, hp_pin, 0,
3607                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3608 
3609         if (hp_pin_sense || spec->ultra_low_power)
3610                 msleep(85);
3611 
3612         snd_hda_codec_write(codec, hp_pin, 0,
3613                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3614 
3615         if (hp_pin_sense || spec->ultra_low_power)
3616                 msleep(100);
3617 
3618         alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
3619         alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
3620         alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 1 << 15); /* Clear bit */
3621         alc_update_coefex_idx(codec, 0x53, 0x02, 0x8000, 0 << 15);
3622         /*
3623          * Expose headphone mic (or possibly Line In on some machines) instead
3624          * of PC Beep on 1Ah, and disable 1Ah loopback for all outputs. See
3625          * Documentation/sound/hd-audio/realtek-pc-beep.rst for details of
3626          * this register.
3627          */
3628         alc_write_coef_idx(codec, 0x36, 0x5757);
3629 }
3630 
3631 static void alc256_shutup(struct hda_codec *codec)
3632 {
3633         struct alc_spec *spec = codec->spec;
3634         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3635         bool hp_pin_sense;
3636 
3637         if (!hp_pin)
3638                 hp_pin = 0x21;
3639 
3640         alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3641         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3642 
3643         if (hp_pin_sense)
3644                 msleep(2);
3645 
3646         snd_hda_codec_write(codec, hp_pin, 0,
3647                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3648 
3649         if (hp_pin_sense || spec->ultra_low_power)
3650                 msleep(85);
3651 
3652         /* 3k pull low control for Headset jack. */
3653         /* NOTE: call this before clearing the pin, otherwise codec stalls */
3654         /* If disable 3k pulldown control for alc257, the Mic detection will not work correctly
3655          * when booting with headset plugged. So skip setting it for the codec alc257
3656          */
3657         if (spec->en_3kpull_low)
3658                 alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
3659 
3660         if (!spec->no_shutup_pins)
3661                 snd_hda_codec_write(codec, hp_pin, 0,
3662                                     AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3663 
3664         if (hp_pin_sense || spec->ultra_low_power)
3665                 msleep(100);
3666 
3667         alc_auto_setup_eapd(codec, false);
3668         alc_shutup_pins(codec);
3669         if (spec->ultra_low_power) {
3670                 msleep(50);
3671                 alc_update_coef_idx(codec, 0x03, 1<<1, 0);
3672                 alc_update_coef_idx(codec, 0x08, 7<<4, 7<<4);
3673                 alc_update_coef_idx(codec, 0x08, 3<<2, 0);
3674                 alc_update_coef_idx(codec, 0x3b, 1<<15, 1<<15);
3675                 alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3676                 msleep(30);
3677         }
3678 }
3679 
3680 static void alc285_hp_init(struct hda_codec *codec)
3681 {
3682         struct alc_spec *spec = codec->spec;
3683         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3684         int i, val;
3685         int coef38, coef0d, coef36;
3686 
3687         alc_write_coefex_idx(codec, 0x58, 0x00, 0x1888); /* write default value */
3688         alc_update_coef_idx(codec, 0x4a, 1<<15, 1<<15); /* Reset HP JD */
3689         coef38 = alc_read_coef_idx(codec, 0x38); /* Amp control */
3690         coef0d = alc_read_coef_idx(codec, 0x0d); /* Digital Misc control */
3691         coef36 = alc_read_coef_idx(codec, 0x36); /* Passthrough Control */
3692         alc_update_coef_idx(codec, 0x38, 1<<4, 0x0);
3693         alc_update_coef_idx(codec, 0x0d, 0x110, 0x0);
3694 
3695         alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
3696 
3697         if (hp_pin)
3698                 snd_hda_codec_write(codec, hp_pin, 0,
3699                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3700 
3701         msleep(130);
3702         alc_update_coef_idx(codec, 0x36, 1<<14, 1<<14);
3703         alc_update_coef_idx(codec, 0x36, 1<<13, 0x0);
3704 
3705         if (hp_pin)
3706                 snd_hda_codec_write(codec, hp_pin, 0,
3707                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3708         msleep(10);
3709         alc_write_coef_idx(codec, 0x67, 0x0); /* Set HP depop to manual mode */
3710         alc_write_coefex_idx(codec, 0x58, 0x00, 0x7880);
3711         alc_write_coefex_idx(codec, 0x58, 0x0f, 0xf049);
3712         alc_update_coefex_idx(codec, 0x58, 0x03, 0x00f0, 0x00c0);
3713 
3714         alc_write_coefex_idx(codec, 0x58, 0x00, 0xf888); /* HP depop procedure start */
3715         val = alc_read_coefex_idx(codec, 0x58, 0x00);
3716         for (i = 0; i < 20 && val & 0x8000; i++) {
3717                 msleep(50);
3718                 val = alc_read_coefex_idx(codec, 0x58, 0x00);
3719         } /* Wait for depop procedure finish  */
3720 
3721         alc_write_coefex_idx(codec, 0x58, 0x00, val); /* write back the result */
3722         alc_update_coef_idx(codec, 0x38, 1<<4, coef38);
3723         alc_update_coef_idx(codec, 0x0d, 0x110, coef0d);
3724         alc_update_coef_idx(codec, 0x36, 3<<13, coef36);
3725 
3726         msleep(50);
3727         alc_update_coef_idx(codec, 0x4a, 1<<15, 0);
3728 }
3729 
3730 static void alc225_init(struct hda_codec *codec)
3731 {
3732         struct alc_spec *spec = codec->spec;
3733         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3734         bool hp1_pin_sense, hp2_pin_sense;
3735 
3736         if (spec->ultra_low_power) {
3737                 alc_update_coef_idx(codec, 0x08, 0x0f << 2, 3<<2);
3738                 alc_update_coef_idx(codec, 0x0e, 7<<6, 7<<6);
3739                 alc_update_coef_idx(codec, 0x33, 1<<11, 0);
3740                 msleep(30);
3741         }
3742 
3743         if (spec->codec_variant != ALC269_TYPE_ALC287 &&
3744                 spec->codec_variant != ALC269_TYPE_ALC245)
3745                 /* required only at boot or S3 and S4 resume time */
3746                 if (!spec->done_hp_init ||
3747                         is_s3_resume(codec) ||
3748                         is_s4_resume(codec)) {
3749                         alc285_hp_init(codec);
3750                         spec->done_hp_init = true;
3751                 }
3752 
3753         if (!hp_pin)
3754                 hp_pin = 0x21;
3755         msleep(30);
3756 
3757         hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3758         hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3759 
3760         if (hp1_pin_sense || hp2_pin_sense)
3761                 msleep(2);
3762 
3763         alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x1); /* Low power */
3764 
3765         if (hp1_pin_sense || spec->ultra_low_power)
3766                 snd_hda_codec_write(codec, hp_pin, 0,
3767                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3768         if (hp2_pin_sense)
3769                 snd_hda_codec_write(codec, 0x16, 0,
3770                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3771 
3772         if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3773                 msleep(85);
3774 
3775         if (hp1_pin_sense || spec->ultra_low_power)
3776                 snd_hda_codec_write(codec, hp_pin, 0,
3777                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3778         if (hp2_pin_sense)
3779                 snd_hda_codec_write(codec, 0x16, 0,
3780                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3781 
3782         if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3783                 msleep(100);
3784 
3785         alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3786         alc_update_coefex_idx(codec, 0x57, 0x04, 0x0007, 0x4); /* Hight power */
3787 }
3788 
3789 static void alc225_shutup(struct hda_codec *codec)
3790 {
3791         struct alc_spec *spec = codec->spec;
3792         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3793         bool hp1_pin_sense, hp2_pin_sense;
3794 
3795         if (!hp_pin)
3796                 hp_pin = 0x21;
3797 
3798         alc_disable_headset_jack_key(codec);
3799         /* 3k pull low control for Headset jack. */
3800         alc_update_coef_idx(codec, 0x4a, 0, 3 << 10);
3801 
3802         hp1_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3803         hp2_pin_sense = snd_hda_jack_detect(codec, 0x16);
3804 
3805         if (hp1_pin_sense || hp2_pin_sense)
3806                 msleep(2);
3807 
3808         if (hp1_pin_sense || spec->ultra_low_power)
3809                 snd_hda_codec_write(codec, hp_pin, 0,
3810                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3811         if (hp2_pin_sense)
3812                 snd_hda_codec_write(codec, 0x16, 0,
3813                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3814 
3815         if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3816                 msleep(85);
3817 
3818         if (hp1_pin_sense || spec->ultra_low_power)
3819                 snd_hda_codec_write(codec, hp_pin, 0,
3820                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3821         if (hp2_pin_sense)
3822                 snd_hda_codec_write(codec, 0x16, 0,
3823                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3824 
3825         if (hp1_pin_sense || hp2_pin_sense || spec->ultra_low_power)
3826                 msleep(100);
3827 
3828         alc_auto_setup_eapd(codec, false);
3829         alc_shutup_pins(codec);
3830         if (spec->ultra_low_power) {
3831                 msleep(50);
3832                 alc_update_coef_idx(codec, 0x08, 0x0f << 2, 0x0c << 2);
3833                 alc_update_coef_idx(codec, 0x0e, 7<<6, 0);
3834                 alc_update_coef_idx(codec, 0x33, 1<<11, 1<<11);
3835                 alc_update_coef_idx(codec, 0x4a, 3<<4, 2<<4);
3836                 msleep(30);
3837         }
3838 
3839         alc_update_coef_idx(codec, 0x4a, 3 << 10, 0);
3840         alc_enable_headset_jack_key(codec);
3841 }
3842 
3843 static void alc_default_init(struct hda_codec *codec)
3844 {
3845         struct alc_spec *spec = codec->spec;
3846         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3847         bool hp_pin_sense;
3848 
3849         if (!hp_pin)
3850                 return;
3851 
3852         msleep(30);
3853 
3854         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3855 
3856         if (hp_pin_sense)
3857                 msleep(2);
3858 
3859         snd_hda_codec_write(codec, hp_pin, 0,
3860                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3861 
3862         if (hp_pin_sense)
3863                 msleep(85);
3864 
3865         snd_hda_codec_write(codec, hp_pin, 0,
3866                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
3867 
3868         if (hp_pin_sense)
3869                 msleep(100);
3870 }
3871 
3872 static void alc_default_shutup(struct hda_codec *codec)
3873 {
3874         struct alc_spec *spec = codec->spec;
3875         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3876         bool hp_pin_sense;
3877 
3878         if (!hp_pin) {
3879                 alc269_shutup(codec);
3880                 return;
3881         }
3882 
3883         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3884 
3885         if (hp_pin_sense)
3886                 msleep(2);
3887 
3888         snd_hda_codec_write(codec, hp_pin, 0,
3889                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3890 
3891         if (hp_pin_sense)
3892                 msleep(85);
3893 
3894         if (!spec->no_shutup_pins)
3895                 snd_hda_codec_write(codec, hp_pin, 0,
3896                                     AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3897 
3898         if (hp_pin_sense)
3899                 msleep(100);
3900 
3901         alc_auto_setup_eapd(codec, false);
3902         alc_shutup_pins(codec);
3903 }
3904 
3905 static void alc294_hp_init(struct hda_codec *codec)
3906 {
3907         struct alc_spec *spec = codec->spec;
3908         hda_nid_t hp_pin = alc_get_hp_pin(spec);
3909         int i, val;
3910 
3911         if (!hp_pin)
3912                 return;
3913 
3914         snd_hda_codec_write(codec, hp_pin, 0,
3915                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3916 
3917         msleep(100);
3918 
3919         if (!spec->no_shutup_pins)
3920                 snd_hda_codec_write(codec, hp_pin, 0,
3921                                     AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3922 
3923         alc_update_coef_idx(codec, 0x6f, 0x000f, 0);/* Set HP depop to manual mode */
3924         alc_update_coefex_idx(codec, 0x58, 0x00, 0x8000, 0x8000); /* HP depop procedure start */
3925 
3926         /* Wait for depop procedure finish  */
3927         val = alc_read_coefex_idx(codec, 0x58, 0x01);
3928         for (i = 0; i < 20 && val & 0x0080; i++) {
3929                 msleep(50);
3930                 val = alc_read_coefex_idx(codec, 0x58, 0x01);
3931         }
3932         /* Set HP depop to auto mode */
3933         alc_update_coef_idx(codec, 0x6f, 0x000f, 0x000b);
3934         msleep(50);
3935 }
3936 
3937 static void alc294_init(struct hda_codec *codec)
3938 {
3939         struct alc_spec *spec = codec->spec;
3940 
3941         /* required only at boot or S4 resume time */
3942         if (!spec->done_hp_init ||
3943             codec->core.dev.power.power_state.event == PM_EVENT_RESTORE) {
3944                 alc294_hp_init(codec);
3945                 spec->done_hp_init = true;
3946         }
3947         alc_default_init(codec);
3948 }
3949 
3950 static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg,
3951                              unsigned int val)
3952 {
3953         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3954         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val & 0xffff); /* LSB */
3955         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val >> 16); /* MSB */
3956 }
3957 
3958 static int alc5505_coef_get(struct hda_codec *codec, unsigned int index_reg)
3959 {
3960         unsigned int val;
3961 
3962         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3963         val = snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3964                 & 0xffff;
3965         val |= snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3966                 << 16;
3967         return val;
3968 }
3969 
3970 static void alc5505_dsp_halt(struct hda_codec *codec)
3971 {
3972         unsigned int val;
3973 
3974         alc5505_coef_set(codec, 0x3000, 0x000c); /* DSP CPU stop */
3975         alc5505_coef_set(codec, 0x880c, 0x0008); /* DDR enter self refresh */
3976         alc5505_coef_set(codec, 0x61c0, 0x11110080); /* Clock control for PLL and CPU */
3977         alc5505_coef_set(codec, 0x6230, 0xfc0d4011); /* Disable Input OP */
3978         alc5505_coef_set(codec, 0x61b4, 0x040a2b03); /* Stop PLL2 */
3979         alc5505_coef_set(codec, 0x61b0, 0x00005b17); /* Stop PLL1 */
3980         alc5505_coef_set(codec, 0x61b8, 0x04133303); /* Stop PLL3 */
3981         val = alc5505_coef_get(codec, 0x6220);
3982         alc5505_coef_set(codec, 0x6220, (val | 0x3000)); /* switch Ringbuffer clock to DBUS clock */
3983 }
3984 
3985 static void alc5505_dsp_back_from_halt(struct hda_codec *codec)
3986 {
3987         alc5505_coef_set(codec, 0x61b8, 0x04133302);
3988         alc5505_coef_set(codec, 0x61b0, 0x00005b16);
3989         alc5505_coef_set(codec, 0x61b4, 0x040a2b02);
3990         alc5505_coef_set(codec, 0x6230, 0xf80d4011);
3991         alc5505_coef_set(codec, 0x6220, 0x2002010f);
3992         alc5505_coef_set(codec, 0x880c, 0x00000004);
3993 }
3994 
3995 static void alc5505_dsp_init(struct hda_codec *codec)
3996 {
3997         unsigned int val;
3998 
3999         alc5505_dsp_halt(codec);
4000         alc5505_dsp_back_from_halt(codec);
4001         alc5505_coef_set(codec, 0x61b0, 0x5b14); /* PLL1 control */
4002         alc5505_coef_set(codec, 0x61b0, 0x5b16);
4003         alc5505_coef_set(codec, 0x61b4, 0x04132b00); /* PLL2 control */
4004         alc5505_coef_set(codec, 0x61b4, 0x04132b02);
4005         alc5505_coef_set(codec, 0x61b8, 0x041f3300); /* PLL3 control*/
4006         alc5505_coef_set(codec, 0x61b8, 0x041f3302);
4007         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_CODEC_RESET, 0); /* Function reset */
4008         alc5505_coef_set(codec, 0x61b8, 0x041b3302);
4009         alc5505_coef_set(codec, 0x61b8, 0x04173302);
4010         alc5505_coef_set(codec, 0x61b8, 0x04163302);
4011         alc5505_coef_set(codec, 0x8800, 0x348b328b); /* DRAM control */
4012         alc5505_coef_set(codec, 0x8808, 0x00020022); /* DRAM control */
4013         alc5505_coef_set(codec, 0x8818, 0x00000400); /* DRAM control */
4014 
4015         val = alc5505_coef_get(codec, 0x6200) >> 16; /* Read revision ID */
4016         if (val <= 3)
4017                 alc5505_coef_set(codec, 0x6220, 0x2002010f); /* I/O PAD Configuration */
4018         else
4019                 alc5505_coef_set(codec, 0x6220, 0x6002018f);
4020 
4021         alc5505_coef_set(codec, 0x61ac, 0x055525f0); /**/
4022         alc5505_coef_set(codec, 0x61c0, 0x12230080); /* Clock control */
4023         alc5505_coef_set(codec, 0x61b4, 0x040e2b02); /* PLL2 control */
4024         alc5505_coef_set(codec, 0x61bc, 0x010234f8); /* OSC Control */
4025         alc5505_coef_set(codec, 0x880c, 0x00000004); /* DRAM Function control */
4026         alc5505_coef_set(codec, 0x880c, 0x00000003);
4027         alc5505_coef_set(codec, 0x880c, 0x00000010);
4028 
4029 #ifdef HALT_REALTEK_ALC5505
4030         alc5505_dsp_halt(codec);
4031 #endif
4032 }
4033 
4034 #ifdef HALT_REALTEK_ALC5505
4035 #define alc5505_dsp_suspend(codec)      do { } while (0) /* NOP */
4036 #define alc5505_dsp_resume(codec)       do { } while (0) /* NOP */
4037 #else
4038 #define alc5505_dsp_suspend(codec)      alc5505_dsp_halt(codec)
4039 #define alc5505_dsp_resume(codec)       alc5505_dsp_back_from_halt(codec)
4040 #endif
4041 
4042 static int alc269_suspend(struct hda_codec *codec)
4043 {
4044         struct alc_spec *spec = codec->spec;
4045 
4046         if (spec->has_alc5505_dsp)
4047                 alc5505_dsp_suspend(codec);
4048 
4049         return alc_suspend(codec);
4050 }
4051 
4052 static int alc269_resume(struct hda_codec *codec)
4053 {
4054         struct alc_spec *spec = codec->spec;
4055 
4056         if (spec->codec_variant == ALC269_TYPE_ALC269VB)
4057                 alc269vb_toggle_power_output(codec, 0);
4058         if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
4059                         (alc_get_coef0(codec) & 0x00ff) == 0x018) {
4060                 msleep(150);
4061         }
4062 
4063         codec->patch_ops.init(codec);
4064 
4065         if (spec->codec_variant == ALC269_TYPE_ALC269VB)
4066                 alc269vb_toggle_power_output(codec, 1);
4067         if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
4068                         (alc_get_coef0(codec) & 0x00ff) == 0x017) {
4069                 msleep(200);
4070         }
4071 
4072         snd_hda_regmap_sync(codec);
4073         hda_call_check_power_status(codec, 0x01);
4074 
4075         /* on some machine, the BIOS will clear the codec gpio data when enter
4076          * suspend, and won't restore the data after resume, so we restore it
4077          * in the driver.
4078          */
4079         if (spec->gpio_data)
4080                 alc_write_gpio_data(codec);
4081 
4082         if (spec->has_alc5505_dsp)
4083                 alc5505_dsp_resume(codec);
4084 
4085         return 0;
4086 }
4087 
4088 static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,
4089                                                  const struct hda_fixup *fix, int action)
4090 {
4091         struct alc_spec *spec = codec->spec;
4092 
4093         if (action == HDA_FIXUP_ACT_PRE_PROBE)
4094                 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
4095 }
4096 
4097 static void alc269_fixup_pincfg_U7x7_headset_mic(struct hda_codec *codec,
4098                                                  const struct hda_fixup *fix,
4099                                                  int action)
4100 {
4101         unsigned int cfg_headphone = snd_hda_codec_get_pincfg(codec, 0x21);
4102         unsigned int cfg_headset_mic = snd_hda_codec_get_pincfg(codec, 0x19);
4103 
4104         if (cfg_headphone && cfg_headset_mic == 0x411111f0)
4105                 snd_hda_codec_set_pincfg(codec, 0x19,
4106                         (cfg_headphone & ~AC_DEFCFG_DEVICE) |
4107                         (AC_JACK_MIC_IN << AC_DEFCFG_DEVICE_SHIFT));
4108 }
4109 
4110 static void alc269_fixup_hweq(struct hda_codec *codec,
4111                                const struct hda_fixup *fix, int action)
4112 {
4113         if (action == HDA_FIXUP_ACT_INIT)
4114                 alc_update_coef_idx(codec, 0x1e, 0, 0x80);
4115 }
4116 
4117 static void alc269_fixup_headset_mic(struct hda_codec *codec,
4118                                        const struct hda_fixup *fix, int action)
4119 {
4120         struct alc_spec *spec = codec->spec;
4121 
4122         if (action == HDA_FIXUP_ACT_PRE_PROBE)
4123                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4124 }
4125 
4126 static void alc271_fixup_dmic(struct hda_codec *codec,
4127                               const struct hda_fixup *fix, int action)
4128 {
4129         static const struct hda_verb verbs[] = {
4130                 {0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
4131                 {0x20, AC_VERB_SET_PROC_COEF, 0x4000},
4132                 {}
4133         };
4134         unsigned int cfg;
4135 
4136         if (strcmp(codec->core.chip_name, "ALC271X") &&
4137             strcmp(codec->core.chip_name, "ALC269VB"))
4138                 return;
4139         cfg = snd_hda_codec_get_pincfg(codec, 0x12);
4140         if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
4141                 snd_hda_sequence_write(codec, verbs);
4142 }
4143 
4144 /* Fix the speaker amp after resume, etc */
4145 static void alc269vb_fixup_aspire_e1_coef(struct hda_codec *codec,
4146                                           const struct hda_fixup *fix,
4147                                           int action)
4148 {
4149         if (action == HDA_FIXUP_ACT_INIT)
4150                 alc_update_coef_idx(codec, 0x0d, 0x6000, 0x6000);
4151 }
4152 
4153 static void alc269_fixup_pcm_44k(struct hda_codec *codec,
4154                                  const struct hda_fixup *fix, int action)
4155 {
4156         struct alc_spec *spec = codec->spec;
4157 
4158         if (action != HDA_FIXUP_ACT_PROBE)
4159                 return;
4160 
4161         /* Due to a hardware problem on Lenovo Ideadpad, we need to
4162          * fix the sample rate of analog I/O to 44.1kHz
4163          */
4164         spec->gen.stream_analog_playback = &alc269_44k_pcm_analog_playback;
4165         spec->gen.stream_analog_capture = &alc269_44k_pcm_analog_capture;
4166 }
4167 
4168 static void alc269_fixup_stereo_dmic(struct hda_codec *codec,
4169                                      const struct hda_fixup *fix, int action)
4170 {
4171         /* The digital-mic unit sends PDM (differential signal) instead of
4172          * the standard PCM, thus you can't record a valid mono stream as is.
4173          * Below is a workaround specific to ALC269 to control the dmic
4174          * signal source as mono.
4175          */
4176         if (action == HDA_FIXUP_ACT_INIT)
4177                 alc_update_coef_idx(codec, 0x07, 0, 0x80);
4178 }
4179 
4180 static void alc269_quanta_automute(struct hda_codec *codec)
4181 {
4182         snd_hda_gen_update_outputs(codec);
4183 
4184         alc_write_coef_idx(codec, 0x0c, 0x680);
4185         alc_write_coef_idx(codec, 0x0c, 0x480);
4186 }
4187 
4188 static void alc269_fixup_quanta_mute(struct hda_codec *codec,
4189                                      const struct hda_fixup *fix, int action)
4190 {
4191         struct alc_spec *spec = codec->spec;
4192         if (action != HDA_FIXUP_ACT_PROBE)
4193                 return;
4194         spec->gen.automute_hook = alc269_quanta_automute;
4195 }
4196 
4197 static void alc269_x101_hp_automute_hook(struct hda_codec *codec,
4198                                          struct hda_jack_callback *jack)
4199 {
4200         struct alc_spec *spec = codec->spec;
4201         int vref;
4202         msleep(200);
4203         snd_hda_gen_hp_automute(codec, jack);
4204 
4205         vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
4206         msleep(100);
4207         snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4208                             vref);
4209         msleep(500);
4210         snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4211                             vref);
4212 }
4213 
4214 /*
4215  * Magic sequence to make Huawei Matebook X right speaker working (bko#197801)
4216  */
4217 struct hda_alc298_mbxinit {
4218         unsigned char value_0x23;
4219         unsigned char value_0x25;
4220 };
4221 
4222 static void alc298_huawei_mbx_stereo_seq(struct hda_codec *codec,
4223                                          const struct hda_alc298_mbxinit *initval,
4224                                          bool first)
4225 {
4226         snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x0);
4227         alc_write_coef_idx(codec, 0x26, 0xb000);
4228 
4229         if (first)
4230                 snd_hda_codec_write(codec, 0x21, 0, AC_VERB_GET_PIN_SENSE, 0x0);
4231 
4232         snd_hda_codec_write(codec, 0x6, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
4233         alc_write_coef_idx(codec, 0x26, 0xf000);
4234         alc_write_coef_idx(codec, 0x23, initval->value_0x23);
4235 
4236         if (initval->value_0x23 != 0x1e)
4237                 alc_write_coef_idx(codec, 0x25, initval->value_0x25);
4238 
4239         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
4240         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
4241 }
4242 
4243 static void alc298_fixup_huawei_mbx_stereo(struct hda_codec *codec,
4244                                            const struct hda_fixup *fix,
4245                                            int action)
4246 {
4247         /* Initialization magic */
4248         static const struct hda_alc298_mbxinit dac_init[] = {
4249                 {0x0c, 0x00}, {0x0d, 0x00}, {0x0e, 0x00}, {0x0f, 0x00},
4250                 {0x10, 0x00}, {0x1a, 0x40}, {0x1b, 0x82}, {0x1c, 0x00},
4251                 {0x1d, 0x00}, {0x1e, 0x00}, {0x1f, 0x00},
4252                 {0x20, 0xc2}, {0x21, 0xc8}, {0x22, 0x26}, {0x23, 0x24},
4253                 {0x27, 0xff}, {0x28, 0xff}, {0x29, 0xff}, {0x2a, 0x8f},
4254                 {0x2b, 0x02}, {0x2c, 0x48}, {0x2d, 0x34}, {0x2e, 0x00},
4255                 {0x2f, 0x00},
4256                 {0x30, 0x00}, {0x31, 0x00}, {0x32, 0x00}, {0x33, 0x00},
4257                 {0x34, 0x00}, {0x35, 0x01}, {0x36, 0x93}, {0x37, 0x0c},
4258                 {0x38, 0x00}, {0x39, 0x00}, {0x3a, 0xf8}, {0x38, 0x80},
4259                 {}
4260         };
4261         const struct hda_alc298_mbxinit *seq;
4262 
4263         if (action != HDA_FIXUP_ACT_INIT)
4264                 return;
4265 
4266         /* Start */
4267         snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x00);
4268         snd_hda_codec_write(codec, 0x06, 0, AC_VERB_SET_DIGI_CONVERT_3, 0x80);
4269         alc_write_coef_idx(codec, 0x26, 0xf000);
4270         alc_write_coef_idx(codec, 0x22, 0x31);
4271         alc_write_coef_idx(codec, 0x23, 0x0b);
4272         alc_write_coef_idx(codec, 0x25, 0x00);
4273         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_COEF_INDEX, 0x26);
4274         snd_hda_codec_write(codec, 0x20, 0, AC_VERB_SET_PROC_COEF, 0xb010);
4275 
4276         for (seq = dac_init; seq->value_0x23; seq++)
4277                 alc298_huawei_mbx_stereo_seq(codec, seq, seq == dac_init);
4278 }
4279 
4280 static void alc269_fixup_x101_headset_mic(struct hda_codec *codec,
4281                                      const struct hda_fixup *fix, int action)
4282 {
4283         struct alc_spec *spec = codec->spec;
4284         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4285                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4286                 spec->gen.hp_automute_hook = alc269_x101_hp_automute_hook;
4287         }
4288 }
4289 
4290 static void alc_update_vref_led(struct hda_codec *codec, hda_nid_t pin,
4291                                 bool polarity, bool on)
4292 {
4293         unsigned int pinval;
4294 
4295         if (!pin)
4296                 return;
4297         if (polarity)
4298                 on = !on;
4299         pinval = snd_hda_codec_get_pin_target(codec, pin);
4300         pinval &= ~AC_PINCTL_VREFEN;
4301         pinval |= on ? AC_PINCTL_VREF_80 : AC_PINCTL_VREF_HIZ;
4302         /* temporarily power up/down for setting VREF */
4303         snd_hda_power_up_pm(codec);
4304         snd_hda_set_pin_ctl_cache(codec, pin, pinval);
4305         snd_hda_power_down_pm(codec);
4306 }
4307 
4308 /* update mute-LED according to the speaker mute state via mic VREF pin */
4309 static int vref_mute_led_set(struct led_classdev *led_cdev,
4310                              enum led_brightness brightness)
4311 {
4312         struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4313         struct alc_spec *spec = codec->spec;
4314 
4315         alc_update_vref_led(codec, spec->mute_led_nid,
4316                             spec->mute_led_polarity, brightness);
4317         return 0;
4318 }
4319 
4320 /* Make sure the led works even in runtime suspend */
4321 static unsigned int led_power_filter(struct hda_codec *codec,
4322                                                   hda_nid_t nid,
4323                                                   unsigned int power_state)
4324 {
4325         struct alc_spec *spec = codec->spec;
4326 
4327         if (power_state != AC_PWRST_D3 || nid == 0 ||
4328             (nid != spec->mute_led_nid && nid != spec->cap_mute_led_nid))
4329                 return power_state;
4330 
4331         /* Set pin ctl again, it might have just been set to 0 */
4332         snd_hda_set_pin_ctl(codec, nid,
4333                             snd_hda_codec_get_pin_target(codec, nid));
4334 
4335         return snd_hda_gen_path_power_filter(codec, nid, power_state);
4336 }
4337 
4338 static void alc269_fixup_hp_mute_led(struct hda_codec *codec,
4339                                      const struct hda_fixup *fix, int action)
4340 {
4341         struct alc_spec *spec = codec->spec;
4342         const struct dmi_device *dev = NULL;
4343 
4344         if (action != HDA_FIXUP_ACT_PRE_PROBE)
4345                 return;
4346 
4347         while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
4348                 int pol, pin;
4349                 if (sscanf(dev->name, "HP_Mute_LED_%d_%x", &pol, &pin) != 2)
4350                         continue;
4351                 if (pin < 0x0a || pin >= 0x10)
4352                         break;
4353                 spec->mute_led_polarity = pol;
4354                 spec->mute_led_nid = pin - 0x0a + 0x18;
4355                 snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
4356                 codec->power_filter = led_power_filter;
4357                 codec_dbg(codec,
4358                           "Detected mute LED for %x:%d\n", spec->mute_led_nid,
4359                            spec->mute_led_polarity);
4360                 break;
4361         }
4362 }
4363 
4364 static void alc269_fixup_hp_mute_led_micx(struct hda_codec *codec,
4365                                           const struct hda_fixup *fix,
4366                                           int action, hda_nid_t pin)
4367 {
4368         struct alc_spec *spec = codec->spec;
4369 
4370         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4371                 spec->mute_led_polarity = 0;
4372                 spec->mute_led_nid = pin;
4373                 snd_hda_gen_add_mute_led_cdev(codec, vref_mute_led_set);
4374                 codec->power_filter = led_power_filter;
4375         }
4376 }
4377 
4378 static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec,
4379                                 const struct hda_fixup *fix, int action)
4380 {
4381         alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x18);
4382 }
4383 
4384 static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,
4385                                 const struct hda_fixup *fix, int action)
4386 {
4387         alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x19);
4388 }
4389 
4390 static void alc269_fixup_hp_mute_led_mic3(struct hda_codec *codec,
4391                                 const struct hda_fixup *fix, int action)
4392 {
4393         alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1b);
4394 }
4395 
4396 /* update LED status via GPIO */
4397 static void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask,
4398                                 int polarity, bool enabled)
4399 {
4400         if (polarity)
4401                 enabled = !enabled;
4402         alc_update_gpio_data(codec, mask, !enabled); /* muted -> LED on */
4403 }
4404 
4405 /* turn on/off mute LED via GPIO per vmaster hook */
4406 static int gpio_mute_led_set(struct led_classdev *led_cdev,
4407                              enum led_brightness brightness)
4408 {
4409         struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4410         struct alc_spec *spec = codec->spec;
4411 
4412         alc_update_gpio_led(codec, spec->gpio_mute_led_mask,
4413                             spec->mute_led_polarity, !brightness);
4414         return 0;
4415 }
4416 
4417 /* turn on/off mic-mute LED via GPIO per capture hook */
4418 static int micmute_led_set(struct led_classdev *led_cdev,
4419                            enum led_brightness brightness)
4420 {
4421         struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4422         struct alc_spec *spec = codec->spec;
4423 
4424         alc_update_gpio_led(codec, spec->gpio_mic_led_mask,
4425                             spec->micmute_led_polarity, !brightness);
4426         return 0;
4427 }
4428 
4429 /* setup mute and mic-mute GPIO bits, add hooks appropriately */
4430 static void alc_fixup_hp_gpio_led(struct hda_codec *codec,
4431                                   int action,
4432                                   unsigned int mute_mask,
4433                                   unsigned int micmute_mask)
4434 {
4435         struct alc_spec *spec = codec->spec;
4436 
4437         alc_fixup_gpio(codec, action, mute_mask | micmute_mask);
4438 
4439         if (action != HDA_FIXUP_ACT_PRE_PROBE)
4440                 return;
4441         if (mute_mask) {
4442                 spec->gpio_mute_led_mask = mute_mask;
4443                 snd_hda_gen_add_mute_led_cdev(codec, gpio_mute_led_set);
4444         }
4445         if (micmute_mask) {
4446                 spec->gpio_mic_led_mask = micmute_mask;
4447                 snd_hda_gen_add_micmute_led_cdev(codec, micmute_led_set);
4448         }
4449 }
4450 
4451 static void alc236_fixup_hp_gpio_led(struct hda_codec *codec,
4452                                 const struct hda_fixup *fix, int action)
4453 {
4454         alc_fixup_hp_gpio_led(codec, action, 0x02, 0x01);
4455 }
4456 
4457 static void alc269_fixup_hp_gpio_led(struct hda_codec *codec,
4458                                 const struct hda_fixup *fix, int action)
4459 {
4460         alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
4461 }
4462 
4463 static void alc285_fixup_hp_gpio_led(struct hda_codec *codec,
4464                                 const struct hda_fixup *fix, int action)
4465 {
4466         alc_fixup_hp_gpio_led(codec, action, 0x04, 0x01);
4467 }
4468 
4469 static void alc286_fixup_hp_gpio_led(struct hda_codec *codec,
4470                                 const struct hda_fixup *fix, int action)
4471 {
4472         alc_fixup_hp_gpio_led(codec, action, 0x02, 0x20);
4473 }
4474 
4475 static void alc287_fixup_hp_gpio_led(struct hda_codec *codec,
4476                                 const struct hda_fixup *fix, int action)
4477 {
4478         alc_fixup_hp_gpio_led(codec, action, 0x10, 0);
4479 }
4480 
4481 static void alc245_fixup_hp_gpio_led(struct hda_codec *codec,
4482                                 const struct hda_fixup *fix, int action)
4483 {
4484         struct alc_spec *spec = codec->spec;
4485 
4486         if (action == HDA_FIXUP_ACT_PRE_PROBE)
4487                 spec->micmute_led_polarity = 1;
4488         alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4489 }
4490 
4491 /* turn on/off mic-mute LED per capture hook via VREF change */
4492 static int vref_micmute_led_set(struct led_classdev *led_cdev,
4493                                 enum led_brightness brightness)
4494 {
4495         struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4496         struct alc_spec *spec = codec->spec;
4497 
4498         alc_update_vref_led(codec, spec->cap_mute_led_nid,
4499                             spec->micmute_led_polarity, brightness);
4500         return 0;
4501 }
4502 
4503 static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec,
4504                                 const struct hda_fixup *fix, int action)
4505 {
4506         struct alc_spec *spec = codec->spec;
4507 
4508         alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
4509         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4510                 /* Like hp_gpio_mic1_led, but also needs GPIO4 low to
4511                  * enable headphone amp
4512                  */
4513                 spec->gpio_mask |= 0x10;
4514                 spec->gpio_dir |= 0x10;
4515                 spec->cap_mute_led_nid = 0x18;
4516                 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4517                 codec->power_filter = led_power_filter;
4518         }
4519 }
4520 
4521 static void alc280_fixup_hp_gpio4(struct hda_codec *codec,
4522                                    const struct hda_fixup *fix, int action)
4523 {
4524         struct alc_spec *spec = codec->spec;
4525 
4526         alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
4527         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4528                 spec->cap_mute_led_nid = 0x18;
4529                 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4530                 codec->power_filter = led_power_filter;
4531         }
4532 }
4533 
4534 /* HP Spectre x360 14 model needs a unique workaround for enabling the amp;
4535  * it needs to toggle the GPIO0 once on and off at each time (bko#210633)
4536  */
4537 static void alc245_fixup_hp_x360_amp(struct hda_codec *codec,
4538                                      const struct hda_fixup *fix, int action)
4539 {
4540         struct alc_spec *spec = codec->spec;
4541 
4542         switch (action) {
4543         case HDA_FIXUP_ACT_PRE_PROBE:
4544                 spec->gpio_mask |= 0x01;
4545                 spec->gpio_dir |= 0x01;
4546                 break;
4547         case HDA_FIXUP_ACT_INIT:
4548                 /* need to toggle GPIO to enable the amp */
4549                 alc_update_gpio_data(codec, 0x01, true);
4550                 msleep(100);
4551                 alc_update_gpio_data(codec, 0x01, false);
4552                 break;
4553         }
4554 }
4555 
4556 /* toggle GPIO2 at each time stream is started; we use PREPARE state instead */
4557 static void alc274_hp_envy_pcm_hook(struct hda_pcm_stream *hinfo,
4558                                     struct hda_codec *codec,
4559                                     struct snd_pcm_substream *substream,
4560                                     int action)
4561 {
4562         switch (action) {
4563         case HDA_GEN_PCM_ACT_PREPARE:
4564                 alc_update_gpio_data(codec, 0x04, true);
4565                 break;
4566         case HDA_GEN_PCM_ACT_CLEANUP:
4567                 alc_update_gpio_data(codec, 0x04, false);
4568                 break;
4569         }
4570 }
4571 
4572 static void alc274_fixup_hp_envy_gpio(struct hda_codec *codec,
4573                                       const struct hda_fixup *fix,
4574                                       int action)
4575 {
4576         struct alc_spec *spec = codec->spec;
4577 
4578         if (action == HDA_FIXUP_ACT_PROBE) {
4579                 spec->gpio_mask |= 0x04;
4580                 spec->gpio_dir |= 0x04;
4581                 spec->gen.pcm_playback_hook = alc274_hp_envy_pcm_hook;
4582         }
4583 }
4584 
4585 static void alc_update_coef_led(struct hda_codec *codec,
4586                                 struct alc_coef_led *led,
4587                                 bool polarity, bool on)
4588 {
4589         if (polarity)
4590                 on = !on;
4591         /* temporarily power up/down for setting COEF bit */
4592         alc_update_coef_idx(codec, led->idx, led->mask,
4593                             on ? led->on : led->off);
4594 }
4595 
4596 /* update mute-LED according to the speaker mute state via COEF bit */
4597 static int coef_mute_led_set(struct led_classdev *led_cdev,
4598                              enum led_brightness brightness)
4599 {
4600         struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4601         struct alc_spec *spec = codec->spec;
4602 
4603         alc_update_coef_led(codec, &spec->mute_led_coef,
4604                             spec->mute_led_polarity, brightness);
4605         return 0;
4606 }
4607 
4608 static void alc285_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4609                                           const struct hda_fixup *fix,
4610                                           int action)
4611 {
4612         struct alc_spec *spec = codec->spec;
4613 
4614         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4615                 spec->mute_led_polarity = 0;
4616                 spec->mute_led_coef.idx = 0x0b;
4617                 spec->mute_led_coef.mask = 1 << 3;
4618                 spec->mute_led_coef.on = 1 << 3;
4619                 spec->mute_led_coef.off = 0;
4620                 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4621         }
4622 }
4623 
4624 static void alc236_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4625                                           const struct hda_fixup *fix,
4626                                           int action)
4627 {
4628         struct alc_spec *spec = codec->spec;
4629 
4630         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4631                 spec->mute_led_polarity = 0;
4632                 spec->mute_led_coef.idx = 0x34;
4633                 spec->mute_led_coef.mask = 1 << 5;
4634                 spec->mute_led_coef.on = 0;
4635                 spec->mute_led_coef.off = 1 << 5;
4636                 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4637         }
4638 }
4639 
4640 static void alc236_fixup_hp_mute_led_coefbit2(struct hda_codec *codec,
4641                                           const struct hda_fixup *fix, int action)
4642 {
4643         struct alc_spec *spec = codec->spec;
4644 
4645         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4646                 spec->mute_led_polarity = 0;
4647                 spec->mute_led_coef.idx = 0x07;
4648                 spec->mute_led_coef.mask = 1;
4649                 spec->mute_led_coef.on = 1;
4650                 spec->mute_led_coef.off = 0;
4651                 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4652         }
4653 }
4654 
4655 static void alc245_fixup_hp_mute_led_coefbit(struct hda_codec *codec,
4656                                           const struct hda_fixup *fix,
4657                                           int action)
4658 {
4659         struct alc_spec *spec = codec->spec;
4660 
4661         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4662                 spec->mute_led_polarity = 0;
4663                 spec->mute_led_coef.idx = 0x0b;
4664                 spec->mute_led_coef.mask = 3 << 2;
4665                 spec->mute_led_coef.on = 2 << 2;
4666                 spec->mute_led_coef.off = 1 << 2;
4667                 snd_hda_gen_add_mute_led_cdev(codec, coef_mute_led_set);
4668         }
4669 }
4670 
4671 /* turn on/off mic-mute LED per capture hook by coef bit */
4672 static int coef_micmute_led_set(struct led_classdev *led_cdev,
4673                                 enum led_brightness brightness)
4674 {
4675         struct hda_codec *codec = dev_to_hda_codec(led_cdev->dev->parent);
4676         struct alc_spec *spec = codec->spec;
4677 
4678         alc_update_coef_led(codec, &spec->mic_led_coef,
4679                             spec->micmute_led_polarity, brightness);
4680         return 0;
4681 }
4682 
4683 static void alc285_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4684                                 const struct hda_fixup *fix, int action)
4685 {
4686         struct alc_spec *spec = codec->spec;
4687 
4688         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4689                 spec->mic_led_coef.idx = 0x19;
4690                 spec->mic_led_coef.mask = 1 << 13;
4691                 spec->mic_led_coef.on = 1 << 13;
4692                 spec->mic_led_coef.off = 0;
4693                 snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
4694         }
4695 }
4696 
4697 static void alc285_fixup_hp_gpio_micmute_led(struct hda_codec *codec,
4698                                 const struct hda_fixup *fix, int action)
4699 {
4700         struct alc_spec *spec = codec->spec;
4701 
4702         if (action == HDA_FIXUP_ACT_PRE_PROBE)
4703                 spec->micmute_led_polarity = 1;
4704         alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4705 }
4706 
4707 static void alc236_fixup_hp_coef_micmute_led(struct hda_codec *codec,
4708                                 const struct hda_fixup *fix, int action)
4709 {
4710         struct alc_spec *spec = codec->spec;
4711 
4712         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4713                 spec->mic_led_coef.idx = 0x35;
4714                 spec->mic_led_coef.mask = 3 << 2;
4715                 spec->mic_led_coef.on = 2 << 2;
4716                 spec->mic_led_coef.off = 1 << 2;
4717                 snd_hda_gen_add_micmute_led_cdev(codec, coef_micmute_led_set);
4718         }
4719 }
4720 
4721 static void alc285_fixup_hp_mute_led(struct hda_codec *codec,
4722                                 const struct hda_fixup *fix, int action)
4723 {
4724         alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
4725         alc285_fixup_hp_coef_micmute_led(codec, fix, action);
4726 }
4727 
4728 static void alc285_fixup_hp_spectre_x360_mute_led(struct hda_codec *codec,
4729                                 const struct hda_fixup *fix, int action)
4730 {
4731         alc285_fixup_hp_mute_led_coefbit(codec, fix, action);
4732         alc285_fixup_hp_gpio_micmute_led(codec, fix, action);
4733 }
4734 
4735 static void alc236_fixup_hp_mute_led(struct hda_codec *codec,
4736                                 const struct hda_fixup *fix, int action)
4737 {
4738         alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
4739         alc236_fixup_hp_coef_micmute_led(codec, fix, action);
4740 }
4741 
4742 static void alc236_fixup_hp_micmute_led_vref(struct hda_codec *codec,
4743                                 const struct hda_fixup *fix, int action)
4744 {
4745         struct alc_spec *spec = codec->spec;
4746 
4747         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4748                 spec->cap_mute_led_nid = 0x1a;
4749                 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4750                 codec->power_filter = led_power_filter;
4751         }
4752 }
4753 
4754 static void alc236_fixup_hp_mute_led_micmute_vref(struct hda_codec *codec,
4755                                 const struct hda_fixup *fix, int action)
4756 {
4757         alc236_fixup_hp_mute_led_coefbit(codec, fix, action);
4758         alc236_fixup_hp_micmute_led_vref(codec, fix, action);
4759 }
4760 
4761 static inline void alc298_samsung_write_coef_pack(struct hda_codec *codec,
4762                                                   const unsigned short coefs[2])
4763 {
4764         alc_write_coef_idx(codec, 0x23, coefs[0]);
4765         alc_write_coef_idx(codec, 0x25, coefs[1]);
4766         alc_write_coef_idx(codec, 0x26, 0xb011);
4767 }
4768 
4769 struct alc298_samsung_amp_desc {
4770         unsigned char nid;
4771         unsigned short init_seq[2][2];
4772 };
4773 
4774 static void alc298_fixup_samsung_amp(struct hda_codec *codec,
4775                                      const struct hda_fixup *fix, int action)
4776 {
4777         int i, j;
4778         static const unsigned short init_seq[][2] = {
4779                 { 0x19, 0x00 }, { 0x20, 0xc0 }, { 0x22, 0x44 }, { 0x23, 0x08 },
4780                 { 0x24, 0x85 }, { 0x25, 0x41 }, { 0x35, 0x40 }, { 0x36, 0x01 },
4781                 { 0x38, 0x81 }, { 0x3a, 0x03 }, { 0x3b, 0x81 }, { 0x40, 0x3e },
4782                 { 0x41, 0x07 }, { 0x400, 0x1 }
4783         };
4784         static const struct alc298_samsung_amp_desc amps[] = {
4785                 { 0x3a, { { 0x18, 0x1 }, { 0x26, 0x0 } } },
4786                 { 0x39, { { 0x18, 0x2 }, { 0x26, 0x1 } } }
4787         };
4788 
4789         if (action != HDA_FIXUP_ACT_INIT)
4790                 return;
4791 
4792         for (i = 0; i < ARRAY_SIZE(amps); i++) {
4793                 alc_write_coef_idx(codec, 0x22, amps[i].nid);
4794 
4795                 for (j = 0; j < ARRAY_SIZE(amps[i].init_seq); j++)
4796                         alc298_samsung_write_coef_pack(codec, amps[i].init_seq[j]);
4797 
4798                 for (j = 0; j < ARRAY_SIZE(init_seq); j++)
4799                         alc298_samsung_write_coef_pack(codec, init_seq[j]);
4800         }
4801 }
4802 
4803 #include "samsung_helper.c"
4804 
4805 #if IS_REACHABLE(CONFIG_INPUT)
4806 static void gpio2_mic_hotkey_event(struct hda_codec *codec,
4807                                    struct hda_jack_callback *event)
4808 {
4809         struct alc_spec *spec = codec->spec;
4810 
4811         /* GPIO2 just toggles on a keypress/keyrelease cycle. Therefore
4812            send both key on and key off event for every interrupt. */
4813         input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1);
4814         input_sync(spec->kb_dev);
4815         input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0);
4816         input_sync(spec->kb_dev);
4817 }
4818 
4819 static int alc_register_micmute_input_device(struct hda_codec *codec)
4820 {
4821         struct alc_spec *spec = codec->spec;
4822         int i;
4823 
4824         spec->kb_dev = input_allocate_device();
4825         if (!spec->kb_dev) {
4826                 codec_err(codec, "Out of memory (input_allocate_device)\n");
4827                 return -ENOMEM;
4828         }
4829 
4830         spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE;
4831 
4832         spec->kb_dev->name = "Microphone Mute Button";
4833         spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);
4834         spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]);
4835         spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map);
4836         spec->kb_dev->keycode = spec->alc_mute_keycode_map;
4837         for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++)
4838                 set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit);
4839 
4840         if (input_register_device(spec->kb_dev)) {
4841                 codec_err(codec, "input_register_device failed\n");
4842                 input_free_device(spec->kb_dev);
4843                 spec->kb_dev = NULL;
4844                 return -ENOMEM;
4845         }
4846 
4847         return 0;
4848 }
4849 
4850 /* GPIO1 = set according to SKU external amp
4851  * GPIO2 = mic mute hotkey
4852  * GPIO3 = mute LED
4853  * GPIO4 = mic mute LED
4854  */
4855 static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
4856                                              const struct hda_fixup *fix, int action)
4857 {
4858         struct alc_spec *spec = codec->spec;
4859 
4860         alc_fixup_hp_gpio_led(codec, action, 0x08, 0x10);
4861         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4862                 spec->init_amp = ALC_INIT_DEFAULT;
4863                 if (alc_register_micmute_input_device(codec) != 0)
4864                         return;
4865 
4866                 spec->gpio_mask |= 0x06;
4867                 spec->gpio_dir |= 0x02;
4868                 spec->gpio_data |= 0x02;
4869                 snd_hda_codec_write_cache(codec, codec->core.afg, 0,
4870                                           AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x04);
4871                 snd_hda_jack_detect_enable_callback(codec, codec->core.afg,
4872                                                     gpio2_mic_hotkey_event);
4873                 return;
4874         }
4875 
4876         if (!spec->kb_dev)
4877                 return;
4878 
4879         switch (action) {
4880         case HDA_FIXUP_ACT_FREE:
4881                 input_unregister_device(spec->kb_dev);
4882                 spec->kb_dev = NULL;
4883         }
4884 }
4885 
4886 /* Line2 = mic mute hotkey
4887  * GPIO2 = mic mute LED
4888  */
4889 static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,
4890                                              const struct hda_fixup *fix, int action)
4891 {
4892         struct alc_spec *spec = codec->spec;
4893 
4894         alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
4895         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4896                 spec->init_amp = ALC_INIT_DEFAULT;
4897                 if (alc_register_micmute_input_device(codec) != 0)
4898                         return;
4899 
4900                 snd_hda_jack_detect_enable_callback(codec, 0x1b,
4901                                                     gpio2_mic_hotkey_event);
4902                 return;
4903         }
4904 
4905         if (!spec->kb_dev)
4906                 return;
4907 
4908         switch (action) {
4909         case HDA_FIXUP_ACT_FREE:
4910                 input_unregister_device(spec->kb_dev);
4911                 spec->kb_dev = NULL;
4912         }
4913 }
4914 #else /* INPUT */
4915 #define alc280_fixup_hp_gpio2_mic_hotkey        NULL
4916 #define alc233_fixup_lenovo_line2_mic_hotkey    NULL
4917 #endif /* INPUT */
4918 
4919 static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,
4920                                 const struct hda_fixup *fix, int action)
4921 {
4922         struct alc_spec *spec = codec->spec;
4923 
4924         alc269_fixup_hp_mute_led_micx(codec, fix, action, 0x1a);
4925         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4926                 spec->cap_mute_led_nid = 0x18;
4927                 snd_hda_gen_add_micmute_led_cdev(codec, vref_micmute_led_set);
4928         }
4929 }
4930 
4931 static const struct coef_fw alc225_pre_hsmode[] = {
4932         UPDATE_COEF(0x4a, 1<<8, 0),
4933         UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
4934         UPDATE_COEF(0x63, 3<<14, 3<<14),
4935         UPDATE_COEF(0x4a, 3<<4, 2<<4),
4936         UPDATE_COEF(0x4a, 3<<10, 3<<10),
4937         UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10),
4938         UPDATE_COEF(0x4a, 3<<10, 0),
4939         {}
4940 };
4941 
4942 static void alc_headset_mode_unplugged(struct hda_codec *codec)
4943 {
4944         struct alc_spec *spec = codec->spec;
4945         static const struct coef_fw coef0255[] = {
4946                 WRITE_COEF(0x1b, 0x0c0b), /* LDO and MISC control */
4947                 WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4948                 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4949                 WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4950                 WRITE_COEFEX(0x57, 0x03, 0x8aa6), /* Direct Drive HP Amp control */
4951                 {}
4952         };
4953         static const struct coef_fw coef0256[] = {
4954                 WRITE_COEF(0x1b, 0x0c4b), /* LDO and MISC control */
4955                 WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
4956                 WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
4957                 WRITE_COEFEX(0x57, 0x03, 0x09a3), /* Direct Drive HP Amp control */
4958                 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
4959                 {}
4960         };
4961         static const struct coef_fw coef0233[] = {
4962                 WRITE_COEF(0x1b, 0x0c0b),
4963                 WRITE_COEF(0x45, 0xc429),
4964                 UPDATE_COEF(0x35, 0x4000, 0),
4965                 WRITE_COEF(0x06, 0x2104),
4966                 WRITE_COEF(0x1a, 0x0001),
4967                 WRITE_COEF(0x26, 0x0004),
4968                 WRITE_COEF(0x32, 0x42a3),
4969                 {}
4970         };
4971         static const struct coef_fw coef0288[] = {
4972                 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
4973                 UPDATE_COEF(0x50, 0x2000, 0x2000),
4974                 UPDATE_COEF(0x56, 0x0006, 0x0006),
4975                 UPDATE_COEF(0x66, 0x0008, 0),
4976                 UPDATE_COEF(0x67, 0x2000, 0),
4977                 {}
4978         };
4979         static const struct coef_fw coef0298[] = {
4980                 UPDATE_COEF(0x19, 0x1300, 0x0300),
4981                 {}
4982         };
4983         static const struct coef_fw coef0292[] = {
4984                 WRITE_COEF(0x76, 0x000e),
4985                 WRITE_COEF(0x6c, 0x2400),
4986                 WRITE_COEF(0x18, 0x7308),
4987                 WRITE_COEF(0x6b, 0xc429),
4988                 {}
4989         };
4990         static const struct coef_fw coef0293[] = {
4991                 UPDATE_COEF(0x10, 7<<8, 6<<8), /* SET Line1 JD to 0 */
4992                 UPDATE_COEFEX(0x57, 0x05, 1<<15|1<<13, 0x0), /* SET charge pump by verb */
4993                 UPDATE_COEFEX(0x57, 0x03, 1<<10, 1<<10), /* SET EN_OSW to 1 */
4994                 UPDATE_COEF(0x1a, 1<<3, 1<<3), /* Combo JD gating with LINE1-VREFO */
4995                 WRITE_COEF(0x45, 0xc429), /* Set to TRS type */
4996                 UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
4997                 {}
4998         };
4999         static const struct coef_fw coef0668[] = {
5000                 WRITE_COEF(0x15, 0x0d40),
5001                 WRITE_COEF(0xb7, 0x802b),
5002                 {}
5003         };
5004         static const struct coef_fw coef0225[] = {
5005                 UPDATE_COEF(0x63, 3<<14, 0),
5006                 {}
5007         };
5008         static const struct coef_fw coef0274[] = {
5009                 UPDATE_COEF(0x4a, 0x0100, 0),
5010                 UPDATE_COEFEX(0x57, 0x05, 0x4000, 0),
5011                 UPDATE_COEF(0x6b, 0xf000, 0x5000),
5012                 UPDATE_COEF(0x4a, 0x0010, 0),
5013                 UPDATE_COEF(0x4a, 0x0c00, 0x0c00),
5014                 WRITE_COEF(0x45, 0x5289),
5015                 UPDATE_COEF(0x4a, 0x0c00, 0),
5016                 {}
5017         };
5018 
5019         if (spec->no_internal_mic_pin) {
5020                 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
5021                 return;
5022         }
5023 
5024         switch (codec->core.vendor_id) {
5025         case 0x10ec0255:
5026                 alc_process_coef_fw(codec, coef0255);
5027                 break;
5028         case 0x10ec0230:
5029         case 0x10ec0236:
5030         case 0x10ec0256:
5031         case 0x19e58326:
5032                 alc_process_coef_fw(codec, coef0256);
5033                 break;
5034         case 0x10ec0234:
5035         case 0x10ec0274:
5036         case 0x10ec0294:
5037                 alc_process_coef_fw(codec, coef0274);
5038                 break;
5039         case 0x10ec0233:
5040         case 0x10ec0283:
5041                 alc_process_coef_fw(codec, coef0233);
5042                 break;
5043         case 0x10ec0286:
5044         case 0x10ec0288:
5045                 alc_process_coef_fw(codec, coef0288);
5046                 break;
5047         case 0x10ec0298:
5048                 alc_process_coef_fw(codec, coef0298);
5049                 alc_process_coef_fw(codec, coef0288);
5050                 break;
5051         case 0x10ec0292:
5052                 alc_process_coef_fw(codec, coef0292);
5053                 break;
5054         case 0x10ec0293:
5055                 alc_process_coef_fw(codec, coef0293);
5056                 break;
5057         case 0x10ec0668:
5058                 alc_process_coef_fw(codec, coef0668);
5059                 break;
5060         case 0x10ec0215:
5061         case 0x10ec0225:
5062         case 0x10ec0285:
5063         case 0x10ec0295:
5064         case 0x10ec0289:
5065         case 0x10ec0299:
5066                 alc_process_coef_fw(codec, alc225_pre_hsmode);
5067                 alc_process_coef_fw(codec, coef0225);
5068                 break;
5069         case 0x10ec0867:
5070                 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5071                 break;
5072         }
5073         codec_dbg(codec, "Headset jack set to unplugged mode.\n");
5074 }
5075 
5076 
5077 static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
5078                                     hda_nid_t mic_pin)
5079 {
5080         static const struct coef_fw coef0255[] = {
5081                 WRITE_COEFEX(0x57, 0x03, 0x8aa6),
5082                 WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
5083                 {}
5084         };
5085         static const struct coef_fw coef0256[] = {
5086                 UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14), /* Direct Drive HP Amp control(Set to verb control)*/
5087                 WRITE_COEFEX(0x57, 0x03, 0x09a3),
5088                 WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
5089                 {}
5090         };
5091         static const struct coef_fw coef0233[] = {
5092                 UPDATE_COEF(0x35, 0, 1<<14),
5093                 WRITE_COEF(0x06, 0x2100),
5094                 WRITE_COEF(0x1a, 0x0021),
5095                 WRITE_COEF(0x26, 0x008c),
5096                 {}
5097         };
5098         static const struct coef_fw coef0288[] = {
5099                 UPDATE_COEF(0x4f, 0x00c0, 0),
5100                 UPDATE_COEF(0x50, 0x2000, 0),
5101                 UPDATE_COEF(0x56, 0x0006, 0),
5102                 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
5103                 UPDATE_COEF(0x66, 0x0008, 0x0008),
5104                 UPDATE_COEF(0x67, 0x2000, 0x2000),
5105                 {}
5106         };
5107         static const struct coef_fw coef0292[] = {
5108                 WRITE_COEF(0x19, 0xa208),
5109                 WRITE_COEF(0x2e, 0xacf0),
5110                 {}
5111         };
5112         static const struct coef_fw coef0293[] = {
5113                 UPDATE_COEFEX(0x57, 0x05, 0, 1<<15|1<<13), /* SET charge pump by verb */
5114                 UPDATE_COEFEX(0x57, 0x03, 1<<10, 0), /* SET EN_OSW to 0 */
5115                 UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
5116                 {}
5117         };
5118         static const struct coef_fw coef0688[] = {
5119                 WRITE_COEF(0xb7, 0x802b),
5120                 WRITE_COEF(0xb5, 0x1040),
5121                 UPDATE_COEF(0xc3, 0, 1<<12),
5122                 {}
5123         };
5124         static const struct coef_fw coef0225[] = {
5125                 UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14),
5126                 UPDATE_COEF(0x4a, 3<<4, 2<<4),
5127                 UPDATE_COEF(0x63, 3<<14, 0),
5128                 {}
5129         };
5130         static const struct coef_fw coef0274[] = {
5131                 UPDATE_COEFEX(0x57, 0x05, 0x4000, 0x4000),
5132                 UPDATE_COEF(0x4a, 0x0010, 0),
5133                 UPDATE_COEF(0x6b, 0xf000, 0),
5134                 {}
5135         };
5136 
5137         switch (codec->core.vendor_id) {
5138         case 0x10ec0255:
5139                 alc_write_coef_idx(codec, 0x45, 0xc489);
5140                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5141                 alc_process_coef_fw(codec, coef0255);
5142                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5143                 break;
5144         case 0x10ec0230:
5145         case 0x10ec0236:
5146         case 0x10ec0256:
5147         case 0x19e58326:
5148                 alc_write_coef_idx(codec, 0x45, 0xc489);
5149                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5150                 alc_process_coef_fw(codec, coef0256);
5151                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5152                 break;
5153         case 0x10ec0234:
5154         case 0x10ec0274:
5155         case 0x10ec0294:
5156                 alc_write_coef_idx(codec, 0x45, 0x4689);
5157                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5158                 alc_process_coef_fw(codec, coef0274);
5159                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5160                 break;
5161         case 0x10ec0233:
5162         case 0x10ec0283:
5163                 alc_write_coef_idx(codec, 0x45, 0xc429);
5164                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5165                 alc_process_coef_fw(codec, coef0233);
5166                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5167                 break;
5168         case 0x10ec0286:
5169         case 0x10ec0288:
5170         case 0x10ec0298:
5171                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5172                 alc_process_coef_fw(codec, coef0288);
5173                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5174                 break;
5175         case 0x10ec0292:
5176                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5177                 alc_process_coef_fw(codec, coef0292);
5178                 break;
5179         case 0x10ec0293:
5180                 /* Set to TRS mode */
5181                 alc_write_coef_idx(codec, 0x45, 0xc429);
5182                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5183                 alc_process_coef_fw(codec, coef0293);
5184                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5185                 break;
5186         case 0x10ec0867:
5187                 alc_update_coefex_idx(codec, 0x57, 0x5, 0, 1<<14);
5188                 fallthrough;
5189         case 0x10ec0221:
5190         case 0x10ec0662:
5191                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5192                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5193                 break;
5194         case 0x10ec0668:
5195                 alc_write_coef_idx(codec, 0x11, 0x0001);
5196                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5197                 alc_process_coef_fw(codec, coef0688);
5198                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5199                 break;
5200         case 0x10ec0215:
5201         case 0x10ec0225:
5202         case 0x10ec0285:
5203         case 0x10ec0295:
5204         case 0x10ec0289:
5205         case 0x10ec0299:
5206                 alc_process_coef_fw(codec, alc225_pre_hsmode);
5207                 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x31<<10);
5208                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
5209                 alc_process_coef_fw(codec, coef0225);
5210                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
5211                 break;
5212         }
5213         codec_dbg(codec, "Headset jack set to mic-in mode.\n");
5214 }
5215 
5216 static void alc_headset_mode_default(struct hda_codec *codec)
5217 {
5218         static const struct coef_fw coef0225[] = {
5219                 UPDATE_COEF(0x45, 0x3f<<10, 0x30<<10),
5220                 UPDATE_COEF(0x45, 0x3f<<10, 0x31<<10),
5221                 UPDATE_COEF(0x49, 3<<8, 0<<8),
5222                 UPDATE_COEF(0x4a, 3<<4, 3<<4),
5223                 UPDATE_COEF(0x63, 3<<14, 0),
5224                 UPDATE_COEF(0x67, 0xf000, 0x3000),
5225                 {}
5226         };
5227         static const struct coef_fw coef0255[] = {
5228                 WRITE_COEF(0x45, 0xc089),
5229                 WRITE_COEF(0x45, 0xc489),
5230                 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5231                 WRITE_COEF(0x49, 0x0049),
5232                 {}
5233         };
5234         static const struct coef_fw coef0256[] = {
5235                 WRITE_COEF(0x45, 0xc489),
5236                 WRITE_COEFEX(0x57, 0x03, 0x0da3),
5237                 WRITE_COEF(0x49, 0x0049),
5238                 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
5239                 WRITE_COEF(0x06, 0x6100),
5240                 {}
5241         };
5242         static const struct coef_fw coef0233[] = {
5243                 WRITE_COEF(0x06, 0x2100),
5244                 WRITE_COEF(0x32, 0x4ea3),
5245                 {}
5246         };
5247         static const struct coef_fw coef0288[] = {
5248                 UPDATE_COEF(0x4f, 0xfcc0, 0xc400), /* Set to TRS type */
5249                 UPDATE_COEF(0x50, 0x2000, 0x2000),
5250                 UPDATE_COEF(0x56, 0x0006, 0x0006),
5251                 UPDATE_COEF(0x66, 0x0008, 0),
5252                 UPDATE_COEF(0x67, 0x2000, 0),
5253                 {}
5254         };
5255         static const struct coef_fw coef0292[] = {
5256                 WRITE_COEF(0x76, 0x000e),
5257                 WRITE_COEF(0x6c, 0x2400),
5258                 WRITE_COEF(0x6b, 0xc429),
5259                 WRITE_COEF(0x18, 0x7308),
5260                 {}
5261         };
5262         static const struct coef_fw coef0293[] = {
5263                 UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
5264                 WRITE_COEF(0x45, 0xC429), /* Set to TRS type */
5265                 UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
5266                 {}
5267         };
5268         static const struct coef_fw coef0688[] = {
5269                 WRITE_COEF(0x11, 0x0041),
5270                 WRITE_COEF(0x15, 0x0d40),
5271                 WRITE_COEF(0xb7, 0x802b),
5272                 {}
5273         };
5274         static const struct coef_fw coef0274[] = {
5275                 WRITE_COEF(0x45, 0x4289),
5276                 UPDATE_COEF(0x4a, 0x0010, 0x0010),
5277                 UPDATE_COEF(0x6b, 0x0f00, 0),
5278                 UPDATE_COEF(0x49, 0x0300, 0x0300),
5279                 {}
5280         };
5281 
5282         switch (codec->core.vendor_id) {
5283         case 0x10ec0215:
5284         case 0x10ec0225:
5285         case 0x10ec0285:
5286         case 0x10ec0295:
5287         case 0x10ec0289:
5288         case 0x10ec0299:
5289                 alc_process_coef_fw(codec, alc225_pre_hsmode);
5290                 alc_process_coef_fw(codec, coef0225);
5291                 break;
5292         case 0x10ec0255:
5293                 alc_process_coef_fw(codec, coef0255);
5294                 break;
5295         case 0x10ec0230:
5296         case 0x10ec0236:
5297         case 0x10ec0256:
5298         case 0x19e58326:
5299                 alc_write_coef_idx(codec, 0x1b, 0x0e4b);
5300                 alc_write_coef_idx(codec, 0x45, 0xc089);
5301                 msleep(50);
5302                 alc_process_coef_fw(codec, coef0256);
5303                 break;
5304         case 0x10ec0234:
5305         case 0x10ec0274:
5306         case 0x10ec0294:
5307                 alc_process_coef_fw(codec, coef0274);
5308                 break;
5309         case 0x10ec0233:
5310         case 0x10ec0283:
5311                 alc_process_coef_fw(codec, coef0233);
5312                 break;
5313         case 0x10ec0286:
5314         case 0x10ec0288:
5315         case 0x10ec0298:
5316                 alc_process_coef_fw(codec, coef0288);
5317                 break;
5318         case 0x10ec0292:
5319                 alc_process_coef_fw(codec, coef0292);
5320                 break;
5321         case 0x10ec0293:
5322                 alc_process_coef_fw(codec, coef0293);
5323                 break;
5324         case 0x10ec0668:
5325                 alc_process_coef_fw(codec, coef0688);
5326                 break;
5327         case 0x10ec0867:
5328                 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5329                 break;
5330         }
5331         codec_dbg(codec, "Headset jack set to headphone (default) mode.\n");
5332 }
5333 
5334 /* Iphone type */
5335 static void alc_headset_mode_ctia(struct hda_codec *codec)
5336 {
5337         int val;
5338 
5339         static const struct coef_fw coef0255[] = {
5340                 WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
5341                 WRITE_COEF(0x1b, 0x0c2b),
5342                 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5343                 {}
5344         };
5345         static const struct coef_fw coef0256[] = {
5346                 WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
5347                 WRITE_COEF(0x1b, 0x0e6b),
5348                 {}
5349         };
5350         static const struct coef_fw coef0233[] = {
5351                 WRITE_COEF(0x45, 0xd429),
5352                 WRITE_COEF(0x1b, 0x0c2b),
5353                 WRITE_COEF(0x32, 0x4ea3),
5354                 {}
5355         };
5356         static const struct coef_fw coef0288[] = {
5357                 UPDATE_COEF(0x50, 0x2000, 0x2000),
5358                 UPDATE_COEF(0x56, 0x0006, 0x0006),
5359                 UPDATE_COEF(0x66, 0x0008, 0),
5360                 UPDATE_COEF(0x67, 0x2000, 0),
5361                 {}
5362         };
5363         static const struct coef_fw coef0292[] = {
5364                 WRITE_COEF(0x6b, 0xd429),
5365                 WRITE_COEF(0x76, 0x0008),
5366                 WRITE_COEF(0x18, 0x7388),
5367                 {}
5368         };
5369         static const struct coef_fw coef0293[] = {
5370                 WRITE_COEF(0x45, 0xd429), /* Set to ctia type */
5371                 UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
5372                 {}
5373         };
5374         static const struct coef_fw coef0688[] = {
5375                 WRITE_COEF(0x11, 0x0001),
5376                 WRITE_COEF(0x15, 0x0d60),
5377                 WRITE_COEF(0xc3, 0x0000),
5378                 {}
5379         };
5380         static const struct coef_fw coef0225_1[] = {
5381                 UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
5382                 UPDATE_COEF(0x63, 3<<14, 2<<14),
5383                 {}
5384         };
5385         static const struct coef_fw coef0225_2[] = {
5386                 UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
5387                 UPDATE_COEF(0x63, 3<<14, 1<<14),
5388                 {}
5389         };
5390 
5391         switch (codec->core.vendor_id) {
5392         case 0x10ec0255:
5393                 alc_process_coef_fw(codec, coef0255);
5394                 break;
5395         case 0x10ec0230:
5396         case 0x10ec0236:
5397         case 0x10ec0256:
5398         case 0x19e58326:
5399                 alc_process_coef_fw(codec, coef0256);
5400                 break;
5401         case 0x10ec0234:
5402         case 0x10ec0274:
5403         case 0x10ec0294:
5404                 alc_write_coef_idx(codec, 0x45, 0xd689);
5405                 break;
5406         case 0x10ec0233:
5407         case 0x10ec0283:
5408                 alc_process_coef_fw(codec, coef0233);
5409                 break;
5410         case 0x10ec0298:
5411                 val = alc_read_coef_idx(codec, 0x50);
5412                 if (val & (1 << 12)) {
5413                         alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
5414                         alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5415                         msleep(300);
5416                 } else {
5417                         alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5418                         alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5419                         msleep(300);
5420                 }
5421                 break;
5422         case 0x10ec0286:
5423         case 0x10ec0288:
5424                 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
5425                 msleep(300);
5426                 alc_process_coef_fw(codec, coef0288);
5427                 break;
5428         case 0x10ec0292:
5429                 alc_process_coef_fw(codec, coef0292);
5430                 break;
5431         case 0x10ec0293:
5432                 alc_process_coef_fw(codec, coef0293);
5433                 break;
5434         case 0x10ec0668:
5435                 alc_process_coef_fw(codec, coef0688);
5436                 break;
5437         case 0x10ec0215:
5438         case 0x10ec0225:
5439         case 0x10ec0285:
5440         case 0x10ec0295:
5441         case 0x10ec0289:
5442         case 0x10ec0299:
5443                 val = alc_read_coef_idx(codec, 0x45);
5444                 if (val & (1 << 9))
5445                         alc_process_coef_fw(codec, coef0225_2);
5446                 else
5447                         alc_process_coef_fw(codec, coef0225_1);
5448                 break;
5449         case 0x10ec0867:
5450                 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5451                 break;
5452         }
5453         codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n");
5454 }
5455 
5456 /* Nokia type */
5457 static void alc_headset_mode_omtp(struct hda_codec *codec)
5458 {
5459         static const struct coef_fw coef0255[] = {
5460                 WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
5461                 WRITE_COEF(0x1b, 0x0c2b),
5462                 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
5463                 {}
5464         };
5465         static const struct coef_fw coef0256[] = {
5466                 WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
5467                 WRITE_COEF(0x1b, 0x0e6b),
5468                 {}
5469         };
5470         static const struct coef_fw coef0233[] = {
5471                 WRITE_COEF(0x45, 0xe429),
5472                 WRITE_COEF(0x1b, 0x0c2b),
5473                 WRITE_COEF(0x32, 0x4ea3),
5474                 {}
5475         };
5476         static const struct coef_fw coef0288[] = {
5477                 UPDATE_COEF(0x50, 0x2000, 0x2000),
5478                 UPDATE_COEF(0x56, 0x0006, 0x0006),
5479                 UPDATE_COEF(0x66, 0x0008, 0),
5480                 UPDATE_COEF(0x67, 0x2000, 0),
5481                 {}
5482         };
5483         static const struct coef_fw coef0292[] = {
5484                 WRITE_COEF(0x6b, 0xe429),
5485                 WRITE_COEF(0x76, 0x0008),
5486                 WRITE_COEF(0x18, 0x7388),
5487                 {}
5488         };
5489         static const struct coef_fw coef0293[] = {
5490                 WRITE_COEF(0x45, 0xe429), /* Set to omtp type */
5491                 UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
5492                 {}
5493         };
5494         static const struct coef_fw coef0688[] = {
5495                 WRITE_COEF(0x11, 0x0001),
5496                 WRITE_COEF(0x15, 0x0d50),
5497                 WRITE_COEF(0xc3, 0x0000),
5498                 {}
5499         };
5500         static const struct coef_fw coef0225[] = {
5501                 UPDATE_COEF(0x45, 0x3f<<10, 0x39<<10),
5502                 UPDATE_COEF(0x63, 3<<14, 2<<14),
5503                 {}
5504         };
5505 
5506         switch (codec->core.vendor_id) {
5507         case 0x10ec0255:
5508                 alc_process_coef_fw(codec, coef0255);
5509                 break;
5510         case 0x10ec0230:
5511         case 0x10ec0236:
5512         case 0x10ec0256:
5513         case 0x19e58326:
5514                 alc_process_coef_fw(codec, coef0256);
5515                 break;
5516         case 0x10ec0234:
5517         case 0x10ec0274:
5518         case 0x10ec0294:
5519                 alc_write_coef_idx(codec, 0x45, 0xe689);
5520                 break;
5521         case 0x10ec0233:
5522         case 0x10ec0283:
5523                 alc_process_coef_fw(codec, coef0233);
5524                 break;
5525         case 0x10ec0298:
5526                 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);/* Headset output enable */
5527                 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5528                 msleep(300);
5529                 break;
5530         case 0x10ec0286:
5531         case 0x10ec0288:
5532                 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
5533                 msleep(300);
5534                 alc_process_coef_fw(codec, coef0288);
5535                 break;
5536         case 0x10ec0292:
5537                 alc_process_coef_fw(codec, coef0292);
5538                 break;
5539         case 0x10ec0293:
5540                 alc_process_coef_fw(codec, coef0293);
5541                 break;
5542         case 0x10ec0668:
5543                 alc_process_coef_fw(codec, coef0688);
5544                 break;
5545         case 0x10ec0215:
5546         case 0x10ec0225:
5547         case 0x10ec0285:
5548         case 0x10ec0295:
5549         case 0x10ec0289:
5550         case 0x10ec0299:
5551                 alc_process_coef_fw(codec, coef0225);
5552                 break;
5553         }
5554         codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n");
5555 }
5556 
5557 static void alc_determine_headset_type(struct hda_codec *codec)
5558 {
5559         int val;
5560         bool is_ctia = false;
5561         struct alc_spec *spec = codec->spec;
5562         static const struct coef_fw coef0255[] = {
5563                 WRITE_COEF(0x45, 0xd089), /* combo jack auto switch control(Check type)*/
5564                 WRITE_COEF(0x49, 0x0149), /* combo jack auto switch control(Vref
5565  conteol) */
5566                 {}
5567         };
5568         static const struct coef_fw coef0288[] = {
5569                 UPDATE_COEF(0x4f, 0xfcc0, 0xd400), /* Check Type */
5570                 {}
5571         };
5572         static const struct coef_fw coef0298[] = {
5573                 UPDATE_COEF(0x50, 0x2000, 0x2000),
5574                 UPDATE_COEF(0x56, 0x0006, 0x0006),
5575                 UPDATE_COEF(0x66, 0x0008, 0),
5576                 UPDATE_COEF(0x67, 0x2000, 0),
5577                 UPDATE_COEF(0x19, 0x1300, 0x1300),
5578                 {}
5579         };
5580         static const struct coef_fw coef0293[] = {
5581                 UPDATE_COEF(0x4a, 0x000f, 0x0008), /* Combo Jack auto detect */
5582                 WRITE_COEF(0x45, 0xD429), /* Set to ctia type */
5583                 {}
5584         };
5585         static const struct coef_fw coef0688[] = {
5586                 WRITE_COEF(0x11, 0x0001),
5587                 WRITE_COEF(0xb7, 0x802b),
5588                 WRITE_COEF(0x15, 0x0d60),
5589                 WRITE_COEF(0xc3, 0x0c00),
5590                 {}
5591         };
5592         static const struct coef_fw coef0274[] = {
5593                 UPDATE_COEF(0x4a, 0x0010, 0),
5594                 UPDATE_COEF(0x4a, 0x8000, 0),
5595                 WRITE_COEF(0x45, 0xd289),
5596                 UPDATE_COEF(0x49, 0x0300, 0x0300),
5597                 {}
5598         };
5599 
5600         if (spec->no_internal_mic_pin) {
5601                 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
5602                 return;
5603         }
5604 
5605         switch (codec->core.vendor_id) {
5606         case 0x10ec0255:
5607                 alc_process_coef_fw(codec, coef0255);
5608                 msleep(300);
5609                 val = alc_read_coef_idx(codec, 0x46);
5610                 is_ctia = (val & 0x0070) == 0x0070;
5611                 break;
5612         case 0x10ec0230:
5613         case 0x10ec0236:
5614         case 0x10ec0256:
5615         case 0x19e58326:
5616                 alc_write_coef_idx(codec, 0x1b, 0x0e4b);
5617                 alc_write_coef_idx(codec, 0x06, 0x6104);
5618                 alc_write_coefex_idx(codec, 0x57, 0x3, 0x09a3);
5619 
5620                 snd_hda_codec_write(codec, 0x21, 0,
5621                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5622                 msleep(80);
5623                 snd_hda_codec_write(codec, 0x21, 0,
5624                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5625 
5626                 alc_process_coef_fw(codec, coef0255);
5627                 msleep(300);
5628                 val = alc_read_coef_idx(codec, 0x46);
5629                 is_ctia = (val & 0x0070) == 0x0070;
5630 
5631                 alc_write_coefex_idx(codec, 0x57, 0x3, 0x0da3);
5632                 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
5633 
5634                 snd_hda_codec_write(codec, 0x21, 0,
5635                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5636                 msleep(80);
5637                 snd_hda_codec_write(codec, 0x21, 0,
5638                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5639                 break;
5640         case 0x10ec0234:
5641         case 0x10ec0274:
5642         case 0x10ec0294:
5643                 alc_process_coef_fw(codec, coef0274);
5644                 msleep(850);
5645                 val = alc_read_coef_idx(codec, 0x46);
5646                 is_ctia = (val & 0x00f0) == 0x00f0;
5647                 break;
5648         case 0x10ec0233:
5649         case 0x10ec0283:
5650                 alc_write_coef_idx(codec, 0x45, 0xd029);
5651                 msleep(300);
5652                 val = alc_read_coef_idx(codec, 0x46);
5653                 is_ctia = (val & 0x0070) == 0x0070;
5654                 break;
5655         case 0x10ec0298:
5656                 snd_hda_codec_write(codec, 0x21, 0,
5657                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5658                 msleep(100);
5659                 snd_hda_codec_write(codec, 0x21, 0,
5660                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5661                 msleep(200);
5662 
5663                 val = alc_read_coef_idx(codec, 0x50);
5664                 if (val & (1 << 12)) {
5665                         alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);
5666                         alc_process_coef_fw(codec, coef0288);
5667                         msleep(350);
5668                         val = alc_read_coef_idx(codec, 0x50);
5669                         is_ctia = (val & 0x0070) == 0x0070;
5670                 } else {
5671                         alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);
5672                         alc_process_coef_fw(codec, coef0288);
5673                         msleep(350);
5674                         val = alc_read_coef_idx(codec, 0x50);
5675                         is_ctia = (val & 0x0070) == 0x0070;
5676                 }
5677                 alc_process_coef_fw(codec, coef0298);
5678                 snd_hda_codec_write(codec, 0x21, 0,
5679                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP);
5680                 msleep(75);
5681                 snd_hda_codec_write(codec, 0x21, 0,
5682                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5683                 break;
5684         case 0x10ec0286:
5685         case 0x10ec0288:
5686                 alc_process_coef_fw(codec, coef0288);
5687                 msleep(350);
5688                 val = alc_read_coef_idx(codec, 0x50);
5689                 is_ctia = (val & 0x0070) == 0x0070;
5690                 break;
5691         case 0x10ec0292:
5692                 alc_write_coef_idx(codec, 0x6b, 0xd429);
5693                 msleep(300);
5694                 val = alc_read_coef_idx(codec, 0x6c);
5695                 is_ctia = (val & 0x001c) == 0x001c;
5696                 break;
5697         case 0x10ec0293:
5698                 alc_process_coef_fw(codec, coef0293);
5699                 msleep(300);
5700                 val = alc_read_coef_idx(codec, 0x46);
5701                 is_ctia = (val & 0x0070) == 0x0070;
5702                 break;
5703         case 0x10ec0668:
5704                 alc_process_coef_fw(codec, coef0688);
5705                 msleep(300);
5706                 val = alc_read_coef_idx(codec, 0xbe);
5707                 is_ctia = (val & 0x1c02) == 0x1c02;
5708                 break;
5709         case 0x10ec0215:
5710         case 0x10ec0225:
5711         case 0x10ec0285:
5712         case 0x10ec0295:
5713         case 0x10ec0289:
5714         case 0x10ec0299:
5715                 snd_hda_codec_write(codec, 0x21, 0,
5716                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
5717                 msleep(80);
5718                 snd_hda_codec_write(codec, 0x21, 0,
5719                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
5720 
5721                 alc_process_coef_fw(codec, alc225_pre_hsmode);
5722                 alc_update_coef_idx(codec, 0x67, 0xf000, 0x1000);
5723                 val = alc_read_coef_idx(codec, 0x45);
5724                 if (val & (1 << 9)) {
5725                         alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5726                         alc_update_coef_idx(codec, 0x49, 3<<8, 2<<8);
5727                         msleep(800);
5728                         val = alc_read_coef_idx(codec, 0x46);
5729                         is_ctia = (val & 0x00f0) == 0x00f0;
5730                 } else {
5731                         alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x34<<10);
5732                         alc_update_coef_idx(codec, 0x49, 3<<8, 1<<8);
5733                         msleep(800);
5734                         val = alc_read_coef_idx(codec, 0x46);
5735                         is_ctia = (val & 0x00f0) == 0x00f0;
5736                 }
5737                 alc_update_coef_idx(codec, 0x4a, 7<<6, 7<<6);
5738                 alc_update_coef_idx(codec, 0x4a, 3<<4, 3<<4);
5739                 alc_update_coef_idx(codec, 0x67, 0xf000, 0x3000);
5740 
5741                 snd_hda_codec_write(codec, 0x21, 0,
5742                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
5743                 msleep(80);
5744                 snd_hda_codec_write(codec, 0x21, 0,
5745                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE);
5746                 break;
5747         case 0x10ec0867:
5748                 is_ctia = true;
5749                 break;
5750         }
5751 
5752         codec_dbg(codec, "Headset jack detected iPhone-style headset: %s\n",
5753                     is_ctia ? "yes" : "no");
5754         spec->current_headset_type = is_ctia ? ALC_HEADSET_TYPE_CTIA : ALC_HEADSET_TYPE_OMTP;
5755 }
5756 
5757 static void alc_update_headset_mode(struct hda_codec *codec)
5758 {
5759         struct alc_spec *spec = codec->spec;
5760 
5761         hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]];
5762         hda_nid_t hp_pin = alc_get_hp_pin(spec);
5763 
5764         int new_headset_mode;
5765 
5766         if (!snd_hda_jack_detect(codec, hp_pin))
5767                 new_headset_mode = ALC_HEADSET_MODE_UNPLUGGED;
5768         else if (mux_pin == spec->headset_mic_pin)
5769                 new_headset_mode = ALC_HEADSET_MODE_HEADSET;
5770         else if (mux_pin == spec->headphone_mic_pin)
5771                 new_headset_mode = ALC_HEADSET_MODE_MIC;
5772         else
5773                 new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;
5774 
5775         if (new_headset_mode == spec->current_headset_mode) {
5776                 snd_hda_gen_update_outputs(codec);
5777                 return;
5778         }
5779 
5780         switch (new_headset_mode) {
5781         case ALC_HEADSET_MODE_UNPLUGGED:
5782                 alc_headset_mode_unplugged(codec);
5783                 spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5784                 spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5785                 spec->gen.hp_jack_present = false;
5786                 break;
5787         case ALC_HEADSET_MODE_HEADSET:
5788                 if (spec->current_headset_type == ALC_HEADSET_TYPE_UNKNOWN)
5789                         alc_determine_headset_type(codec);
5790                 if (spec->current_headset_type == ALC_HEADSET_TYPE_CTIA)
5791                         alc_headset_mode_ctia(codec);
5792                 else if (spec->current_headset_type == ALC_HEADSET_TYPE_OMTP)
5793                         alc_headset_mode_omtp(codec);
5794                 spec->gen.hp_jack_present = true;
5795                 break;
5796         case ALC_HEADSET_MODE_MIC:
5797                 alc_headset_mode_mic_in(codec, hp_pin, spec->headphone_mic_pin);
5798                 spec->gen.hp_jack_present = false;
5799                 break;
5800         case ALC_HEADSET_MODE_HEADPHONE:
5801                 alc_headset_mode_default(codec);
5802                 spec->gen.hp_jack_present = true;
5803                 break;
5804         }
5805         if (new_headset_mode != ALC_HEADSET_MODE_MIC) {
5806                 snd_hda_set_pin_ctl_cache(codec, hp_pin,
5807                                           AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
5808                 if (spec->headphone_mic_pin && spec->headphone_mic_pin != hp_pin)
5809                         snd_hda_set_pin_ctl_cache(codec, spec->headphone_mic_pin,
5810                                                   PIN_VREFHIZ);
5811         }
5812         spec->current_headset_mode = new_headset_mode;
5813 
5814         snd_hda_gen_update_outputs(codec);
5815 }
5816 
5817 static void alc_update_headset_mode_hook(struct hda_codec *codec,
5818                                          struct snd_kcontrol *kcontrol,
5819                                          struct snd_ctl_elem_value *ucontrol)
5820 {
5821         alc_update_headset_mode(codec);
5822 }
5823 
5824 static void alc_update_headset_jack_cb(struct hda_codec *codec,
5825                                        struct hda_jack_callback *jack)
5826 {
5827         snd_hda_gen_hp_automute(codec, jack);
5828         alc_update_headset_mode(codec);
5829 }
5830 
5831 static void alc_probe_headset_mode(struct hda_codec *codec)
5832 {
5833         int i;
5834         struct alc_spec *spec = codec->spec;
5835         struct auto_pin_cfg *cfg = &spec->gen.autocfg;
5836 
5837         /* Find mic pins */
5838         for (i = 0; i < cfg->num_inputs; i++) {
5839                 if (cfg->inputs[i].is_headset_mic && !spec->headset_mic_pin)
5840                         spec->headset_mic_pin = cfg->inputs[i].pin;
5841                 if (cfg->inputs[i].is_headphone_mic && !spec->headphone_mic_pin)
5842                         spec->headphone_mic_pin = cfg->inputs[i].pin;
5843         }
5844 
5845         WARN_ON(spec->gen.cap_sync_hook);
5846         spec->gen.cap_sync_hook = alc_update_headset_mode_hook;
5847         spec->gen.automute_hook = alc_update_headset_mode;
5848         spec->gen.hp_automute_hook = alc_update_headset_jack_cb;
5849 }
5850 
5851 static void alc_fixup_headset_mode(struct hda_codec *codec,
5852                                 const struct hda_fixup *fix, int action)
5853 {
5854         struct alc_spec *spec = codec->spec;
5855 
5856         switch (action) {
5857         case HDA_FIXUP_ACT_PRE_PROBE:
5858                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC | HDA_PINCFG_HEADPHONE_MIC;
5859                 break;
5860         case HDA_FIXUP_ACT_PROBE:
5861                 alc_probe_headset_mode(codec);
5862                 break;
5863         case HDA_FIXUP_ACT_INIT:
5864                 if (is_s3_resume(codec) || is_s4_resume(codec)) {
5865                         spec->current_headset_mode = ALC_HEADSET_MODE_UNKNOWN;
5866                         spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
5867                 }
5868                 alc_update_headset_mode(codec);
5869                 break;
5870         }
5871 }
5872 
5873 static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
5874                                 const struct hda_fixup *fix, int action)
5875 {
5876         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5877                 struct alc_spec *spec = codec->spec;
5878                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5879         }
5880         else
5881                 alc_fixup_headset_mode(codec, fix, action);
5882 }
5883 
5884 static void alc255_set_default_jack_type(struct hda_codec *codec)
5885 {
5886         /* Set to iphone type */
5887         static const struct coef_fw alc255fw[] = {
5888                 WRITE_COEF(0x1b, 0x880b),
5889                 WRITE_COEF(0x45, 0xd089),
5890                 WRITE_COEF(0x1b, 0x080b),
5891                 WRITE_COEF(0x46, 0x0004),
5892                 WRITE_COEF(0x1b, 0x0c0b),
5893                 {}
5894         };
5895         static const struct coef_fw alc256fw[] = {
5896                 WRITE_COEF(0x1b, 0x884b),
5897                 WRITE_COEF(0x45, 0xd089),
5898                 WRITE_COEF(0x1b, 0x084b),
5899                 WRITE_COEF(0x46, 0x0004),
5900                 WRITE_COEF(0x1b, 0x0c4b),
5901                 {}
5902         };
5903         switch (codec->core.vendor_id) {
5904         case 0x10ec0255:
5905                 alc_process_coef_fw(codec, alc255fw);
5906                 break;
5907         case 0x10ec0230:
5908         case 0x10ec0236:
5909         case 0x10ec0256:
5910         case 0x19e58326:
5911                 alc_process_coef_fw(codec, alc256fw);
5912                 break;
5913         }
5914         msleep(30);
5915 }
5916 
5917 static void alc_fixup_headset_mode_alc255(struct hda_codec *codec,
5918                                 const struct hda_fixup *fix, int action)
5919 {
5920         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5921                 alc255_set_default_jack_type(codec);
5922         }
5923         alc_fixup_headset_mode(codec, fix, action);
5924 }
5925 
5926 static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,
5927                                 const struct hda_fixup *fix, int action)
5928 {
5929         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5930                 struct alc_spec *spec = codec->spec;
5931                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
5932                 alc255_set_default_jack_type(codec);
5933         }
5934         else
5935                 alc_fixup_headset_mode(codec, fix, action);
5936 }
5937 
5938 static void alc288_update_headset_jack_cb(struct hda_codec *codec,
5939                                        struct hda_jack_callback *jack)
5940 {
5941         struct alc_spec *spec = codec->spec;
5942 
5943         alc_update_headset_jack_cb(codec, jack);
5944         /* Headset Mic enable or disable, only for Dell Dino */
5945         alc_update_gpio_data(codec, 0x40, spec->gen.hp_jack_present);
5946 }
5947 
5948 static void alc_fixup_headset_mode_dell_alc288(struct hda_codec *codec,
5949                                 const struct hda_fixup *fix, int action)
5950 {
5951         alc_fixup_headset_mode(codec, fix, action);
5952         if (action == HDA_FIXUP_ACT_PROBE) {
5953                 struct alc_spec *spec = codec->spec;
5954                 /* toggled via hp_automute_hook */
5955                 spec->gpio_mask |= 0x40;
5956                 spec->gpio_dir |= 0x40;
5957                 spec->gen.hp_automute_hook = alc288_update_headset_jack_cb;
5958         }
5959 }
5960 
5961 static void alc_fixup_auto_mute_via_amp(struct hda_codec *codec,
5962                                         const struct hda_fixup *fix, int action)
5963 {
5964         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5965                 struct alc_spec *spec = codec->spec;
5966                 spec->gen.auto_mute_via_amp = 1;
5967         }
5968 }
5969 
5970 static void alc_fixup_no_shutup(struct hda_codec *codec,
5971                                 const struct hda_fixup *fix, int action)
5972 {
5973         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5974                 struct alc_spec *spec = codec->spec;
5975                 spec->no_shutup_pins = 1;
5976         }
5977 }
5978 
5979 static void alc_fixup_disable_aamix(struct hda_codec *codec,
5980                                     const struct hda_fixup *fix, int action)
5981 {
5982         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
5983                 struct alc_spec *spec = codec->spec;
5984                 /* Disable AA-loopback as it causes white noise */
5985                 spec->gen.mixer_nid = 0;
5986         }
5987 }
5988 
5989 /* fixup for Thinkpad docks: add dock pins, avoid HP parser fixup */
5990 static void alc_fixup_tpt440_dock(struct hda_codec *codec,
5991                                   const struct hda_fixup *fix, int action)
5992 {
5993         static const struct hda_pintbl pincfgs[] = {
5994                 { 0x16, 0x21211010 }, /* dock headphone */
5995                 { 0x19, 0x21a11010 }, /* dock mic */
5996                 { }
5997         };
5998         struct alc_spec *spec = codec->spec;
5999 
6000         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6001                 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
6002                 codec->power_save_node = 0; /* avoid click noises */
6003                 snd_hda_apply_pincfgs(codec, pincfgs);
6004         }
6005 }
6006 
6007 static void alc_fixup_tpt470_dock(struct hda_codec *codec,
6008                                   const struct hda_fixup *fix, int action)
6009 {
6010         static const struct hda_pintbl pincfgs[] = {
6011                 { 0x17, 0x21211010 }, /* dock headphone */
6012                 { 0x19, 0x21a11010 }, /* dock mic */
6013                 { }
6014         };
6015         struct alc_spec *spec = codec->spec;
6016 
6017         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6018                 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
6019                 snd_hda_apply_pincfgs(codec, pincfgs);
6020         } else if (action == HDA_FIXUP_ACT_INIT) {
6021                 /* Enable DOCK device */
6022                 snd_hda_codec_write(codec, 0x17, 0,
6023                             AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
6024                 /* Enable DOCK device */
6025                 snd_hda_codec_write(codec, 0x19, 0,
6026                             AC_VERB_SET_CONFIG_DEFAULT_BYTES_3, 0);
6027         }
6028 }
6029 
6030 static void alc_fixup_tpt470_dacs(struct hda_codec *codec,
6031                                   const struct hda_fixup *fix, int action)
6032 {
6033         /* Assure the speaker pin to be coupled with DAC NID 0x03; otherwise
6034          * the speaker output becomes too low by some reason on Thinkpads with
6035          * ALC298 codec
6036          */
6037         static const hda_nid_t preferred_pairs[] = {
6038                 0x14, 0x03, 0x17, 0x02, 0x21, 0x02,
6039                 0
6040         };
6041         struct alc_spec *spec = codec->spec;
6042 
6043         if (action == HDA_FIXUP_ACT_PRE_PROBE)
6044                 spec->gen.preferred_dacs = preferred_pairs;
6045 }
6046 
6047 static void alc295_fixup_asus_dacs(struct hda_codec *codec,
6048                                    const struct hda_fixup *fix, int action)
6049 {
6050         static const hda_nid_t preferred_pairs[] = {
6051                 0x17, 0x02, 0x21, 0x03, 0
6052         };
6053         struct alc_spec *spec = codec->spec;
6054 
6055         if (action == HDA_FIXUP_ACT_PRE_PROBE)
6056                 spec->gen.preferred_dacs = preferred_pairs;
6057 }
6058 
6059 static void alc_shutup_dell_xps13(struct hda_codec *codec)
6060 {
6061         struct alc_spec *spec = codec->spec;
6062         int hp_pin = alc_get_hp_pin(spec);
6063 
6064         /* Prevent pop noises when headphones are plugged in */
6065         snd_hda_codec_write(codec, hp_pin, 0,
6066                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
6067         msleep(20);
6068 }
6069 
6070 static void alc_fixup_dell_xps13(struct hda_codec *codec,
6071                                 const struct hda_fixup *fix, int action)
6072 {
6073         struct alc_spec *spec = codec->spec;
6074         struct hda_input_mux *imux = &spec->gen.input_mux;
6075         int i;
6076 
6077         switch (action) {
6078         case HDA_FIXUP_ACT_PRE_PROBE:
6079                 /* mic pin 0x19 must be initialized with Vref Hi-Z, otherwise
6080                  * it causes a click noise at start up
6081                  */
6082                 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
6083                 spec->shutup = alc_shutup_dell_xps13;
6084                 break;
6085         case HDA_FIXUP_ACT_PROBE:
6086                 /* Make the internal mic the default input source. */
6087                 for (i = 0; i < imux->num_items; i++) {
6088                         if (spec->gen.imux_pins[i] == 0x12) {
6089                                 spec->gen.cur_mux[0] = i;
6090                                 break;
6091                         }
6092                 }
6093                 break;
6094         }
6095 }
6096 
6097 static void alc_fixup_headset_mode_alc662(struct hda_codec *codec,
6098                                 const struct hda_fixup *fix, int action)
6099 {
6100         struct alc_spec *spec = codec->spec;
6101 
6102         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6103                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
6104                 spec->gen.hp_mic = 1; /* Mic-in is same pin as headphone */
6105 
6106                 /* Disable boost for mic-in permanently. (This code is only called
6107                    from quirks that guarantee that the headphone is at NID 0x1b.) */
6108                 snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000);
6109                 snd_hda_override_wcaps(codec, 0x1b, get_wcaps(codec, 0x1b) & ~AC_WCAP_IN_AMP);
6110         } else
6111                 alc_fixup_headset_mode(codec, fix, action);
6112 }
6113 
6114 static void alc_fixup_headset_mode_alc668(struct hda_codec *codec,
6115                                 const struct hda_fixup *fix, int action)
6116 {
6117         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6118                 alc_write_coef_idx(codec, 0xc4, 0x8000);
6119                 alc_update_coef_idx(codec, 0xc2, ~0xfe, 0);
6120                 snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
6121         }
6122         alc_fixup_headset_mode(codec, fix, action);
6123 }
6124 
6125 /* Returns the nid of the external mic input pin, or 0 if it cannot be found. */
6126 static int find_ext_mic_pin(struct hda_codec *codec)
6127 {
6128         struct alc_spec *spec = codec->spec;
6129         struct auto_pin_cfg *cfg = &spec->gen.autocfg;
6130         hda_nid_t nid;
6131         unsigned int defcfg;
6132         int i;
6133 
6134         for (i = 0; i < cfg->num_inputs; i++) {
6135                 if (cfg->inputs[i].type != AUTO_PIN_MIC)
6136                         continue;
6137                 nid = cfg->inputs[i].pin;
6138                 defcfg = snd_hda_codec_get_pincfg(codec, nid);
6139                 if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT)
6140                         continue;
6141                 return nid;
6142         }
6143 
6144         return 0;
6145 }
6146 
6147 static void alc271_hp_gate_mic_jack(struct hda_codec *codec,
6148                                     const struct hda_fixup *fix,
6149                                     int action)
6150 {
6151         struct alc_spec *spec = codec->spec;
6152 
6153         if (action == HDA_FIXUP_ACT_PROBE) {
6154                 int mic_pin = find_ext_mic_pin(codec);
6155                 int hp_pin = alc_get_hp_pin(spec);
6156 
6157                 if (snd_BUG_ON(!mic_pin || !hp_pin))
6158                         return;
6159                 snd_hda_jack_set_gating_jack(codec, mic_pin, hp_pin);
6160         }
6161 }
6162 
6163 static void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec,
6164                                              const struct hda_fixup *fix,
6165                                              int action)
6166 {
6167         struct alc_spec *spec = codec->spec;
6168         struct auto_pin_cfg *cfg = &spec->gen.autocfg;
6169         int i;
6170 
6171         /* The mic boosts on level 2 and 3 are too noisy
6172            on the internal mic input.
6173            Therefore limit the boost to 0 or 1. */
6174 
6175         if (action != HDA_FIXUP_ACT_PROBE)
6176                 return;
6177 
6178         for (i = 0; i < cfg->num_inputs; i++) {
6179                 hda_nid_t nid = cfg->inputs[i].pin;
6180                 unsigned int defcfg;
6181                 if (cfg->inputs[i].type != AUTO_PIN_MIC)
6182                         continue;
6183                 defcfg = snd_hda_codec_get_pincfg(codec, nid);
6184                 if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
6185                         continue;
6186 
6187                 snd_hda_override_amp_caps(codec, nid, HDA_INPUT,
6188                                           (0x00 << AC_AMPCAP_OFFSET_SHIFT) |
6189                                           (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) |
6190                                           (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) |
6191                                           (0 << AC_AMPCAP_MUTE_SHIFT));
6192         }
6193 }
6194 
6195 static void alc283_hp_automute_hook(struct hda_codec *codec,
6196                                     struct hda_jack_callback *jack)
6197 {
6198         struct alc_spec *spec = codec->spec;
6199         int vref;
6200 
6201         msleep(200);
6202         snd_hda_gen_hp_automute(codec, jack);
6203 
6204         vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
6205 
6206         msleep(600);
6207         snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
6208                             vref);
6209 }
6210 
6211 static void alc283_fixup_chromebook(struct hda_codec *codec,
6212                                     const struct hda_fixup *fix, int action)
6213 {
6214         struct alc_spec *spec = codec->spec;
6215 
6216         switch (action) {
6217         case HDA_FIXUP_ACT_PRE_PROBE:
6218                 snd_hda_override_wcaps(codec, 0x03, 0);
6219                 /* Disable AA-loopback as it causes white noise */
6220                 spec->gen.mixer_nid = 0;
6221                 break;
6222         case HDA_FIXUP_ACT_INIT:
6223                 /* MIC2-VREF control */
6224                 /* Set to manual mode */
6225                 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
6226                 /* Enable Line1 input control by verb */
6227                 alc_update_coef_idx(codec, 0x1a, 0, 1 << 4);
6228                 break;
6229         }
6230 }
6231 
6232 static void alc283_fixup_sense_combo_jack(struct hda_codec *codec,
6233                                     const struct hda_fixup *fix, int action)
6234 {
6235         struct alc_spec *spec = codec->spec;
6236 
6237         switch (action) {
6238         case HDA_FIXUP_ACT_PRE_PROBE:
6239                 spec->gen.hp_automute_hook = alc283_hp_automute_hook;
6240                 break;
6241         case HDA_FIXUP_ACT_INIT:
6242                 /* MIC2-VREF control */
6243                 /* Set to manual mode */
6244                 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
6245                 break;
6246         }
6247 }
6248 
6249 /* mute tablet speaker pin (0x14) via dock plugging in addition */
6250 static void asus_tx300_automute(struct hda_codec *codec)
6251 {
6252         struct alc_spec *spec = codec->spec;
6253         snd_hda_gen_update_outputs(codec);
6254         if (snd_hda_jack_detect(codec, 0x1b))
6255                 spec->gen.mute_bits |= (1ULL << 0x14);
6256 }
6257 
6258 static void alc282_fixup_asus_tx300(struct hda_codec *codec,
6259                                     const struct hda_fixup *fix, int action)
6260 {
6261         struct alc_spec *spec = codec->spec;
6262         static const struct hda_pintbl dock_pins[] = {
6263                 { 0x1b, 0x21114000 }, /* dock speaker pin */
6264                 {}
6265         };
6266 
6267         switch (action) {
6268         case HDA_FIXUP_ACT_PRE_PROBE:
6269                 spec->init_amp = ALC_INIT_DEFAULT;
6270                 /* TX300 needs to set up GPIO2 for the speaker amp */
6271                 alc_setup_gpio(codec, 0x04);
6272                 snd_hda_apply_pincfgs(codec, dock_pins);
6273                 spec->gen.auto_mute_via_amp = 1;
6274                 spec->gen.automute_hook = asus_tx300_automute;
6275                 snd_hda_jack_detect_enable_callback(codec, 0x1b,
6276                                                     snd_hda_gen_hp_automute);
6277                 break;
6278         case HDA_FIXUP_ACT_PROBE:
6279                 spec->init_amp = ALC_INIT_DEFAULT;
6280                 break;
6281         case HDA_FIXUP_ACT_BUILD:
6282                 /* this is a bit tricky; give more sane names for the main
6283                  * (tablet) speaker and the dock speaker, respectively
6284                  */
6285                 rename_ctl(codec, "Speaker Playback Switch",
6286                            "Dock Speaker Playback Switch");
6287                 rename_ctl(codec, "Bass Speaker Playback Switch",
6288                            "Speaker Playback Switch");
6289                 break;
6290         }
6291 }
6292 
6293 static void alc290_fixup_mono_speakers(struct hda_codec *codec,
6294                                        const struct hda_fixup *fix, int action)
6295 {
6296         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6297                 /* DAC node 0x03 is giving mono output. We therefore want to
6298                    make sure 0x14 (front speaker) and 0x15 (headphones) use the
6299                    stereo DAC, while leaving 0x17 (bass speaker) for node 0x03. */
6300                 static const hda_nid_t conn1[] = { 0x0c };
6301                 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn1), conn1);
6302                 snd_hda_override_conn_list(codec, 0x15, ARRAY_SIZE(conn1), conn1);
6303         }
6304 }
6305 
6306 static void alc298_fixup_speaker_volume(struct hda_codec *codec,
6307                                         const struct hda_fixup *fix, int action)
6308 {
6309         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6310                 /* The speaker is routed to the Node 0x06 by a mistake, as a result
6311                    we can't adjust the speaker's volume since this node does not has
6312                    Amp-out capability. we change the speaker's route to:
6313                    Node 0x02 (Audio Output) -> Node 0x0c (Audio Mixer) -> Node 0x17 (
6314                    Pin Complex), since Node 0x02 has Amp-out caps, we can adjust
6315                    speaker's volume now. */
6316 
6317                 static const hda_nid_t conn1[] = { 0x0c };
6318                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn1), conn1);
6319         }
6320 }
6321 
6322 /* disable DAC3 (0x06) selection on NID 0x17 as it has no volume amp control */
6323 static void alc295_fixup_disable_dac3(struct hda_codec *codec,
6324                                       const struct hda_fixup *fix, int action)
6325 {
6326         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6327                 static const hda_nid_t conn[] = { 0x02, 0x03 };
6328                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6329         }
6330 }
6331 
6332 /* force NID 0x17 (Bass Speaker) to DAC1 to share it with the main speaker */
6333 static void alc285_fixup_speaker2_to_dac1(struct hda_codec *codec,
6334                                           const struct hda_fixup *fix, int action)
6335 {
6336         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6337                 static const hda_nid_t conn[] = { 0x02 };
6338                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6339         }
6340 }
6341 
6342 /* Hook to update amp GPIO4 for automute */
6343 static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,
6344                                           struct hda_jack_callback *jack)
6345 {
6346         struct alc_spec *spec = codec->spec;
6347 
6348         snd_hda_gen_hp_automute(codec, jack);
6349         /* mute_led_polarity is set to 0, so we pass inverted value here */
6350         alc_update_gpio_led(codec, 0x10, spec->mute_led_polarity,
6351                             !spec->gen.hp_jack_present);
6352 }
6353 
6354 /* Manage GPIOs for HP EliteBook Folio 9480m.
6355  *
6356  * GPIO4 is the headphone amplifier power control
6357  * GPIO3 is the audio output mute indicator LED
6358  */
6359 
6360 static void alc280_fixup_hp_9480m(struct hda_codec *codec,
6361                                   const struct hda_fixup *fix,
6362                                   int action)
6363 {
6364         struct alc_spec *spec = codec->spec;
6365 
6366         alc_fixup_hp_gpio_led(codec, action, 0x08, 0);
6367         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6368                 /* amp at GPIO4; toggled via alc280_hp_gpio4_automute_hook() */
6369                 spec->gpio_mask |= 0x10;
6370                 spec->gpio_dir |= 0x10;
6371                 spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook;
6372         }
6373 }
6374 
6375 static void alc275_fixup_gpio4_off(struct hda_codec *codec,
6376                                    const struct hda_fixup *fix,
6377                                    int action)
6378 {
6379         struct alc_spec *spec = codec->spec;
6380 
6381         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6382                 spec->gpio_mask |= 0x04;
6383                 spec->gpio_dir |= 0x04;
6384                 /* set data bit low */
6385         }
6386 }
6387 
6388 /* Quirk for Thinkpad X1 7th and 8th Gen
6389  * The following fixed routing needed
6390  * DAC1 (NID 0x02) -> Speaker (NID 0x14); some eq applied secretly
6391  * DAC2 (NID 0x03) -> Bass (NID 0x17) & Headphone (NID 0x21); sharing a DAC
6392  * DAC3 (NID 0x06) -> Unused, due to the lack of volume amp
6393  */
6394 static void alc285_fixup_thinkpad_x1_gen7(struct hda_codec *codec,
6395                                           const struct hda_fixup *fix, int action)
6396 {
6397         static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */
6398         static const hda_nid_t preferred_pairs[] = {
6399                 0x14, 0x02, 0x17, 0x03, 0x21, 0x03, 0
6400         };
6401         struct alc_spec *spec = codec->spec;
6402 
6403         switch (action) {
6404         case HDA_FIXUP_ACT_PRE_PROBE:
6405                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6406                 spec->gen.preferred_dacs = preferred_pairs;
6407                 break;
6408         case HDA_FIXUP_ACT_BUILD:
6409                 /* The generic parser creates somewhat unintuitive volume ctls
6410                  * with the fixed routing above, and the shared DAC2 may be
6411                  * confusing for PA.
6412                  * Rename those to unique names so that PA doesn't touch them
6413                  * and use only Master volume.
6414                  */
6415                 rename_ctl(codec, "Front Playback Volume", "DAC1 Playback Volume");
6416                 rename_ctl(codec, "Bass Speaker Playback Volume", "DAC2 Playback Volume");
6417                 break;
6418         }
6419 }
6420 
6421 static void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec,
6422                                          const struct hda_fixup *fix,
6423                                          int action)
6424 {
6425         alc_fixup_dual_codecs(codec, fix, action);
6426         switch (action) {
6427         case HDA_FIXUP_ACT_PRE_PROBE:
6428                 /* override card longname to provide a unique UCM profile */
6429                 strcpy(codec->card->longname, "HDAudio-Lenovo-DualCodecs");
6430                 break;
6431         case HDA_FIXUP_ACT_BUILD:
6432                 /* rename Capture controls depending on the codec */
6433                 rename_ctl(codec, "Capture Volume",
6434                            codec->addr == 0 ?
6435                            "Rear-Panel Capture Volume" :
6436                            "Front-Panel Capture Volume");
6437                 rename_ctl(codec, "Capture Switch",
6438                            codec->addr == 0 ?
6439                            "Rear-Panel Capture Switch" :
6440                            "Front-Panel Capture Switch");
6441                 break;
6442         }
6443 }
6444 
6445 static void alc225_fixup_s3_pop_noise(struct hda_codec *codec,
6446                                       const struct hda_fixup *fix, int action)
6447 {
6448         if (action != HDA_FIXUP_ACT_PRE_PROBE)
6449                 return;
6450 
6451         codec->power_save_node = 1;
6452 }
6453 
6454 /* Forcibly assign NID 0x03 to HP/LO while NID 0x02 to SPK for EQ */
6455 static void alc274_fixup_bind_dacs(struct hda_codec *codec,
6456                                     const struct hda_fixup *fix, int action)
6457 {
6458         struct alc_spec *spec = codec->spec;
6459         static const hda_nid_t preferred_pairs[] = {
6460                 0x21, 0x03, 0x1b, 0x03, 0x16, 0x02,
6461                 0
6462         };
6463 
6464         if (action != HDA_FIXUP_ACT_PRE_PROBE)
6465                 return;
6466 
6467         spec->gen.preferred_dacs = preferred_pairs;
6468         spec->gen.auto_mute_via_amp = 1;
6469         codec->power_save_node = 0;
6470 }
6471 
6472 /* avoid DAC 0x06 for bass speaker 0x17; it has no volume control */
6473 static void alc289_fixup_asus_ga401(struct hda_codec *codec,
6474                                     const struct hda_fixup *fix, int action)
6475 {
6476         static const hda_nid_t preferred_pairs[] = {
6477                 0x14, 0x02, 0x17, 0x02, 0x21, 0x03, 0
6478         };
6479         struct alc_spec *spec = codec->spec;
6480 
6481         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6482                 spec->gen.preferred_dacs = preferred_pairs;
6483                 spec->gen.obey_preferred_dacs = 1;
6484         }
6485 }
6486 
6487 /* The DAC of NID 0x3 will introduce click/pop noise on headphones, so invalidate it */
6488 static void alc285_fixup_invalidate_dacs(struct hda_codec *codec,
6489                               const struct hda_fixup *fix, int action)
6490 {
6491         if (action != HDA_FIXUP_ACT_PRE_PROBE)
6492                 return;
6493 
6494         snd_hda_override_wcaps(codec, 0x03, 0);
6495 }
6496 
6497 static void alc_combo_jack_hp_jd_restart(struct hda_codec *codec)
6498 {
6499         switch (codec->core.vendor_id) {
6500         case 0x10ec0274:
6501         case 0x10ec0294:
6502         case 0x10ec0225:
6503         case 0x10ec0295:
6504         case 0x10ec0299:
6505                 alc_update_coef_idx(codec, 0x4a, 0x8000, 1 << 15); /* Reset HP JD */
6506                 alc_update_coef_idx(codec, 0x4a, 0x8000, 0 << 15);
6507                 break;
6508         case 0x10ec0230:
6509         case 0x10ec0235:
6510         case 0x10ec0236:
6511         case 0x10ec0255:
6512         case 0x10ec0256:
6513         case 0x10ec0257:
6514         case 0x19e58326:
6515                 alc_update_coef_idx(codec, 0x1b, 0x8000, 1 << 15); /* Reset HP JD */
6516                 alc_update_coef_idx(codec, 0x1b, 0x8000, 0 << 15);
6517                 break;
6518         }
6519 }
6520 
6521 static void alc295_fixup_chromebook(struct hda_codec *codec,
6522                                     const struct hda_fixup *fix, int action)
6523 {
6524         struct alc_spec *spec = codec->spec;
6525 
6526         switch (action) {
6527         case HDA_FIXUP_ACT_PRE_PROBE:
6528                 spec->ultra_low_power = true;
6529                 break;
6530         case HDA_FIXUP_ACT_INIT:
6531                 alc_combo_jack_hp_jd_restart(codec);
6532                 break;
6533         }
6534 }
6535 
6536 static void alc256_fixup_chromebook(struct hda_codec *codec,
6537                                     const struct hda_fixup *fix, int action)
6538 {
6539         struct alc_spec *spec = codec->spec;
6540 
6541         switch (action) {
6542         case HDA_FIXUP_ACT_PRE_PROBE:
6543                 spec->gen.suppress_auto_mute = 1;
6544                 spec->gen.suppress_auto_mic = 1;
6545                 spec->en_3kpull_low = false;
6546                 break;
6547         }
6548 }
6549 
6550 static void alc_fixup_disable_mic_vref(struct hda_codec *codec,
6551                                   const struct hda_fixup *fix, int action)
6552 {
6553         if (action == HDA_FIXUP_ACT_PRE_PROBE)
6554                 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
6555 }
6556 
6557 
6558 static void alc294_gx502_toggle_output(struct hda_codec *codec,
6559                                         struct hda_jack_callback *cb)
6560 {
6561         /* The Windows driver sets the codec up in a very different way where
6562          * it appears to leave 0x10 = 0x8a20 set. For Linux we need to toggle it
6563          */
6564         if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
6565                 alc_write_coef_idx(codec, 0x10, 0x8a20);
6566         else
6567                 alc_write_coef_idx(codec, 0x10, 0x0a20);
6568 }
6569 
6570 static void alc294_fixup_gx502_hp(struct hda_codec *codec,
6571                                         const struct hda_fixup *fix, int action)
6572 {
6573         /* Pin 0x21: headphones/headset mic */
6574         if (!is_jack_detectable(codec, 0x21))
6575                 return;
6576 
6577         switch (action) {
6578         case HDA_FIXUP_ACT_PRE_PROBE:
6579                 snd_hda_jack_detect_enable_callback(codec, 0x21,
6580                                 alc294_gx502_toggle_output);
6581                 break;
6582         case HDA_FIXUP_ACT_INIT:
6583                 /* Make sure to start in a correct state, i.e. if
6584                  * headphones have been plugged in before powering up the system
6585                  */
6586                 alc294_gx502_toggle_output(codec, NULL);
6587                 break;
6588         }
6589 }
6590 
6591 static void alc294_gu502_toggle_output(struct hda_codec *codec,
6592                                        struct hda_jack_callback *cb)
6593 {
6594         /* Windows sets 0x10 to 0x8420 for Node 0x20 which is
6595          * responsible from changes between speakers and headphones
6596          */
6597         if (snd_hda_jack_detect_state(codec, 0x21) == HDA_JACK_PRESENT)
6598                 alc_write_coef_idx(codec, 0x10, 0x8420);
6599         else
6600                 alc_write_coef_idx(codec, 0x10, 0x0a20);
6601 }
6602 
6603 static void alc294_fixup_gu502_hp(struct hda_codec *codec,
6604                                   const struct hda_fixup *fix, int action)
6605 {
6606         if (!is_jack_detectable(codec, 0x21))
6607                 return;
6608 
6609         switch (action) {
6610         case HDA_FIXUP_ACT_PRE_PROBE:
6611                 snd_hda_jack_detect_enable_callback(codec, 0x21,
6612                                 alc294_gu502_toggle_output);
6613                 break;
6614         case HDA_FIXUP_ACT_INIT:
6615                 alc294_gu502_toggle_output(codec, NULL);
6616                 break;
6617         }
6618 }
6619 
6620 static void  alc285_fixup_hp_gpio_amp_init(struct hda_codec *codec,
6621                               const struct hda_fixup *fix, int action)
6622 {
6623         if (action != HDA_FIXUP_ACT_INIT)
6624                 return;
6625 
6626         msleep(100);
6627         alc_write_coef_idx(codec, 0x65, 0x0);
6628 }
6629 
6630 static void alc274_fixup_hp_headset_mic(struct hda_codec *codec,
6631                                     const struct hda_fixup *fix, int action)
6632 {
6633         switch (action) {
6634         case HDA_FIXUP_ACT_INIT:
6635                 alc_combo_jack_hp_jd_restart(codec);
6636                 break;
6637         }
6638 }
6639 
6640 static void alc_fixup_no_int_mic(struct hda_codec *codec,
6641                                     const struct hda_fixup *fix, int action)
6642 {
6643         struct alc_spec *spec = codec->spec;
6644 
6645         switch (action) {
6646         case HDA_FIXUP_ACT_PRE_PROBE:
6647                 /* Mic RING SLEEVE swap for combo jack */
6648                 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
6649                 spec->no_internal_mic_pin = true;
6650                 break;
6651         case HDA_FIXUP_ACT_INIT:
6652                 alc_combo_jack_hp_jd_restart(codec);
6653                 break;
6654         }
6655 }
6656 
6657 /* GPIO1 = amplifier on/off
6658  * GPIO3 = mic mute LED
6659  */
6660 static void alc285_fixup_hp_spectre_x360_eb1(struct hda_codec *codec,
6661                                           const struct hda_fixup *fix, int action)
6662 {
6663         static const hda_nid_t conn[] = { 0x02 };
6664 
6665         struct alc_spec *spec = codec->spec;
6666         static const struct hda_pintbl pincfgs[] = {
6667                 { 0x14, 0x90170110 },  /* front/high speakers */
6668                 { 0x17, 0x90170130 },  /* back/bass speakers */
6669                 { }
6670         };
6671 
6672         //enable micmute led
6673         alc_fixup_hp_gpio_led(codec, action, 0x00, 0x04);
6674 
6675         switch (action) {
6676         case HDA_FIXUP_ACT_PRE_PROBE:
6677                 spec->micmute_led_polarity = 1;
6678                 /* needed for amp of back speakers */
6679                 spec->gpio_mask |= 0x01;
6680                 spec->gpio_dir |= 0x01;
6681                 snd_hda_apply_pincfgs(codec, pincfgs);
6682                 /* share DAC to have unified volume control */
6683                 snd_hda_override_conn_list(codec, 0x14, ARRAY_SIZE(conn), conn);
6684                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6685                 break;
6686         case HDA_FIXUP_ACT_INIT:
6687                 /* need to toggle GPIO to enable the amp of back speakers */
6688                 alc_update_gpio_data(codec, 0x01, true);
6689                 msleep(100);
6690                 alc_update_gpio_data(codec, 0x01, false);
6691                 break;
6692         }
6693 }
6694 
6695 static void alc285_fixup_hp_spectre_x360(struct hda_codec *codec,
6696                                           const struct hda_fixup *fix, int action)
6697 {
6698         static const hda_nid_t conn[] = { 0x02 };
6699         static const struct hda_pintbl pincfgs[] = {
6700                 { 0x14, 0x90170110 },  /* rear speaker */
6701                 { }
6702         };
6703 
6704         switch (action) {
6705         case HDA_FIXUP_ACT_PRE_PROBE:
6706                 snd_hda_apply_pincfgs(codec, pincfgs);
6707                 /* force front speaker to DAC1 */
6708                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
6709                 break;
6710         }
6711 }
6712 
6713 static void alc285_fixup_hp_envy_x360(struct hda_codec *codec,
6714                                       const struct hda_fixup *fix,
6715                                       int action)
6716 {
6717         static const struct coef_fw coefs[] = {
6718                 WRITE_COEF(0x08, 0x6a0c), WRITE_COEF(0x0d, 0xa023),
6719                 WRITE_COEF(0x10, 0x0320), WRITE_COEF(0x1a, 0x8c03),
6720                 WRITE_COEF(0x25, 0x1800), WRITE_COEF(0x26, 0x003a),
6721                 WRITE_COEF(0x28, 0x1dfe), WRITE_COEF(0x29, 0xb014),
6722                 WRITE_COEF(0x2b, 0x1dfe), WRITE_COEF(0x37, 0xfe15),
6723                 WRITE_COEF(0x38, 0x7909), WRITE_COEF(0x45, 0xd489),
6724                 WRITE_COEF(0x46, 0x00f4), WRITE_COEF(0x4a, 0x21e0),
6725                 WRITE_COEF(0x66, 0x03f0), WRITE_COEF(0x67, 0x1000),
6726                 WRITE_COEF(0x6e, 0x1005), { }
6727         };
6728 
6729         static const struct hda_pintbl pincfgs[] = {
6730                 { 0x12, 0xb7a60130 },  /* Internal microphone*/
6731                 { 0x14, 0x90170150 },  /* B&O soundbar speakers */
6732                 { 0x17, 0x90170153 },  /* Side speakers */
6733                 { 0x19, 0x03a11040 },  /* Headset microphone */
6734                 { }
6735         };
6736 
6737         switch (action) {
6738         case HDA_FIXUP_ACT_PRE_PROBE:
6739                 snd_hda_apply_pincfgs(codec, pincfgs);
6740 
6741                 /* Fixes volume control problem for side speakers */
6742                 alc295_fixup_disable_dac3(codec, fix, action);
6743 
6744                 /* Fixes no sound from headset speaker */
6745                 snd_hda_codec_amp_stereo(codec, 0x21, HDA_OUTPUT, 0, -1, 0);
6746 
6747                 /* Auto-enable headset mic when plugged */
6748                 snd_hda_jack_set_gating_jack(codec, 0x19, 0x21);
6749 
6750                 /* Headset mic volume enhancement */
6751                 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREF50);
6752                 break;
6753         case HDA_FIXUP_ACT_INIT:
6754                 alc_process_coef_fw(codec, coefs);
6755                 break;
6756         case HDA_FIXUP_ACT_BUILD:
6757                 rename_ctl(codec, "Bass Speaker Playback Volume",
6758                            "B&O-Tuned Playback Volume");
6759                 rename_ctl(codec, "Front Playback Switch",
6760                            "B&O Soundbar Playback Switch");
6761                 rename_ctl(codec, "Bass Speaker Playback Switch",
6762                            "Side Speaker Playback Switch");
6763                 break;
6764         }
6765 }
6766 
6767 /* for hda_fixup_thinkpad_acpi() */
6768 #include "thinkpad_helper.c"
6769 
6770 static void alc_fixup_thinkpad_acpi(struct hda_codec *codec,
6771                                     const struct hda_fixup *fix, int action)
6772 {
6773         alc_fixup_no_shutup(codec, fix, action); /* reduce click noise */
6774         hda_fixup_thinkpad_acpi(codec, fix, action);
6775 }
6776 
6777 /* Fixup for Lenovo Legion 15IMHg05 speaker output on headset removal. */
6778 static void alc287_fixup_legion_15imhg05_speakers(struct hda_codec *codec,
6779                                                   const struct hda_fixup *fix,
6780                                                   int action)
6781 {
6782         struct alc_spec *spec = codec->spec;
6783 
6784         switch (action) {
6785         case HDA_FIXUP_ACT_PRE_PROBE:
6786                 spec->gen.suppress_auto_mute = 1;
6787                 break;
6788         }
6789 }
6790 
6791 static void comp_acpi_device_notify(acpi_handle handle, u32 event, void *data)
6792 {
6793         struct hda_codec *cdc = data;
6794         struct alc_spec *spec = cdc->spec;
6795 
6796         codec_info(cdc, "ACPI Notification %d\n", event);
6797 
6798         hda_component_acpi_device_notify(&spec->comps, handle, event, data);
6799 }
6800 
6801 static int comp_bind(struct device *dev)
6802 {
6803         struct hda_codec *cdc = dev_to_hda_codec(dev);
6804         struct alc_spec *spec = cdc->spec;
6805         int ret;
6806 
6807         ret = hda_component_manager_bind(cdc, &spec->comps);
6808         if (ret)
6809                 return ret;
6810 
6811         return hda_component_manager_bind_acpi_notifications(cdc,
6812                                                              &spec->comps,
6813                                                              comp_acpi_device_notify, cdc);
6814 }
6815 
6816 static void comp_unbind(struct device *dev)
6817 {
6818         struct hda_codec *cdc = dev_to_hda_codec(dev);
6819         struct alc_spec *spec = cdc->spec;
6820 
6821         hda_component_manager_unbind_acpi_notifications(cdc, &spec->comps, comp_acpi_device_notify);
6822         hda_component_manager_unbind(cdc, &spec->comps);
6823 }
6824 
6825 static const struct component_master_ops comp_master_ops = {
6826         .bind = comp_bind,
6827         .unbind = comp_unbind,
6828 };
6829 
6830 static void comp_generic_playback_hook(struct hda_pcm_stream *hinfo, struct hda_codec *cdc,
6831                                        struct snd_pcm_substream *sub, int action)
6832 {
6833         struct alc_spec *spec = cdc->spec;
6834 
6835         hda_component_manager_playback_hook(&spec->comps, action);
6836 }
6837 
6838 static void comp_generic_fixup(struct hda_codec *cdc, int action, const char *bus,
6839                                const char *hid, const char *match_str, int count)
6840 {
6841         struct alc_spec *spec = cdc->spec;
6842         int ret;
6843 
6844         switch (action) {
6845         case HDA_FIXUP_ACT_PRE_PROBE:
6846                 ret = hda_component_manager_init(cdc, &spec->comps, count, bus, hid,
6847                                                  match_str, &comp_master_ops);
6848                 if (ret)
6849                         return;
6850 
6851                 spec->gen.pcm_playback_hook = comp_generic_playback_hook;
6852                 break;
6853         case HDA_FIXUP_ACT_FREE:
6854                 hda_component_manager_free(cdc, &comp_master_ops);
6855                 break;
6856         }
6857 }
6858 
6859 static void cs35l41_fixup_i2c_two(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
6860 {
6861         comp_generic_fixup(cdc, action, "i2c", "CSC3551", "-%s:00-cs35l41-hda.%d", 2);
6862 }
6863 
6864 static void cs35l41_fixup_i2c_four(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
6865 {
6866         comp_generic_fixup(cdc, action, "i2c", "CSC3551", "-%s:00-cs35l41-hda.%d", 4);
6867 }
6868 
6869 static void cs35l41_fixup_spi_two(struct hda_codec *codec, const struct hda_fixup *fix, int action)
6870 {
6871         comp_generic_fixup(codec, action, "spi", "CSC3551", "-%s:00-cs35l41-hda.%d", 2);
6872 }
6873 
6874 static void cs35l41_fixup_spi_four(struct hda_codec *codec, const struct hda_fixup *fix, int action)
6875 {
6876         comp_generic_fixup(codec, action, "spi", "CSC3551", "-%s:00-cs35l41-hda.%d", 4);
6877 }
6878 
6879 static void alc287_fixup_legion_16achg6_speakers(struct hda_codec *cdc, const struct hda_fixup *fix,
6880                                                  int action)
6881 {
6882         comp_generic_fixup(cdc, action, "i2c", "CLSA0100", "-%s:00-cs35l41-hda.%d", 2);
6883 }
6884 
6885 static void alc287_fixup_legion_16ithg6_speakers(struct hda_codec *cdc, const struct hda_fixup *fix,
6886                                                  int action)
6887 {
6888         comp_generic_fixup(cdc, action, "i2c", "CLSA0101", "-%s:00-cs35l41-hda.%d", 2);
6889 }
6890 
6891 static void cs35l56_fixup_i2c_two(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
6892 {
6893         comp_generic_fixup(cdc, action, "i2c", "CSC3556", "-%s:00-cs35l56-hda.%d", 2);
6894 }
6895 
6896 static void cs35l56_fixup_i2c_four(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
6897 {
6898         comp_generic_fixup(cdc, action, "i2c", "CSC3556", "-%s:00-cs35l56-hda.%d", 4);
6899 }
6900 
6901 static void cs35l56_fixup_spi_two(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
6902 {
6903         comp_generic_fixup(cdc, action, "spi", "CSC3556", "-%s:00-cs35l56-hda.%d", 2);
6904 }
6905 
6906 static void cs35l56_fixup_spi_four(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
6907 {
6908         comp_generic_fixup(cdc, action, "spi", "CSC3556", "-%s:00-cs35l56-hda.%d", 4);
6909 }
6910 
6911 static void alc285_fixup_asus_ga403u(struct hda_codec *cdc, const struct hda_fixup *fix, int action)
6912 {
6913         /*
6914          * The same SSID has been re-used in different hardware, they have
6915          * different codecs and the newer GA403U has a ALC285.
6916          */
6917         if (cdc->core.vendor_id == 0x10ec0285)
6918                 cs35l56_fixup_i2c_two(cdc, fix, action);
6919         else
6920                 alc_fixup_inv_dmic(cdc, fix, action);
6921 }
6922 
6923 static void tas2781_fixup_i2c(struct hda_codec *cdc,
6924         const struct hda_fixup *fix, int action)
6925 {
6926         comp_generic_fixup(cdc, action, "i2c", "TIAS2781", "-%s:00", 1);
6927 }
6928 
6929 static void yoga7_14arb7_fixup_i2c(struct hda_codec *cdc,
6930         const struct hda_fixup *fix, int action)
6931 {
6932         comp_generic_fixup(cdc, action, "i2c", "INT8866", "-%s:00", 1);
6933 }
6934 
6935 static void alc256_fixup_acer_sfg16_micmute_led(struct hda_codec *codec,
6936         const struct hda_fixup *fix, int action)
6937 {
6938         alc_fixup_hp_gpio_led(codec, action, 0, 0x04);
6939 }
6940 
6941 
6942 /* for alc295_fixup_hp_top_speakers */
6943 #include "hp_x360_helper.c"
6944 
6945 /* for alc285_fixup_ideapad_s740_coef() */
6946 #include "ideapad_s740_helper.c"
6947 
6948 static const struct coef_fw alc256_fixup_set_coef_defaults_coefs[] = {
6949         WRITE_COEF(0x10, 0x0020), WRITE_COEF(0x24, 0x0000),
6950         WRITE_COEF(0x26, 0x0000), WRITE_COEF(0x29, 0x3000),
6951         WRITE_COEF(0x37, 0xfe05), WRITE_COEF(0x45, 0x5089),
6952         {}
6953 };
6954 
6955 static void alc256_fixup_set_coef_defaults(struct hda_codec *codec,
6956                                            const struct hda_fixup *fix,
6957                                            int action)
6958 {
6959         /*
6960          * A certain other OS sets these coeffs to different values. On at least
6961          * one TongFang barebone these settings might survive even a cold
6962          * reboot. So to restore a clean slate the values are explicitly reset
6963          * to default here. Without this, the external microphone is always in a
6964          * plugged-in state, while the internal microphone is always in an
6965          * unplugged state, breaking the ability to use the internal microphone.
6966          */
6967         alc_process_coef_fw(codec, alc256_fixup_set_coef_defaults_coefs);
6968 }
6969 
6970 static const struct coef_fw alc233_fixup_no_audio_jack_coefs[] = {
6971         WRITE_COEF(0x1a, 0x9003), WRITE_COEF(0x1b, 0x0e2b), WRITE_COEF(0x37, 0xfe06),
6972         WRITE_COEF(0x38, 0x4981), WRITE_COEF(0x45, 0xd489), WRITE_COEF(0x46, 0x0074),
6973         WRITE_COEF(0x49, 0x0149),
6974         {}
6975 };
6976 
6977 static void alc233_fixup_no_audio_jack(struct hda_codec *codec,
6978                                        const struct hda_fixup *fix,
6979                                        int action)
6980 {
6981         /*
6982          * The audio jack input and output is not detected on the ASRock NUC Box
6983          * 1100 series when cold booting without this fix. Warm rebooting from a
6984          * certain other OS makes the audio functional, as COEF settings are
6985          * preserved in this case. This fix sets these altered COEF values as
6986          * the default.
6987          */
6988         alc_process_coef_fw(codec, alc233_fixup_no_audio_jack_coefs);
6989 }
6990 
6991 static void alc256_fixup_mic_no_presence_and_resume(struct hda_codec *codec,
6992                                                     const struct hda_fixup *fix,
6993                                                     int action)
6994 {
6995         /*
6996          * The Clevo NJ51CU comes either with the ALC293 or the ALC256 codec,
6997          * but uses the 0x8686 subproduct id in both cases. The ALC256 codec
6998          * needs an additional quirk for sound working after suspend and resume.
6999          */
7000         if (codec->core.vendor_id == 0x10ec0256) {
7001                 alc_update_coef_idx(codec, 0x10, 1<<9, 0);
7002                 snd_hda_codec_set_pincfg(codec, 0x19, 0x04a11120);
7003         } else {
7004                 snd_hda_codec_set_pincfg(codec, 0x1a, 0x04a1113c);
7005         }
7006 }
7007 
7008 static void alc256_decrease_headphone_amp_val(struct hda_codec *codec,
7009                                               const struct hda_fixup *fix, int action)
7010 {
7011         u32 caps;
7012         u8 nsteps, offs;
7013 
7014         if (action != HDA_FIXUP_ACT_PRE_PROBE)
7015                 return;
7016 
7017         caps = query_amp_caps(codec, 0x3, HDA_OUTPUT);
7018         nsteps = ((caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT) - 10;
7019         offs = ((caps & AC_AMPCAP_OFFSET) >> AC_AMPCAP_OFFSET_SHIFT) - 10;
7020         caps &= ~AC_AMPCAP_NUM_STEPS & ~AC_AMPCAP_OFFSET;
7021         caps |= (nsteps << AC_AMPCAP_NUM_STEPS_SHIFT) | (offs << AC_AMPCAP_OFFSET_SHIFT);
7022 
7023         if (snd_hda_override_amp_caps(codec, 0x3, HDA_OUTPUT, caps))
7024                 codec_warn(codec, "failed to override amp caps for NID 0x3\n");
7025 }
7026 
7027 static void alc_fixup_dell4_mic_no_presence_quiet(struct hda_codec *codec,
7028                                                   const struct hda_fixup *fix,
7029                                                   int action)
7030 {
7031         struct alc_spec *spec = codec->spec;
7032         struct hda_input_mux *imux = &spec->gen.input_mux;
7033         int i;
7034 
7035         alc269_fixup_limit_int_mic_boost(codec, fix, action);
7036 
7037         switch (action) {
7038         case HDA_FIXUP_ACT_PRE_PROBE:
7039                 /**
7040                  * Set the vref of pin 0x19 (Headset Mic) and pin 0x1b (Headphone Mic)
7041                  * to Hi-Z to avoid pop noises at startup and when plugging and
7042                  * unplugging headphones.
7043                  */
7044                 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
7045                 snd_hda_codec_set_pin_target(codec, 0x1b, PIN_VREFHIZ);
7046                 break;
7047         case HDA_FIXUP_ACT_PROBE:
7048                 /**
7049                  * Make the internal mic (0x12) the default input source to
7050                  * prevent pop noises on cold boot.
7051                  */
7052                 for (i = 0; i < imux->num_items; i++) {
7053                         if (spec->gen.imux_pins[i] == 0x12) {
7054                                 spec->gen.cur_mux[0] = i;
7055                                 break;
7056                         }
7057                 }
7058                 break;
7059         }
7060 }
7061 
7062 static void alc287_fixup_yoga9_14iap7_bass_spk_pin(struct hda_codec *codec,
7063                                           const struct hda_fixup *fix, int action)
7064 {
7065         /*
7066          * The Pin Complex 0x17 for the bass speakers is wrongly reported as
7067          * unconnected.
7068          */
7069         static const struct hda_pintbl pincfgs[] = {
7070                 { 0x17, 0x90170121 },
7071                 { }
7072         };
7073         /*
7074          * Avoid DAC 0x06 and 0x08, as they have no volume controls.
7075          * DAC 0x02 and 0x03 would be fine.
7076          */
7077         static const hda_nid_t conn[] = { 0x02, 0x03 };
7078         /*
7079          * Prefer both speakerbar (0x14) and bass speakers (0x17) connected to DAC 0x02.
7080          * Headphones (0x21) are connected to DAC 0x03.
7081          */
7082         static const hda_nid_t preferred_pairs[] = {
7083                 0x14, 0x02,
7084                 0x17, 0x02,
7085                 0x21, 0x03,
7086                 0
7087         };
7088         struct alc_spec *spec = codec->spec;
7089 
7090         switch (action) {
7091         case HDA_FIXUP_ACT_PRE_PROBE:
7092                 snd_hda_apply_pincfgs(codec, pincfgs);
7093                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
7094                 spec->gen.preferred_dacs = preferred_pairs;
7095                 break;
7096         }
7097 }
7098 
7099 static void alc295_fixup_dell_inspiron_top_speakers(struct hda_codec *codec,
7100                                           const struct hda_fixup *fix, int action)
7101 {
7102         static const struct hda_pintbl pincfgs[] = {
7103                 { 0x14, 0x90170151 },
7104                 { 0x17, 0x90170150 },
7105                 { }
7106         };
7107         static const hda_nid_t conn[] = { 0x02, 0x03 };
7108         static const hda_nid_t preferred_pairs[] = {
7109                 0x14, 0x02,
7110                 0x17, 0x03,
7111                 0x21, 0x02,
7112                 0
7113         };
7114         struct alc_spec *spec = codec->spec;
7115 
7116         alc_fixup_no_shutup(codec, fix, action);
7117 
7118         switch (action) {
7119         case HDA_FIXUP_ACT_PRE_PROBE:
7120                 snd_hda_apply_pincfgs(codec, pincfgs);
7121                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
7122                 spec->gen.preferred_dacs = preferred_pairs;
7123                 break;
7124         }
7125 }
7126 
7127 /* Forcibly assign NID 0x03 to HP while NID 0x02 to SPK */
7128 static void alc287_fixup_bind_dacs(struct hda_codec *codec,
7129                                     const struct hda_fixup *fix, int action)
7130 {
7131         struct alc_spec *spec = codec->spec;
7132         static const hda_nid_t conn[] = { 0x02, 0x03 }; /* exclude 0x06 */
7133         static const hda_nid_t preferred_pairs[] = {
7134                 0x17, 0x02, 0x21, 0x03, 0
7135         };
7136 
7137         if (action != HDA_FIXUP_ACT_PRE_PROBE)
7138                 return;
7139 
7140         snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
7141         spec->gen.preferred_dacs = preferred_pairs;
7142         spec->gen.auto_mute_via_amp = 1;
7143         if (spec->gen.autocfg.speaker_pins[0] != 0x14) {
7144                 snd_hda_codec_write_cache(codec, 0x14, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
7145                                         0x0); /* Make sure 0x14 was disable */
7146         }
7147 }
7148 /* Fix none verb table of Headset Mic pin */
7149 static void alc_fixup_headset_mic(struct hda_codec *codec,
7150                                    const struct hda_fixup *fix, int action)
7151 {
7152         struct alc_spec *spec = codec->spec;
7153         static const struct hda_pintbl pincfgs[] = {
7154                 { 0x19, 0x03a1103c },
7155                 { }
7156         };
7157 
7158         switch (action) {
7159         case HDA_FIXUP_ACT_PRE_PROBE:
7160                 snd_hda_apply_pincfgs(codec, pincfgs);
7161                 alc_update_coef_idx(codec, 0x45, 0xf<<12 | 1<<10, 5<<12);
7162                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
7163                 break;
7164         }
7165 }
7166 
7167 static void alc245_fixup_hp_spectre_x360_eu0xxx(struct hda_codec *codec,
7168                                           const struct hda_fixup *fix, int action)
7169 {
7170         /*
7171          * The Pin Complex 0x14 for the treble speakers is wrongly reported as
7172          * unconnected.
7173          * The Pin Complex 0x17 for the bass speakers has the lowest association
7174          * and sequence values so shift it up a bit to squeeze 0x14 in.
7175          */
7176         static const struct hda_pintbl pincfgs[] = {
7177                 { 0x14, 0x90170110 }, // top/treble
7178                 { 0x17, 0x90170111 }, // bottom/bass
7179                 { }
7180         };
7181 
7182         /*
7183          * Force DAC 0x02 for the bass speakers 0x17.
7184          */
7185         static const hda_nid_t conn[] = { 0x02 };
7186 
7187         switch (action) {
7188         case HDA_FIXUP_ACT_PRE_PROBE:
7189                 snd_hda_apply_pincfgs(codec, pincfgs);
7190                 snd_hda_override_conn_list(codec, 0x17, ARRAY_SIZE(conn), conn);
7191                 break;
7192         }
7193 
7194         cs35l41_fixup_i2c_two(codec, fix, action);
7195         alc245_fixup_hp_mute_led_coefbit(codec, fix, action);
7196         alc245_fixup_hp_gpio_led(codec, fix, action);
7197 }
7198 
7199 /*
7200  * ALC287 PCM hooks
7201  */
7202 static void alc287_alc1318_playback_pcm_hook(struct hda_pcm_stream *hinfo,
7203                                    struct hda_codec *codec,
7204                                    struct snd_pcm_substream *substream,
7205                                    int action)
7206 {
7207         alc_write_coef_idx(codec, 0x10, 0x8806); /* Change MLK to GPIO3 */
7208         switch (action) {
7209         case HDA_GEN_PCM_ACT_OPEN:
7210                 alc_write_coefex_idx(codec, 0x5a, 0x00, 0x954f); /* write gpio3 to high */
7211                 break;
7212         case HDA_GEN_PCM_ACT_CLOSE:
7213                 alc_write_coefex_idx(codec, 0x5a, 0x00, 0x554f); /* write gpio3 as default value */
7214                 break;
7215         }
7216 }
7217 
7218 static void alc287_s4_power_gpio3_default(struct hda_codec *codec)
7219 {
7220         if (is_s4_suspend(codec)) {
7221                 alc_write_coef_idx(codec, 0x10, 0x8806); /* Change MLK to GPIO3 */
7222                 alc_write_coefex_idx(codec, 0x5a, 0x00, 0x554f); /* write gpio3 as default value */
7223         }
7224 }
7225 
7226 static void alc287_fixup_lenovo_thinkpad_with_alc1318(struct hda_codec *codec,
7227                                const struct hda_fixup *fix, int action)
7228 {
7229         struct alc_spec *spec = codec->spec;
7230 
7231         if (action != HDA_FIXUP_ACT_PRE_PROBE)
7232                 return;
7233         spec->power_hook = alc287_s4_power_gpio3_default;
7234         spec->gen.pcm_playback_hook = alc287_alc1318_playback_pcm_hook;
7235 }
7236 
7237 
7238 enum {
7239         ALC269_FIXUP_GPIO2,
7240         ALC269_FIXUP_SONY_VAIO,
7241         ALC275_FIXUP_SONY_VAIO_GPIO2,
7242         ALC269_FIXUP_DELL_M101Z,
7243         ALC269_FIXUP_SKU_IGNORE,
7244         ALC269_FIXUP_ASUS_G73JW,
7245         ALC269_FIXUP_ASUS_N7601ZM_PINS,
7246         ALC269_FIXUP_ASUS_N7601ZM,
7247         ALC269_FIXUP_LENOVO_EAPD,
7248         ALC275_FIXUP_SONY_HWEQ,
7249         ALC275_FIXUP_SONY_DISABLE_AAMIX,
7250         ALC271_FIXUP_DMIC,
7251         ALC269_FIXUP_PCM_44K,
7252         ALC269_FIXUP_STEREO_DMIC,
7253         ALC269_FIXUP_HEADSET_MIC,
7254         ALC269_FIXUP_QUANTA_MUTE,
7255         ALC269_FIXUP_LIFEBOOK,
7256         ALC269_FIXUP_LIFEBOOK_EXTMIC,
7257         ALC269_FIXUP_LIFEBOOK_HP_PIN,
7258         ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT,
7259         ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC,
7260         ALC269_FIXUP_AMIC,
7261         ALC269_FIXUP_DMIC,
7262         ALC269VB_FIXUP_AMIC,
7263         ALC269VB_FIXUP_DMIC,
7264         ALC269_FIXUP_HP_MUTE_LED,
7265         ALC269_FIXUP_HP_MUTE_LED_MIC1,
7266         ALC269_FIXUP_HP_MUTE_LED_MIC2,
7267         ALC269_FIXUP_HP_MUTE_LED_MIC3,
7268         ALC269_FIXUP_HP_GPIO_LED,
7269         ALC269_FIXUP_HP_GPIO_MIC1_LED,
7270         ALC269_FIXUP_HP_LINE1_MIC1_LED,
7271         ALC269_FIXUP_INV_DMIC,
7272         ALC269_FIXUP_LENOVO_DOCK,
7273         ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST,
7274         ALC269_FIXUP_NO_SHUTUP,
7275         ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
7276         ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
7277         ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
7278         ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
7279         ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
7280         ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
7281         ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET,
7282         ALC269_FIXUP_HEADSET_MODE,
7283         ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
7284         ALC269_FIXUP_ASPIRE_HEADSET_MIC,
7285         ALC269_FIXUP_ASUS_X101_FUNC,
7286         ALC269_FIXUP_ASUS_X101_VERB,
7287         ALC269_FIXUP_ASUS_X101,
7288         ALC271_FIXUP_AMIC_MIC2,
7289         ALC271_FIXUP_HP_GATE_MIC_JACK,
7290         ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572,
7291         ALC269_FIXUP_ACER_AC700,
7292         ALC269_FIXUP_LIMIT_INT_MIC_BOOST,
7293         ALC269VB_FIXUP_ASUS_ZENBOOK,
7294         ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,
7295         ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE,
7296         ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,
7297         ALC269VB_FIXUP_ORDISSIMO_EVE2,
7298         ALC283_FIXUP_CHROME_BOOK,
7299         ALC283_FIXUP_SENSE_COMBO_JACK,
7300         ALC282_FIXUP_ASUS_TX300,
7301         ALC283_FIXUP_INT_MIC,
7302         ALC290_FIXUP_MONO_SPEAKERS,
7303         ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
7304         ALC290_FIXUP_SUBWOOFER,
7305         ALC290_FIXUP_SUBWOOFER_HSJACK,
7306         ALC269_FIXUP_THINKPAD_ACPI,
7307         ALC269_FIXUP_DMIC_THINKPAD_ACPI,
7308         ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO,
7309         ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
7310         ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
7311         ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
7312         ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
7313         ALC255_FIXUP_HEADSET_MODE,
7314         ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
7315         ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
7316         ALC292_FIXUP_TPT440_DOCK,
7317         ALC292_FIXUP_TPT440,
7318         ALC283_FIXUP_HEADSET_MIC,
7319         ALC255_FIXUP_MIC_MUTE_LED,
7320         ALC282_FIXUP_ASPIRE_V5_PINS,
7321         ALC269VB_FIXUP_ASPIRE_E1_COEF,
7322         ALC280_FIXUP_HP_GPIO4,
7323         ALC286_FIXUP_HP_GPIO_LED,
7324         ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
7325         ALC280_FIXUP_HP_DOCK_PINS,
7326         ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,
7327         ALC280_FIXUP_HP_9480M,
7328         ALC245_FIXUP_HP_X360_AMP,
7329         ALC285_FIXUP_HP_SPECTRE_X360_EB1,
7330         ALC285_FIXUP_HP_ENVY_X360,
7331         ALC288_FIXUP_DELL_HEADSET_MODE,
7332         ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
7333         ALC288_FIXUP_DELL_XPS_13,
7334         ALC288_FIXUP_DISABLE_AAMIX,
7335         ALC292_FIXUP_DELL_E7X_AAMIX,
7336         ALC292_FIXUP_DELL_E7X,
7337         ALC292_FIXUP_DISABLE_AAMIX,
7338         ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK,
7339         ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
7340         ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
7341         ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
7342         ALC275_FIXUP_DELL_XPS,
7343         ALC293_FIXUP_LENOVO_SPK_NOISE,
7344         ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
7345         ALC255_FIXUP_DELL_SPK_NOISE,
7346         ALC225_FIXUP_DISABLE_MIC_VREF,
7347         ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
7348         ALC295_FIXUP_DISABLE_DAC3,
7349         ALC285_FIXUP_SPEAKER2_TO_DAC1,
7350         ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1,
7351         ALC285_FIXUP_ASUS_HEADSET_MIC,
7352         ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS,
7353         ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1,
7354         ALC285_FIXUP_ASUS_I2C_HEADSET_MIC,
7355         ALC280_FIXUP_HP_HEADSET_MIC,
7356         ALC221_FIXUP_HP_FRONT_MIC,
7357         ALC292_FIXUP_TPT460,
7358         ALC298_FIXUP_SPK_VOLUME,
7359         ALC298_FIXUP_LENOVO_SPK_VOLUME,
7360         ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER,
7361         ALC269_FIXUP_ATIV_BOOK_8,
7362         ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE,
7363         ALC221_FIXUP_HP_MIC_NO_PRESENCE,
7364         ALC256_FIXUP_ASUS_HEADSET_MODE,
7365         ALC256_FIXUP_ASUS_MIC,
7366         ALC256_FIXUP_ASUS_AIO_GPIO2,
7367         ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,
7368         ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,
7369         ALC233_FIXUP_LENOVO_MULTI_CODECS,
7370         ALC233_FIXUP_ACER_HEADSET_MIC,
7371         ALC294_FIXUP_LENOVO_MIC_LOCATION,
7372         ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE,
7373         ALC225_FIXUP_S3_POP_NOISE,
7374         ALC700_FIXUP_INTEL_REFERENCE,
7375         ALC274_FIXUP_DELL_BIND_DACS,
7376         ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
7377         ALC298_FIXUP_TPT470_DOCK_FIX,
7378         ALC298_FIXUP_TPT470_DOCK,
7379         ALC255_FIXUP_DUMMY_LINEOUT_VERB,
7380         ALC255_FIXUP_DELL_HEADSET_MIC,
7381         ALC256_FIXUP_HUAWEI_MACH_WX9_PINS,
7382         ALC298_FIXUP_HUAWEI_MBX_STEREO,
7383         ALC295_FIXUP_HP_X360,
7384         ALC221_FIXUP_HP_HEADSET_MIC,
7385         ALC285_FIXUP_LENOVO_HEADPHONE_NOISE,
7386         ALC295_FIXUP_HP_AUTO_MUTE,
7387         ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
7388         ALC294_FIXUP_ASUS_MIC,
7389         ALC294_FIXUP_ASUS_HEADSET_MIC,
7390         ALC294_FIXUP_ASUS_SPK,
7391         ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
7392         ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
7393         ALC255_FIXUP_ACER_HEADSET_MIC,
7394         ALC295_FIXUP_CHROME_BOOK,
7395         ALC225_FIXUP_HEADSET_JACK,
7396         ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE,
7397         ALC225_FIXUP_WYSE_AUTO_MUTE,
7398         ALC225_FIXUP_WYSE_DISABLE_MIC_VREF,
7399         ALC286_FIXUP_ACER_AIO_HEADSET_MIC,
7400         ALC256_FIXUP_ASUS_HEADSET_MIC,
7401         ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
7402         ALC299_FIXUP_PREDATOR_SPK,
7403         ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE,
7404         ALC289_FIXUP_DELL_SPK1,
7405         ALC289_FIXUP_DELL_SPK2,
7406         ALC289_FIXUP_DUAL_SPK,
7407         ALC289_FIXUP_RTK_AMP_DUAL_SPK,
7408         ALC294_FIXUP_SPK2_TO_DAC1,
7409         ALC294_FIXUP_ASUS_DUAL_SPK,
7410         ALC285_FIXUP_THINKPAD_X1_GEN7,
7411         ALC285_FIXUP_THINKPAD_HEADSET_JACK,
7412         ALC294_FIXUP_ASUS_ALLY,
7413         ALC294_FIXUP_ASUS_ALLY_PINS,
7414         ALC294_FIXUP_ASUS_ALLY_VERBS,
7415         ALC294_FIXUP_ASUS_ALLY_SPEAKER,
7416         ALC294_FIXUP_ASUS_HPE,
7417         ALC294_FIXUP_ASUS_COEF_1B,
7418         ALC294_FIXUP_ASUS_GX502_HP,
7419         ALC294_FIXUP_ASUS_GX502_PINS,
7420         ALC294_FIXUP_ASUS_GX502_VERBS,
7421         ALC294_FIXUP_ASUS_GU502_HP,
7422         ALC294_FIXUP_ASUS_GU502_PINS,
7423         ALC294_FIXUP_ASUS_GU502_VERBS,
7424         ALC294_FIXUP_ASUS_G513_PINS,
7425         ALC285_FIXUP_ASUS_G533Z_PINS,
7426         ALC285_FIXUP_HP_GPIO_LED,
7427         ALC285_FIXUP_HP_MUTE_LED,
7428         ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED,
7429         ALC236_FIXUP_HP_MUTE_LED_COEFBIT2,
7430         ALC236_FIXUP_HP_GPIO_LED,
7431         ALC236_FIXUP_HP_MUTE_LED,
7432         ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
7433         ALC298_FIXUP_SAMSUNG_AMP,
7434         ALC298_FIXUP_SAMSUNG_AMP2,
7435         ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
7436         ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET,
7437         ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
7438         ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS,
7439         ALC269VC_FIXUP_ACER_HEADSET_MIC,
7440         ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE,
7441         ALC289_FIXUP_ASUS_GA401,
7442         ALC289_FIXUP_ASUS_GA502,
7443         ALC256_FIXUP_ACER_MIC_NO_PRESENCE,
7444         ALC285_FIXUP_HP_GPIO_AMP_INIT,
7445         ALC269_FIXUP_CZC_B20,
7446         ALC269_FIXUP_CZC_TMI,
7447         ALC269_FIXUP_CZC_L101,
7448         ALC269_FIXUP_LEMOTE_A1802,
7449         ALC269_FIXUP_LEMOTE_A190X,
7450         ALC256_FIXUP_INTEL_NUC8_RUGGED,
7451         ALC233_FIXUP_INTEL_NUC8_DMIC,
7452         ALC233_FIXUP_INTEL_NUC8_BOOST,
7453         ALC256_FIXUP_INTEL_NUC10,
7454         ALC255_FIXUP_XIAOMI_HEADSET_MIC,
7455         ALC274_FIXUP_HP_MIC,
7456         ALC274_FIXUP_HP_HEADSET_MIC,
7457         ALC274_FIXUP_HP_ENVY_GPIO,
7458         ALC256_FIXUP_ASUS_HPE,
7459         ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
7460         ALC287_FIXUP_HP_GPIO_LED,
7461         ALC256_FIXUP_HP_HEADSET_MIC,
7462         ALC245_FIXUP_HP_GPIO_LED,
7463         ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
7464         ALC282_FIXUP_ACER_DISABLE_LINEOUT,
7465         ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST,
7466         ALC256_FIXUP_ACER_HEADSET_MIC,
7467         ALC285_FIXUP_IDEAPAD_S740_COEF,
7468         ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST,
7469         ALC295_FIXUP_ASUS_DACS,
7470         ALC295_FIXUP_HP_OMEN,
7471         ALC285_FIXUP_HP_SPECTRE_X360,
7472         ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP,
7473         ALC623_FIXUP_LENOVO_THINKSTATION_P340,
7474         ALC255_FIXUP_ACER_HEADPHONE_AND_MIC,
7475         ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST,
7476         ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS,
7477         ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
7478         ALC287_FIXUP_YOGA7_14ITL_SPEAKERS,
7479         ALC298_FIXUP_LENOVO_C940_DUET7,
7480         ALC287_FIXUP_LENOVO_14IRP8_DUETITL,
7481         ALC287_FIXUP_LENOVO_LEGION_7,
7482         ALC287_FIXUP_13S_GEN2_SPEAKERS,
7483         ALC256_FIXUP_SET_COEF_DEFAULTS,
7484         ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE,
7485         ALC233_FIXUP_NO_AUDIO_JACK,
7486         ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME,
7487         ALC285_FIXUP_LEGION_Y9000X_SPEAKERS,
7488         ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
7489         ALC287_FIXUP_LEGION_16ACHG6,
7490         ALC287_FIXUP_CS35L41_I2C_2,
7491         ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED,
7492         ALC287_FIXUP_CS35L41_I2C_4,
7493         ALC245_FIXUP_CS35L41_SPI_2,
7494         ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED,
7495         ALC245_FIXUP_CS35L41_SPI_4,
7496         ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED,
7497         ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED,
7498         ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE,
7499         ALC287_FIXUP_LEGION_16ITHG6,
7500         ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK,
7501         ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN,
7502         ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PIN,
7503         ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS,
7504         ALC236_FIXUP_DELL_DUAL_CODECS,
7505         ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI,
7506         ALC287_FIXUP_TAS2781_I2C,
7507         ALC287_FIXUP_YOGA7_14ARB7_I2C,
7508         ALC245_FIXUP_HP_MUTE_LED_COEFBIT,
7509         ALC245_FIXUP_HP_X360_MUTE_LEDS,
7510         ALC287_FIXUP_THINKPAD_I2S_SPK,
7511         ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD,
7512         ALC2XX_FIXUP_HEADSET_MIC,
7513         ALC289_FIXUP_DELL_CS35L41_SPI_2,
7514         ALC294_FIXUP_CS35L41_I2C_2,
7515         ALC245_FIXUP_CS35L56_SPI_4_HP_GPIO_LED,
7516         ALC256_FIXUP_ACER_SFG16_MICMUTE_LED,
7517         ALC256_FIXUP_HEADPHONE_AMP_VOL,
7518         ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX,
7519         ALC285_FIXUP_CS35L56_SPI_2,
7520         ALC285_FIXUP_CS35L56_I2C_2,
7521         ALC285_FIXUP_CS35L56_I2C_4,
7522         ALC285_FIXUP_ASUS_GA403U,
7523         ALC285_FIXUP_ASUS_GA403U_HEADSET_MIC,
7524         ALC285_FIXUP_ASUS_GA403U_I2C_SPEAKER2_TO_DAC1,
7525         ALC285_FIXUP_ASUS_GU605_SPI_2_HEADSET_MIC,
7526         ALC285_FIXUP_ASUS_GU605_SPI_SPEAKER2_TO_DAC1,
7527         ALC287_FIXUP_LENOVO_THKPAD_WH_ALC1318,
7528         ALC256_FIXUP_CHROME_BOOK,
7529         ALC287_FIXUP_LENOVO_14ARP8_LEGION_IAH7,
7530         ALC287_FIXUP_LENOVO_SSID_17AA3820,
7531 };
7532 
7533 /* A special fixup for Lenovo C940 and Yoga Duet 7;
7534  * both have the very same PCI SSID, and we need to apply different fixups
7535  * depending on the codec ID
7536  */
7537 static void alc298_fixup_lenovo_c940_duet7(struct hda_codec *codec,
7538                                            const struct hda_fixup *fix,
7539                                            int action)
7540 {
7541         int id;
7542 
7543         if (codec->core.vendor_id == 0x10ec0298)
7544                 id = ALC298_FIXUP_LENOVO_SPK_VOLUME; /* C940 */
7545         else
7546                 id = ALC287_FIXUP_YOGA7_14ITL_SPEAKERS; /* Duet 7 */
7547         __snd_hda_apply_fixup(codec, id, action, 0);
7548 }
7549 
7550 /* A special fixup for Lenovo Slim/Yoga Pro 9 14IRP8 and Yoga DuetITL 2021;
7551  * 14IRP8 PCI SSID will mistakenly be matched with the DuetITL codec SSID,
7552  * so we need to apply a different fixup in this case. The only DuetITL codec
7553  * SSID reported so far is the 17aa:3802 while the 14IRP8 has the 17aa:38be
7554  * and 17aa:38bf. If it weren't for the PCI SSID, the 14IRP8 models would
7555  * have matched correctly by their codecs.
7556  */
7557 static void alc287_fixup_lenovo_14irp8_duetitl(struct hda_codec *codec,
7558                                               const struct hda_fixup *fix,
7559                                               int action)
7560 {
7561         int id;
7562 
7563         if (codec->core.subsystem_id == 0x17aa3802)
7564                 id = ALC287_FIXUP_YOGA7_14ITL_SPEAKERS; /* DuetITL */
7565         else
7566                 id = ALC287_FIXUP_TAS2781_I2C; /* 14IRP8 */
7567         __snd_hda_apply_fixup(codec, id, action, 0);
7568 }
7569 
7570 /* Similar to above the Lenovo Yoga Pro 7 14ARP8 PCI SSID matches the codec SSID of the
7571    Legion Y9000X 2022 IAH7.*/
7572 static void alc287_fixup_lenovo_14arp8_legion_iah7(struct hda_codec *codec,
7573                                            const struct hda_fixup *fix,
7574                                            int action)
7575 {
7576         int id;
7577 
7578         if (codec->core.subsystem_id == 0x17aa386e)
7579                 id = ALC287_FIXUP_CS35L41_I2C_2; /* Legion Y9000X 2022 IAH7 */
7580         else
7581                 id = ALC285_FIXUP_SPEAKER2_TO_DAC1; /* Yoga Pro 7 14ARP8 */
7582         __snd_hda_apply_fixup(codec, id, action, 0);
7583 }
7584 
7585 /* Another hilarious PCI SSID conflict with Lenovo Legion Pro 7 16ARX8H (with
7586  * TAS2781 codec) and Legion 7i 16IAX7 (with CS35L41 codec);
7587  * we apply a corresponding fixup depending on the codec SSID instead
7588  */
7589 static void alc287_fixup_lenovo_legion_7(struct hda_codec *codec,
7590                                          const struct hda_fixup *fix,
7591                                          int action)
7592 {
7593         int id;
7594 
7595         if (codec->core.subsystem_id == 0x17aa38a8)
7596                 id = ALC287_FIXUP_TAS2781_I2C; /* Legion Pro 7 16ARX8H */
7597         else
7598                 id = ALC287_FIXUP_CS35L41_I2C_2; /* Legion 7i 16IAX7 */
7599         __snd_hda_apply_fixup(codec, id, action, 0);
7600 }
7601 
7602 /* Yet more conflicting PCI SSID (17aa:3820) on two Lenovo models */
7603 static void alc287_fixup_lenovo_ssid_17aa3820(struct hda_codec *codec,
7604                                               const struct hda_fixup *fix,
7605                                               int action)
7606 {
7607         int id;
7608 
7609         if (codec->core.subsystem_id == 0x17aa3820)
7610                 id = ALC269_FIXUP_ASPIRE_HEADSET_MIC; /* IdeaPad 330-17IKB 81DM */
7611         else /* 0x17aa3802 */
7612                 id =  ALC287_FIXUP_YOGA7_14ITL_SPEAKERS; /* "Yoga Duet 7 13ITL6 */
7613         __snd_hda_apply_fixup(codec, id, action, 0);
7614 }
7615 
7616 static const struct hda_fixup alc269_fixups[] = {
7617         [ALC269_FIXUP_GPIO2] = {
7618                 .type = HDA_FIXUP_FUNC,
7619                 .v.func = alc_fixup_gpio2,
7620         },
7621         [ALC269_FIXUP_SONY_VAIO] = {
7622                 .type = HDA_FIXUP_PINCTLS,
7623                 .v.pins = (const struct hda_pintbl[]) {
7624                         {0x19, PIN_VREFGRD},
7625                         {}
7626                 }
7627         },
7628         [ALC275_FIXUP_SONY_VAIO_GPIO2] = {
7629                 .type = HDA_FIXUP_FUNC,
7630                 .v.func = alc275_fixup_gpio4_off,
7631                 .chained = true,
7632                 .chain_id = ALC269_FIXUP_SONY_VAIO
7633         },
7634         [ALC269_FIXUP_DELL_M101Z] = {
7635                 .type = HDA_FIXUP_VERBS,
7636                 .v.verbs = (const struct hda_verb[]) {
7637                         /* Enables internal speaker */
7638                         {0x20, AC_VERB_SET_COEF_INDEX, 13},
7639                         {0x20, AC_VERB_SET_PROC_COEF, 0x4040},
7640                         {}
7641                 }
7642         },
7643         [ALC269_FIXUP_SKU_IGNORE] = {
7644                 .type = HDA_FIXUP_FUNC,
7645                 .v.func = alc_fixup_sku_ignore,
7646         },
7647         [ALC269_FIXUP_ASUS_G73JW] = {
7648                 .type = HDA_FIXUP_PINS,
7649                 .v.pins = (const struct hda_pintbl[]) {
7650                         { 0x17, 0x99130111 }, /* subwoofer */
7651                         { }
7652                 }
7653         },
7654         [ALC269_FIXUP_ASUS_N7601ZM_PINS] = {
7655                 .type = HDA_FIXUP_PINS,
7656                 .v.pins = (const struct hda_pintbl[]) {
7657                         { 0x19, 0x03A11050 },
7658                         { 0x1a, 0x03A11C30 },
7659                         { 0x21, 0x03211420 },
7660                         { }
7661                 }
7662         },
7663         [ALC269_FIXUP_ASUS_N7601ZM] = {
7664                 .type = HDA_FIXUP_VERBS,
7665                 .v.verbs = (const struct hda_verb[]) {
7666                         {0x20, AC_VERB_SET_COEF_INDEX, 0x62},
7667                         {0x20, AC_VERB_SET_PROC_COEF, 0xa007},
7668                         {0x20, AC_VERB_SET_COEF_INDEX, 0x10},
7669                         {0x20, AC_VERB_SET_PROC_COEF, 0x8420},
7670                         {0x20, AC_VERB_SET_COEF_INDEX, 0x0f},
7671                         {0x20, AC_VERB_SET_PROC_COEF, 0x7774},
7672                         { }
7673                 },
7674                 .chained = true,
7675                 .chain_id = ALC269_FIXUP_ASUS_N7601ZM_PINS,
7676         },
7677         [ALC269_FIXUP_LENOVO_EAPD] = {
7678                 .type = HDA_FIXUP_VERBS,
7679                 .v.verbs = (const struct hda_verb[]) {
7680                         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
7681                         {}
7682                 }
7683         },
7684         [ALC275_FIXUP_SONY_HWEQ] = {
7685                 .type = HDA_FIXUP_FUNC,
7686                 .v.func = alc269_fixup_hweq,
7687                 .chained = true,
7688                 .chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
7689         },
7690         [ALC275_FIXUP_SONY_DISABLE_AAMIX] = {
7691                 .type = HDA_FIXUP_FUNC,
7692                 .v.func = alc_fixup_disable_aamix,
7693                 .chained = true,
7694                 .chain_id = ALC269_FIXUP_SONY_VAIO
7695         },
7696         [ALC271_FIXUP_DMIC] = {
7697                 .type = HDA_FIXUP_FUNC,
7698                 .v.func = alc271_fixup_dmic,
7699         },
7700         [ALC269_FIXUP_PCM_44K] = {
7701                 .type = HDA_FIXUP_FUNC,
7702                 .v.func = alc269_fixup_pcm_44k,
7703                 .chained = true,
7704                 .chain_id = ALC269_FIXUP_QUANTA_MUTE
7705         },
7706         [ALC269_FIXUP_STEREO_DMIC] = {
7707                 .type = HDA_FIXUP_FUNC,
7708                 .v.func = alc269_fixup_stereo_dmic,
7709         },
7710         [ALC269_FIXUP_HEADSET_MIC] = {
7711                 .type = HDA_FIXUP_FUNC,
7712                 .v.func = alc269_fixup_headset_mic,
7713         },
7714         [ALC269_FIXUP_QUANTA_MUTE] = {
7715                 .type = HDA_FIXUP_FUNC,
7716                 .v.func = alc269_fixup_quanta_mute,
7717         },
7718         [ALC269_FIXUP_LIFEBOOK] = {
7719                 .type = HDA_FIXUP_PINS,
7720                 .v.pins = (const struct hda_pintbl[]) {
7721                         { 0x1a, 0x2101103f }, /* dock line-out */
7722                         { 0x1b, 0x23a11040 }, /* dock mic-in */
7723                         { }
7724                 },
7725                 .chained = true,
7726                 .chain_id = ALC269_FIXUP_QUANTA_MUTE
7727         },
7728         [ALC269_FIXUP_LIFEBOOK_EXTMIC] = {
7729                 .type = HDA_FIXUP_PINS,
7730                 .v.pins = (const struct hda_pintbl[]) {
7731                         { 0x19, 0x01a1903c }, /* headset mic, with jack detect */
7732                         { }
7733                 },
7734         },
7735         [ALC269_FIXUP_LIFEBOOK_HP_PIN] = {
7736                 .type = HDA_FIXUP_PINS,
7737                 .v.pins = (const struct hda_pintbl[]) {
7738                         { 0x21, 0x0221102f }, /* HP out */
7739                         { }
7740                 },
7741         },
7742         [ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT] = {
7743                 .type = HDA_FIXUP_FUNC,
7744                 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
7745         },
7746         [ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC] = {
7747                 .type = HDA_FIXUP_FUNC,
7748                 .v.func = alc269_fixup_pincfg_U7x7_headset_mic,
7749         },
7750         [ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO] = {
7751                 .type = HDA_FIXUP_PINS,
7752                 .v.pins = (const struct hda_pintbl[]) {
7753                         { 0x18, 0x03a19020 }, /* headset mic */
7754                         { 0x1b, 0x90170150 }, /* speaker */
7755                         { }
7756                 },
7757         },
7758         [ALC269_FIXUP_AMIC] = {
7759                 .type = HDA_FIXUP_PINS,
7760                 .v.pins = (const struct hda_pintbl[]) {
7761                         { 0x14, 0x99130110 }, /* speaker */
7762                         { 0x15, 0x0121401f }, /* HP out */
7763                         { 0x18, 0x01a19c20 }, /* mic */
7764                         { 0x19, 0x99a3092f }, /* int-mic */
7765                         { }
7766                 },
7767         },
7768         [ALC269_FIXUP_DMIC] = {
7769                 .type = HDA_FIXUP_PINS,
7770                 .v.pins = (const struct hda_pintbl[]) {
7771                         { 0x12, 0x99a3092f }, /* int-mic */
7772                         { 0x14, 0x99130110 }, /* speaker */
7773                         { 0x15, 0x0121401f }, /* HP out */
7774                         { 0x18, 0x01a19c20 }, /* mic */
7775                         { }
7776                 },
7777         },
7778         [ALC269VB_FIXUP_AMIC] = {
7779                 .type = HDA_FIXUP_PINS,
7780                 .v.pins = (const struct hda_pintbl[]) {
7781                         { 0x14, 0x99130110 }, /* speaker */
7782                         { 0x18, 0x01a19c20 }, /* mic */
7783                         { 0x19, 0x99a3092f }, /* int-mic */
7784                         { 0x21, 0x0121401f }, /* HP out */
7785                         { }
7786                 },
7787         },
7788         [ALC269VB_FIXUP_DMIC] = {
7789                 .type = HDA_FIXUP_PINS,
7790                 .v.pins = (const struct hda_pintbl[]) {
7791                         { 0x12, 0x99a3092f }, /* int-mic */
7792                         { 0x14, 0x99130110 }, /* speaker */
7793                         { 0x18, 0x01a19c20 }, /* mic */
7794                         { 0x21, 0x0121401f }, /* HP out */
7795                         { }
7796                 },
7797         },
7798         [ALC269_FIXUP_HP_MUTE_LED] = {
7799                 .type = HDA_FIXUP_FUNC,
7800                 .v.func = alc269_fixup_hp_mute_led,
7801         },
7802         [ALC269_FIXUP_HP_MUTE_LED_MIC1] = {
7803                 .type = HDA_FIXUP_FUNC,
7804                 .v.func = alc269_fixup_hp_mute_led_mic1,
7805         },
7806         [ALC269_FIXUP_HP_MUTE_LED_MIC2] = {
7807                 .type = HDA_FIXUP_FUNC,
7808                 .v.func = alc269_fixup_hp_mute_led_mic2,
7809         },
7810         [ALC269_FIXUP_HP_MUTE_LED_MIC3] = {
7811                 .type = HDA_FIXUP_FUNC,
7812                 .v.func = alc269_fixup_hp_mute_led_mic3,
7813                 .chained = true,
7814                 .chain_id = ALC295_FIXUP_HP_AUTO_MUTE
7815         },
7816         [ALC269_FIXUP_HP_GPIO_LED] = {
7817                 .type = HDA_FIXUP_FUNC,
7818                 .v.func = alc269_fixup_hp_gpio_led,
7819         },
7820         [ALC269_FIXUP_HP_GPIO_MIC1_LED] = {
7821                 .type = HDA_FIXUP_FUNC,
7822                 .v.func = alc269_fixup_hp_gpio_mic1_led,
7823         },
7824         [ALC269_FIXUP_HP_LINE1_MIC1_LED] = {
7825                 .type = HDA_FIXUP_FUNC,
7826                 .v.func = alc269_fixup_hp_line1_mic1_led,
7827         },
7828         [ALC269_FIXUP_INV_DMIC] = {
7829                 .type = HDA_FIXUP_FUNC,
7830                 .v.func = alc_fixup_inv_dmic,
7831         },
7832         [ALC269_FIXUP_NO_SHUTUP] = {
7833                 .type = HDA_FIXUP_FUNC,
7834                 .v.func = alc_fixup_no_shutup,
7835         },
7836         [ALC269_FIXUP_LENOVO_DOCK] = {
7837                 .type = HDA_FIXUP_PINS,
7838                 .v.pins = (const struct hda_pintbl[]) {
7839                         { 0x19, 0x23a11040 }, /* dock mic */
7840                         { 0x1b, 0x2121103f }, /* dock headphone */
7841                         { }
7842                 },
7843                 .chained = true,
7844                 .chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT
7845         },
7846         [ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST] = {
7847                 .type = HDA_FIXUP_FUNC,
7848                 .v.func = alc269_fixup_limit_int_mic_boost,
7849                 .chained = true,
7850                 .chain_id = ALC269_FIXUP_LENOVO_DOCK,
7851         },
7852         [ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = {
7853                 .type = HDA_FIXUP_FUNC,
7854                 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
7855                 .chained = true,
7856                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
7857         },
7858         [ALC269_FIXUP_DELL1_MIC_NO_PRESENCE] = {
7859                 .type = HDA_FIXUP_PINS,
7860                 .v.pins = (const struct hda_pintbl[]) {
7861                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7862                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7863                         { }
7864                 },
7865                 .chained = true,
7866                 .chain_id = ALC269_FIXUP_HEADSET_MODE
7867         },
7868         [ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {
7869                 .type = HDA_FIXUP_PINS,
7870                 .v.pins = (const struct hda_pintbl[]) {
7871                         { 0x16, 0x21014020 }, /* dock line out */
7872                         { 0x19, 0x21a19030 }, /* dock mic */
7873                         { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7874                         { }
7875                 },
7876                 .chained = true,
7877                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7878         },
7879         [ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = {
7880                 .type = HDA_FIXUP_PINS,
7881                 .v.pins = (const struct hda_pintbl[]) {
7882                         { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7883                         { }
7884                 },
7885                 .chained = true,
7886                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
7887         },
7888         [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE] = {
7889                 .type = HDA_FIXUP_PINS,
7890                 .v.pins = (const struct hda_pintbl[]) {
7891                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7892                         { 0x1b, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
7893                         { }
7894                 },
7895                 .chained = true,
7896                 .chain_id = ALC269_FIXUP_HEADSET_MODE
7897         },
7898         [ALC269_FIXUP_HEADSET_MODE] = {
7899                 .type = HDA_FIXUP_FUNC,
7900                 .v.func = alc_fixup_headset_mode,
7901                 .chained = true,
7902                 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
7903         },
7904         [ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
7905                 .type = HDA_FIXUP_FUNC,
7906                 .v.func = alc_fixup_headset_mode_no_hp_mic,
7907         },
7908         [ALC269_FIXUP_ASPIRE_HEADSET_MIC] = {
7909                 .type = HDA_FIXUP_PINS,
7910                 .v.pins = (const struct hda_pintbl[]) {
7911                         { 0x19, 0x01a1913c }, /* headset mic w/o jack detect */
7912                         { }
7913                 },
7914                 .chained = true,
7915                 .chain_id = ALC269_FIXUP_HEADSET_MODE,
7916         },
7917         [ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {
7918                 .type = HDA_FIXUP_PINS,
7919                 .v.pins = (const struct hda_pintbl[]) {
7920                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
7921                         { }
7922                 },
7923                 .chained = true,
7924                 .chain_id = ALC269_FIXUP_HEADSET_MIC
7925         },
7926         [ALC256_FIXUP_HUAWEI_MACH_WX9_PINS] = {
7927                 .type = HDA_FIXUP_PINS,
7928                 .v.pins = (const struct hda_pintbl[]) {
7929                         {0x12, 0x90a60130},
7930                         {0x13, 0x40000000},
7931                         {0x14, 0x90170110},
7932                         {0x18, 0x411111f0},
7933                         {0x19, 0x04a11040},
7934                         {0x1a, 0x411111f0},
7935                         {0x1b, 0x90170112},
7936                         {0x1d, 0x40759a05},
7937                         {0x1e, 0x411111f0},
7938                         {0x21, 0x04211020},
7939                         { }
7940                 },
7941                 .chained = true,
7942                 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
7943         },
7944         [ALC298_FIXUP_HUAWEI_MBX_STEREO] = {
7945                 .type = HDA_FIXUP_FUNC,
7946                 .v.func = alc298_fixup_huawei_mbx_stereo,
7947                 .chained = true,
7948                 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
7949         },
7950         [ALC269_FIXUP_ASUS_X101_FUNC] = {
7951                 .type = HDA_FIXUP_FUNC,
7952                 .v.func = alc269_fixup_x101_headset_mic,
7953         },
7954         [ALC269_FIXUP_ASUS_X101_VERB] = {
7955                 .type = HDA_FIXUP_VERBS,
7956                 .v.verbs = (const struct hda_verb[]) {
7957                         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
7958                         {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
7959                         {0x20, AC_VERB_SET_PROC_COEF,  0x0310},
7960                         { }
7961                 },
7962                 .chained = true,
7963                 .chain_id = ALC269_FIXUP_ASUS_X101_FUNC
7964         },
7965         [ALC269_FIXUP_ASUS_X101] = {
7966                 .type = HDA_FIXUP_PINS,
7967                 .v.pins = (const struct hda_pintbl[]) {
7968                         { 0x18, 0x04a1182c }, /* Headset mic */
7969                         { }
7970                 },
7971                 .chained = true,
7972                 .chain_id = ALC269_FIXUP_ASUS_X101_VERB
7973         },
7974         [ALC271_FIXUP_AMIC_MIC2] = {
7975                 .type = HDA_FIXUP_PINS,
7976                 .v.pins = (const struct hda_pintbl[]) {
7977                         { 0x14, 0x99130110 }, /* speaker */
7978                         { 0x19, 0x01a19c20 }, /* mic */
7979                         { 0x1b, 0x99a7012f }, /* int-mic */
7980                         { 0x21, 0x0121401f }, /* HP out */
7981                         { }
7982                 },
7983         },
7984         [ALC271_FIXUP_HP_GATE_MIC_JACK] = {
7985                 .type = HDA_FIXUP_FUNC,
7986                 .v.func = alc271_hp_gate_mic_jack,
7987                 .chained = true,
7988                 .chain_id = ALC271_FIXUP_AMIC_MIC2,
7989         },
7990         [ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572] = {
7991                 .type = HDA_FIXUP_FUNC,
7992                 .v.func = alc269_fixup_limit_int_mic_boost,
7993                 .chained = true,
7994                 .chain_id = ALC271_FIXUP_HP_GATE_MIC_JACK,
7995         },
7996         [ALC269_FIXUP_ACER_AC700] = {
7997                 .type = HDA_FIXUP_PINS,
7998                 .v.pins = (const struct hda_pintbl[]) {
7999                         { 0x12, 0x99a3092f }, /* int-mic */
8000                         { 0x14, 0x99130110 }, /* speaker */
8001                         { 0x18, 0x03a11c20 }, /* mic */
8002                         { 0x1e, 0x0346101e }, /* SPDIF1 */
8003                         { 0x21, 0x0321101f }, /* HP out */
8004                         { }
8005                 },
8006                 .chained = true,
8007                 .chain_id = ALC271_FIXUP_DMIC,
8008         },
8009         [ALC269_FIXUP_LIMIT_INT_MIC_BOOST] = {
8010                 .type = HDA_FIXUP_FUNC,
8011                 .v.func = alc269_fixup_limit_int_mic_boost,
8012                 .chained = true,
8013                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
8014         },
8015         [ALC269VB_FIXUP_ASUS_ZENBOOK] = {
8016                 .type = HDA_FIXUP_FUNC,
8017                 .v.func = alc269_fixup_limit_int_mic_boost,
8018                 .chained = true,
8019                 .chain_id = ALC269VB_FIXUP_DMIC,
8020         },
8021         [ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A] = {
8022                 .type = HDA_FIXUP_VERBS,
8023                 .v.verbs = (const struct hda_verb[]) {
8024                         /* class-D output amp +5dB */
8025                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x12 },
8026                         { 0x20, AC_VERB_SET_PROC_COEF, 0x2800 },
8027                         {}
8028                 },
8029                 .chained = true,
8030                 .chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,
8031         },
8032         [ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8033                 .type = HDA_FIXUP_PINS,
8034                 .v.pins = (const struct hda_pintbl[]) {
8035                         { 0x18, 0x01a110f0 },  /* use as headset mic */
8036                         { }
8037                 },
8038                 .chained = true,
8039                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8040         },
8041         [ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {
8042                 .type = HDA_FIXUP_FUNC,
8043                 .v.func = alc269_fixup_limit_int_mic_boost,
8044                 .chained = true,
8045                 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC1,
8046         },
8047         [ALC269VB_FIXUP_ORDISSIMO_EVE2] = {
8048                 .type = HDA_FIXUP_PINS,
8049                 .v.pins = (const struct hda_pintbl[]) {
8050                         { 0x12, 0x99a3092f }, /* int-mic */
8051                         { 0x18, 0x03a11d20 }, /* mic */
8052                         { 0x19, 0x411111f0 }, /* Unused bogus pin */
8053                         { }
8054                 },
8055         },
8056         [ALC283_FIXUP_CHROME_BOOK] = {
8057                 .type = HDA_FIXUP_FUNC,
8058                 .v.func = alc283_fixup_chromebook,
8059         },
8060         [ALC283_FIXUP_SENSE_COMBO_JACK] = {
8061                 .type = HDA_FIXUP_FUNC,
8062                 .v.func = alc283_fixup_sense_combo_jack,
8063                 .chained = true,
8064                 .chain_id = ALC283_FIXUP_CHROME_BOOK,
8065         },
8066         [ALC282_FIXUP_ASUS_TX300] = {
8067                 .type = HDA_FIXUP_FUNC,
8068                 .v.func = alc282_fixup_asus_tx300,
8069         },
8070         [ALC283_FIXUP_INT_MIC] = {
8071                 .type = HDA_FIXUP_VERBS,
8072                 .v.verbs = (const struct hda_verb[]) {
8073                         {0x20, AC_VERB_SET_COEF_INDEX, 0x1a},
8074                         {0x20, AC_VERB_SET_PROC_COEF, 0x0011},
8075                         { }
8076                 },
8077                 .chained = true,
8078                 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
8079         },
8080         [ALC290_FIXUP_SUBWOOFER_HSJACK] = {
8081                 .type = HDA_FIXUP_PINS,
8082                 .v.pins = (const struct hda_pintbl[]) {
8083                         { 0x17, 0x90170112 }, /* subwoofer */
8084                         { }
8085                 },
8086                 .chained = true,
8087                 .chain_id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
8088         },
8089         [ALC290_FIXUP_SUBWOOFER] = {
8090                 .type = HDA_FIXUP_PINS,
8091                 .v.pins = (const struct hda_pintbl[]) {
8092                         { 0x17, 0x90170112 }, /* subwoofer */
8093                         { }
8094                 },
8095                 .chained = true,
8096                 .chain_id = ALC290_FIXUP_MONO_SPEAKERS,
8097         },
8098         [ALC290_FIXUP_MONO_SPEAKERS] = {
8099                 .type = HDA_FIXUP_FUNC,
8100                 .v.func = alc290_fixup_mono_speakers,
8101         },
8102         [ALC290_FIXUP_MONO_SPEAKERS_HSJACK] = {
8103                 .type = HDA_FIXUP_FUNC,
8104                 .v.func = alc290_fixup_mono_speakers,
8105                 .chained = true,
8106                 .chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
8107         },
8108         [ALC269_FIXUP_THINKPAD_ACPI] = {
8109                 .type = HDA_FIXUP_FUNC,
8110                 .v.func = alc_fixup_thinkpad_acpi,
8111                 .chained = true,
8112                 .chain_id = ALC269_FIXUP_SKU_IGNORE,
8113         },
8114         [ALC269_FIXUP_DMIC_THINKPAD_ACPI] = {
8115                 .type = HDA_FIXUP_FUNC,
8116                 .v.func = alc_fixup_inv_dmic,
8117                 .chained = true,
8118                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
8119         },
8120         [ALC255_FIXUP_ACER_MIC_NO_PRESENCE] = {
8121                 .type = HDA_FIXUP_PINS,
8122                 .v.pins = (const struct hda_pintbl[]) {
8123                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8124                         { }
8125                 },
8126                 .chained = true,
8127                 .chain_id = ALC255_FIXUP_HEADSET_MODE
8128         },
8129         [ALC255_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8130                 .type = HDA_FIXUP_PINS,
8131                 .v.pins = (const struct hda_pintbl[]) {
8132                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8133                         { }
8134                 },
8135                 .chained = true,
8136                 .chain_id = ALC255_FIXUP_HEADSET_MODE
8137         },
8138         [ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = {
8139                 .type = HDA_FIXUP_PINS,
8140                 .v.pins = (const struct hda_pintbl[]) {
8141                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8142                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
8143                         { }
8144                 },
8145                 .chained = true,
8146                 .chain_id = ALC255_FIXUP_HEADSET_MODE
8147         },
8148         [ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {
8149                 .type = HDA_FIXUP_PINS,
8150                 .v.pins = (const struct hda_pintbl[]) {
8151                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8152                         { }
8153                 },
8154                 .chained = true,
8155                 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
8156         },
8157         [ALC255_FIXUP_HEADSET_MODE] = {
8158                 .type = HDA_FIXUP_FUNC,
8159                 .v.func = alc_fixup_headset_mode_alc255,
8160                 .chained = true,
8161                 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
8162         },
8163         [ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
8164                 .type = HDA_FIXUP_FUNC,
8165                 .v.func = alc_fixup_headset_mode_alc255_no_hp_mic,
8166         },
8167         [ALC293_FIXUP_DELL1_MIC_NO_PRESENCE] = {
8168                 .type = HDA_FIXUP_PINS,
8169                 .v.pins = (const struct hda_pintbl[]) {
8170                         { 0x18, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
8171                         { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8172                         { }
8173                 },
8174                 .chained = true,
8175                 .chain_id = ALC269_FIXUP_HEADSET_MODE
8176         },
8177         [ALC292_FIXUP_TPT440_DOCK] = {
8178                 .type = HDA_FIXUP_FUNC,
8179                 .v.func = alc_fixup_tpt440_dock,
8180                 .chained = true,
8181                 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
8182         },
8183         [ALC292_FIXUP_TPT440] = {
8184                 .type = HDA_FIXUP_FUNC,
8185                 .v.func = alc_fixup_disable_aamix,
8186                 .chained = true,
8187                 .chain_id = ALC292_FIXUP_TPT440_DOCK,
8188         },
8189         [ALC283_FIXUP_HEADSET_MIC] = {
8190                 .type = HDA_FIXUP_PINS,
8191                 .v.pins = (const struct hda_pintbl[]) {
8192                         { 0x19, 0x04a110f0 },
8193                         { },
8194                 },
8195         },
8196         [ALC255_FIXUP_MIC_MUTE_LED] = {
8197                 .type = HDA_FIXUP_FUNC,
8198                 .v.func = alc_fixup_micmute_led,
8199         },
8200         [ALC282_FIXUP_ASPIRE_V5_PINS] = {
8201                 .type = HDA_FIXUP_PINS,
8202                 .v.pins = (const struct hda_pintbl[]) {
8203                         { 0x12, 0x90a60130 },
8204                         { 0x14, 0x90170110 },
8205                         { 0x17, 0x40000008 },
8206                         { 0x18, 0x411111f0 },
8207                         { 0x19, 0x01a1913c },
8208                         { 0x1a, 0x411111f0 },
8209                         { 0x1b, 0x411111f0 },
8210                         { 0x1d, 0x40f89b2d },
8211                         { 0x1e, 0x411111f0 },
8212                         { 0x21, 0x0321101f },
8213                         { },
8214                 },
8215         },
8216         [ALC269VB_FIXUP_ASPIRE_E1_COEF] = {
8217                 .type = HDA_FIXUP_FUNC,
8218                 .v.func = alc269vb_fixup_aspire_e1_coef,
8219         },
8220         [ALC280_FIXUP_HP_GPIO4] = {
8221                 .type = HDA_FIXUP_FUNC,
8222                 .v.func = alc280_fixup_hp_gpio4,
8223         },
8224         [ALC286_FIXUP_HP_GPIO_LED] = {
8225                 .type = HDA_FIXUP_FUNC,
8226                 .v.func = alc286_fixup_hp_gpio_led,
8227         },
8228         [ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY] = {
8229                 .type = HDA_FIXUP_FUNC,
8230                 .v.func = alc280_fixup_hp_gpio2_mic_hotkey,
8231         },
8232         [ALC280_FIXUP_HP_DOCK_PINS] = {
8233                 .type = HDA_FIXUP_PINS,
8234                 .v.pins = (const struct hda_pintbl[]) {
8235                         { 0x1b, 0x21011020 }, /* line-out */
8236                         { 0x1a, 0x01a1903c }, /* headset mic */
8237                         { 0x18, 0x2181103f }, /* line-in */
8238                         { },
8239                 },
8240                 .chained = true,
8241                 .chain_id = ALC280_FIXUP_HP_GPIO4
8242         },
8243         [ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {
8244                 .type = HDA_FIXUP_PINS,
8245                 .v.pins = (const struct hda_pintbl[]) {
8246                         { 0x1b, 0x21011020 }, /* line-out */
8247                         { 0x18, 0x2181103f }, /* line-in */
8248                         { },
8249                 },
8250                 .chained = true,
8251                 .chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED
8252         },
8253         [ALC280_FIXUP_HP_9480M] = {
8254                 .type = HDA_FIXUP_FUNC,
8255                 .v.func = alc280_fixup_hp_9480m,
8256         },
8257         [ALC245_FIXUP_HP_X360_AMP] = {
8258                 .type = HDA_FIXUP_FUNC,
8259                 .v.func = alc245_fixup_hp_x360_amp,
8260                 .chained = true,
8261                 .chain_id = ALC245_FIXUP_HP_GPIO_LED
8262         },
8263         [ALC288_FIXUP_DELL_HEADSET_MODE] = {
8264                 .type = HDA_FIXUP_FUNC,
8265                 .v.func = alc_fixup_headset_mode_dell_alc288,
8266                 .chained = true,
8267                 .chain_id = ALC255_FIXUP_MIC_MUTE_LED
8268         },
8269         [ALC288_FIXUP_DELL1_MIC_NO_PRESENCE] = {
8270                 .type = HDA_FIXUP_PINS,
8271                 .v.pins = (const struct hda_pintbl[]) {
8272                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8273                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
8274                         { }
8275                 },
8276                 .chained = true,
8277                 .chain_id = ALC288_FIXUP_DELL_HEADSET_MODE
8278         },
8279         [ALC288_FIXUP_DISABLE_AAMIX] = {
8280                 .type = HDA_FIXUP_FUNC,
8281                 .v.func = alc_fixup_disable_aamix,
8282                 .chained = true,
8283                 .chain_id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE
8284         },
8285         [ALC288_FIXUP_DELL_XPS_13] = {
8286                 .type = HDA_FIXUP_FUNC,
8287                 .v.func = alc_fixup_dell_xps13,
8288                 .chained = true,
8289                 .chain_id = ALC288_FIXUP_DISABLE_AAMIX
8290         },
8291         [ALC292_FIXUP_DISABLE_AAMIX] = {
8292                 .type = HDA_FIXUP_FUNC,
8293                 .v.func = alc_fixup_disable_aamix,
8294                 .chained = true,
8295                 .chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE
8296         },
8297         [ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = {
8298                 .type = HDA_FIXUP_FUNC,
8299                 .v.func = alc_fixup_disable_aamix,
8300                 .chained = true,
8301                 .chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE
8302         },
8303         [ALC292_FIXUP_DELL_E7X_AAMIX] = {
8304                 .type = HDA_FIXUP_FUNC,
8305                 .v.func = alc_fixup_dell_xps13,
8306                 .chained = true,
8307                 .chain_id = ALC292_FIXUP_DISABLE_AAMIX
8308         },
8309         [ALC292_FIXUP_DELL_E7X] = {
8310                 .type = HDA_FIXUP_FUNC,
8311                 .v.func = alc_fixup_micmute_led,
8312                 /* micmute fixup must be applied at last */
8313                 .chained_before = true,
8314                 .chain_id = ALC292_FIXUP_DELL_E7X_AAMIX,
8315         },
8316         [ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE] = {
8317                 .type = HDA_FIXUP_PINS,
8318                 .v.pins = (const struct hda_pintbl[]) {
8319                         { 0x18, 0x01a1913c }, /* headset mic w/o jack detect */
8320                         { }
8321                 },
8322                 .chained_before = true,
8323                 .chain_id = ALC269_FIXUP_HEADSET_MODE,
8324         },
8325         [ALC298_FIXUP_DELL1_MIC_NO_PRESENCE] = {
8326                 .type = HDA_FIXUP_PINS,
8327                 .v.pins = (const struct hda_pintbl[]) {
8328                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8329                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
8330                         { }
8331                 },
8332                 .chained = true,
8333                 .chain_id = ALC269_FIXUP_HEADSET_MODE
8334         },
8335         [ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE] = {
8336                 .type = HDA_FIXUP_PINS,
8337                 .v.pins = (const struct hda_pintbl[]) {
8338                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8339                         { }
8340                 },
8341                 .chained = true,
8342                 .chain_id = ALC269_FIXUP_HEADSET_MODE
8343         },
8344         [ALC275_FIXUP_DELL_XPS] = {
8345                 .type = HDA_FIXUP_VERBS,
8346                 .v.verbs = (const struct hda_verb[]) {
8347                         /* Enables internal speaker */
8348                         {0x20, AC_VERB_SET_COEF_INDEX, 0x1f},
8349                         {0x20, AC_VERB_SET_PROC_COEF, 0x00c0},
8350                         {0x20, AC_VERB_SET_COEF_INDEX, 0x30},
8351                         {0x20, AC_VERB_SET_PROC_COEF, 0x00b1},
8352                         {}
8353                 }
8354         },
8355         [ALC293_FIXUP_LENOVO_SPK_NOISE] = {
8356                 .type = HDA_FIXUP_FUNC,
8357                 .v.func = alc_fixup_disable_aamix,
8358                 .chained = true,
8359                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
8360         },
8361         [ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = {
8362                 .type = HDA_FIXUP_FUNC,
8363                 .v.func = alc233_fixup_lenovo_line2_mic_hotkey,
8364         },
8365         [ALC233_FIXUP_INTEL_NUC8_DMIC] = {
8366                 .type = HDA_FIXUP_FUNC,
8367                 .v.func = alc_fixup_inv_dmic,
8368                 .chained = true,
8369                 .chain_id = ALC233_FIXUP_INTEL_NUC8_BOOST,
8370         },
8371         [ALC233_FIXUP_INTEL_NUC8_BOOST] = {
8372                 .type = HDA_FIXUP_FUNC,
8373                 .v.func = alc269_fixup_limit_int_mic_boost
8374         },
8375         [ALC255_FIXUP_DELL_SPK_NOISE] = {
8376                 .type = HDA_FIXUP_FUNC,
8377                 .v.func = alc_fixup_disable_aamix,
8378                 .chained = true,
8379                 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
8380         },
8381         [ALC225_FIXUP_DISABLE_MIC_VREF] = {
8382                 .type = HDA_FIXUP_FUNC,
8383                 .v.func = alc_fixup_disable_mic_vref,
8384                 .chained = true,
8385                 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
8386         },
8387         [ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = {
8388                 .type = HDA_FIXUP_VERBS,
8389                 .v.verbs = (const struct hda_verb[]) {
8390                         /* Disable pass-through path for FRONT 14h */
8391                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
8392                         { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
8393                         {}
8394                 },
8395                 .chained = true,
8396                 .chain_id = ALC225_FIXUP_DISABLE_MIC_VREF
8397         },
8398         [ALC280_FIXUP_HP_HEADSET_MIC] = {
8399                 .type = HDA_FIXUP_FUNC,
8400                 .v.func = alc_fixup_disable_aamix,
8401                 .chained = true,
8402                 .chain_id = ALC269_FIXUP_HEADSET_MIC,
8403         },
8404         [ALC221_FIXUP_HP_FRONT_MIC] = {
8405                 .type = HDA_FIXUP_PINS,
8406                 .v.pins = (const struct hda_pintbl[]) {
8407                         { 0x19, 0x02a19020 }, /* Front Mic */
8408                         { }
8409                 },
8410         },
8411         [ALC292_FIXUP_TPT460] = {
8412                 .type = HDA_FIXUP_FUNC,
8413                 .v.func = alc_fixup_tpt440_dock,
8414                 .chained = true,
8415                 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE,
8416         },
8417         [ALC298_FIXUP_SPK_VOLUME] = {
8418                 .type = HDA_FIXUP_FUNC,
8419                 .v.func = alc298_fixup_speaker_volume,
8420                 .chained = true,
8421                 .chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
8422         },
8423         [ALC298_FIXUP_LENOVO_SPK_VOLUME] = {
8424                 .type = HDA_FIXUP_FUNC,
8425                 .v.func = alc298_fixup_speaker_volume,
8426         },
8427         [ALC295_FIXUP_DISABLE_DAC3] = {
8428                 .type = HDA_FIXUP_FUNC,
8429                 .v.func = alc295_fixup_disable_dac3,
8430         },
8431         [ALC285_FIXUP_SPEAKER2_TO_DAC1] = {
8432                 .type = HDA_FIXUP_FUNC,
8433                 .v.func = alc285_fixup_speaker2_to_dac1,
8434                 .chained = true,
8435                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
8436         },
8437         [ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1] = {
8438                 .type = HDA_FIXUP_FUNC,
8439                 .v.func = alc285_fixup_speaker2_to_dac1,
8440                 .chained = true,
8441                 .chain_id = ALC245_FIXUP_CS35L41_SPI_2
8442         },
8443         [ALC285_FIXUP_ASUS_HEADSET_MIC] = {
8444                 .type = HDA_FIXUP_PINS,
8445                 .v.pins = (const struct hda_pintbl[]) {
8446                         { 0x19, 0x03a11050 },
8447                         { 0x1b, 0x03a11c30 },
8448                         { }
8449                 },
8450                 .chained = true,
8451                 .chain_id = ALC285_FIXUP_ASUS_SPEAKER2_TO_DAC1
8452         },
8453         [ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS] = {
8454                 .type = HDA_FIXUP_PINS,
8455                 .v.pins = (const struct hda_pintbl[]) {
8456                         { 0x14, 0x90170120 },
8457                         { }
8458                 },
8459                 .chained = true,
8460                 .chain_id = ALC285_FIXUP_ASUS_HEADSET_MIC
8461         },
8462         [ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1] = {
8463                 .type = HDA_FIXUP_FUNC,
8464                 .v.func = alc285_fixup_speaker2_to_dac1,
8465                 .chained = true,
8466                 .chain_id = ALC287_FIXUP_CS35L41_I2C_2
8467         },
8468         [ALC285_FIXUP_ASUS_I2C_HEADSET_MIC] = {
8469                 .type = HDA_FIXUP_PINS,
8470                 .v.pins = (const struct hda_pintbl[]) {
8471                         { 0x19, 0x03a11050 },
8472                         { 0x1b, 0x03a11c30 },
8473                         { }
8474                 },
8475                 .chained = true,
8476                 .chain_id = ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1
8477         },
8478         [ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
8479                 .type = HDA_FIXUP_PINS,
8480                 .v.pins = (const struct hda_pintbl[]) {
8481                         { 0x1b, 0x90170151 },
8482                         { }
8483                 },
8484                 .chained = true,
8485                 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
8486         },
8487         [ALC269_FIXUP_ATIV_BOOK_8] = {
8488                 .type = HDA_FIXUP_FUNC,
8489                 .v.func = alc_fixup_auto_mute_via_amp,
8490                 .chained = true,
8491                 .chain_id = ALC269_FIXUP_NO_SHUTUP
8492         },
8493         [ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE] = {
8494                 .type = HDA_FIXUP_PINS,
8495                 .v.pins = (const struct hda_pintbl[]) {
8496                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8497                         { 0x1a, 0x01813030 }, /* use as headphone mic, without its own jack detect */
8498                         { }
8499                 },
8500                 .chained = true,
8501                 .chain_id = ALC269_FIXUP_HEADSET_MODE
8502         },
8503         [ALC221_FIXUP_HP_MIC_NO_PRESENCE] = {
8504                 .type = HDA_FIXUP_PINS,
8505                 .v.pins = (const struct hda_pintbl[]) {
8506                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8507                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
8508                         { }
8509                 },
8510                 .chained = true,
8511                 .chain_id = ALC269_FIXUP_HEADSET_MODE
8512         },
8513         [ALC256_FIXUP_ASUS_HEADSET_MODE] = {
8514                 .type = HDA_FIXUP_FUNC,
8515                 .v.func = alc_fixup_headset_mode,
8516         },
8517         [ALC256_FIXUP_ASUS_MIC] = {
8518                 .type = HDA_FIXUP_PINS,
8519                 .v.pins = (const struct hda_pintbl[]) {
8520                         { 0x13, 0x90a60160 }, /* use as internal mic */
8521                         { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
8522                         { }
8523                 },
8524                 .chained = true,
8525                 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8526         },
8527         [ALC256_FIXUP_ASUS_AIO_GPIO2] = {
8528                 .type = HDA_FIXUP_FUNC,
8529                 /* Set up GPIO2 for the speaker amp */
8530                 .v.func = alc_fixup_gpio4,
8531         },
8532         [ALC233_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8533                 .type = HDA_FIXUP_PINS,
8534                 .v.pins = (const struct hda_pintbl[]) {
8535                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8536                         { }
8537                 },
8538                 .chained = true,
8539                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8540         },
8541         [ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE] = {
8542                 .type = HDA_FIXUP_VERBS,
8543                 .v.verbs = (const struct hda_verb[]) {
8544                         /* Enables internal speaker */
8545                         {0x20, AC_VERB_SET_COEF_INDEX, 0x40},
8546                         {0x20, AC_VERB_SET_PROC_COEF, 0x8800},
8547                         {}
8548                 },
8549                 .chained = true,
8550                 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
8551         },
8552         [ALC233_FIXUP_LENOVO_MULTI_CODECS] = {
8553                 .type = HDA_FIXUP_FUNC,
8554                 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
8555                 .chained = true,
8556                 .chain_id = ALC269_FIXUP_GPIO2
8557         },
8558         [ALC233_FIXUP_ACER_HEADSET_MIC] = {
8559                 .type = HDA_FIXUP_VERBS,
8560                 .v.verbs = (const struct hda_verb[]) {
8561                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
8562                         { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
8563                         { }
8564                 },
8565                 .chained = true,
8566                 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
8567         },
8568         [ALC294_FIXUP_LENOVO_MIC_LOCATION] = {
8569                 .type = HDA_FIXUP_PINS,
8570                 .v.pins = (const struct hda_pintbl[]) {
8571                         /* Change the mic location from front to right, otherwise there are
8572                            two front mics with the same name, pulseaudio can't handle them.
8573                            This is just a temporary workaround, after applying this fixup,
8574                            there will be one "Front Mic" and one "Mic" in this machine.
8575                          */
8576                         { 0x1a, 0x04a19040 },
8577                         { }
8578                 },
8579         },
8580         [ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE] = {
8581                 .type = HDA_FIXUP_PINS,
8582                 .v.pins = (const struct hda_pintbl[]) {
8583                         { 0x16, 0x0101102f }, /* Rear Headset HP */
8584                         { 0x19, 0x02a1913c }, /* use as Front headset mic, without its own jack detect */
8585                         { 0x1a, 0x01a19030 }, /* Rear Headset MIC */
8586                         { 0x1b, 0x02011020 },
8587                         { }
8588                 },
8589                 .chained = true,
8590                 .chain_id = ALC225_FIXUP_S3_POP_NOISE
8591         },
8592         [ALC225_FIXUP_S3_POP_NOISE] = {
8593                 .type = HDA_FIXUP_FUNC,
8594                 .v.func = alc225_fixup_s3_pop_noise,
8595                 .chained = true,
8596                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8597         },
8598         [ALC700_FIXUP_INTEL_REFERENCE] = {
8599                 .type = HDA_FIXUP_VERBS,
8600                 .v.verbs = (const struct hda_verb[]) {
8601                         /* Enables internal speaker */
8602                         {0x20, AC_VERB_SET_COEF_INDEX, 0x45},
8603                         {0x20, AC_VERB_SET_PROC_COEF, 0x5289},
8604                         {0x20, AC_VERB_SET_COEF_INDEX, 0x4A},
8605                         {0x20, AC_VERB_SET_PROC_COEF, 0x001b},
8606                         {0x58, AC_VERB_SET_COEF_INDEX, 0x00},
8607                         {0x58, AC_VERB_SET_PROC_COEF, 0x3888},
8608                         {0x20, AC_VERB_SET_COEF_INDEX, 0x6f},
8609                         {0x20, AC_VERB_SET_PROC_COEF, 0x2c0b},
8610                         {}
8611                 }
8612         },
8613         [ALC274_FIXUP_DELL_BIND_DACS] = {
8614                 .type = HDA_FIXUP_FUNC,
8615                 .v.func = alc274_fixup_bind_dacs,
8616                 .chained = true,
8617                 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
8618         },
8619         [ALC274_FIXUP_DELL_AIO_LINEOUT_VERB] = {
8620                 .type = HDA_FIXUP_PINS,
8621                 .v.pins = (const struct hda_pintbl[]) {
8622                         { 0x1b, 0x0401102f },
8623                         { }
8624                 },
8625                 .chained = true,
8626                 .chain_id = ALC274_FIXUP_DELL_BIND_DACS
8627         },
8628         [ALC298_FIXUP_TPT470_DOCK_FIX] = {
8629                 .type = HDA_FIXUP_FUNC,
8630                 .v.func = alc_fixup_tpt470_dock,
8631                 .chained = true,
8632                 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE
8633         },
8634         [ALC298_FIXUP_TPT470_DOCK] = {
8635                 .type = HDA_FIXUP_FUNC,
8636                 .v.func = alc_fixup_tpt470_dacs,
8637                 .chained = true,
8638                 .chain_id = ALC298_FIXUP_TPT470_DOCK_FIX
8639         },
8640         [ALC255_FIXUP_DUMMY_LINEOUT_VERB] = {
8641                 .type = HDA_FIXUP_PINS,
8642                 .v.pins = (const struct hda_pintbl[]) {
8643                         { 0x14, 0x0201101f },
8644                         { }
8645                 },
8646                 .chained = true,
8647                 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
8648         },
8649         [ALC255_FIXUP_DELL_HEADSET_MIC] = {
8650                 .type = HDA_FIXUP_PINS,
8651                 .v.pins = (const struct hda_pintbl[]) {
8652                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8653                         { }
8654                 },
8655                 .chained = true,
8656                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8657         },
8658         [ALC295_FIXUP_HP_X360] = {
8659                 .type = HDA_FIXUP_FUNC,
8660                 .v.func = alc295_fixup_hp_top_speakers,
8661                 .chained = true,
8662                 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC3
8663         },
8664         [ALC221_FIXUP_HP_HEADSET_MIC] = {
8665                 .type = HDA_FIXUP_PINS,
8666                 .v.pins = (const struct hda_pintbl[]) {
8667                         { 0x19, 0x0181313f},
8668                         { }
8669                 },
8670                 .chained = true,
8671                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8672         },
8673         [ALC285_FIXUP_LENOVO_HEADPHONE_NOISE] = {
8674                 .type = HDA_FIXUP_FUNC,
8675                 .v.func = alc285_fixup_invalidate_dacs,
8676                 .chained = true,
8677                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
8678         },
8679         [ALC295_FIXUP_HP_AUTO_MUTE] = {
8680                 .type = HDA_FIXUP_FUNC,
8681                 .v.func = alc_fixup_auto_mute_via_amp,
8682         },
8683         [ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE] = {
8684                 .type = HDA_FIXUP_PINS,
8685                 .v.pins = (const struct hda_pintbl[]) {
8686                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8687                         { }
8688                 },
8689                 .chained = true,
8690                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8691         },
8692         [ALC294_FIXUP_ASUS_MIC] = {
8693                 .type = HDA_FIXUP_PINS,
8694                 .v.pins = (const struct hda_pintbl[]) {
8695                         { 0x13, 0x90a60160 }, /* use as internal mic */
8696                         { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
8697                         { }
8698                 },
8699                 .chained = true,
8700                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8701         },
8702         [ALC294_FIXUP_ASUS_HEADSET_MIC] = {
8703                 .type = HDA_FIXUP_PINS,
8704                 .v.pins = (const struct hda_pintbl[]) {
8705                         { 0x19, 0x01a1103c }, /* use as headset mic */
8706                         { }
8707                 },
8708                 .chained = true,
8709                 .chain_id = ALC269_FIXUP_HEADSET_MIC
8710         },
8711         [ALC294_FIXUP_ASUS_SPK] = {
8712                 .type = HDA_FIXUP_VERBS,
8713                 .v.verbs = (const struct hda_verb[]) {
8714                         /* Set EAPD high */
8715                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x40 },
8716                         { 0x20, AC_VERB_SET_PROC_COEF, 0x8800 },
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         [ALC295_FIXUP_CHROME_BOOK] = {
8725                 .type = HDA_FIXUP_FUNC,
8726                 .v.func = alc295_fixup_chromebook,
8727                 .chained = true,
8728                 .chain_id = ALC225_FIXUP_HEADSET_JACK
8729         },
8730         [ALC225_FIXUP_HEADSET_JACK] = {
8731                 .type = HDA_FIXUP_FUNC,
8732                 .v.func = alc_fixup_headset_jack,
8733         },
8734         [ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
8735                 .type = HDA_FIXUP_PINS,
8736                 .v.pins = (const struct hda_pintbl[]) {
8737                         { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
8738                         { }
8739                 },
8740                 .chained = true,
8741                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8742         },
8743         [ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE] = {
8744                 .type = HDA_FIXUP_VERBS,
8745                 .v.verbs = (const struct hda_verb[]) {
8746                         /* Disable PCBEEP-IN passthrough */
8747                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
8748                         { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
8749                         { }
8750                 },
8751                 .chained = true,
8752                 .chain_id = ALC285_FIXUP_LENOVO_HEADPHONE_NOISE
8753         },
8754         [ALC255_FIXUP_ACER_HEADSET_MIC] = {
8755                 .type = HDA_FIXUP_PINS,
8756                 .v.pins = (const struct hda_pintbl[]) {
8757                         { 0x19, 0x03a11130 },
8758                         { 0x1a, 0x90a60140 }, /* use as internal mic */
8759                         { }
8760                 },
8761                 .chained = true,
8762                 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
8763         },
8764         [ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE] = {
8765                 .type = HDA_FIXUP_PINS,
8766                 .v.pins = (const struct hda_pintbl[]) {
8767                         { 0x16, 0x01011020 }, /* Rear Line out */
8768                         { 0x19, 0x01a1913c }, /* use as Front headset mic, without its own jack detect */
8769                         { }
8770                 },
8771                 .chained = true,
8772                 .chain_id = ALC225_FIXUP_WYSE_AUTO_MUTE
8773         },
8774         [ALC225_FIXUP_WYSE_AUTO_MUTE] = {
8775                 .type = HDA_FIXUP_FUNC,
8776                 .v.func = alc_fixup_auto_mute_via_amp,
8777                 .chained = true,
8778                 .chain_id = ALC225_FIXUP_WYSE_DISABLE_MIC_VREF
8779         },
8780         [ALC225_FIXUP_WYSE_DISABLE_MIC_VREF] = {
8781                 .type = HDA_FIXUP_FUNC,
8782                 .v.func = alc_fixup_disable_mic_vref,
8783                 .chained = true,
8784                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
8785         },
8786         [ALC286_FIXUP_ACER_AIO_HEADSET_MIC] = {
8787                 .type = HDA_FIXUP_VERBS,
8788                 .v.verbs = (const struct hda_verb[]) {
8789                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x4f },
8790                         { 0x20, AC_VERB_SET_PROC_COEF, 0x5029 },
8791                         { }
8792                 },
8793                 .chained = true,
8794                 .chain_id = ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE
8795         },
8796         [ALC256_FIXUP_ASUS_HEADSET_MIC] = {
8797                 .type = HDA_FIXUP_PINS,
8798                 .v.pins = (const struct hda_pintbl[]) {
8799                         { 0x19, 0x03a11020 }, /* headset mic with jack detect */
8800                         { }
8801                 },
8802                 .chained = true,
8803                 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8804         },
8805         [ALC256_FIXUP_ASUS_MIC_NO_PRESENCE] = {
8806                 .type = HDA_FIXUP_PINS,
8807                 .v.pins = (const struct hda_pintbl[]) {
8808                         { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
8809                         { }
8810                 },
8811                 .chained = true,
8812                 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8813         },
8814         [ALC299_FIXUP_PREDATOR_SPK] = {
8815                 .type = HDA_FIXUP_PINS,
8816                 .v.pins = (const struct hda_pintbl[]) {
8817                         { 0x21, 0x90170150 }, /* use as headset mic, without its own jack detect */
8818                         { }
8819                 }
8820         },
8821         [ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE] = {
8822                 .type = HDA_FIXUP_PINS,
8823                 .v.pins = (const struct hda_pintbl[]) {
8824                         { 0x19, 0x04a11040 },
8825                         { 0x21, 0x04211020 },
8826                         { }
8827                 },
8828                 .chained = true,
8829                 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
8830         },
8831         [ALC289_FIXUP_DELL_SPK1] = {
8832                 .type = HDA_FIXUP_PINS,
8833                 .v.pins = (const struct hda_pintbl[]) {
8834                         { 0x14, 0x90170140 },
8835                         { }
8836                 },
8837                 .chained = true,
8838                 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
8839         },
8840         [ALC289_FIXUP_DELL_SPK2] = {
8841                 .type = HDA_FIXUP_PINS,
8842                 .v.pins = (const struct hda_pintbl[]) {
8843                         { 0x17, 0x90170130 }, /* bass spk */
8844                         { }
8845                 },
8846                 .chained = true,
8847                 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE
8848         },
8849         [ALC289_FIXUP_DUAL_SPK] = {
8850                 .type = HDA_FIXUP_FUNC,
8851                 .v.func = alc285_fixup_speaker2_to_dac1,
8852                 .chained = true,
8853                 .chain_id = ALC289_FIXUP_DELL_SPK2
8854         },
8855         [ALC289_FIXUP_RTK_AMP_DUAL_SPK] = {
8856                 .type = HDA_FIXUP_FUNC,
8857                 .v.func = alc285_fixup_speaker2_to_dac1,
8858                 .chained = true,
8859                 .chain_id = ALC289_FIXUP_DELL_SPK1
8860         },
8861         [ALC294_FIXUP_SPK2_TO_DAC1] = {
8862                 .type = HDA_FIXUP_FUNC,
8863                 .v.func = alc285_fixup_speaker2_to_dac1,
8864                 .chained = true,
8865                 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8866         },
8867         [ALC294_FIXUP_ASUS_DUAL_SPK] = {
8868                 .type = HDA_FIXUP_FUNC,
8869                 /* The GPIO must be pulled to initialize the AMP */
8870                 .v.func = alc_fixup_gpio4,
8871                 .chained = true,
8872                 .chain_id = ALC294_FIXUP_SPK2_TO_DAC1
8873         },
8874         [ALC294_FIXUP_ASUS_ALLY] = {
8875                 .type = HDA_FIXUP_FUNC,
8876                 .v.func = cs35l41_fixup_i2c_two,
8877                 .chained = true,
8878                 .chain_id = ALC294_FIXUP_ASUS_ALLY_PINS
8879         },
8880         [ALC294_FIXUP_ASUS_ALLY_PINS] = {
8881                 .type = HDA_FIXUP_PINS,
8882                 .v.pins = (const struct hda_pintbl[]) {
8883                         { 0x19, 0x03a11050 },
8884                         { 0x1a, 0x03a11c30 },
8885                         { 0x21, 0x03211420 },
8886                         { }
8887                 },
8888                 .chained = true,
8889                 .chain_id = ALC294_FIXUP_ASUS_ALLY_VERBS
8890         },
8891         [ALC294_FIXUP_ASUS_ALLY_VERBS] = {
8892                 .type = HDA_FIXUP_VERBS,
8893                 .v.verbs = (const struct hda_verb[]) {
8894                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
8895                         { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
8896                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x46 },
8897                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0004 },
8898                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x47 },
8899                         { 0x20, AC_VERB_SET_PROC_COEF, 0xa47a },
8900                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x49 },
8901                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0049},
8902                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x4a },
8903                         { 0x20, AC_VERB_SET_PROC_COEF, 0x201b },
8904                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x6b },
8905                         { 0x20, AC_VERB_SET_PROC_COEF, 0x4278},
8906                         { }
8907                 },
8908                 .chained = true,
8909                 .chain_id = ALC294_FIXUP_ASUS_ALLY_SPEAKER
8910         },
8911         [ALC294_FIXUP_ASUS_ALLY_SPEAKER] = {
8912                 .type = HDA_FIXUP_FUNC,
8913                 .v.func = alc285_fixup_speaker2_to_dac1,
8914         },
8915         [ALC285_FIXUP_THINKPAD_X1_GEN7] = {
8916                 .type = HDA_FIXUP_FUNC,
8917                 .v.func = alc285_fixup_thinkpad_x1_gen7,
8918                 .chained = true,
8919                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
8920         },
8921         [ALC285_FIXUP_THINKPAD_HEADSET_JACK] = {
8922                 .type = HDA_FIXUP_FUNC,
8923                 .v.func = alc_fixup_headset_jack,
8924                 .chained = true,
8925                 .chain_id = ALC285_FIXUP_THINKPAD_X1_GEN7
8926         },
8927         [ALC294_FIXUP_ASUS_HPE] = {
8928                 .type = HDA_FIXUP_VERBS,
8929                 .v.verbs = (const struct hda_verb[]) {
8930                         /* Set EAPD high */
8931                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
8932                         { 0x20, AC_VERB_SET_PROC_COEF, 0x7774 },
8933                         { }
8934                 },
8935                 .chained = true,
8936                 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
8937         },
8938         [ALC294_FIXUP_ASUS_GX502_PINS] = {
8939                 .type = HDA_FIXUP_PINS,
8940                 .v.pins = (const struct hda_pintbl[]) {
8941                         { 0x19, 0x03a11050 }, /* front HP mic */
8942                         { 0x1a, 0x01a11830 }, /* rear external mic */
8943                         { 0x21, 0x03211020 }, /* front HP out */
8944                         { }
8945                 },
8946                 .chained = true,
8947                 .chain_id = ALC294_FIXUP_ASUS_GX502_VERBS
8948         },
8949         [ALC294_FIXUP_ASUS_GX502_VERBS] = {
8950                 .type = HDA_FIXUP_VERBS,
8951                 .v.verbs = (const struct hda_verb[]) {
8952                         /* set 0x15 to HP-OUT ctrl */
8953                         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
8954                         /* unmute the 0x15 amp */
8955                         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
8956                         { }
8957                 },
8958                 .chained = true,
8959                 .chain_id = ALC294_FIXUP_ASUS_GX502_HP
8960         },
8961         [ALC294_FIXUP_ASUS_GX502_HP] = {
8962                 .type = HDA_FIXUP_FUNC,
8963                 .v.func = alc294_fixup_gx502_hp,
8964         },
8965         [ALC294_FIXUP_ASUS_GU502_PINS] = {
8966                 .type = HDA_FIXUP_PINS,
8967                 .v.pins = (const struct hda_pintbl[]) {
8968                         { 0x19, 0x01a11050 }, /* rear HP mic */
8969                         { 0x1a, 0x01a11830 }, /* rear external mic */
8970                         { 0x21, 0x012110f0 }, /* rear HP out */
8971                         { }
8972                 },
8973                 .chained = true,
8974                 .chain_id = ALC294_FIXUP_ASUS_GU502_VERBS
8975         },
8976         [ALC294_FIXUP_ASUS_GU502_VERBS] = {
8977                 .type = HDA_FIXUP_VERBS,
8978                 .v.verbs = (const struct hda_verb[]) {
8979                         /* set 0x15 to HP-OUT ctrl */
8980                         { 0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc0 },
8981                         /* unmute the 0x15 amp */
8982                         { 0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000 },
8983                         /* set 0x1b to HP-OUT */
8984                         { 0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24 },
8985                         { }
8986                 },
8987                 .chained = true,
8988                 .chain_id = ALC294_FIXUP_ASUS_GU502_HP
8989         },
8990         [ALC294_FIXUP_ASUS_GU502_HP] = {
8991                 .type = HDA_FIXUP_FUNC,
8992                 .v.func = alc294_fixup_gu502_hp,
8993         },
8994          [ALC294_FIXUP_ASUS_G513_PINS] = {
8995                 .type = HDA_FIXUP_PINS,
8996                 .v.pins = (const struct hda_pintbl[]) {
8997                                 { 0x19, 0x03a11050 }, /* front HP mic */
8998                                 { 0x1a, 0x03a11c30 }, /* rear external mic */
8999                                 { 0x21, 0x03211420 }, /* front HP out */
9000                                 { }
9001                 },
9002         },
9003         [ALC285_FIXUP_ASUS_G533Z_PINS] = {
9004                 .type = HDA_FIXUP_PINS,
9005                 .v.pins = (const struct hda_pintbl[]) {
9006                         { 0x14, 0x90170152 }, /* Speaker Surround Playback Switch */
9007                         { 0x19, 0x03a19020 }, /* Mic Boost Volume */
9008                         { 0x1a, 0x03a11c30 }, /* Mic Boost Volume */
9009                         { 0x1e, 0x90170151 }, /* Rear jack, IN OUT EAPD Detect */
9010                         { 0x21, 0x03211420 },
9011                         { }
9012                 },
9013         },
9014         [ALC294_FIXUP_ASUS_COEF_1B] = {
9015                 .type = HDA_FIXUP_VERBS,
9016                 .v.verbs = (const struct hda_verb[]) {
9017                         /* Set bit 10 to correct noisy output after reboot from
9018                          * Windows 10 (due to pop noise reduction?)
9019                          */
9020                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x1b },
9021                         { 0x20, AC_VERB_SET_PROC_COEF, 0x4e4b },
9022                         { }
9023                 },
9024                 .chained = true,
9025                 .chain_id = ALC289_FIXUP_ASUS_GA401,
9026         },
9027         [ALC285_FIXUP_HP_GPIO_LED] = {
9028                 .type = HDA_FIXUP_FUNC,
9029                 .v.func = alc285_fixup_hp_gpio_led,
9030         },
9031         [ALC285_FIXUP_HP_MUTE_LED] = {
9032                 .type = HDA_FIXUP_FUNC,
9033                 .v.func = alc285_fixup_hp_mute_led,
9034         },
9035         [ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED] = {
9036                 .type = HDA_FIXUP_FUNC,
9037                 .v.func = alc285_fixup_hp_spectre_x360_mute_led,
9038         },
9039         [ALC236_FIXUP_HP_MUTE_LED_COEFBIT2] = {
9040             .type = HDA_FIXUP_FUNC,
9041             .v.func = alc236_fixup_hp_mute_led_coefbit2,
9042         },
9043         [ALC236_FIXUP_HP_GPIO_LED] = {
9044                 .type = HDA_FIXUP_FUNC,
9045                 .v.func = alc236_fixup_hp_gpio_led,
9046         },
9047         [ALC236_FIXUP_HP_MUTE_LED] = {
9048                 .type = HDA_FIXUP_FUNC,
9049                 .v.func = alc236_fixup_hp_mute_led,
9050         },
9051         [ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF] = {
9052                 .type = HDA_FIXUP_FUNC,
9053                 .v.func = alc236_fixup_hp_mute_led_micmute_vref,
9054         },
9055         [ALC298_FIXUP_SAMSUNG_AMP] = {
9056                 .type = HDA_FIXUP_FUNC,
9057                 .v.func = alc298_fixup_samsung_amp,
9058                 .chained = true,
9059                 .chain_id = ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET
9060         },
9061         [ALC298_FIXUP_SAMSUNG_AMP2] = {
9062                 .type = HDA_FIXUP_FUNC,
9063                 .v.func = alc298_fixup_samsung_amp2
9064         },
9065         [ALC298_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
9066                 .type = HDA_FIXUP_VERBS,
9067                 .v.verbs = (const struct hda_verb[]) {
9068                         { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc5 },
9069                         { }
9070                 },
9071         },
9072         [ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET] = {
9073                 .type = HDA_FIXUP_VERBS,
9074                 .v.verbs = (const struct hda_verb[]) {
9075                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x08},
9076                         { 0x20, AC_VERB_SET_PROC_COEF, 0x2fcf},
9077                         { }
9078                 },
9079         },
9080         [ALC295_FIXUP_ASUS_MIC_NO_PRESENCE] = {
9081                 .type = HDA_FIXUP_PINS,
9082                 .v.pins = (const struct hda_pintbl[]) {
9083                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
9084                         { }
9085                 },
9086                 .chained = true,
9087                 .chain_id = ALC269_FIXUP_HEADSET_MODE
9088         },
9089         [ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS] = {
9090                 .type = HDA_FIXUP_PINS,
9091                 .v.pins = (const struct hda_pintbl[]) {
9092                         { 0x14, 0x90100120 }, /* use as internal speaker */
9093                         { 0x18, 0x02a111f0 }, /* use as headset mic, without its own jack detect */
9094                         { 0x1a, 0x01011020 }, /* use as line out */
9095                         { },
9096                 },
9097                 .chained = true,
9098                 .chain_id = ALC269_FIXUP_HEADSET_MIC
9099         },
9100         [ALC269VC_FIXUP_ACER_HEADSET_MIC] = {
9101                 .type = HDA_FIXUP_PINS,
9102                 .v.pins = (const struct hda_pintbl[]) {
9103                         { 0x18, 0x02a11030 }, /* use as headset mic */
9104                         { }
9105                 },
9106                 .chained = true,
9107                 .chain_id = ALC269_FIXUP_HEADSET_MIC
9108         },
9109         [ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE] = {
9110                 .type = HDA_FIXUP_PINS,
9111                 .v.pins = (const struct hda_pintbl[]) {
9112                         { 0x18, 0x01a11130 }, /* use as headset mic, without its own jack detect */
9113                         { }
9114                 },
9115                 .chained = true,
9116                 .chain_id = ALC269_FIXUP_HEADSET_MIC
9117         },
9118         [ALC289_FIXUP_ASUS_GA401] = {
9119                 .type = HDA_FIXUP_FUNC,
9120                 .v.func = alc289_fixup_asus_ga401,
9121                 .chained = true,
9122                 .chain_id = ALC289_FIXUP_ASUS_GA502,
9123         },
9124         [ALC289_FIXUP_ASUS_GA502] = {
9125                 .type = HDA_FIXUP_PINS,
9126                 .v.pins = (const struct hda_pintbl[]) {
9127                         { 0x19, 0x03a11020 }, /* headset mic with jack detect */
9128                         { }
9129                 },
9130         },
9131         [ALC256_FIXUP_ACER_MIC_NO_PRESENCE] = {
9132                 .type = HDA_FIXUP_PINS,
9133                 .v.pins = (const struct hda_pintbl[]) {
9134                         { 0x19, 0x02a11120 }, /* use as headset mic, without its own jack detect */
9135                         { }
9136                 },
9137                 .chained = true,
9138                 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
9139         },
9140         [ALC285_FIXUP_HP_GPIO_AMP_INIT] = {
9141                 .type = HDA_FIXUP_FUNC,
9142                 .v.func = alc285_fixup_hp_gpio_amp_init,
9143                 .chained = true,
9144                 .chain_id = ALC285_FIXUP_HP_GPIO_LED
9145         },
9146         [ALC269_FIXUP_CZC_B20] = {
9147                 .type = HDA_FIXUP_PINS,
9148                 .v.pins = (const struct hda_pintbl[]) {
9149                         { 0x12, 0x411111f0 },
9150                         { 0x14, 0x90170110 }, /* speaker */
9151                         { 0x15, 0x032f1020 }, /* HP out */
9152                         { 0x17, 0x411111f0 },
9153                         { 0x18, 0x03ab1040 }, /* mic */
9154                         { 0x19, 0xb7a7013f },
9155                         { 0x1a, 0x0181305f },
9156                         { 0x1b, 0x411111f0 },
9157                         { 0x1d, 0x411111f0 },
9158                         { 0x1e, 0x411111f0 },
9159                         { }
9160                 },
9161                 .chain_id = ALC269_FIXUP_DMIC,
9162         },
9163         [ALC269_FIXUP_CZC_TMI] = {
9164                 .type = HDA_FIXUP_PINS,
9165                 .v.pins = (const struct hda_pintbl[]) {
9166                         { 0x12, 0x4000c000 },
9167                         { 0x14, 0x90170110 }, /* speaker */
9168                         { 0x15, 0x0421401f }, /* HP out */
9169                         { 0x17, 0x411111f0 },
9170                         { 0x18, 0x04a19020 }, /* mic */
9171                         { 0x19, 0x411111f0 },
9172                         { 0x1a, 0x411111f0 },
9173                         { 0x1b, 0x411111f0 },
9174                         { 0x1d, 0x40448505 },
9175                         { 0x1e, 0x411111f0 },
9176                         { 0x20, 0x8000ffff },
9177                         { }
9178                 },
9179                 .chain_id = ALC269_FIXUP_DMIC,
9180         },
9181         [ALC269_FIXUP_CZC_L101] = {
9182                 .type = HDA_FIXUP_PINS,
9183                 .v.pins = (const struct hda_pintbl[]) {
9184                         { 0x12, 0x40000000 },
9185                         { 0x14, 0x01014010 }, /* speaker */
9186                         { 0x15, 0x411111f0 }, /* HP out */
9187                         { 0x16, 0x411111f0 },
9188                         { 0x18, 0x01a19020 }, /* mic */
9189                         { 0x19, 0x02a19021 },
9190                         { 0x1a, 0x0181302f },
9191                         { 0x1b, 0x0221401f },
9192                         { 0x1c, 0x411111f0 },
9193                         { 0x1d, 0x4044c601 },
9194                         { 0x1e, 0x411111f0 },
9195                         { }
9196                 },
9197                 .chain_id = ALC269_FIXUP_DMIC,
9198         },
9199         [ALC269_FIXUP_LEMOTE_A1802] = {
9200                 .type = HDA_FIXUP_PINS,
9201                 .v.pins = (const struct hda_pintbl[]) {
9202                         { 0x12, 0x40000000 },
9203                         { 0x14, 0x90170110 }, /* speaker */
9204                         { 0x17, 0x411111f0 },
9205                         { 0x18, 0x03a19040 }, /* mic1 */
9206                         { 0x19, 0x90a70130 }, /* mic2 */
9207                         { 0x1a, 0x411111f0 },
9208                         { 0x1b, 0x411111f0 },
9209                         { 0x1d, 0x40489d2d },
9210                         { 0x1e, 0x411111f0 },
9211                         { 0x20, 0x0003ffff },
9212                         { 0x21, 0x03214020 },
9213                         { }
9214                 },
9215                 .chain_id = ALC269_FIXUP_DMIC,
9216         },
9217         [ALC269_FIXUP_LEMOTE_A190X] = {
9218                 .type = HDA_FIXUP_PINS,
9219                 .v.pins = (const struct hda_pintbl[]) {
9220                         { 0x14, 0x99130110 }, /* speaker */
9221                         { 0x15, 0x0121401f }, /* HP out */
9222                         { 0x18, 0x01a19c20 }, /* rear  mic */
9223                         { 0x19, 0x99a3092f }, /* front mic */
9224                         { 0x1b, 0x0201401f }, /* front lineout */
9225                         { }
9226                 },
9227                 .chain_id = ALC269_FIXUP_DMIC,
9228         },
9229         [ALC256_FIXUP_INTEL_NUC8_RUGGED] = {
9230                 .type = HDA_FIXUP_PINS,
9231                 .v.pins = (const struct hda_pintbl[]) {
9232                         { 0x1b, 0x01a1913c }, /* use as headset mic, without its own jack detect */
9233                         { }
9234                 },
9235                 .chained = true,
9236                 .chain_id = ALC269_FIXUP_HEADSET_MODE
9237         },
9238         [ALC256_FIXUP_INTEL_NUC10] = {
9239                 .type = HDA_FIXUP_PINS,
9240                 .v.pins = (const struct hda_pintbl[]) {
9241                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
9242                         { }
9243                 },
9244                 .chained = true,
9245                 .chain_id = ALC269_FIXUP_HEADSET_MODE
9246         },
9247         [ALC255_FIXUP_XIAOMI_HEADSET_MIC] = {
9248                 .type = HDA_FIXUP_VERBS,
9249                 .v.verbs = (const struct hda_verb[]) {
9250                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
9251                         { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
9252                         { }
9253                 },
9254                 .chained = true,
9255                 .chain_id = ALC289_FIXUP_ASUS_GA502
9256         },
9257         [ALC274_FIXUP_HP_MIC] = {
9258                 .type = HDA_FIXUP_VERBS,
9259                 .v.verbs = (const struct hda_verb[]) {
9260                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x45 },
9261                         { 0x20, AC_VERB_SET_PROC_COEF, 0x5089 },
9262                         { }
9263                 },
9264         },
9265         [ALC274_FIXUP_HP_HEADSET_MIC] = {
9266                 .type = HDA_FIXUP_FUNC,
9267                 .v.func = alc274_fixup_hp_headset_mic,
9268                 .chained = true,
9269                 .chain_id = ALC274_FIXUP_HP_MIC
9270         },
9271         [ALC274_FIXUP_HP_ENVY_GPIO] = {
9272                 .type = HDA_FIXUP_FUNC,
9273                 .v.func = alc274_fixup_hp_envy_gpio,
9274         },
9275         [ALC256_FIXUP_ASUS_HPE] = {
9276                 .type = HDA_FIXUP_VERBS,
9277                 .v.verbs = (const struct hda_verb[]) {
9278                         /* Set EAPD high */
9279                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x0f },
9280                         { 0x20, AC_VERB_SET_PROC_COEF, 0x7778 },
9281                         { }
9282                 },
9283                 .chained = true,
9284                 .chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
9285         },
9286         [ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK] = {
9287                 .type = HDA_FIXUP_FUNC,
9288                 .v.func = alc_fixup_headset_jack,
9289                 .chained = true,
9290                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
9291         },
9292         [ALC287_FIXUP_HP_GPIO_LED] = {
9293                 .type = HDA_FIXUP_FUNC,
9294                 .v.func = alc287_fixup_hp_gpio_led,
9295         },
9296         [ALC256_FIXUP_HP_HEADSET_MIC] = {
9297                 .type = HDA_FIXUP_FUNC,
9298                 .v.func = alc274_fixup_hp_headset_mic,
9299         },
9300         [ALC236_FIXUP_DELL_AIO_HEADSET_MIC] = {
9301                 .type = HDA_FIXUP_FUNC,
9302                 .v.func = alc_fixup_no_int_mic,
9303                 .chained = true,
9304                 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
9305         },
9306         [ALC282_FIXUP_ACER_DISABLE_LINEOUT] = {
9307                 .type = HDA_FIXUP_PINS,
9308                 .v.pins = (const struct hda_pintbl[]) {
9309                         { 0x1b, 0x411111f0 },
9310                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
9311                         { },
9312                 },
9313                 .chained = true,
9314                 .chain_id = ALC269_FIXUP_HEADSET_MODE
9315         },
9316         [ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST] = {
9317                 .type = HDA_FIXUP_FUNC,
9318                 .v.func = alc269_fixup_limit_int_mic_boost,
9319                 .chained = true,
9320                 .chain_id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
9321         },
9322         [ALC256_FIXUP_ACER_HEADSET_MIC] = {
9323                 .type = HDA_FIXUP_PINS,
9324                 .v.pins = (const struct hda_pintbl[]) {
9325                         { 0x19, 0x02a1113c }, /* use as headset mic, without its own jack detect */
9326                         { 0x1a, 0x90a1092f }, /* use as internal mic */
9327                         { }
9328                 },
9329                 .chained = true,
9330                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
9331         },
9332         [ALC285_FIXUP_IDEAPAD_S740_COEF] = {
9333                 .type = HDA_FIXUP_FUNC,
9334                 .v.func = alc285_fixup_ideapad_s740_coef,
9335                 .chained = true,
9336                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
9337         },
9338         [ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST] = {
9339                 .type = HDA_FIXUP_FUNC,
9340                 .v.func = alc269_fixup_limit_int_mic_boost,
9341                 .chained = true,
9342                 .chain_id = ALC285_FIXUP_HP_MUTE_LED,
9343         },
9344         [ALC295_FIXUP_ASUS_DACS] = {
9345                 .type = HDA_FIXUP_FUNC,
9346                 .v.func = alc295_fixup_asus_dacs,
9347         },
9348         [ALC295_FIXUP_HP_OMEN] = {
9349                 .type = HDA_FIXUP_PINS,
9350                 .v.pins = (const struct hda_pintbl[]) {
9351                         { 0x12, 0xb7a60130 },
9352                         { 0x13, 0x40000000 },
9353                         { 0x14, 0x411111f0 },
9354                         { 0x16, 0x411111f0 },
9355                         { 0x17, 0x90170110 },
9356                         { 0x18, 0x411111f0 },
9357                         { 0x19, 0x02a11030 },
9358                         { 0x1a, 0x411111f0 },
9359                         { 0x1b, 0x04a19030 },
9360                         { 0x1d, 0x40600001 },
9361                         { 0x1e, 0x411111f0 },
9362                         { 0x21, 0x03211020 },
9363                         {}
9364                 },
9365                 .chained = true,
9366                 .chain_id = ALC269_FIXUP_HP_LINE1_MIC1_LED,
9367         },
9368         [ALC285_FIXUP_HP_SPECTRE_X360] = {
9369                 .type = HDA_FIXUP_FUNC,
9370                 .v.func = alc285_fixup_hp_spectre_x360,
9371         },
9372         [ALC285_FIXUP_HP_SPECTRE_X360_EB1] = {
9373                 .type = HDA_FIXUP_FUNC,
9374                 .v.func = alc285_fixup_hp_spectre_x360_eb1
9375         },
9376         [ALC285_FIXUP_HP_ENVY_X360] = {
9377                 .type = HDA_FIXUP_FUNC,
9378                 .v.func = alc285_fixup_hp_envy_x360,
9379                 .chained = true,
9380                 .chain_id = ALC285_FIXUP_HP_GPIO_AMP_INIT,
9381         },
9382         [ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP] = {
9383                 .type = HDA_FIXUP_FUNC,
9384                 .v.func = alc285_fixup_ideapad_s740_coef,
9385                 .chained = true,
9386                 .chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,
9387         },
9388         [ALC623_FIXUP_LENOVO_THINKSTATION_P340] = {
9389                 .type = HDA_FIXUP_FUNC,
9390                 .v.func = alc_fixup_no_shutup,
9391                 .chained = true,
9392                 .chain_id = ALC283_FIXUP_HEADSET_MIC,
9393         },
9394         [ALC255_FIXUP_ACER_HEADPHONE_AND_MIC] = {
9395                 .type = HDA_FIXUP_PINS,
9396                 .v.pins = (const struct hda_pintbl[]) {
9397                         { 0x21, 0x03211030 }, /* Change the Headphone location to Left */
9398                         { }
9399                 },
9400                 .chained = true,
9401                 .chain_id = ALC255_FIXUP_XIAOMI_HEADSET_MIC
9402         },
9403         [ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST] = {
9404                 .type = HDA_FIXUP_FUNC,
9405                 .v.func = alc269_fixup_limit_int_mic_boost,
9406                 .chained = true,
9407                 .chain_id = ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF,
9408         },
9409         [ALC285_FIXUP_LEGION_Y9000X_SPEAKERS] = {
9410                 .type = HDA_FIXUP_FUNC,
9411                 .v.func = alc285_fixup_ideapad_s740_coef,
9412                 .chained = true,
9413                 .chain_id = ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE,
9414         },
9415         [ALC285_FIXUP_LEGION_Y9000X_AUTOMUTE] = {
9416                 .type = HDA_FIXUP_FUNC,
9417                 .v.func = alc287_fixup_legion_15imhg05_speakers,
9418                 .chained = true,
9419                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
9420         },
9421         [ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS] = {
9422                 .type = HDA_FIXUP_VERBS,
9423                 //.v.verbs = legion_15imhg05_coefs,
9424                 .v.verbs = (const struct hda_verb[]) {
9425                          // set left speaker Legion 7i.
9426                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9427                          { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
9428 
9429                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9430                          { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9431                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9432                          { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
9433                          { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9434 
9435                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9436                          { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9437                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9438                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9439                          { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9440 
9441                          // set right speaker Legion 7i.
9442                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9443                          { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
9444 
9445                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9446                          { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9447                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9448                          { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
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                 .chained = true,
9459                 .chain_id = ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE,
9460         },
9461         [ALC287_FIXUP_LEGION_15IMHG05_AUTOMUTE] = {
9462                 .type = HDA_FIXUP_FUNC,
9463                 .v.func = alc287_fixup_legion_15imhg05_speakers,
9464                 .chained = true,
9465                 .chain_id = ALC269_FIXUP_HEADSET_MODE,
9466         },
9467         [ALC287_FIXUP_YOGA7_14ITL_SPEAKERS] = {
9468                 .type = HDA_FIXUP_VERBS,
9469                 .v.verbs = (const struct hda_verb[]) {
9470                          // set left speaker Yoga 7i.
9471                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9472                          { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
9473 
9474                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9475                          { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9476                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9477                          { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
9478                          { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9479 
9480                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9481                          { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9482                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9483                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9484                          { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9485 
9486                          // set right speaker Yoga 7i.
9487                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9488                          { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
9489 
9490                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9491                          { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9492                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9493                          { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
9494                          { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9495 
9496                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9497                          { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9498                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9499                          { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9500                          { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9501                          {}
9502                 },
9503                 .chained = true,
9504                 .chain_id = ALC269_FIXUP_HEADSET_MODE,
9505         },
9506         [ALC298_FIXUP_LENOVO_C940_DUET7] = {
9507                 .type = HDA_FIXUP_FUNC,
9508                 .v.func = alc298_fixup_lenovo_c940_duet7,
9509         },
9510         [ALC287_FIXUP_LENOVO_14IRP8_DUETITL] = {
9511                 .type = HDA_FIXUP_FUNC,
9512                 .v.func = alc287_fixup_lenovo_14irp8_duetitl,
9513         },
9514         [ALC287_FIXUP_LENOVO_LEGION_7] = {
9515                 .type = HDA_FIXUP_FUNC,
9516                 .v.func = alc287_fixup_lenovo_legion_7,
9517         },
9518         [ALC287_FIXUP_13S_GEN2_SPEAKERS] = {
9519                 .type = HDA_FIXUP_VERBS,
9520                 .v.verbs = (const struct hda_verb[]) {
9521                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9522                         { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
9523                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9524                         { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9525                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9526                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9527                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9528                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9529                         { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
9530                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9531                         { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9532                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9533                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9534                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9535                         {}
9536                 },
9537                 .chained = true,
9538                 .chain_id = ALC269_FIXUP_HEADSET_MODE,
9539         },
9540         [ALC256_FIXUP_SET_COEF_DEFAULTS] = {
9541                 .type = HDA_FIXUP_FUNC,
9542                 .v.func = alc256_fixup_set_coef_defaults,
9543         },
9544         [ALC245_FIXUP_HP_GPIO_LED] = {
9545                 .type = HDA_FIXUP_FUNC,
9546                 .v.func = alc245_fixup_hp_gpio_led,
9547         },
9548         [ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE] = {
9549                 .type = HDA_FIXUP_PINS,
9550                 .v.pins = (const struct hda_pintbl[]) {
9551                         { 0x19, 0x03a11120 }, /* use as headset mic, without its own jack detect */
9552                         { }
9553                 },
9554                 .chained = true,
9555                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
9556         },
9557         [ALC233_FIXUP_NO_AUDIO_JACK] = {
9558                 .type = HDA_FIXUP_FUNC,
9559                 .v.func = alc233_fixup_no_audio_jack,
9560         },
9561         [ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME] = {
9562                 .type = HDA_FIXUP_FUNC,
9563                 .v.func = alc256_fixup_mic_no_presence_and_resume,
9564                 .chained = true,
9565                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
9566         },
9567         [ALC287_FIXUP_LEGION_16ACHG6] = {
9568                 .type = HDA_FIXUP_FUNC,
9569                 .v.func = alc287_fixup_legion_16achg6_speakers,
9570         },
9571         [ALC287_FIXUP_CS35L41_I2C_2] = {
9572                 .type = HDA_FIXUP_FUNC,
9573                 .v.func = cs35l41_fixup_i2c_two,
9574         },
9575         [ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED] = {
9576                 .type = HDA_FIXUP_FUNC,
9577                 .v.func = cs35l41_fixup_i2c_two,
9578                 .chained = true,
9579                 .chain_id = ALC285_FIXUP_HP_MUTE_LED,
9580         },
9581         [ALC287_FIXUP_CS35L41_I2C_4] = {
9582                 .type = HDA_FIXUP_FUNC,
9583                 .v.func = cs35l41_fixup_i2c_four,
9584         },
9585         [ALC245_FIXUP_CS35L41_SPI_2] = {
9586                 .type = HDA_FIXUP_FUNC,
9587                 .v.func = cs35l41_fixup_spi_two,
9588         },
9589         [ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED] = {
9590                 .type = HDA_FIXUP_FUNC,
9591                 .v.func = cs35l41_fixup_spi_two,
9592                 .chained = true,
9593                 .chain_id = ALC285_FIXUP_HP_GPIO_LED,
9594         },
9595         [ALC245_FIXUP_CS35L41_SPI_4] = {
9596                 .type = HDA_FIXUP_FUNC,
9597                 .v.func = cs35l41_fixup_spi_four,
9598         },
9599         [ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED] = {
9600                 .type = HDA_FIXUP_FUNC,
9601                 .v.func = cs35l41_fixup_spi_four,
9602                 .chained = true,
9603                 .chain_id = ALC285_FIXUP_HP_GPIO_LED,
9604         },
9605         [ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED] = {
9606                 .type = HDA_FIXUP_VERBS,
9607                 .v.verbs = (const struct hda_verb[]) {
9608                          { 0x20, AC_VERB_SET_COEF_INDEX, 0x19 },
9609                          { 0x20, AC_VERB_SET_PROC_COEF, 0x8e11 },
9610                          { }
9611                 },
9612                 .chained = true,
9613                 .chain_id = ALC285_FIXUP_HP_MUTE_LED,
9614         },
9615         [ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET] = {
9616                 .type = HDA_FIXUP_FUNC,
9617                 .v.func = alc_fixup_dell4_mic_no_presence_quiet,
9618                 .chained = true,
9619                 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
9620         },
9621         [ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE] = {
9622                 .type = HDA_FIXUP_PINS,
9623                 .v.pins = (const struct hda_pintbl[]) {
9624                         { 0x19, 0x02a1112c }, /* use as headset mic, without its own jack detect */
9625                         { }
9626                 },
9627                 .chained = true,
9628                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
9629         },
9630         [ALC287_FIXUP_LEGION_16ITHG6] = {
9631                 .type = HDA_FIXUP_FUNC,
9632                 .v.func = alc287_fixup_legion_16ithg6_speakers,
9633         },
9634         [ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK] = {
9635                 .type = HDA_FIXUP_VERBS,
9636                 .v.verbs = (const struct hda_verb[]) {
9637                         // enable left speaker
9638                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9639                         { 0x20, AC_VERB_SET_PROC_COEF, 0x41 },
9640 
9641                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9642                         { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9643                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9644                         { 0x20, AC_VERB_SET_PROC_COEF, 0x1a },
9645                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9646 
9647                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9648                         { 0x20, AC_VERB_SET_PROC_COEF, 0xf },
9649                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9650                         { 0x20, AC_VERB_SET_PROC_COEF, 0x42 },
9651                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9652 
9653                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9654                         { 0x20, AC_VERB_SET_PROC_COEF, 0x10 },
9655                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9656                         { 0x20, AC_VERB_SET_PROC_COEF, 0x40 },
9657                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9658 
9659                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9660                         { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9661                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9662                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9663                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9664 
9665                         // enable right speaker
9666                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x24 },
9667                         { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
9668 
9669                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9670                         { 0x20, AC_VERB_SET_PROC_COEF, 0xc },
9671                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9672                         { 0x20, AC_VERB_SET_PROC_COEF, 0x2a },
9673                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9674 
9675                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9676                         { 0x20, AC_VERB_SET_PROC_COEF, 0xf },
9677                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9678                         { 0x20, AC_VERB_SET_PROC_COEF, 0x46 },
9679                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9680 
9681                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9682                         { 0x20, AC_VERB_SET_PROC_COEF, 0x10 },
9683                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9684                         { 0x20, AC_VERB_SET_PROC_COEF, 0x44 },
9685                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9686 
9687                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x26 },
9688                         { 0x20, AC_VERB_SET_PROC_COEF, 0x2 },
9689                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9690                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0 },
9691                         { 0x20, AC_VERB_SET_PROC_COEF, 0xb020 },
9692 
9693                         { },
9694                 },
9695         },
9696         [ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN] = {
9697                 .type = HDA_FIXUP_FUNC,
9698                 .v.func = alc287_fixup_yoga9_14iap7_bass_spk_pin,
9699                 .chained = true,
9700                 .chain_id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK,
9701         },
9702         [ALC287_FIXUP_LENOVO_14ARP8_LEGION_IAH7] = {
9703                 .type = HDA_FIXUP_FUNC,
9704                 .v.func = alc287_fixup_lenovo_14arp8_legion_iah7,
9705         },
9706         [ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PIN] = {
9707                 .type = HDA_FIXUP_FUNC,
9708                 .v.func = alc287_fixup_yoga9_14iap7_bass_spk_pin,
9709                 .chained = true,
9710                 .chain_id = ALC287_FIXUP_CS35L41_I2C_2,
9711         },
9712         [ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS] = {
9713                 .type = HDA_FIXUP_FUNC,
9714                 .v.func = alc295_fixup_dell_inspiron_top_speakers,
9715                 .chained = true,
9716                 .chain_id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
9717         },
9718         [ALC236_FIXUP_DELL_DUAL_CODECS] = {
9719                 .type = HDA_FIXUP_PINS,
9720                 .v.func = alc1220_fixup_gb_dual_codecs,
9721                 .chained = true,
9722                 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
9723         },
9724         [ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI] = {
9725                 .type = HDA_FIXUP_FUNC,
9726                 .v.func = cs35l41_fixup_i2c_two,
9727                 .chained = true,
9728                 .chain_id = ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
9729         },
9730         [ALC287_FIXUP_TAS2781_I2C] = {
9731                 .type = HDA_FIXUP_FUNC,
9732                 .v.func = tas2781_fixup_i2c,
9733                 .chained = true,
9734                 .chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,
9735         },
9736         [ALC287_FIXUP_YOGA7_14ARB7_I2C] = {
9737                 .type = HDA_FIXUP_FUNC,
9738                 .v.func = yoga7_14arb7_fixup_i2c,
9739                 .chained = true,
9740                 .chain_id = ALC285_FIXUP_THINKPAD_HEADSET_JACK,
9741         },
9742         [ALC245_FIXUP_HP_MUTE_LED_COEFBIT] = {
9743                 .type = HDA_FIXUP_FUNC,
9744                 .v.func = alc245_fixup_hp_mute_led_coefbit,
9745         },
9746         [ALC245_FIXUP_HP_X360_MUTE_LEDS] = {
9747                 .type = HDA_FIXUP_FUNC,
9748                 .v.func = alc245_fixup_hp_mute_led_coefbit,
9749                 .chained = true,
9750                 .chain_id = ALC245_FIXUP_HP_GPIO_LED
9751         },
9752         [ALC287_FIXUP_THINKPAD_I2S_SPK] = {
9753                 .type = HDA_FIXUP_FUNC,
9754                 .v.func = alc287_fixup_bind_dacs,
9755                 .chained = true,
9756                 .chain_id = ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
9757         },
9758         [ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD] = {
9759                 .type = HDA_FIXUP_FUNC,
9760                 .v.func = alc287_fixup_bind_dacs,
9761                 .chained = true,
9762                 .chain_id = ALC287_FIXUP_CS35L41_I2C_2_THINKPAD_ACPI,
9763         },
9764         [ALC2XX_FIXUP_HEADSET_MIC] = {
9765                 .type = HDA_FIXUP_FUNC,
9766                 .v.func = alc_fixup_headset_mic,
9767         },
9768         [ALC289_FIXUP_DELL_CS35L41_SPI_2] = {
9769                 .type = HDA_FIXUP_FUNC,
9770                 .v.func = cs35l41_fixup_spi_two,
9771                 .chained = true,
9772                 .chain_id = ALC289_FIXUP_DUAL_SPK
9773         },
9774         [ALC294_FIXUP_CS35L41_I2C_2] = {
9775                 .type = HDA_FIXUP_FUNC,
9776                 .v.func = cs35l41_fixup_i2c_two,
9777         },
9778         [ALC245_FIXUP_CS35L56_SPI_4_HP_GPIO_LED] = {
9779                 .type = HDA_FIXUP_FUNC,
9780                 .v.func = cs35l56_fixup_spi_four,
9781                 .chained = true,
9782                 .chain_id = ALC285_FIXUP_HP_GPIO_LED,
9783         },
9784         [ALC256_FIXUP_ACER_SFG16_MICMUTE_LED] = {
9785                 .type = HDA_FIXUP_FUNC,
9786                 .v.func = alc256_fixup_acer_sfg16_micmute_led,
9787         },
9788         [ALC256_FIXUP_HEADPHONE_AMP_VOL] = {
9789                 .type = HDA_FIXUP_FUNC,
9790                 .v.func = alc256_decrease_headphone_amp_val,
9791         },
9792         [ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX] = {
9793                 .type = HDA_FIXUP_FUNC,
9794                 .v.func = alc245_fixup_hp_spectre_x360_eu0xxx,
9795         },
9796         [ALC285_FIXUP_CS35L56_SPI_2] = {
9797                 .type = HDA_FIXUP_FUNC,
9798                 .v.func = cs35l56_fixup_spi_two,
9799         },
9800         [ALC285_FIXUP_CS35L56_I2C_2] = {
9801                 .type = HDA_FIXUP_FUNC,
9802                 .v.func = cs35l56_fixup_i2c_two,
9803         },
9804         [ALC285_FIXUP_CS35L56_I2C_4] = {
9805                 .type = HDA_FIXUP_FUNC,
9806                 .v.func = cs35l56_fixup_i2c_four,
9807         },
9808         [ALC285_FIXUP_ASUS_GA403U] = {
9809                 .type = HDA_FIXUP_FUNC,
9810                 .v.func = alc285_fixup_asus_ga403u,
9811         },
9812         [ALC285_FIXUP_ASUS_GA403U_HEADSET_MIC] = {
9813                 .type = HDA_FIXUP_PINS,
9814                 .v.pins = (const struct hda_pintbl[]) {
9815                         { 0x19, 0x03a11050 },
9816                         { 0x1b, 0x03a11c30 },
9817                         { }
9818                 },
9819                 .chained = true,
9820                 .chain_id = ALC285_FIXUP_ASUS_GA403U_I2C_SPEAKER2_TO_DAC1
9821         },
9822         [ALC285_FIXUP_ASUS_GU605_SPI_SPEAKER2_TO_DAC1] = {
9823                 .type = HDA_FIXUP_FUNC,
9824                 .v.func = alc285_fixup_speaker2_to_dac1,
9825                 .chained = true,
9826                 .chain_id = ALC285_FIXUP_ASUS_GU605_SPI_2_HEADSET_MIC,
9827         },
9828         [ALC285_FIXUP_ASUS_GU605_SPI_2_HEADSET_MIC] = {
9829                 .type = HDA_FIXUP_PINS,
9830                 .v.pins = (const struct hda_pintbl[]) {
9831                         { 0x19, 0x03a11050 },
9832                         { 0x1b, 0x03a11c30 },
9833                         { }
9834                 },
9835                 .chained = true,
9836                 .chain_id = ALC285_FIXUP_CS35L56_SPI_2
9837         },
9838         [ALC285_FIXUP_ASUS_GA403U_I2C_SPEAKER2_TO_DAC1] = {
9839                 .type = HDA_FIXUP_FUNC,
9840                 .v.func = alc285_fixup_speaker2_to_dac1,
9841                 .chained = true,
9842                 .chain_id = ALC285_FIXUP_ASUS_GA403U,
9843         },
9844         [ALC287_FIXUP_LENOVO_THKPAD_WH_ALC1318] = {
9845                 .type = HDA_FIXUP_FUNC,
9846                 .v.func = alc287_fixup_lenovo_thinkpad_with_alc1318,
9847                 .chained = true,
9848                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
9849         },
9850         [ALC256_FIXUP_CHROME_BOOK] = {
9851                 .type = HDA_FIXUP_FUNC,
9852                 .v.func = alc256_fixup_chromebook,
9853                 .chained = true,
9854                 .chain_id = ALC225_FIXUP_HEADSET_JACK
9855         },
9856         [ALC287_FIXUP_LENOVO_SSID_17AA3820] = {
9857                 .type = HDA_FIXUP_FUNC,
9858                 .v.func = alc287_fixup_lenovo_ssid_17aa3820,
9859         },
9860 };
9861 
9862 static const struct snd_pci_quirk alc269_fixup_tbl[] = {
9863         SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC),
9864         SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC),
9865         SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC),
9866         SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700),
9867         SND_PCI_QUIRK(0x1025, 0x072d, "Acer Aspire V5-571G", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
9868         SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK),
9869         SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK),
9870         SND_PCI_QUIRK(0x1025, 0x0762, "Acer Aspire E1-472", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
9871         SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
9872         SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),
9873         SND_PCI_QUIRK(0x1025, 0x080d, "Acer Aspire V5-122P", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
9874         SND_PCI_QUIRK(0x1025, 0x0840, "Acer Aspire E1", ALC269VB_FIXUP_ASPIRE_E1_COEF),
9875         SND_PCI_QUIRK(0x1025, 0x100c, "Acer Aspire E5-574G", ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST),
9876         SND_PCI_QUIRK(0x1025, 0x101c, "Acer Veriton N2510G", ALC269_FIXUP_LIFEBOOK),
9877         SND_PCI_QUIRK(0x1025, 0x102b, "Acer Aspire C24-860", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE),
9878         SND_PCI_QUIRK(0x1025, 0x1065, "Acer Aspire C20-820", ALC269VC_FIXUP_ACER_HEADSET_MIC),
9879         SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),
9880         SND_PCI_QUIRK(0x1025, 0x1094, "Acer Aspire E5-575T", ALC255_FIXUP_ACER_LIMIT_INT_MIC_BOOST),
9881         SND_PCI_QUIRK(0x1025, 0x1099, "Acer Aspire E5-523G", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9882         SND_PCI_QUIRK(0x1025, 0x110e, "Acer Aspire ES1-432", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9883         SND_PCI_QUIRK(0x1025, 0x1166, "Acer Veriton N4640G", ALC269_FIXUP_LIFEBOOK),
9884         SND_PCI_QUIRK(0x1025, 0x1167, "Acer Veriton N6640G", ALC269_FIXUP_LIFEBOOK),
9885         SND_PCI_QUIRK(0x1025, 0x1246, "Acer Predator Helios 500", ALC299_FIXUP_PREDATOR_SPK),
9886         SND_PCI_QUIRK(0x1025, 0x1247, "Acer vCopperbox", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),
9887         SND_PCI_QUIRK(0x1025, 0x1248, "Acer Veriton N4660G", ALC269VC_FIXUP_ACER_MIC_NO_PRESENCE),
9888         SND_PCI_QUIRK(0x1025, 0x1269, "Acer SWIFT SF314-54", ALC256_FIXUP_ACER_HEADSET_MIC),
9889         SND_PCI_QUIRK(0x1025, 0x126a, "Acer Swift SF114-32", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
9890         SND_PCI_QUIRK(0x1025, 0x128f, "Acer Veriton Z6860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9891         SND_PCI_QUIRK(0x1025, 0x1290, "Acer Veriton Z4860G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9892         SND_PCI_QUIRK(0x1025, 0x1291, "Acer Veriton Z4660G", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9893         SND_PCI_QUIRK(0x1025, 0x129c, "Acer SWIFT SF314-55", ALC256_FIXUP_ACER_HEADSET_MIC),
9894         SND_PCI_QUIRK(0x1025, 0x129d, "Acer SWIFT SF313-51", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
9895         SND_PCI_QUIRK(0x1025, 0x1300, "Acer SWIFT SF314-56", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
9896         SND_PCI_QUIRK(0x1025, 0x1308, "Acer Aspire Z24-890", ALC286_FIXUP_ACER_AIO_HEADSET_MIC),
9897         SND_PCI_QUIRK(0x1025, 0x132a, "Acer TravelMate B114-21", ALC233_FIXUP_ACER_HEADSET_MIC),
9898         SND_PCI_QUIRK(0x1025, 0x1330, "Acer TravelMate X514-51T", ALC255_FIXUP_ACER_HEADSET_MIC),
9899         SND_PCI_QUIRK(0x1025, 0x141f, "Acer Spin SP513-54N", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9900         SND_PCI_QUIRK(0x1025, 0x142b, "Acer Swift SF314-42", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9901         SND_PCI_QUIRK(0x1025, 0x1430, "Acer TravelMate B311R-31", ALC256_FIXUP_ACER_MIC_NO_PRESENCE),
9902         SND_PCI_QUIRK(0x1025, 0x1466, "Acer Aspire A515-56", ALC255_FIXUP_ACER_HEADPHONE_AND_MIC),
9903         SND_PCI_QUIRK(0x1025, 0x1534, "Acer Predator PH315-54", ALC255_FIXUP_ACER_MIC_NO_PRESENCE),
9904         SND_PCI_QUIRK(0x1025, 0x169a, "Acer Swift SFG16", ALC256_FIXUP_ACER_SFG16_MICMUTE_LED),
9905         SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
9906         SND_PCI_QUIRK(0x1028, 0x053c, "Dell Latitude E5430", ALC292_FIXUP_DELL_E7X),
9907         SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),
9908         SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X),
9909         SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X),
9910         SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X),
9911         SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X),
9912         SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
9913         SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
9914         SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
9915         SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
9916         SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
9917         SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
9918         SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X),
9919         SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X),
9920         SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
9921         SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9922         SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9923         SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),
9924         SND_PCI_QUIRK(0x1028, 0x0669, "Dell Optiplex 9020m", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
9925         SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
9926         SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
9927         SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9928         SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9929         SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9930         SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9931         SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9932         SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9933         SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
9934         SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
9935         SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE),
9936         SND_PCI_QUIRK(0x1028, 0x0738, "Dell Precision 5820", ALC269_FIXUP_NO_SHUTUP),
9937         SND_PCI_QUIRK(0x1028, 0x075c, "Dell XPS 27 7760", ALC298_FIXUP_SPK_VOLUME),
9938         SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME),
9939         SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
9940         SND_PCI_QUIRK(0x1028, 0x07b0, "Dell Precision 7520", ALC295_FIXUP_DISABLE_DAC3),
9941         SND_PCI_QUIRK(0x1028, 0x080c, "Dell WYSE", ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE),
9942         SND_PCI_QUIRK(0x1028, 0x084b, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
9943         SND_PCI_QUIRK(0x1028, 0x084e, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
9944         SND_PCI_QUIRK(0x1028, 0x0871, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
9945         SND_PCI_QUIRK(0x1028, 0x0872, "Dell Precision 3630", ALC255_FIXUP_DELL_HEADSET_MIC),
9946         SND_PCI_QUIRK(0x1028, 0x0873, "Dell Precision 3930", ALC255_FIXUP_DUMMY_LINEOUT_VERB),
9947         SND_PCI_QUIRK(0x1028, 0x08ad, "Dell WYSE AIO", ALC225_FIXUP_DELL_WYSE_AIO_MIC_NO_PRESENCE),
9948         SND_PCI_QUIRK(0x1028, 0x08ae, "Dell WYSE NB", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE),
9949         SND_PCI_QUIRK(0x1028, 0x0935, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB),
9950         SND_PCI_QUIRK(0x1028, 0x097d, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
9951         SND_PCI_QUIRK(0x1028, 0x097e, "Dell Precision", ALC289_FIXUP_DUAL_SPK),
9952         SND_PCI_QUIRK(0x1028, 0x098d, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
9953         SND_PCI_QUIRK(0x1028, 0x09bf, "Dell Precision", ALC233_FIXUP_ASUS_MIC_NO_PRESENCE),
9954         SND_PCI_QUIRK(0x1028, 0x0a2e, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
9955         SND_PCI_QUIRK(0x1028, 0x0a30, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC),
9956         SND_PCI_QUIRK(0x1028, 0x0a38, "Dell Latitude 7520", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE_QUIET),
9957         SND_PCI_QUIRK(0x1028, 0x0a58, "Dell", ALC255_FIXUP_DELL_HEADSET_MIC),
9958         SND_PCI_QUIRK(0x1028, 0x0a61, "Dell XPS 15 9510", ALC289_FIXUP_DUAL_SPK),
9959         SND_PCI_QUIRK(0x1028, 0x0a62, "Dell Precision 5560", ALC289_FIXUP_DUAL_SPK),
9960         SND_PCI_QUIRK(0x1028, 0x0a9d, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
9961         SND_PCI_QUIRK(0x1028, 0x0a9e, "Dell Latitude 5430", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
9962         SND_PCI_QUIRK(0x1028, 0x0b19, "Dell XPS 15 9520", ALC289_FIXUP_DUAL_SPK),
9963         SND_PCI_QUIRK(0x1028, 0x0b1a, "Dell Precision 5570", ALC289_FIXUP_DUAL_SPK),
9964         SND_PCI_QUIRK(0x1028, 0x0b27, "Dell", ALC245_FIXUP_CS35L41_SPI_2),
9965         SND_PCI_QUIRK(0x1028, 0x0b28, "Dell", ALC245_FIXUP_CS35L41_SPI_2),
9966         SND_PCI_QUIRK(0x1028, 0x0b37, "Dell Inspiron 16 Plus 7620 2-in-1", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS),
9967         SND_PCI_QUIRK(0x1028, 0x0b71, "Dell Inspiron 16 Plus 7620", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS),
9968         SND_PCI_QUIRK(0x1028, 0x0beb, "Dell XPS 15 9530 (2023)", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9969         SND_PCI_QUIRK(0x1028, 0x0c03, "Dell Precision 5340", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE),
9970         SND_PCI_QUIRK(0x1028, 0x0c0b, "Dell Oasis 14 RPL-P", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
9971         SND_PCI_QUIRK(0x1028, 0x0c0d, "Dell Oasis", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
9972         SND_PCI_QUIRK(0x1028, 0x0c0e, "Dell Oasis 16", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
9973         SND_PCI_QUIRK(0x1028, 0x0c19, "Dell Precision 3340", ALC236_FIXUP_DELL_DUAL_CODECS),
9974         SND_PCI_QUIRK(0x1028, 0x0c1a, "Dell Precision 3340", ALC236_FIXUP_DELL_DUAL_CODECS),
9975         SND_PCI_QUIRK(0x1028, 0x0c1b, "Dell Precision 3440", ALC236_FIXUP_DELL_DUAL_CODECS),
9976         SND_PCI_QUIRK(0x1028, 0x0c1c, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS),
9977         SND_PCI_QUIRK(0x1028, 0x0c1d, "Dell Precision 3440", ALC236_FIXUP_DELL_DUAL_CODECS),
9978         SND_PCI_QUIRK(0x1028, 0x0c1e, "Dell Precision 3540", ALC236_FIXUP_DELL_DUAL_CODECS),
9979         SND_PCI_QUIRK(0x1028, 0x0c28, "Dell Inspiron 16 Plus 7630", ALC295_FIXUP_DELL_INSPIRON_TOP_SPEAKERS),
9980         SND_PCI_QUIRK(0x1028, 0x0c4d, "Dell", ALC287_FIXUP_CS35L41_I2C_4),
9981         SND_PCI_QUIRK(0x1028, 0x0cbd, "Dell Oasis 13 CS MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9982         SND_PCI_QUIRK(0x1028, 0x0cbe, "Dell Oasis 13 2-IN-1 MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9983         SND_PCI_QUIRK(0x1028, 0x0cbf, "Dell Oasis 13 Low Weight MTU-L", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9984         SND_PCI_QUIRK(0x1028, 0x0cc0, "Dell Oasis 13", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
9985         SND_PCI_QUIRK(0x1028, 0x0cc1, "Dell Oasis 14 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9986         SND_PCI_QUIRK(0x1028, 0x0cc2, "Dell Oasis 14 2-in-1 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9987         SND_PCI_QUIRK(0x1028, 0x0cc3, "Dell Oasis 14 Low Weight MTL-U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9988         SND_PCI_QUIRK(0x1028, 0x0cc4, "Dell Oasis 16 MTL-H/U", ALC289_FIXUP_DELL_CS35L41_SPI_2),
9989         SND_PCI_QUIRK(0x1028, 0x0cc5, "Dell Oasis 14", ALC289_FIXUP_RTK_AMP_DUAL_SPK),
9990         SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9991         SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
9992         SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
9993         SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
9994         SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
9995         SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9996         SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9997         SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
9998         SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
9999         SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC),
10000         SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
10001         SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
10002         SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
10003         SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
10004         SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
10005         SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
10006         SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
10007         SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
10008         SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
10009         SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
10010         SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
10011         SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
10012         SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
10013         SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
10014         SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
10015         SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10016         SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10017         SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10018         SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10019         SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10020         SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10021         SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10022         SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10023         SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED),
10024         SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
10025         SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS),
10026         SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
10027         SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS),
10028         SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
10029         SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10030         SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10031         SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10032         SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10033         SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10034         SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10035         SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10036         SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10037         SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10038         SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10039         SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10040         SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10041         SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10042         SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),
10043         SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
10044         SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
10045         SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10046         SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10047         SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10048         SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
10049         SND_PCI_QUIRK(0x103c, 0x2b5e, "HP 288 Pro G2 MT", ALC221_FIXUP_HP_288PRO_MIC_NO_PRESENCE),
10050         SND_PCI_QUIRK(0x103c, 0x802e, "HP Z240 SFF", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
10051         SND_PCI_QUIRK(0x103c, 0x802f, "HP Z240", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
10052         SND_PCI_QUIRK(0x103c, 0x8077, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
10053         SND_PCI_QUIRK(0x103c, 0x8158, "HP", ALC256_FIXUP_HP_HEADSET_MIC),
10054         SND_PCI_QUIRK(0x103c, 0x820d, "HP Pavilion 15", ALC295_FIXUP_HP_X360),
10055         SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
10056         SND_PCI_QUIRK(0x103c, 0x827e, "HP x360", ALC295_FIXUP_HP_X360),
10057         SND_PCI_QUIRK(0x103c, 0x827f, "HP x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
10058         SND_PCI_QUIRK(0x103c, 0x82bf, "HP G3 mini", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
10059         SND_PCI_QUIRK(0x103c, 0x82c0, "HP G3 mini premium", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
10060         SND_PCI_QUIRK(0x103c, 0x83b9, "HP Spectre x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
10061         SND_PCI_QUIRK(0x103c, 0x841c, "HP Pavilion 15-CK0xx", ALC269_FIXUP_HP_MUTE_LED_MIC3),
10062         SND_PCI_QUIRK(0x103c, 0x8497, "HP Envy x360", ALC269_FIXUP_HP_MUTE_LED_MIC3),
10063         SND_PCI_QUIRK(0x103c, 0x84a6, "HP 250 G7 Notebook PC", ALC269_FIXUP_HP_LINE1_MIC1_LED),
10064         SND_PCI_QUIRK(0x103c, 0x84ae, "HP 15-db0403ng", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
10065         SND_PCI_QUIRK(0x103c, 0x84da, "HP OMEN dc0019-ur", ALC295_FIXUP_HP_OMEN),
10066         SND_PCI_QUIRK(0x103c, 0x84e7, "HP Pavilion 15", ALC269_FIXUP_HP_MUTE_LED_MIC3),
10067         SND_PCI_QUIRK(0x103c, 0x8519, "HP Spectre x360 15-df0xxx", ALC285_FIXUP_HP_SPECTRE_X360),
10068         SND_PCI_QUIRK(0x103c, 0x8537, "HP ProBook 440 G6", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
10069         SND_PCI_QUIRK(0x103c, 0x85de, "HP Envy x360 13-ar0xxx", ALC285_FIXUP_HP_ENVY_X360),
10070         SND_PCI_QUIRK(0x103c, 0x860f, "HP ZBook 15 G6", ALC285_FIXUP_HP_GPIO_AMP_INIT),
10071         SND_PCI_QUIRK(0x103c, 0x861f, "HP Elite Dragonfly G1", ALC285_FIXUP_HP_GPIO_AMP_INIT),
10072         SND_PCI_QUIRK(0x103c, 0x869d, "HP", ALC236_FIXUP_HP_MUTE_LED),
10073         SND_PCI_QUIRK(0x103c, 0x86c1, "HP Laptop 15-da3001TU", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
10074         SND_PCI_QUIRK(0x103c, 0x86c7, "HP Envy AiO 32", ALC274_FIXUP_HP_ENVY_GPIO),
10075         SND_PCI_QUIRK(0x103c, 0x86e7, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
10076         SND_PCI_QUIRK(0x103c, 0x86e8, "HP Spectre x360 15-eb0xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
10077         SND_PCI_QUIRK(0x103c, 0x86f9, "HP Spectre x360 13-aw0xxx", ALC285_FIXUP_HP_SPECTRE_X360_MUTE_LED),
10078         SND_PCI_QUIRK(0x103c, 0x8716, "HP Elite Dragonfly G2 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
10079         SND_PCI_QUIRK(0x103c, 0x8720, "HP EliteBook x360 1040 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
10080         SND_PCI_QUIRK(0x103c, 0x8724, "HP EliteBook 850 G7", ALC285_FIXUP_HP_GPIO_LED),
10081         SND_PCI_QUIRK(0x103c, 0x8728, "HP EliteBook 840 G7", ALC285_FIXUP_HP_GPIO_LED),
10082         SND_PCI_QUIRK(0x103c, 0x8729, "HP", ALC285_FIXUP_HP_GPIO_LED),
10083         SND_PCI_QUIRK(0x103c, 0x8730, "HP ProBook 445 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
10084         SND_PCI_QUIRK(0x103c, 0x8735, "HP ProBook 435 G7", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
10085         SND_PCI_QUIRK(0x103c, 0x8736, "HP", ALC285_FIXUP_HP_GPIO_AMP_INIT),
10086         SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED),
10087         SND_PCI_QUIRK(0x103c, 0x876e, "HP ENVY x360 Convertible 13-ay0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS),
10088         SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED),
10089         SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED),
10090         SND_PCI_QUIRK(0x103c, 0x8780, "HP ZBook Fury 17 G7 Mobile Workstation",
10091                       ALC285_FIXUP_HP_GPIO_AMP_INIT),
10092         SND_PCI_QUIRK(0x103c, 0x8783, "HP ZBook Fury 15 G7 Mobile Workstation",
10093                       ALC285_FIXUP_HP_GPIO_AMP_INIT),
10094         SND_PCI_QUIRK(0x103c, 0x8786, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
10095         SND_PCI_QUIRK(0x103c, 0x8787, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
10096         SND_PCI_QUIRK(0x103c, 0x8788, "HP OMEN 15", ALC285_FIXUP_HP_MUTE_LED),
10097         SND_PCI_QUIRK(0x103c, 0x87b7, "HP Laptop 14-fq0xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
10098         SND_PCI_QUIRK(0x103c, 0x87c8, "HP", ALC287_FIXUP_HP_GPIO_LED),
10099         SND_PCI_QUIRK(0x103c, 0x87d3, "HP Laptop 15-gw0xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
10100         SND_PCI_QUIRK(0x103c, 0x87e5, "HP ProBook 440 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
10101         SND_PCI_QUIRK(0x103c, 0x87e7, "HP ProBook 450 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
10102         SND_PCI_QUIRK(0x103c, 0x87f1, "HP ProBook 630 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
10103         SND_PCI_QUIRK(0x103c, 0x87f2, "HP ProBook 640 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
10104         SND_PCI_QUIRK(0x103c, 0x87f4, "HP", ALC287_FIXUP_HP_GPIO_LED),
10105         SND_PCI_QUIRK(0x103c, 0x87f5, "HP", ALC287_FIXUP_HP_GPIO_LED),
10106         SND_PCI_QUIRK(0x103c, 0x87f6, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
10107         SND_PCI_QUIRK(0x103c, 0x87f7, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
10108         SND_PCI_QUIRK(0x103c, 0x87fe, "HP Laptop 15s-fq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
10109         SND_PCI_QUIRK(0x103c, 0x8805, "HP ProBook 650 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
10110         SND_PCI_QUIRK(0x103c, 0x880d, "HP EliteBook 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
10111         SND_PCI_QUIRK(0x103c, 0x8811, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
10112         SND_PCI_QUIRK(0x103c, 0x8812, "HP Spectre x360 15-eb1xxx", ALC285_FIXUP_HP_SPECTRE_X360_EB1),
10113         SND_PCI_QUIRK(0x103c, 0x881d, "HP 250 G8 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
10114         SND_PCI_QUIRK(0x103c, 0x8846, "HP EliteBook 850 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
10115         SND_PCI_QUIRK(0x103c, 0x8847, "HP EliteBook x360 830 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
10116         SND_PCI_QUIRK(0x103c, 0x884b, "HP EliteBook 840 Aero G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
10117         SND_PCI_QUIRK(0x103c, 0x884c, "HP EliteBook 840 G8 Notebook PC", ALC285_FIXUP_HP_GPIO_LED),
10118         SND_PCI_QUIRK(0x103c, 0x8862, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),
10119         SND_PCI_QUIRK(0x103c, 0x8863, "HP ProBook 445 G8 Notebook PC", ALC236_FIXUP_HP_LIMIT_INT_MIC_BOOST),
10120         SND_PCI_QUIRK(0x103c, 0x886d, "HP ZBook Fury 17.3 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
10121         SND_PCI_QUIRK(0x103c, 0x8870, "HP ZBook Fury 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
10122         SND_PCI_QUIRK(0x103c, 0x8873, "HP ZBook Studio 15.6 Inch G8 Mobile Workstation PC", ALC285_FIXUP_HP_GPIO_AMP_INIT),
10123         SND_PCI_QUIRK(0x103c, 0x887a, "HP Laptop 15s-eq2xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
10124         SND_PCI_QUIRK(0x103c, 0x888a, "HP ENVY x360 Convertible 15-eu0xxx", ALC245_FIXUP_HP_X360_MUTE_LEDS),
10125         SND_PCI_QUIRK(0x103c, 0x888d, "HP ZBook Power 15.6 inch G8 Mobile Workstation PC", ALC236_FIXUP_HP_GPIO_LED),
10126         SND_PCI_QUIRK(0x103c, 0x8895, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_SPEAKERS_MICMUTE_LED),
10127         SND_PCI_QUIRK(0x103c, 0x8896, "HP EliteBook 855 G8 Notebook PC", ALC285_FIXUP_HP_MUTE_LED),
10128         SND_PCI_QUIRK(0x103c, 0x8898, "HP EliteBook 845 G8 Notebook PC", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
10129         SND_PCI_QUIRK(0x103c, 0x88d0, "HP Pavilion 15-eh1xxx (mainboard 88D0)", ALC287_FIXUP_HP_GPIO_LED),
10130         SND_PCI_QUIRK(0x103c, 0x8902, "HP OMEN 16", ALC285_FIXUP_HP_MUTE_LED),
10131         SND_PCI_QUIRK(0x103c, 0x890e, "HP 255 G8 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
10132         SND_PCI_QUIRK(0x103c, 0x8919, "HP Pavilion Aero Laptop 13-be0xxx", ALC287_FIXUP_HP_GPIO_LED),
10133         SND_PCI_QUIRK(0x103c, 0x896d, "HP ZBook Firefly 16 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10134         SND_PCI_QUIRK(0x103c, 0x896e, "HP EliteBook x360 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10135         SND_PCI_QUIRK(0x103c, 0x8971, "HP EliteBook 830 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10136         SND_PCI_QUIRK(0x103c, 0x8972, "HP EliteBook 840 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10137         SND_PCI_QUIRK(0x103c, 0x8973, "HP EliteBook 860 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10138         SND_PCI_QUIRK(0x103c, 0x8974, "HP EliteBook 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10139         SND_PCI_QUIRK(0x103c, 0x8975, "HP EliteBook x360 840 Aero G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10140         SND_PCI_QUIRK(0x103c, 0x897d, "HP mt440 Mobile Thin Client U74", ALC236_FIXUP_HP_GPIO_LED),
10141         SND_PCI_QUIRK(0x103c, 0x8981, "HP Elite Dragonfly G3", ALC245_FIXUP_CS35L41_SPI_4),
10142         SND_PCI_QUIRK(0x103c, 0x898e, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),
10143         SND_PCI_QUIRK(0x103c, 0x898f, "HP EliteBook 835 G9", ALC287_FIXUP_CS35L41_I2C_2),
10144         SND_PCI_QUIRK(0x103c, 0x8991, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
10145         SND_PCI_QUIRK(0x103c, 0x8992, "HP EliteBook 845 G9", ALC287_FIXUP_CS35L41_I2C_2),
10146         SND_PCI_QUIRK(0x103c, 0x8994, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
10147         SND_PCI_QUIRK(0x103c, 0x8995, "HP EliteBook 855 G9", ALC287_FIXUP_CS35L41_I2C_2),
10148         SND_PCI_QUIRK(0x103c, 0x89a4, "HP ProBook 440 G9", ALC236_FIXUP_HP_GPIO_LED),
10149         SND_PCI_QUIRK(0x103c, 0x89a6, "HP ProBook 450 G9", ALC236_FIXUP_HP_GPIO_LED),
10150         SND_PCI_QUIRK(0x103c, 0x89aa, "HP EliteBook 630 G9", ALC236_FIXUP_HP_GPIO_LED),
10151         SND_PCI_QUIRK(0x103c, 0x89ac, "HP EliteBook 640 G9", ALC236_FIXUP_HP_GPIO_LED),
10152         SND_PCI_QUIRK(0x103c, 0x89ae, "HP EliteBook 650 G9", ALC236_FIXUP_HP_GPIO_LED),
10153         SND_PCI_QUIRK(0x103c, 0x89c0, "HP ZBook Power 15.6 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10154         SND_PCI_QUIRK(0x103c, 0x89c3, "Zbook Studio G9", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
10155         SND_PCI_QUIRK(0x103c, 0x89c6, "Zbook Fury 17 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10156         SND_PCI_QUIRK(0x103c, 0x89ca, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
10157         SND_PCI_QUIRK(0x103c, 0x89d3, "HP EliteBook 645 G9 (MB 89D2)", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
10158         SND_PCI_QUIRK(0x103c, 0x89e7, "HP Elite x2 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10159         SND_PCI_QUIRK(0x103c, 0x8a0f, "HP Pavilion 14-ec1xxx", ALC287_FIXUP_HP_GPIO_LED),
10160         SND_PCI_QUIRK(0x103c, 0x8a20, "HP Laptop 15s-fq5xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
10161         SND_PCI_QUIRK(0x103c, 0x8a25, "HP Victus 16-d1xxx (MB 8A25)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),
10162         SND_PCI_QUIRK(0x103c, 0x8a28, "HP Envy 13", ALC287_FIXUP_CS35L41_I2C_2),
10163         SND_PCI_QUIRK(0x103c, 0x8a29, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
10164         SND_PCI_QUIRK(0x103c, 0x8a2a, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
10165         SND_PCI_QUIRK(0x103c, 0x8a2b, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
10166         SND_PCI_QUIRK(0x103c, 0x8a2c, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),
10167         SND_PCI_QUIRK(0x103c, 0x8a2d, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),
10168         SND_PCI_QUIRK(0x103c, 0x8a2e, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),
10169         SND_PCI_QUIRK(0x103c, 0x8a30, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
10170         SND_PCI_QUIRK(0x103c, 0x8a31, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
10171         SND_PCI_QUIRK(0x103c, 0x8a6e, "HP EDNA 360", ALC287_FIXUP_CS35L41_I2C_4),
10172         SND_PCI_QUIRK(0x103c, 0x8a74, "HP ProBook 440 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
10173         SND_PCI_QUIRK(0x103c, 0x8a78, "HP Dev One", ALC285_FIXUP_HP_LIMIT_INT_MIC_BOOST),
10174         SND_PCI_QUIRK(0x103c, 0x8aa0, "HP ProBook 440 G9 (MB 8A9E)", ALC236_FIXUP_HP_GPIO_LED),
10175         SND_PCI_QUIRK(0x103c, 0x8aa3, "HP ProBook 450 G9 (MB 8AA1)", ALC236_FIXUP_HP_GPIO_LED),
10176         SND_PCI_QUIRK(0x103c, 0x8aa8, "HP EliteBook 640 G9 (MB 8AA6)", ALC236_FIXUP_HP_GPIO_LED),
10177         SND_PCI_QUIRK(0x103c, 0x8aab, "HP EliteBook 650 G9 (MB 8AA9)", ALC236_FIXUP_HP_GPIO_LED),
10178         SND_PCI_QUIRK(0x103c, 0x8ab9, "HP EliteBook 840 G8 (MB 8AB8)", ALC285_FIXUP_HP_GPIO_LED),
10179         SND_PCI_QUIRK(0x103c, 0x8abb, "HP ZBook Firefly 14 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10180         SND_PCI_QUIRK(0x103c, 0x8ad1, "HP EliteBook 840 14 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10181         SND_PCI_QUIRK(0x103c, 0x8ad2, "HP EliteBook 860 16 inch G9 Notebook PC", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10182         SND_PCI_QUIRK(0x103c, 0x8ad8, "HP 800 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10183         SND_PCI_QUIRK(0x103c, 0x8b0f, "HP Elite mt645 G7 Mobile Thin Client U81", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
10184         SND_PCI_QUIRK(0x103c, 0x8b2f, "HP 255 15.6 inch G10 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
10185         SND_PCI_QUIRK(0x103c, 0x8b3a, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
10186         SND_PCI_QUIRK(0x103c, 0x8b3f, "HP mt440 Mobile Thin Client U91", ALC236_FIXUP_HP_GPIO_LED),
10187         SND_PCI_QUIRK(0x103c, 0x8b42, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10188         SND_PCI_QUIRK(0x103c, 0x8b43, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10189         SND_PCI_QUIRK(0x103c, 0x8b44, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10190         SND_PCI_QUIRK(0x103c, 0x8b45, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10191         SND_PCI_QUIRK(0x103c, 0x8b46, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10192         SND_PCI_QUIRK(0x103c, 0x8b47, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10193         SND_PCI_QUIRK(0x103c, 0x8b59, "HP Elite mt645 G7 Mobile Thin Client U89", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
10194         SND_PCI_QUIRK(0x103c, 0x8b5d, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
10195         SND_PCI_QUIRK(0x103c, 0x8b5e, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
10196         SND_PCI_QUIRK(0x103c, 0x8b63, "HP Elite Dragonfly 13.5 inch G4", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
10197         SND_PCI_QUIRK(0x103c, 0x8b65, "HP ProBook 455 15.6 inch G10 Notebook PC", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
10198         SND_PCI_QUIRK(0x103c, 0x8b66, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
10199         SND_PCI_QUIRK(0x103c, 0x8b70, "HP EliteBook 835 G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
10200         SND_PCI_QUIRK(0x103c, 0x8b72, "HP EliteBook 845 G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
10201         SND_PCI_QUIRK(0x103c, 0x8b74, "HP EliteBook 845W G10", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
10202         SND_PCI_QUIRK(0x103c, 0x8b77, "HP ElieBook 865 G10", ALC287_FIXUP_CS35L41_I2C_2),
10203         SND_PCI_QUIRK(0x103c, 0x8b7a, "HP", ALC236_FIXUP_HP_GPIO_LED),
10204         SND_PCI_QUIRK(0x103c, 0x8b7d, "HP", ALC236_FIXUP_HP_GPIO_LED),
10205         SND_PCI_QUIRK(0x103c, 0x8b87, "HP", ALC236_FIXUP_HP_GPIO_LED),
10206         SND_PCI_QUIRK(0x103c, 0x8b8a, "HP", ALC236_FIXUP_HP_GPIO_LED),
10207         SND_PCI_QUIRK(0x103c, 0x8b8b, "HP", ALC236_FIXUP_HP_GPIO_LED),
10208         SND_PCI_QUIRK(0x103c, 0x8b8d, "HP", ALC236_FIXUP_HP_GPIO_LED),
10209         SND_PCI_QUIRK(0x103c, 0x8b8f, "HP", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
10210         SND_PCI_QUIRK(0x103c, 0x8b92, "HP", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10211         SND_PCI_QUIRK(0x103c, 0x8b96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
10212         SND_PCI_QUIRK(0x103c, 0x8b97, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
10213         SND_PCI_QUIRK(0x103c, 0x8bb3, "HP Slim OMEN", ALC287_FIXUP_CS35L41_I2C_2),
10214         SND_PCI_QUIRK(0x103c, 0x8bb4, "HP Slim OMEN", ALC287_FIXUP_CS35L41_I2C_2),
10215         SND_PCI_QUIRK(0x103c, 0x8bdd, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
10216         SND_PCI_QUIRK(0x103c, 0x8bde, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
10217         SND_PCI_QUIRK(0x103c, 0x8bdf, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
10218         SND_PCI_QUIRK(0x103c, 0x8be0, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
10219         SND_PCI_QUIRK(0x103c, 0x8be1, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
10220         SND_PCI_QUIRK(0x103c, 0x8be2, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
10221         SND_PCI_QUIRK(0x103c, 0x8be3, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
10222         SND_PCI_QUIRK(0x103c, 0x8be5, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),
10223         SND_PCI_QUIRK(0x103c, 0x8be6, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),
10224         SND_PCI_QUIRK(0x103c, 0x8be7, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
10225         SND_PCI_QUIRK(0x103c, 0x8be8, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
10226         SND_PCI_QUIRK(0x103c, 0x8be9, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
10227         SND_PCI_QUIRK(0x103c, 0x8bf0, "HP", ALC236_FIXUP_HP_GPIO_LED),
10228         SND_PCI_QUIRK(0x103c, 0x8c15, "HP Spectre x360 2-in-1 Laptop 14-eu0xxx", ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX),
10229         SND_PCI_QUIRK(0x103c, 0x8c16, "HP Spectre 16", ALC287_FIXUP_CS35L41_I2C_2),
10230         SND_PCI_QUIRK(0x103c, 0x8c17, "HP Spectre 16", ALC287_FIXUP_CS35L41_I2C_2),
10231         SND_PCI_QUIRK(0x103c, 0x8c46, "HP EliteBook 830 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10232         SND_PCI_QUIRK(0x103c, 0x8c47, "HP EliteBook 840 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10233         SND_PCI_QUIRK(0x103c, 0x8c48, "HP EliteBook 860 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10234         SND_PCI_QUIRK(0x103c, 0x8c49, "HP Elite x360 830 2-in-1 G11", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10235         SND_PCI_QUIRK(0x103c, 0x8c4d, "HP Omen", ALC287_FIXUP_CS35L41_I2C_2),
10236         SND_PCI_QUIRK(0x103c, 0x8c4e, "HP Omen", ALC287_FIXUP_CS35L41_I2C_2),
10237         SND_PCI_QUIRK(0x103c, 0x8c4f, "HP Envy 15", ALC287_FIXUP_CS35L41_I2C_2),
10238         SND_PCI_QUIRK(0x103c, 0x8c50, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
10239         SND_PCI_QUIRK(0x103c, 0x8c51, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
10240         SND_PCI_QUIRK(0x103c, 0x8c52, "HP EliteBook 1040 G11", ALC245_FIXUP_CS35L56_SPI_4_HP_GPIO_LED),
10241         SND_PCI_QUIRK(0x103c, 0x8c53, "HP Elite x360 1040 2-in-1 G11", ALC245_FIXUP_CS35L56_SPI_4_HP_GPIO_LED),
10242         SND_PCI_QUIRK(0x103c, 0x8c66, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),
10243         SND_PCI_QUIRK(0x103c, 0x8c67, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
10244         SND_PCI_QUIRK(0x103c, 0x8c68, "HP Envy 17", ALC287_FIXUP_CS35L41_I2C_2),
10245         SND_PCI_QUIRK(0x103c, 0x8c6a, "HP Envy 16", ALC287_FIXUP_CS35L41_I2C_2),
10246         SND_PCI_QUIRK(0x103c, 0x8c70, "HP EliteBook 835 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
10247         SND_PCI_QUIRK(0x103c, 0x8c71, "HP EliteBook 845 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
10248         SND_PCI_QUIRK(0x103c, 0x8c72, "HP EliteBook 865 G11", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
10249         SND_PCI_QUIRK(0x103c, 0x8c7b, "HP ProBook 445 G11", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
10250         SND_PCI_QUIRK(0x103c, 0x8c7c, "HP ProBook 445 G11", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
10251         SND_PCI_QUIRK(0x103c, 0x8c7d, "HP ProBook 465 G11", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
10252         SND_PCI_QUIRK(0x103c, 0x8c7e, "HP ProBook 465 G11", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
10253         SND_PCI_QUIRK(0x103c, 0x8c7f, "HP EliteBook 645 G11", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
10254         SND_PCI_QUIRK(0x103c, 0x8c80, "HP EliteBook 645 G11", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
10255         SND_PCI_QUIRK(0x103c, 0x8c81, "HP EliteBook 665 G11", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
10256         SND_PCI_QUIRK(0x103c, 0x8c89, "HP ProBook 460 G11", ALC236_FIXUP_HP_GPIO_LED),
10257         SND_PCI_QUIRK(0x103c, 0x8c8a, "HP EliteBook 630", ALC236_FIXUP_HP_GPIO_LED),
10258         SND_PCI_QUIRK(0x103c, 0x8c8c, "HP EliteBook 660", ALC236_FIXUP_HP_GPIO_LED),
10259         SND_PCI_QUIRK(0x103c, 0x8c8d, "HP ProBook 440 G11", ALC236_FIXUP_HP_GPIO_LED),
10260         SND_PCI_QUIRK(0x103c, 0x8c8e, "HP ProBook 460 G11", ALC236_FIXUP_HP_GPIO_LED),
10261         SND_PCI_QUIRK(0x103c, 0x8c90, "HP EliteBook 640", ALC236_FIXUP_HP_GPIO_LED),
10262         SND_PCI_QUIRK(0x103c, 0x8c91, "HP EliteBook 660", ALC236_FIXUP_HP_GPIO_LED),
10263         SND_PCI_QUIRK(0x103c, 0x8c96, "HP", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
10264         SND_PCI_QUIRK(0x103c, 0x8c97, "HP ZBook", ALC236_FIXUP_HP_MUTE_LED_MICMUTE_VREF),
10265         SND_PCI_QUIRK(0x103c, 0x8ca1, "HP ZBook Power", ALC236_FIXUP_HP_GPIO_LED),
10266         SND_PCI_QUIRK(0x103c, 0x8ca2, "HP ZBook Power", ALC236_FIXUP_HP_GPIO_LED),
10267         SND_PCI_QUIRK(0x103c, 0x8ca4, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10268         SND_PCI_QUIRK(0x103c, 0x8ca7, "HP ZBook Fury", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
10269         SND_PCI_QUIRK(0x103c, 0x8cdd, "HP Spectre", ALC287_FIXUP_CS35L41_I2C_2),
10270         SND_PCI_QUIRK(0x103c, 0x8cde, "HP Spectre", ALC287_FIXUP_CS35L41_I2C_2),
10271         SND_PCI_QUIRK(0x103c, 0x8cdf, "HP SnowWhite", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
10272         SND_PCI_QUIRK(0x103c, 0x8ce0, "HP SnowWhite", ALC287_FIXUP_CS35L41_I2C_2_HP_GPIO_LED),
10273         SND_PCI_QUIRK(0x103c, 0x8cf5, "HP ZBook Studio 16", ALC245_FIXUP_CS35L41_SPI_4_HP_GPIO_LED),
10274         SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
10275         SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
10276         SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10277         SND_PCI_QUIRK(0x1043, 0x10a1, "ASUS UX391UA", ALC294_FIXUP_ASUS_SPK),
10278         SND_PCI_QUIRK(0x1043, 0x10c0, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
10279         SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
10280         SND_PCI_QUIRK(0x1043, 0x10d3, "ASUS K6500ZC", ALC294_FIXUP_ASUS_SPK),
10281         SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10282         SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
10283         SND_PCI_QUIRK(0x1043, 0x125e, "ASUS Q524UQK", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
10284         SND_PCI_QUIRK(0x1043, 0x1271, "ASUS X430UN", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
10285         SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
10286         SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
10287         SND_PCI_QUIRK(0x1043, 0x12a3, "Asus N7691ZM", ALC269_FIXUP_ASUS_N7601ZM),
10288         SND_PCI_QUIRK(0x1043, 0x12af, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),
10289         SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
10290         SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
10291         SND_PCI_QUIRK(0x1043, 0x1313, "Asus K42JZ", ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE),
10292         SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
10293         SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
10294         SND_PCI_QUIRK(0x1043, 0x1433, "ASUS GX650PY/PZ/PV/PU/PYV/PZV/PIV/PVV", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
10295         SND_PCI_QUIRK(0x1043, 0x1463, "Asus GA402X/GA402N", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
10296         SND_PCI_QUIRK(0x1043, 0x1473, "ASUS GU604VI/VC/VE/VG/VJ/VQ/VU/VV/VY/VZ", ALC285_FIXUP_ASUS_HEADSET_MIC),
10297         SND_PCI_QUIRK(0x1043, 0x1483, "ASUS GU603VQ/VU/VV/VJ/VI", ALC285_FIXUP_ASUS_HEADSET_MIC),
10298         SND_PCI_QUIRK(0x1043, 0x1493, "ASUS GV601VV/VU/VJ/VQ/VI", ALC285_FIXUP_ASUS_HEADSET_MIC),
10299         SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G614JY/JZ/JG", ALC245_FIXUP_CS35L41_SPI_2),
10300         SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS G513PI/PU/PV", ALC287_FIXUP_CS35L41_I2C_2),
10301         SND_PCI_QUIRK(0x1043, 0x1503, "ASUS G733PY/PZ/PZV/PYV", ALC287_FIXUP_CS35L41_I2C_2),
10302         SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
10303         SND_PCI_QUIRK(0x1043, 0x1533, "ASUS GV302XA/XJ/XQ/XU/XV/XI", ALC287_FIXUP_CS35L41_I2C_2),
10304         SND_PCI_QUIRK(0x1043, 0x1573, "ASUS GZ301VV/VQ/VU/VJ/VA/VC/VE/VVC/VQC/VUC/VJC/VEC/VCC", ALC285_FIXUP_ASUS_HEADSET_MIC),
10305         SND_PCI_QUIRK(0x1043, 0x1662, "ASUS GV301QH", ALC294_FIXUP_ASUS_DUAL_SPK),
10306         SND_PCI_QUIRK(0x1043, 0x1663, "ASUS GU603ZI/ZJ/ZQ/ZU/ZV", ALC285_FIXUP_ASUS_HEADSET_MIC),
10307         SND_PCI_QUIRK(0x1043, 0x1683, "ASUS UM3402YAR", ALC287_FIXUP_CS35L41_I2C_2),
10308         SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS UX3402VA", ALC245_FIXUP_CS35L41_SPI_2),
10309         SND_PCI_QUIRK(0x1043, 0x16b2, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
10310         SND_PCI_QUIRK(0x1043, 0x16d3, "ASUS UX5304VA", ALC245_FIXUP_CS35L41_SPI_2),
10311         SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
10312         SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS UX7602VI/BZ", ALC245_FIXUP_CS35L41_SPI_2),
10313         SND_PCI_QUIRK(0x1043, 0x1740, "ASUS UX430UA", ALC295_FIXUP_ASUS_DACS),
10314         SND_PCI_QUIRK(0x1043, 0x17d1, "ASUS UX431FL", ALC294_FIXUP_ASUS_DUAL_SPK),
10315         SND_PCI_QUIRK(0x1043, 0x17f3, "ROG Ally NR2301L/X", ALC294_FIXUP_ASUS_ALLY),
10316         SND_PCI_QUIRK(0x1043, 0x1863, "ASUS UX6404VI/VV", ALC245_FIXUP_CS35L41_SPI_2),
10317         SND_PCI_QUIRK(0x1043, 0x1881, "ASUS Zephyrus S/M", ALC294_FIXUP_ASUS_GX502_PINS),
10318         SND_PCI_QUIRK(0x1043, 0x18b1, "Asus MJ401TA", ALC256_FIXUP_ASUS_HEADSET_MIC),
10319         SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS UM3504DA", ALC294_FIXUP_CS35L41_I2C_2),
10320         SND_PCI_QUIRK(0x1043, 0x18f1, "Asus FX505DT", ALC256_FIXUP_ASUS_HEADSET_MIC),
10321         SND_PCI_QUIRK(0x1043, 0x194e, "ASUS UX563FD", ALC294_FIXUP_ASUS_HPE),
10322         SND_PCI_QUIRK(0x1043, 0x1970, "ASUS UX550VE", ALC289_FIXUP_ASUS_GA401),
10323         SND_PCI_QUIRK(0x1043, 0x1982, "ASUS B1400CEPE", ALC256_FIXUP_ASUS_HPE),
10324         SND_PCI_QUIRK(0x1043, 0x19ce, "ASUS B9450FA", ALC294_FIXUP_ASUS_HPE),
10325         SND_PCI_QUIRK(0x1043, 0x19e1, "ASUS UX581LV", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE),
10326         SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
10327         SND_PCI_QUIRK(0x1043, 0x1a30, "ASUS X705UD", ALC256_FIXUP_ASUS_MIC),
10328         SND_PCI_QUIRK(0x1043, 0x1a63, "ASUS UX3405MA", ALC245_FIXUP_CS35L41_SPI_2),
10329         SND_PCI_QUIRK(0x1043, 0x1a83, "ASUS UM5302LA", ALC294_FIXUP_CS35L41_I2C_2),
10330         SND_PCI_QUIRK(0x1043, 0x1a8f, "ASUS UX582ZS", ALC245_FIXUP_CS35L41_SPI_2),
10331         SND_PCI_QUIRK(0x1043, 0x1b11, "ASUS UX431DA", ALC294_FIXUP_ASUS_COEF_1B),
10332         SND_PCI_QUIRK(0x1043, 0x1b13, "ASUS U41SV/GA403U", ALC285_FIXUP_ASUS_GA403U_HEADSET_MIC),
10333         SND_PCI_QUIRK(0x1043, 0x1b93, "ASUS G614JVR/JIR", ALC245_FIXUP_CS35L41_SPI_2),
10334         SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
10335         SND_PCI_QUIRK(0x1043, 0x1c03, "ASUS UM3406HA", ALC287_FIXUP_CS35L41_I2C_2),
10336         SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10337         SND_PCI_QUIRK(0x1043, 0x1c33, "ASUS UX5304MA", ALC245_FIXUP_CS35L41_SPI_2),
10338         SND_PCI_QUIRK(0x1043, 0x1c43, "ASUS UX8406MA", ALC245_FIXUP_CS35L41_SPI_2),
10339         SND_PCI_QUIRK(0x1043, 0x1c62, "ASUS GU603", ALC289_FIXUP_ASUS_GA401),
10340         SND_PCI_QUIRK(0x1043, 0x1c63, "ASUS GU605M", ALC285_FIXUP_ASUS_GU605_SPI_SPEAKER2_TO_DAC1),
10341         SND_PCI_QUIRK(0x1043, 0x1c92, "ASUS ROG Strix G15", ALC285_FIXUP_ASUS_G533Z_PINS),
10342         SND_PCI_QUIRK(0x1043, 0x1c9f, "ASUS G614JU/JV/JI", ALC285_FIXUP_ASUS_HEADSET_MIC),
10343         SND_PCI_QUIRK(0x1043, 0x1caf, "ASUS G634JY/JZ/JI/JG", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
10344         SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
10345         SND_PCI_QUIRK(0x1043, 0x1ccf, "ASUS G814JU/JV/JI", ALC245_FIXUP_CS35L41_SPI_2),
10346         SND_PCI_QUIRK(0x1043, 0x1cdf, "ASUS G814JY/JZ/JG", ALC245_FIXUP_CS35L41_SPI_2),
10347         SND_PCI_QUIRK(0x1043, 0x1cef, "ASUS G834JY/JZ/JI/JG", ALC285_FIXUP_ASUS_HEADSET_MIC),
10348         SND_PCI_QUIRK(0x1043, 0x1d1f, "ASUS G713PI/PU/PV/PVN", ALC287_FIXUP_CS35L41_I2C_2),
10349         SND_PCI_QUIRK(0x1043, 0x1d42, "ASUS Zephyrus G14 2022", ALC289_FIXUP_ASUS_GA401),
10350         SND_PCI_QUIRK(0x1043, 0x1d4e, "ASUS TM420", ALC256_FIXUP_ASUS_HPE),
10351         SND_PCI_QUIRK(0x1043, 0x1da2, "ASUS UP6502ZA/ZD", ALC245_FIXUP_CS35L41_SPI_2),
10352         SND_PCI_QUIRK(0x1043, 0x1df3, "ASUS UM5606", ALC285_FIXUP_CS35L56_I2C_4),
10353         SND_PCI_QUIRK(0x1043, 0x1e02, "ASUS UX3402ZA", ALC245_FIXUP_CS35L41_SPI_2),
10354         SND_PCI_QUIRK(0x1043, 0x1e11, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA502),
10355         SND_PCI_QUIRK(0x1043, 0x1e12, "ASUS UM3402", ALC287_FIXUP_CS35L41_I2C_2),
10356         SND_PCI_QUIRK(0x1043, 0x1e51, "ASUS Zephyrus M15", ALC294_FIXUP_ASUS_GU502_PINS),
10357         SND_PCI_QUIRK(0x1043, 0x1e5e, "ASUS ROG Strix G513", ALC294_FIXUP_ASUS_G513_PINS),
10358         SND_PCI_QUIRK(0x1043, 0x1e63, "ASUS H7606W", ALC285_FIXUP_CS35L56_I2C_2),
10359         SND_PCI_QUIRK(0x1043, 0x1e83, "ASUS GA605W", ALC285_FIXUP_CS35L56_I2C_2),
10360         SND_PCI_QUIRK(0x1043, 0x1e8e, "ASUS Zephyrus G15", ALC289_FIXUP_ASUS_GA401),
10361         SND_PCI_QUIRK(0x1043, 0x1ed3, "ASUS HN7306W", ALC287_FIXUP_CS35L41_I2C_2),
10362         SND_PCI_QUIRK(0x1043, 0x1ee2, "ASUS UM6702RA/RC", ALC287_FIXUP_CS35L41_I2C_2),
10363         SND_PCI_QUIRK(0x1043, 0x1c52, "ASUS Zephyrus G15 2022", ALC289_FIXUP_ASUS_GA401),
10364         SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),
10365         SND_PCI_QUIRK(0x1043, 0x1f12, "ASUS UM5302", ALC287_FIXUP_CS35L41_I2C_2),
10366         SND_PCI_QUIRK(0x1043, 0x1f1f, "ASUS H7604JI/JV/J3D", ALC245_FIXUP_CS35L41_SPI_2),
10367         SND_PCI_QUIRK(0x1043, 0x1f62, "ASUS UX7602ZM", ALC245_FIXUP_CS35L41_SPI_2),
10368         SND_PCI_QUIRK(0x1043, 0x1f92, "ASUS ROG Flow X16", ALC289_FIXUP_ASUS_GA401),
10369         SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
10370         SND_PCI_QUIRK(0x1043, 0x3a20, "ASUS G614JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
10371         SND_PCI_QUIRK(0x1043, 0x3a30, "ASUS G814JVR/JIR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
10372         SND_PCI_QUIRK(0x1043, 0x3a40, "ASUS G814JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
10373         SND_PCI_QUIRK(0x1043, 0x3a50, "ASUS G834JYR/JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
10374         SND_PCI_QUIRK(0x1043, 0x3a60, "ASUS G634JYR/JZR", ALC285_FIXUP_ASUS_SPI_REAR_SPEAKERS),
10375         SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
10376         SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
10377         SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
10378         SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
10379         SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
10380         SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
10381         SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
10382         SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
10383         SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),
10384         SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
10385         SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
10386         SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
10387         SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),
10388         SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),
10389         SND_PCI_QUIRK(0x10cf, 0x1629, "Lifebook U7x7", ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC),
10390         SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN),
10391         SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
10392         SND_PCI_QUIRK(0x10ec, 0x10f2, "Intel Reference board", ALC700_FIXUP_INTEL_REFERENCE),
10393         SND_PCI_QUIRK(0x10ec, 0x118c, "Medion EE4254 MD62100", ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE),
10394         SND_PCI_QUIRK(0x10ec, 0x119e, "Positivo SU C1400", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
10395         SND_PCI_QUIRK(0x10ec, 0x11bc, "VAIO VJFE-IL", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10396         SND_PCI_QUIRK(0x10ec, 0x1230, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
10397         SND_PCI_QUIRK(0x10ec, 0x124c, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
10398         SND_PCI_QUIRK(0x10ec, 0x1252, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
10399         SND_PCI_QUIRK(0x10ec, 0x1254, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
10400         SND_PCI_QUIRK(0x10ec, 0x12cc, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
10401         SND_PCI_QUIRK(0x10ec, 0x12f6, "Intel Reference board", ALC295_FIXUP_CHROME_BOOK),
10402         SND_PCI_QUIRK(0x10f7, 0x8338, "Panasonic CF-SZ6", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
10403         SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
10404         SND_PCI_QUIRK(0x144d, 0xc169, "Samsung Notebook 9 Pen (NP930SBE-K01US)", ALC298_FIXUP_SAMSUNG_AMP),
10405         SND_PCI_QUIRK(0x144d, 0xc176, "Samsung Notebook 9 Pro (NP930MBE-K04US)", ALC298_FIXUP_SAMSUNG_AMP),
10406         SND_PCI_QUIRK(0x144d, 0xc189, "Samsung Galaxy Flex Book (NT950QCG-X716)", ALC298_FIXUP_SAMSUNG_AMP),
10407         SND_PCI_QUIRK(0x144d, 0xc18a, "Samsung Galaxy Book Ion (NP930XCJ-K01US)", ALC298_FIXUP_SAMSUNG_AMP),
10408         SND_PCI_QUIRK(0x144d, 0xc1a3, "Samsung Galaxy Book Pro (NP935XDB-KC1SE)", ALC298_FIXUP_SAMSUNG_AMP),
10409         SND_PCI_QUIRK(0x144d, 0xc1a4, "Samsung Galaxy Book Pro 360 (NT935QBD)", ALC298_FIXUP_SAMSUNG_AMP),
10410         SND_PCI_QUIRK(0x144d, 0xc1a6, "Samsung Galaxy Book Pro 360 (NP930QBD)", ALC298_FIXUP_SAMSUNG_AMP),
10411         SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
10412         SND_PCI_QUIRK(0x144d, 0xc812, "Samsung Notebook Pen S (NT950SBE-X58)", ALC298_FIXUP_SAMSUNG_AMP),
10413         SND_PCI_QUIRK(0x144d, 0xc830, "Samsung Galaxy Book Ion (NT950XCJ-X716A)", ALC298_FIXUP_SAMSUNG_AMP),
10414         SND_PCI_QUIRK(0x144d, 0xc832, "Samsung Galaxy Book Flex Alpha (NP730QCJ)", ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET),
10415         SND_PCI_QUIRK(0x144d, 0xca03, "Samsung Galaxy Book2 Pro 360 (NP930QED)", ALC298_FIXUP_SAMSUNG_AMP),
10416         SND_PCI_QUIRK(0x144d, 0xc868, "Samsung Galaxy Book2 Pro (NP930XED)", ALC298_FIXUP_SAMSUNG_AMP),
10417         SND_PCI_QUIRK(0x144d, 0xc1ca, "Samsung Galaxy Book3 Pro 360 (NP960QFG-KB1US)", ALC298_FIXUP_SAMSUNG_AMP2),
10418         SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
10419         SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
10420         SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
10421         SND_PCI_QUIRK(0x152d, 0x1082, "Quanta NL3", ALC269_FIXUP_LIFEBOOK),
10422         SND_PCI_QUIRK(0x152d, 0x1262, "Huawei NBLB-WAX9N", ALC2XX_FIXUP_HEADSET_MIC),
10423         SND_PCI_QUIRK(0x1558, 0x0353, "Clevo V35[05]SN[CDE]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10424         SND_PCI_QUIRK(0x1558, 0x1323, "Clevo N130ZU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10425         SND_PCI_QUIRK(0x1558, 0x1325, "Clevo N15[01][CW]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10426         SND_PCI_QUIRK(0x1558, 0x1401, "Clevo L140[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10427         SND_PCI_QUIRK(0x1558, 0x1403, "Clevo N140CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10428         SND_PCI_QUIRK(0x1558, 0x1404, "Clevo N150CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10429         SND_PCI_QUIRK(0x1558, 0x14a1, "Clevo L141MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10430         SND_PCI_QUIRK(0x1558, 0x2624, "Clevo L240TU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10431         SND_PCI_QUIRK(0x1558, 0x4018, "Clevo NV40M[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10432         SND_PCI_QUIRK(0x1558, 0x4019, "Clevo NV40MZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10433         SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10434         SND_PCI_QUIRK(0x1558, 0x4041, "Clevo NV4[15]PZ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10435         SND_PCI_QUIRK(0x1558, 0x40a1, "Clevo NL40GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10436         SND_PCI_QUIRK(0x1558, 0x40c1, "Clevo NL40[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10437         SND_PCI_QUIRK(0x1558, 0x40d1, "Clevo NL41DU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10438         SND_PCI_QUIRK(0x1558, 0x5015, "Clevo NH5[58]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10439         SND_PCI_QUIRK(0x1558, 0x5017, "Clevo NH7[79]H[HJK]Q", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10440         SND_PCI_QUIRK(0x1558, 0x50a3, "Clevo NJ51GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10441         SND_PCI_QUIRK(0x1558, 0x50b3, "Clevo NK50S[BEZ]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10442         SND_PCI_QUIRK(0x1558, 0x50b6, "Clevo NK50S5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10443         SND_PCI_QUIRK(0x1558, 0x50b8, "Clevo NK50SZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10444         SND_PCI_QUIRK(0x1558, 0x50d5, "Clevo NP50D5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10445         SND_PCI_QUIRK(0x1558, 0x50e1, "Clevo NH5[58]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10446         SND_PCI_QUIRK(0x1558, 0x50e2, "Clevo NH7[79]HPQ", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10447         SND_PCI_QUIRK(0x1558, 0x50f0, "Clevo NH50A[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10448         SND_PCI_QUIRK(0x1558, 0x50f2, "Clevo NH50E[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10449         SND_PCI_QUIRK(0x1558, 0x50f3, "Clevo NH58DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10450         SND_PCI_QUIRK(0x1558, 0x50f5, "Clevo NH55EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10451         SND_PCI_QUIRK(0x1558, 0x50f6, "Clevo NH55DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10452         SND_PCI_QUIRK(0x1558, 0x5101, "Clevo S510WU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10453         SND_PCI_QUIRK(0x1558, 0x5157, "Clevo W517GU1", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10454         SND_PCI_QUIRK(0x1558, 0x51a1, "Clevo NS50MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10455         SND_PCI_QUIRK(0x1558, 0x51b1, "Clevo NS50AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10456         SND_PCI_QUIRK(0x1558, 0x51b3, "Clevo NS70AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10457         SND_PCI_QUIRK(0x1558, 0x5630, "Clevo NP50RNJS", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10458         SND_PCI_QUIRK(0x1558, 0x70a1, "Clevo NB70T[HJK]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10459         SND_PCI_QUIRK(0x1558, 0x70b3, "Clevo NK70SB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10460         SND_PCI_QUIRK(0x1558, 0x70f2, "Clevo NH79EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10461         SND_PCI_QUIRK(0x1558, 0x70f3, "Clevo NH77DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10462         SND_PCI_QUIRK(0x1558, 0x70f4, "Clevo NH77EPY", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10463         SND_PCI_QUIRK(0x1558, 0x70f6, "Clevo NH77DPQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10464         SND_PCI_QUIRK(0x1558, 0x7716, "Clevo NS50PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10465         SND_PCI_QUIRK(0x1558, 0x7717, "Clevo NS70PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10466         SND_PCI_QUIRK(0x1558, 0x7718, "Clevo L140PU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10467         SND_PCI_QUIRK(0x1558, 0x7724, "Clevo L140AU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10468         SND_PCI_QUIRK(0x1558, 0x8228, "Clevo NR40BU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10469         SND_PCI_QUIRK(0x1558, 0x8520, "Clevo NH50D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10470         SND_PCI_QUIRK(0x1558, 0x8521, "Clevo NH77D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10471         SND_PCI_QUIRK(0x1558, 0x8535, "Clevo NH50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10472         SND_PCI_QUIRK(0x1558, 0x8536, "Clevo NH79D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10473         SND_PCI_QUIRK(0x1558, 0x8550, "Clevo NH[57][0-9][ER][ACDH]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10474         SND_PCI_QUIRK(0x1558, 0x8551, "Clevo NH[57][0-9][ER][ACDH]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10475         SND_PCI_QUIRK(0x1558, 0x8560, "Clevo NH[57][0-9][ER][ACDH]Q", ALC269_FIXUP_HEADSET_MIC),
10476         SND_PCI_QUIRK(0x1558, 0x8561, "Clevo NH[57][0-9][ER][ACDH]Q", ALC269_FIXUP_HEADSET_MIC),
10477         SND_PCI_QUIRK(0x1558, 0x8562, "Clevo NH[57][0-9]RZ[Q]", ALC269_FIXUP_DMIC),
10478         SND_PCI_QUIRK(0x1558, 0x8668, "Clevo NP50B[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10479         SND_PCI_QUIRK(0x1558, 0x866d, "Clevo NP5[05]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10480         SND_PCI_QUIRK(0x1558, 0x867c, "Clevo NP7[01]PNP", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10481         SND_PCI_QUIRK(0x1558, 0x867d, "Clevo NP7[01]PN[HJK]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10482         SND_PCI_QUIRK(0x1558, 0x8680, "Clevo NJ50LU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10483         SND_PCI_QUIRK(0x1558, 0x8686, "Clevo NH50[CZ]U", ALC256_FIXUP_MIC_NO_PRESENCE_AND_RESUME),
10484         SND_PCI_QUIRK(0x1558, 0x8a20, "Clevo NH55DCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10485         SND_PCI_QUIRK(0x1558, 0x8a51, "Clevo NH70RCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10486         SND_PCI_QUIRK(0x1558, 0x8d50, "Clevo NH55RCQ-M", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10487         SND_PCI_QUIRK(0x1558, 0x951d, "Clevo N950T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10488         SND_PCI_QUIRK(0x1558, 0x9600, "Clevo N960K[PR]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10489         SND_PCI_QUIRK(0x1558, 0x961d, "Clevo N960S[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10490         SND_PCI_QUIRK(0x1558, 0x971d, "Clevo N970T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10491         SND_PCI_QUIRK(0x1558, 0xa500, "Clevo NL5[03]RU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10492         SND_PCI_QUIRK(0x1558, 0xa600, "Clevo NL50NU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10493         SND_PCI_QUIRK(0x1558, 0xa650, "Clevo NP[567]0SN[CD]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10494         SND_PCI_QUIRK(0x1558, 0xa671, "Clevo NP70SN[CDE]", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10495         SND_PCI_QUIRK(0x1558, 0xa763, "Clevo V54x_6x_TU", ALC256_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10496         SND_PCI_QUIRK(0x1558, 0xb018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10497         SND_PCI_QUIRK(0x1558, 0xb019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10498         SND_PCI_QUIRK(0x1558, 0xb022, "Clevo NH77D[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10499         SND_PCI_QUIRK(0x1558, 0xc018, "Clevo NP50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10500         SND_PCI_QUIRK(0x1558, 0xc019, "Clevo NH77D[BE]Q", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10501         SND_PCI_QUIRK(0x1558, 0xc022, "Clevo NH77[DC][QW]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
10502         SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
10503         SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
10504         SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
10505         SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
10506         SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
10507         SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
10508         SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
10509         SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
10510         SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST),
10511         SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
10512         SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
10513         SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
10514         SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
10515         SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440),
10516         SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK),
10517         SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK),
10518         SND_PCI_QUIRK(0x17aa, 0x2211, "Thinkpad W541", ALC292_FIXUP_TPT440_DOCK),
10519         SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),
10520         SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK),
10521         SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10522         SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK),
10523         SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
10524         SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
10525         SND_PCI_QUIRK(0x17aa, 0x222d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10526         SND_PCI_QUIRK(0x17aa, 0x222e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10527         SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460),
10528         SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),
10529         SND_PCI_QUIRK(0x17aa, 0x2234, "Thinkpad ICE-1", ALC287_FIXUP_TAS2781_I2C),
10530         SND_PCI_QUIRK(0x17aa, 0x2245, "Thinkpad T470", ALC298_FIXUP_TPT470_DOCK),
10531         SND_PCI_QUIRK(0x17aa, 0x2246, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10532         SND_PCI_QUIRK(0x17aa, 0x2247, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10533         SND_PCI_QUIRK(0x17aa, 0x2249, "Thinkpad", ALC292_FIXUP_TPT460),
10534         SND_PCI_QUIRK(0x17aa, 0x224b, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10535         SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10536         SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10537         SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10538         SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
10539         SND_PCI_QUIRK(0x17aa, 0x22be, "Thinkpad X1 Carbon 8th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
10540         SND_PCI_QUIRK(0x17aa, 0x22c1, "Thinkpad P1 Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
10541         SND_PCI_QUIRK(0x17aa, 0x22c2, "Thinkpad X1 Extreme Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
10542         SND_PCI_QUIRK(0x17aa, 0x22f1, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10543         SND_PCI_QUIRK(0x17aa, 0x22f2, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10544         SND_PCI_QUIRK(0x17aa, 0x22f3, "Thinkpad", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10545         SND_PCI_QUIRK(0x17aa, 0x2316, "Thinkpad P1 Gen 6", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10546         SND_PCI_QUIRK(0x17aa, 0x2317, "Thinkpad P1 Gen 6", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10547         SND_PCI_QUIRK(0x17aa, 0x2318, "Thinkpad Z13 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10548         SND_PCI_QUIRK(0x17aa, 0x2319, "Thinkpad Z16 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10549         SND_PCI_QUIRK(0x17aa, 0x231a, "Thinkpad Z16 Gen2", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10550         SND_PCI_QUIRK(0x17aa, 0x231e, "Thinkpad", ALC287_FIXUP_LENOVO_THKPAD_WH_ALC1318),
10551         SND_PCI_QUIRK(0x17aa, 0x231f, "Thinkpad", ALC287_FIXUP_LENOVO_THKPAD_WH_ALC1318),
10552         SND_PCI_QUIRK(0x17aa, 0x2326, "Hera2", ALC287_FIXUP_TAS2781_I2C),
10553         SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
10554         SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
10555         SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
10556         SND_PCI_QUIRK(0x17aa, 0x3111, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
10557         SND_PCI_QUIRK(0x17aa, 0x312a, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
10558         SND_PCI_QUIRK(0x17aa, 0x312f, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
10559         SND_PCI_QUIRK(0x17aa, 0x313c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
10560         SND_PCI_QUIRK(0x17aa, 0x3151, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
10561         SND_PCI_QUIRK(0x17aa, 0x3176, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
10562         SND_PCI_QUIRK(0x17aa, 0x3178, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
10563         SND_PCI_QUIRK(0x17aa, 0x31af, "ThinkCentre Station", ALC623_FIXUP_LENOVO_THINKSTATION_P340),
10564         SND_PCI_QUIRK(0x17aa, 0x334b, "Lenovo ThinkCentre M70 Gen5", ALC283_FIXUP_HEADSET_MIC),
10565         SND_PCI_QUIRK(0x17aa, 0x3801, "Lenovo Yoga9 14IAP7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
10566         SND_PCI_QUIRK(0x17aa, 0x3802, "Lenovo Yoga Pro 9 14IRP8 / DuetITL 2021", ALC287_FIXUP_LENOVO_14IRP8_DUETITL),
10567         SND_PCI_QUIRK(0x17aa, 0x3813, "Legion 7i 15IMHG05", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
10568         SND_PCI_QUIRK(0x17aa, 0x3818, "Lenovo C940 / Yoga Duet 7", ALC298_FIXUP_LENOVO_C940_DUET7),
10569         SND_PCI_QUIRK(0x17aa, 0x3819, "Lenovo 13s Gen2 ITL", ALC287_FIXUP_13S_GEN2_SPEAKERS),
10570         SND_PCI_QUIRK(0x17aa, 0x3820, "IdeaPad 330 / Yoga Duet 7", ALC287_FIXUP_LENOVO_SSID_17AA3820),
10571         SND_PCI_QUIRK(0x17aa, 0x3824, "Legion Y9000X 2020", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
10572         SND_PCI_QUIRK(0x17aa, 0x3827, "Ideapad S740", ALC285_FIXUP_IDEAPAD_S740_COEF),
10573         SND_PCI_QUIRK(0x17aa, 0x3834, "Lenovo IdeaPad Slim 9i 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
10574         SND_PCI_QUIRK(0x17aa, 0x383d, "Legion Y9000X 2019", ALC285_FIXUP_LEGION_Y9000X_SPEAKERS),
10575         SND_PCI_QUIRK(0x17aa, 0x3843, "Yoga 9i", ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP),
10576         SND_PCI_QUIRK(0x17aa, 0x3847, "Legion 7 16ACHG6", ALC287_FIXUP_LEGION_16ACHG6),
10577         SND_PCI_QUIRK(0x17aa, 0x384a, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
10578         SND_PCI_QUIRK(0x17aa, 0x3852, "Lenovo Yoga 7 14ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
10579         SND_PCI_QUIRK(0x17aa, 0x3853, "Lenovo Yoga 7 15ITL5", ALC287_FIXUP_YOGA7_14ITL_SPEAKERS),
10580         SND_PCI_QUIRK(0x17aa, 0x3855, "Legion 7 16ITHG6", ALC287_FIXUP_LEGION_16ITHG6),
10581         SND_PCI_QUIRK(0x17aa, 0x3865, "Lenovo 13X", ALC287_FIXUP_CS35L41_I2C_2),
10582         SND_PCI_QUIRK(0x17aa, 0x3866, "Lenovo 13X", ALC287_FIXUP_CS35L41_I2C_2),
10583         SND_PCI_QUIRK(0x17aa, 0x3869, "Lenovo Yoga7 14IAL7", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
10584         SND_PCI_QUIRK(0x17aa, 0x386e, "Legion Y9000X 2022 IAH7 / Yoga Pro 7 14ARP8",  ALC287_FIXUP_LENOVO_14ARP8_LEGION_IAH7),
10585         SND_PCI_QUIRK(0x17aa, 0x386f, "Legion Pro 7/7i", ALC287_FIXUP_LENOVO_LEGION_7),
10586         SND_PCI_QUIRK(0x17aa, 0x3870, "Lenovo Yoga 7 14ARB7", ALC287_FIXUP_YOGA7_14ARB7_I2C),
10587         SND_PCI_QUIRK(0x17aa, 0x3877, "Lenovo Legion 7 Slim 16ARHA7", ALC287_FIXUP_CS35L41_I2C_2),
10588         SND_PCI_QUIRK(0x17aa, 0x3878, "Lenovo Legion 7 Slim 16ARHA7", ALC287_FIXUP_CS35L41_I2C_2),
10589         SND_PCI_QUIRK(0x17aa, 0x387d, "Yoga S780-16 pro Quad AAC", ALC287_FIXUP_TAS2781_I2C),
10590         SND_PCI_QUIRK(0x17aa, 0x387e, "Yoga S780-16 pro Quad YC", ALC287_FIXUP_TAS2781_I2C),
10591         SND_PCI_QUIRK(0x17aa, 0x3881, "YB9 dual power mode2 YC", ALC287_FIXUP_TAS2781_I2C),
10592         SND_PCI_QUIRK(0x17aa, 0x3882, "Lenovo Yoga Pro 7 14APH8", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
10593         SND_PCI_QUIRK(0x17aa, 0x3884, "Y780 YG DUAL", ALC287_FIXUP_TAS2781_I2C),
10594         SND_PCI_QUIRK(0x17aa, 0x3886, "Y780 VECO DUAL", ALC287_FIXUP_TAS2781_I2C),
10595         SND_PCI_QUIRK(0x17aa, 0x3891, "Lenovo Yoga Pro 7 14AHP9", ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN),
10596         SND_PCI_QUIRK(0x17aa, 0x38a7, "Y780P AMD YG dual", ALC287_FIXUP_TAS2781_I2C),
10597         SND_PCI_QUIRK(0x17aa, 0x38a8, "Y780P AMD VECO dual", ALC287_FIXUP_TAS2781_I2C),
10598         SND_PCI_QUIRK(0x17aa, 0x38a9, "Thinkbook 16P", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10599         SND_PCI_QUIRK(0x17aa, 0x38ab, "Thinkbook 16P", ALC287_FIXUP_MG_RTKC_CSAMP_CS35L41_I2C_THINKPAD),
10600         SND_PCI_QUIRK(0x17aa, 0x38b4, "Legion Slim 7 16IRH8", ALC287_FIXUP_CS35L41_I2C_2),
10601         SND_PCI_QUIRK(0x17aa, 0x38b5, "Legion Slim 7 16IRH8", ALC287_FIXUP_CS35L41_I2C_2),
10602         SND_PCI_QUIRK(0x17aa, 0x38b6, "Legion Slim 7 16APH8", ALC287_FIXUP_CS35L41_I2C_2),
10603         SND_PCI_QUIRK(0x17aa, 0x38b7, "Legion Slim 7 16APH8", ALC287_FIXUP_CS35L41_I2C_2),
10604         SND_PCI_QUIRK(0x17aa, 0x38ba, "Yoga S780-14.5 Air AMD quad YC", ALC287_FIXUP_TAS2781_I2C),
10605         SND_PCI_QUIRK(0x17aa, 0x38bb, "Yoga S780-14.5 Air AMD quad AAC", ALC287_FIXUP_TAS2781_I2C),
10606         SND_PCI_QUIRK(0x17aa, 0x38be, "Yoga S980-14.5 proX YC Dual", ALC287_FIXUP_TAS2781_I2C),
10607         SND_PCI_QUIRK(0x17aa, 0x38bf, "Yoga S980-14.5 proX LX Dual", ALC287_FIXUP_TAS2781_I2C),
10608         SND_PCI_QUIRK(0x17aa, 0x38c3, "Y980 DUAL", ALC287_FIXUP_TAS2781_I2C),
10609         SND_PCI_QUIRK(0x17aa, 0x38c7, "Thinkbook 13x Gen 4", ALC287_FIXUP_CS35L41_I2C_4),
10610         SND_PCI_QUIRK(0x17aa, 0x38c8, "Thinkbook 13x Gen 4", ALC287_FIXUP_CS35L41_I2C_4),
10611         SND_PCI_QUIRK(0x17aa, 0x38cb, "Y790 YG DUAL", ALC287_FIXUP_TAS2781_I2C),
10612         SND_PCI_QUIRK(0x17aa, 0x38cd, "Y790 VECO DUAL", ALC287_FIXUP_TAS2781_I2C),
10613         SND_PCI_QUIRK(0x17aa, 0x38d2, "Lenovo Yoga 9 14IMH9", ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PIN),
10614         SND_PCI_QUIRK(0x17aa, 0x38d7, "Lenovo Yoga 9 14IMH9", ALC287_FIXUP_YOGA9_14IMH9_BASS_SPK_PIN),
10615         SND_PCI_QUIRK(0x17aa, 0x38f9, "Thinkbook 16P Gen5", ALC287_FIXUP_CS35L41_I2C_2),
10616         SND_PCI_QUIRK(0x17aa, 0x38fa, "Thinkbook 16P Gen5", ALC287_FIXUP_CS35L41_I2C_2),
10617         SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
10618         SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
10619         SND_PCI_QUIRK(0x17aa, 0x3978, "Lenovo B50-70", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
10620         SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
10621         SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10622         SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
10623         SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
10624         SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10625         SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK),
10626         SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK),
10627         SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK),
10628         SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK),
10629         SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
10630         SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),
10631         SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),
10632         SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460),
10633         SND_PCI_QUIRK(0x17aa, 0x505d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10634         SND_PCI_QUIRK(0x17aa, 0x505f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10635         SND_PCI_QUIRK(0x17aa, 0x5062, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10636         SND_PCI_QUIRK(0x17aa, 0x508b, "Thinkpad X12 Gen 1", ALC287_FIXUP_LEGION_15IMHG05_SPEAKERS),
10637         SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10638         SND_PCI_QUIRK(0x17aa, 0x511e, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10639         SND_PCI_QUIRK(0x17aa, 0x511f, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
10640         SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
10641         SND_PCI_QUIRK(0x17aa, 0x9e56, "Lenovo ZhaoYang CF4620Z", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
10642         SND_PCI_QUIRK(0x1849, 0x1233, "ASRock NUC Box 1100", ALC233_FIXUP_NO_AUDIO_JACK),
10643         SND_PCI_QUIRK(0x1849, 0xa233, "Positivo Master C6300", ALC269_FIXUP_HEADSET_MIC),
10644         SND_PCI_QUIRK(0x1854, 0x0440, "LG CQ6", ALC256_FIXUP_HEADPHONE_AMP_VOL),
10645         SND_PCI_QUIRK(0x1854, 0x0441, "LG CQ6 AIO", ALC256_FIXUP_HEADPHONE_AMP_VOL),
10646         SND_PCI_QUIRK(0x19e5, 0x3204, "Huawei MACH-WX9", ALC256_FIXUP_HUAWEI_MACH_WX9_PINS),
10647         SND_PCI_QUIRK(0x19e5, 0x320f, "Huawei WRT-WX9 ", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE),
10648         SND_PCI_QUIRK(0x1b35, 0x1235, "CZC B20", ALC269_FIXUP_CZC_B20),
10649         SND_PCI_QUIRK(0x1b35, 0x1236, "CZC TMI", ALC269_FIXUP_CZC_TMI),
10650         SND_PCI_QUIRK(0x1b35, 0x1237, "CZC L101", ALC269_FIXUP_CZC_L101),
10651         SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
10652         SND_PCI_QUIRK(0x1c06, 0x2013, "Lemote A1802", ALC269_FIXUP_LEMOTE_A1802),
10653         SND_PCI_QUIRK(0x1c06, 0x2015, "Lemote A190X", ALC269_FIXUP_LEMOTE_A190X),
10654         SND_PCI_QUIRK(0x1c6c, 0x122a, "Positivo N14AP7", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10655         SND_PCI_QUIRK(0x1c6c, 0x1251, "Positivo N14KP6-TG", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE),
10656         SND_PCI_QUIRK(0x1d05, 0x1132, "TongFang PHxTxX1", ALC256_FIXUP_SET_COEF_DEFAULTS),
10657         SND_PCI_QUIRK(0x1d05, 0x1096, "TongFang GMxMRxx", ALC269_FIXUP_NO_SHUTUP),
10658         SND_PCI_QUIRK(0x1d05, 0x1100, "TongFang GKxNRxx", ALC269_FIXUP_NO_SHUTUP),
10659         SND_PCI_QUIRK(0x1d05, 0x1111, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
10660         SND_PCI_QUIRK(0x1d05, 0x1119, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
10661         SND_PCI_QUIRK(0x1d05, 0x1129, "TongFang GMxZGxx", ALC269_FIXUP_NO_SHUTUP),
10662         SND_PCI_QUIRK(0x1d05, 0x1147, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
10663         SND_PCI_QUIRK(0x1d05, 0x115c, "TongFang GMxTGxx", ALC269_FIXUP_NO_SHUTUP),
10664         SND_PCI_QUIRK(0x1d05, 0x121b, "TongFang GMxAGxx", ALC269_FIXUP_NO_SHUTUP),
10665         SND_PCI_QUIRK(0x1d05, 0x1387, "TongFang GMxIXxx", ALC2XX_FIXUP_HEADSET_MIC),
10666         SND_PCI_QUIRK(0x1d17, 0x3288, "Haier Boyue G42", ALC269VC_FIXUP_ACER_VCOPPERBOX_PINS),
10667         SND_PCI_QUIRK(0x1d72, 0x1602, "RedmiBook", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
10668         SND_PCI_QUIRK(0x1d72, 0x1701, "XiaomiNotebook Pro", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE),
10669         SND_PCI_QUIRK(0x1d72, 0x1901, "RedmiBook 14", ALC256_FIXUP_ASUS_HEADSET_MIC),
10670         SND_PCI_QUIRK(0x1d72, 0x1945, "Redmi G", ALC256_FIXUP_ASUS_HEADSET_MIC),
10671         SND_PCI_QUIRK(0x1d72, 0x1947, "RedmiBook Air", ALC255_FIXUP_XIAOMI_HEADSET_MIC),
10672         SND_PCI_QUIRK(0x2782, 0x0214, "VAIO VJFE-CL", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
10673         SND_PCI_QUIRK(0x2782, 0x0232, "CHUWI CoreBook XPro", ALC269VB_FIXUP_CHUWI_COREBOOK_XPRO),
10674         SND_PCI_QUIRK(0x2782, 0x1707, "Vaio VJFE-ADL", ALC298_FIXUP_SPK_VOLUME),
10675         SND_PCI_QUIRK(0x8086, 0x2074, "Intel NUC 8", ALC233_FIXUP_INTEL_NUC8_DMIC),
10676         SND_PCI_QUIRK(0x8086, 0x2080, "Intel NUC 8 Rugged", ALC256_FIXUP_INTEL_NUC8_RUGGED),
10677         SND_PCI_QUIRK(0x8086, 0x2081, "Intel NUC 10", ALC256_FIXUP_INTEL_NUC10),
10678         SND_PCI_QUIRK(0x8086, 0x3038, "Intel NUC 13", ALC295_FIXUP_CHROME_BOOK),
10679         SND_PCI_QUIRK(0xf111, 0x0001, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
10680         SND_PCI_QUIRK(0xf111, 0x0006, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
10681         SND_PCI_QUIRK(0xf111, 0x0009, "Framework Laptop", ALC295_FIXUP_FRAMEWORK_LAPTOP_MIC_NO_PRESENCE),
10682 
10683 #if 0
10684         /* Below is a quirk table taken from the old code.
10685          * Basically the device should work as is without the fixup table.
10686          * If BIOS doesn't give a proper info, enable the corresponding
10687          * fixup entry.
10688          */
10689         SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
10690                       ALC269_FIXUP_AMIC),
10691         SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
10692         SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),
10693         SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),
10694         SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),
10695         SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC),
10696         SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC),
10697         SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC),
10698         SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC),
10699         SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC),
10700         SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC),
10701         SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC),
10702         SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC),
10703         SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC),
10704         SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC),
10705         SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC),
10706         SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC),
10707         SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC),
10708         SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC),
10709         SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC),
10710         SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC),
10711         SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC),
10712         SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC),
10713         SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC),
10714         SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC),
10715         SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC),
10716         SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC),
10717         SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC),
10718         SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC),
10719         SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC),
10720         SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC),
10721         SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC),
10722         SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC),
10723         SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC),
10724         SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC),
10725         SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC),
10726         SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC),
10727         SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC),
10728         SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC),
10729         SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC),
10730 #endif
10731         {}
10732 };
10733 
10734 static const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = {
10735         SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
10736         SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),
10737         SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
10738         SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI),
10739         SND_PCI_QUIRK_VENDOR(0x19e5, "Huawei Matebook", ALC255_FIXUP_MIC_MUTE_LED),
10740         {}
10741 };
10742 
10743 static const struct hda_model_fixup alc269_fixup_models[] = {
10744         {.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
10745         {.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
10746         {.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},
10747         {.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},
10748         {.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
10749         {.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"},
10750         {.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"},
10751         {.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"},
10752         {.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
10753         {.id = ALC269_FIXUP_LENOVO_DOCK_LIMIT_BOOST, .name = "lenovo-dock-limit-boost"},
10754         {.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
10755         {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"},
10756         {.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
10757         {.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
10758         {.id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE, .name = "dell-headset3"},
10759         {.id = ALC269_FIXUP_DELL4_MIC_NO_PRESENCE, .name = "dell-headset4"},
10760         {.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
10761         {.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},
10762         {.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
10763         {.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
10764         {.id = ALC292_FIXUP_TPT460, .name = "tpt460"},
10765         {.id = ALC298_FIXUP_TPT470_DOCK_FIX, .name = "tpt470-dock-fix"},
10766         {.id = ALC298_FIXUP_TPT470_DOCK, .name = "tpt470-dock"},
10767         {.id = ALC233_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
10768         {.id = ALC700_FIXUP_INTEL_REFERENCE, .name = "alc700-ref"},
10769         {.id = ALC269_FIXUP_SONY_VAIO, .name = "vaio"},
10770         {.id = ALC269_FIXUP_DELL_M101Z, .name = "dell-m101z"},
10771         {.id = ALC269_FIXUP_ASUS_G73JW, .name = "asus-g73jw"},
10772         {.id = ALC269_FIXUP_LENOVO_EAPD, .name = "lenovo-eapd"},
10773         {.id = ALC275_FIXUP_SONY_HWEQ, .name = "sony-hweq"},
10774         {.id = ALC269_FIXUP_PCM_44K, .name = "pcm44k"},
10775         {.id = ALC269_FIXUP_LIFEBOOK, .name = "lifebook"},
10776         {.id = ALC269_FIXUP_LIFEBOOK_EXTMIC, .name = "lifebook-extmic"},
10777         {.id = ALC269_FIXUP_LIFEBOOK_HP_PIN, .name = "lifebook-hp-pin"},
10778         {.id = ALC255_FIXUP_LIFEBOOK_U7x7_HEADSET_MIC, .name = "lifebook-u7x7"},
10779         {.id = ALC269VB_FIXUP_AMIC, .name = "alc269vb-amic"},
10780         {.id = ALC269VB_FIXUP_DMIC, .name = "alc269vb-dmic"},
10781         {.id = ALC269_FIXUP_HP_MUTE_LED_MIC1, .name = "hp-mute-led-mic1"},
10782         {.id = ALC269_FIXUP_HP_MUTE_LED_MIC2, .name = "hp-mute-led-mic2"},
10783         {.id = ALC269_FIXUP_HP_MUTE_LED_MIC3, .name = "hp-mute-led-mic3"},
10784         {.id = ALC269_FIXUP_HP_GPIO_MIC1_LED, .name = "hp-gpio-mic1"},
10785         {.id = ALC269_FIXUP_HP_LINE1_MIC1_LED, .name = "hp-line1-mic1"},
10786         {.id = ALC269_FIXUP_NO_SHUTUP, .name = "noshutup"},
10787         {.id = ALC286_FIXUP_SONY_MIC_NO_PRESENCE, .name = "sony-nomic"},
10788         {.id = ALC269_FIXUP_ASPIRE_HEADSET_MIC, .name = "aspire-headset-mic"},
10789         {.id = ALC269_FIXUP_ASUS_X101, .name = "asus-x101"},
10790         {.id = ALC271_FIXUP_HP_GATE_MIC_JACK, .name = "acer-ao7xx"},
10791         {.id = ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572, .name = "acer-aspire-e1"},
10792         {.id = ALC269_FIXUP_ACER_AC700, .name = "acer-ac700"},
10793         {.id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST, .name = "limit-mic-boost"},
10794         {.id = ALC269VB_FIXUP_ASUS_ZENBOOK, .name = "asus-zenbook"},
10795         {.id = ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A, .name = "asus-zenbook-ux31a"},
10796         {.id = ALC269VB_FIXUP_ORDISSIMO_EVE2, .name = "ordissimo"},
10797         {.id = ALC282_FIXUP_ASUS_TX300, .name = "asus-tx300"},
10798         {.id = ALC283_FIXUP_INT_MIC, .name = "alc283-int-mic"},
10799         {.id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK, .name = "mono-speakers"},
10800         {.id = ALC290_FIXUP_SUBWOOFER_HSJACK, .name = "alc290-subwoofer"},
10801         {.id = ALC269_FIXUP_THINKPAD_ACPI, .name = "thinkpad"},
10802         {.id = ALC269_FIXUP_DMIC_THINKPAD_ACPI, .name = "dmic-thinkpad"},
10803         {.id = ALC255_FIXUP_ACER_MIC_NO_PRESENCE, .name = "alc255-acer"},
10804         {.id = ALC255_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc255-asus"},
10805         {.id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc255-dell1"},
10806         {.id = ALC255_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "alc255-dell2"},
10807         {.id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc293-dell1"},
10808         {.id = ALC283_FIXUP_HEADSET_MIC, .name = "alc283-headset"},
10809         {.id = ALC255_FIXUP_MIC_MUTE_LED, .name = "alc255-dell-mute"},
10810         {.id = ALC282_FIXUP_ASPIRE_V5_PINS, .name = "aspire-v5"},
10811         {.id = ALC269VB_FIXUP_ASPIRE_E1_COEF, .name = "aspire-e1-coef"},
10812         {.id = ALC280_FIXUP_HP_GPIO4, .name = "hp-gpio4"},
10813         {.id = ALC286_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
10814         {.id = ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY, .name = "hp-gpio2-hotkey"},
10815         {.id = ALC280_FIXUP_HP_DOCK_PINS, .name = "hp-dock-pins"},
10816         {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic"},
10817         {.id = ALC280_FIXUP_HP_9480M, .name = "hp-9480m"},
10818         {.id = ALC288_FIXUP_DELL_HEADSET_MODE, .name = "alc288-dell-headset"},
10819         {.id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc288-dell1"},
10820         {.id = ALC288_FIXUP_DELL_XPS_13, .name = "alc288-dell-xps13"},
10821         {.id = ALC292_FIXUP_DELL_E7X, .name = "dell-e7x"},
10822         {.id = ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK, .name = "alc293-dell"},
10823         {.id = ALC298_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc298-dell1"},
10824         {.id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE, .name = "alc298-dell-aio"},
10825         {.id = ALC275_FIXUP_DELL_XPS, .name = "alc275-dell-xps"},
10826         {.id = ALC293_FIXUP_LENOVO_SPK_NOISE, .name = "lenovo-spk-noise"},
10827         {.id = ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY, .name = "lenovo-hotkey"},
10828         {.id = ALC255_FIXUP_DELL_SPK_NOISE, .name = "dell-spk-noise"},
10829         {.id = ALC225_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "alc225-dell1"},
10830         {.id = ALC295_FIXUP_DISABLE_DAC3, .name = "alc295-disable-dac3"},
10831         {.id = ALC285_FIXUP_SPEAKER2_TO_DAC1, .name = "alc285-speaker2-to-dac1"},
10832         {.id = ALC280_FIXUP_HP_HEADSET_MIC, .name = "alc280-hp-headset"},
10833         {.id = ALC221_FIXUP_HP_FRONT_MIC, .name = "alc221-hp-mic"},
10834         {.id = ALC298_FIXUP_SPK_VOLUME, .name = "alc298-spk-volume"},
10835         {.id = ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER, .name = "dell-inspiron-7559"},
10836         {.id = ALC269_FIXUP_ATIV_BOOK_8, .name = "ativ-book"},
10837         {.id = ALC221_FIXUP_HP_MIC_NO_PRESENCE, .name = "alc221-hp-mic"},
10838         {.id = ALC256_FIXUP_ASUS_HEADSET_MODE, .name = "alc256-asus-headset"},
10839         {.id = ALC256_FIXUP_ASUS_MIC, .name = "alc256-asus-mic"},
10840         {.id = ALC256_FIXUP_ASUS_AIO_GPIO2, .name = "alc256-asus-aio"},
10841         {.id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE, .name = "alc233-asus"},
10842         {.id = ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE, .name = "alc233-eapd"},
10843         {.id = ALC294_FIXUP_LENOVO_MIC_LOCATION, .name = "alc294-lenovo-mic"},
10844         {.id = ALC225_FIXUP_DELL_WYSE_MIC_NO_PRESENCE, .name = "alc225-wyse"},
10845         {.id = ALC274_FIXUP_DELL_AIO_LINEOUT_VERB, .name = "alc274-dell-aio"},
10846         {.id = ALC255_FIXUP_DUMMY_LINEOUT_VERB, .name = "alc255-dummy-lineout"},
10847         {.id = ALC255_FIXUP_DELL_HEADSET_MIC, .name = "alc255-dell-headset"},
10848         {.id = ALC295_FIXUP_HP_X360, .name = "alc295-hp-x360"},
10849         {.id = ALC225_FIXUP_HEADSET_JACK, .name = "alc-headset-jack"},
10850         {.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-chrome-book"},
10851         {.id = ALC256_FIXUP_CHROME_BOOK, .name = "alc-2024y-chromebook"},
10852         {.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"},
10853         {.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"},
10854         {.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"},
10855         {.id = ALC298_FIXUP_SAMSUNG_AMP, .name = "alc298-samsung-amp"},
10856         {.id = ALC298_FIXUP_SAMSUNG_AMP2, .name = "alc298-samsung-amp2"},
10857         {.id = ALC256_FIXUP_SAMSUNG_HEADPHONE_VERY_QUIET, .name = "alc256-samsung-headphone"},
10858         {.id = ALC255_FIXUP_XIAOMI_HEADSET_MIC, .name = "alc255-xiaomi-headset"},
10859         {.id = ALC274_FIXUP_HP_MIC, .name = "alc274-hp-mic-detect"},
10860         {.id = ALC245_FIXUP_HP_X360_AMP, .name = "alc245-hp-x360-amp"},
10861         {.id = ALC295_FIXUP_HP_OMEN, .name = "alc295-hp-omen"},
10862         {.id = ALC285_FIXUP_HP_SPECTRE_X360, .name = "alc285-hp-spectre-x360"},
10863         {.id = ALC285_FIXUP_HP_SPECTRE_X360_EB1, .name = "alc285-hp-spectre-x360-eb1"},
10864         {.id = ALC285_FIXUP_HP_ENVY_X360, .name = "alc285-hp-envy-x360"},
10865         {.id = ALC287_FIXUP_IDEAPAD_BASS_SPK_AMP, .name = "alc287-ideapad-bass-spk-amp"},
10866         {.id = ALC287_FIXUP_YOGA9_14IAP7_BASS_SPK_PIN, .name = "alc287-yoga9-bass-spk-pin"},
10867         {.id = ALC623_FIXUP_LENOVO_THINKSTATION_P340, .name = "alc623-lenovo-thinkstation-p340"},
10868         {.id = ALC255_FIXUP_ACER_HEADPHONE_AND_MIC, .name = "alc255-acer-headphone-and-mic"},
10869         {.id = ALC285_FIXUP_HP_GPIO_AMP_INIT, .name = "alc285-hp-amp-init"},
10870         {}
10871 };
10872 #define ALC225_STANDARD_PINS \
10873         {0x21, 0x04211020}
10874 
10875 #define ALC256_STANDARD_PINS \
10876         {0x12, 0x90a60140}, \
10877         {0x14, 0x90170110}, \
10878         {0x21, 0x02211020}
10879 
10880 #define ALC282_STANDARD_PINS \
10881         {0x14, 0x90170110}
10882 
10883 #define ALC290_STANDARD_PINS \
10884         {0x12, 0x99a30130}
10885 
10886 #define ALC292_STANDARD_PINS \
10887         {0x14, 0x90170110}, \
10888         {0x15, 0x0221401f}
10889 
10890 #define ALC295_STANDARD_PINS \
10891         {0x12, 0xb7a60130}, \
10892         {0x14, 0x90170110}, \
10893         {0x21, 0x04211020}
10894 
10895 #define ALC298_STANDARD_PINS \
10896         {0x12, 0x90a60130}, \
10897         {0x21, 0x03211020}
10898 
10899 static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
10900         SND_HDA_PIN_QUIRK(0x10ec0221, 0x103c, "HP Workstation", ALC221_FIXUP_HP_HEADSET_MIC,
10901                 {0x14, 0x01014020},
10902                 {0x17, 0x90170110},
10903                 {0x18, 0x02a11030},
10904                 {0x19, 0x0181303F},
10905                 {0x21, 0x0221102f}),
10906         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
10907                 {0x12, 0x90a601c0},
10908                 {0x14, 0x90171120},
10909                 {0x21, 0x02211030}),
10910         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
10911                 {0x14, 0x90170110},
10912                 {0x1b, 0x90a70130},
10913                 {0x21, 0x03211020}),
10914         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
10915                 {0x1a, 0x90a70130},
10916                 {0x1b, 0x90170110},
10917                 {0x21, 0x03211020}),
10918         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10919                 ALC225_STANDARD_PINS,
10920                 {0x12, 0xb7a60130},
10921                 {0x14, 0x901701a0}),
10922         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10923                 ALC225_STANDARD_PINS,
10924                 {0x12, 0xb7a60130},
10925                 {0x14, 0x901701b0}),
10926         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10927                 ALC225_STANDARD_PINS,
10928                 {0x12, 0xb7a60150},
10929                 {0x14, 0x901701a0}),
10930         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10931                 ALC225_STANDARD_PINS,
10932                 {0x12, 0xb7a60150},
10933                 {0x14, 0x901701b0}),
10934         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
10935                 ALC225_STANDARD_PINS,
10936                 {0x12, 0xb7a60130},
10937                 {0x1b, 0x90170110}),
10938         SND_HDA_PIN_QUIRK(0x10ec0233, 0x8086, "Intel NUC Skull Canyon", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
10939                 {0x1b, 0x01111010},
10940                 {0x1e, 0x01451130},
10941                 {0x21, 0x02211020}),
10942         SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
10943                 {0x12, 0x90a60140},
10944                 {0x14, 0x90170110},
10945                 {0x19, 0x02a11030},
10946                 {0x21, 0x02211020}),
10947         SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
10948                 {0x14, 0x90170110},
10949                 {0x19, 0x02a11030},
10950                 {0x1a, 0x02a11040},
10951                 {0x1b, 0x01014020},
10952                 {0x21, 0x0221101f}),
10953         SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
10954                 {0x14, 0x90170110},
10955                 {0x19, 0x02a11030},
10956                 {0x1a, 0x02a11040},
10957                 {0x1b, 0x01011020},
10958                 {0x21, 0x0221101f}),
10959         SND_HDA_PIN_QUIRK(0x10ec0235, 0x17aa, "Lenovo", ALC294_FIXUP_LENOVO_MIC_LOCATION,
10960                 {0x14, 0x90170110},
10961                 {0x19, 0x02a11020},
10962                 {0x1a, 0x02a11030},
10963                 {0x21, 0x0221101f}),
10964         SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC236_FIXUP_DELL_AIO_HEADSET_MIC,
10965                 {0x21, 0x02211010}),
10966         SND_HDA_PIN_QUIRK(0x10ec0236, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
10967                 {0x14, 0x90170110},
10968                 {0x19, 0x02a11020},
10969                 {0x21, 0x02211030}),
10970         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
10971                 {0x14, 0x90170110},
10972                 {0x21, 0x02211020}),
10973         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10974                 {0x14, 0x90170130},
10975                 {0x21, 0x02211040}),
10976         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10977                 {0x12, 0x90a60140},
10978                 {0x14, 0x90170110},
10979                 {0x21, 0x02211020}),
10980         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10981                 {0x12, 0x90a60160},
10982                 {0x14, 0x90170120},
10983                 {0x21, 0x02211030}),
10984         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10985                 {0x14, 0x90170110},
10986                 {0x1b, 0x02011020},
10987                 {0x21, 0x0221101f}),
10988         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10989                 {0x14, 0x90170110},
10990                 {0x1b, 0x01011020},
10991                 {0x21, 0x0221101f}),
10992         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10993                 {0x14, 0x90170130},
10994                 {0x1b, 0x01014020},
10995                 {0x21, 0x0221103f}),
10996         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
10997                 {0x14, 0x90170130},
10998                 {0x1b, 0x01011020},
10999                 {0x21, 0x0221103f}),
11000         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
11001                 {0x14, 0x90170130},
11002                 {0x1b, 0x02011020},
11003                 {0x21, 0x0221103f}),
11004         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
11005                 {0x14, 0x90170150},
11006                 {0x1b, 0x02011020},
11007                 {0x21, 0x0221105f}),
11008         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
11009                 {0x14, 0x90170110},
11010                 {0x1b, 0x01014020},
11011                 {0x21, 0x0221101f}),
11012         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
11013                 {0x12, 0x90a60160},
11014                 {0x14, 0x90170120},
11015                 {0x17, 0x90170140},
11016                 {0x21, 0x0321102f}),
11017         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
11018                 {0x12, 0x90a60160},
11019                 {0x14, 0x90170130},
11020                 {0x21, 0x02211040}),
11021         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
11022                 {0x12, 0x90a60160},
11023                 {0x14, 0x90170140},
11024                 {0x21, 0x02211050}),
11025         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
11026                 {0x12, 0x90a60170},
11027                 {0x14, 0x90170120},
11028                 {0x21, 0x02211030}),
11029         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
11030                 {0x12, 0x90a60170},
11031                 {0x14, 0x90170130},
11032                 {0x21, 0x02211040}),
11033         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
11034                 {0x12, 0x90a60170},
11035                 {0x14, 0x90171130},
11036                 {0x21, 0x02211040}),
11037         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
11038                 {0x12, 0x90a60170},
11039                 {0x14, 0x90170140},
11040                 {0x21, 0x02211050}),
11041         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
11042                 {0x12, 0x90a60180},
11043                 {0x14, 0x90170130},
11044                 {0x21, 0x02211040}),
11045         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5565", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
11046                 {0x12, 0x90a60180},
11047                 {0x14, 0x90170120},
11048                 {0x21, 0x02211030}),
11049         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
11050                 {0x1b, 0x01011020},
11051                 {0x21, 0x02211010}),
11052         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
11053                 {0x14, 0x90170110},
11054                 {0x1b, 0x90a70130},
11055                 {0x21, 0x04211020}),
11056         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
11057                 {0x14, 0x90170110},
11058                 {0x1b, 0x90a70130},
11059                 {0x21, 0x03211020}),
11060         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
11061                 {0x12, 0x90a60130},
11062                 {0x14, 0x90170110},
11063                 {0x21, 0x03211020}),
11064         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
11065                 {0x12, 0x90a60130},
11066                 {0x14, 0x90170110},
11067                 {0x21, 0x04211020}),
11068         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC_NO_PRESENCE,
11069                 {0x1a, 0x90a70130},
11070                 {0x1b, 0x90170110},
11071                 {0x21, 0x03211020}),
11072        SND_HDA_PIN_QUIRK(0x10ec0256, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
11073                 {0x14, 0x90170110},
11074                 {0x19, 0x02a11020},
11075                 {0x21, 0x0221101f}),
11076        SND_HDA_PIN_QUIRK(0x10ec0274, 0x103c, "HP", ALC274_FIXUP_HP_HEADSET_MIC,
11077                 {0x17, 0x90170110},
11078                 {0x19, 0x03a11030},
11079                 {0x21, 0x03211020}),
11080         SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
11081                 {0x12, 0x90a60130},
11082                 {0x14, 0x90170110},
11083                 {0x15, 0x0421101f},
11084                 {0x1a, 0x04a11020}),
11085         SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED,
11086                 {0x12, 0x90a60140},
11087                 {0x14, 0x90170110},
11088                 {0x15, 0x0421101f},
11089                 {0x18, 0x02811030},
11090                 {0x1a, 0x04a1103f},
11091                 {0x1b, 0x02011020}),
11092         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1,
11093                 ALC282_STANDARD_PINS,
11094                 {0x12, 0x99a30130},
11095                 {0x19, 0x03a11020},
11096                 {0x21, 0x0321101f}),
11097         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
11098                 ALC282_STANDARD_PINS,
11099                 {0x12, 0x99a30130},
11100                 {0x19, 0x03a11020},
11101                 {0x21, 0x03211040}),
11102         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
11103                 ALC282_STANDARD_PINS,
11104                 {0x12, 0x99a30130},
11105                 {0x19, 0x03a11030},
11106                 {0x21, 0x03211020}),
11107         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
11108                 ALC282_STANDARD_PINS,
11109                 {0x12, 0x99a30130},
11110                 {0x19, 0x04a11020},
11111                 {0x21, 0x0421101f}),
11112         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED,
11113                 ALC282_STANDARD_PINS,
11114                 {0x12, 0x90a60140},
11115                 {0x19, 0x04a11030},
11116                 {0x21, 0x04211020}),
11117         SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
11118                 ALC282_STANDARD_PINS,
11119                 {0x12, 0x90a609c0},
11120                 {0x18, 0x03a11830},
11121                 {0x19, 0x04a19831},
11122                 {0x1a, 0x0481303f},
11123                 {0x1b, 0x04211020},
11124                 {0x21, 0x0321101f}),
11125         SND_HDA_PIN_QUIRK(0x10ec0282, 0x1025, "Acer", ALC282_FIXUP_ACER_DISABLE_LINEOUT,
11126                 ALC282_STANDARD_PINS,
11127                 {0x12, 0x90a60940},
11128                 {0x18, 0x03a11830},
11129                 {0x19, 0x04a19831},
11130                 {0x1a, 0x0481303f},
11131                 {0x1b, 0x04211020},
11132                 {0x21, 0x0321101f}),
11133         SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
11134                 ALC282_STANDARD_PINS,
11135                 {0x12, 0x90a60130},
11136                 {0x21, 0x0321101f}),
11137         SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
11138                 {0x12, 0x90a60160},
11139                 {0x14, 0x90170120},
11140                 {0x21, 0x02211030}),
11141         SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
11142                 ALC282_STANDARD_PINS,
11143                 {0x12, 0x90a60130},
11144                 {0x19, 0x03a11020},
11145                 {0x21, 0x0321101f}),
11146         SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
11147                 {0x12, 0x90a60130},
11148                 {0x14, 0x90170110},
11149                 {0x19, 0x04a11040},
11150                 {0x21, 0x04211020}),
11151         SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_LENOVO_PC_BEEP_IN_NOISE,
11152                 {0x14, 0x90170110},
11153                 {0x19, 0x04a11040},
11154                 {0x1d, 0x40600001},
11155                 {0x21, 0x04211020}),
11156         SND_HDA_PIN_QUIRK(0x10ec0285, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
11157                 {0x14, 0x90170110},
11158                 {0x19, 0x04a11040},
11159                 {0x21, 0x04211020}),
11160         SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC285_FIXUP_THINKPAD_HEADSET_JACK,
11161                 {0x14, 0x90170110},
11162                 {0x17, 0x90170111},
11163                 {0x19, 0x03a11030},
11164                 {0x21, 0x03211020}),
11165         SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC287_FIXUP_THINKPAD_I2S_SPK,
11166                 {0x17, 0x90170110},
11167                 {0x19, 0x03a11030},
11168                 {0x21, 0x03211020}),
11169         SND_HDA_PIN_QUIRK(0x10ec0287, 0x17aa, "Lenovo", ALC287_FIXUP_THINKPAD_I2S_SPK,
11170                 {0x17, 0x90170110}, /* 0x231f with RTK I2S AMP */
11171                 {0x19, 0x04a11040},
11172                 {0x21, 0x04211020}),
11173         SND_HDA_PIN_QUIRK(0x10ec0286, 0x1025, "Acer", ALC286_FIXUP_ACER_AIO_MIC_NO_PRESENCE,
11174                 {0x12, 0x90a60130},
11175                 {0x17, 0x90170110},
11176                 {0x21, 0x02211020}),
11177         SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
11178                 {0x12, 0x90a60120},
11179                 {0x14, 0x90170110},
11180                 {0x21, 0x0321101f}),
11181         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
11182                 ALC290_STANDARD_PINS,
11183                 {0x15, 0x04211040},
11184                 {0x18, 0x90170112},
11185                 {0x1a, 0x04a11020}),
11186         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
11187                 ALC290_STANDARD_PINS,
11188                 {0x15, 0x04211040},
11189                 {0x18, 0x90170110},
11190                 {0x1a, 0x04a11020}),
11191         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
11192                 ALC290_STANDARD_PINS,
11193                 {0x15, 0x0421101f},
11194                 {0x1a, 0x04a11020}),
11195         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
11196                 ALC290_STANDARD_PINS,
11197                 {0x15, 0x04211020},
11198                 {0x1a, 0x04a11040}),
11199         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
11200                 ALC290_STANDARD_PINS,
11201                 {0x14, 0x90170110},
11202                 {0x15, 0x04211020},
11203                 {0x1a, 0x04a11040}),
11204         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
11205                 ALC290_STANDARD_PINS,
11206                 {0x14, 0x90170110},
11207                 {0x15, 0x04211020},
11208                 {0x1a, 0x04a11020}),
11209         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
11210                 ALC290_STANDARD_PINS,
11211                 {0x14, 0x90170110},
11212                 {0x15, 0x0421101f},
11213                 {0x1a, 0x04a11020}),
11214         SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
11215                 ALC292_STANDARD_PINS,
11216                 {0x12, 0x90a60140},
11217                 {0x16, 0x01014020},
11218                 {0x19, 0x01a19030}),
11219         SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
11220                 ALC292_STANDARD_PINS,
11221                 {0x12, 0x90a60140},
11222                 {0x16, 0x01014020},
11223                 {0x18, 0x02a19031},
11224                 {0x19, 0x01a1903e}),
11225         SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
11226                 ALC292_STANDARD_PINS,
11227                 {0x12, 0x90a60140}),
11228         SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
11229                 ALC292_STANDARD_PINS,
11230                 {0x13, 0x90a60140},
11231                 {0x16, 0x21014020},
11232                 {0x19, 0x21a19030}),
11233         SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
11234                 ALC292_STANDARD_PINS,
11235                 {0x13, 0x90a60140}),
11236         SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_HPE,
11237                 {0x17, 0x90170110},
11238                 {0x21, 0x04211020}),
11239         SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_MIC,
11240                 {0x14, 0x90170110},
11241                 {0x1b, 0x90a70130},
11242                 {0x21, 0x04211020}),
11243         SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
11244                 {0x12, 0x90a60130},
11245                 {0x17, 0x90170110},
11246                 {0x21, 0x03211020}),
11247         SND_HDA_PIN_QUIRK(0x10ec0294, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
11248                 {0x12, 0x90a60130},
11249                 {0x17, 0x90170110},
11250                 {0x21, 0x04211020}),
11251         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC294_FIXUP_ASUS_SPK,
11252                 {0x12, 0x90a60130},
11253                 {0x17, 0x90170110},
11254                 {0x21, 0x03211020}),
11255         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
11256                 {0x12, 0x90a60120},
11257                 {0x17, 0x90170110},
11258                 {0x21, 0x04211030}),
11259         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
11260                 {0x12, 0x90a60130},
11261                 {0x17, 0x90170110},
11262                 {0x21, 0x03211020}),
11263         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1043, "ASUS", ALC295_FIXUP_ASUS_MIC_NO_PRESENCE,
11264                 {0x12, 0x90a60130},
11265                 {0x17, 0x90170110},
11266                 {0x21, 0x03211020}),
11267         SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
11268                 ALC298_STANDARD_PINS,
11269                 {0x17, 0x90170110}),
11270         SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
11271                 ALC298_STANDARD_PINS,
11272                 {0x17, 0x90170140}),
11273         SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
11274                 ALC298_STANDARD_PINS,
11275                 {0x17, 0x90170150}),
11276         SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_SPK_VOLUME,
11277                 {0x12, 0xb7a60140},
11278                 {0x13, 0xb7a60150},
11279                 {0x17, 0x90170110},
11280                 {0x1a, 0x03011020},
11281                 {0x21, 0x03211030}),
11282         SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_ALIENWARE_MIC_NO_PRESENCE,
11283                 {0x12, 0xb7a60140},
11284                 {0x17, 0x90170110},
11285                 {0x1a, 0x03a11030},
11286                 {0x21, 0x03211020}),
11287         SND_HDA_PIN_QUIRK(0x10ec0299, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
11288                 ALC225_STANDARD_PINS,
11289                 {0x12, 0xb7a60130},
11290                 {0x17, 0x90170110}),
11291         SND_HDA_PIN_QUIRK(0x10ec0623, 0x17aa, "Lenovo", ALC283_FIXUP_HEADSET_MIC,
11292                 {0x14, 0x01014010},
11293                 {0x17, 0x90170120},
11294                 {0x18, 0x02a11030},
11295                 {0x19, 0x02a1103f},
11296                 {0x21, 0x0221101f}),
11297         {}
11298 };
11299 
11300 /* This is the fallback pin_fixup_tbl for alc269 family, to make the tbl match
11301  * more machines, don't need to match all valid pins, just need to match
11302  * all the pins defined in the tbl. Just because of this reason, it is possible
11303  * that a single machine matches multiple tbls, so there is one limitation:
11304  *   at most one tbl is allowed to define for the same vendor and same codec
11305  */
11306 static const struct snd_hda_pin_quirk alc269_fallback_pin_fixup_tbl[] = {
11307         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1025, "Acer", ALC2XX_FIXUP_HEADSET_MIC,
11308                 {0x19, 0x40000000}),
11309         SND_HDA_PIN_QUIRK(0x10ec0289, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
11310                 {0x19, 0x40000000},
11311                 {0x1b, 0x40000000}),
11312         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL4_MIC_NO_PRESENCE,
11313                 {0x19, 0x40000000},
11314                 {0x1b, 0x40000000}),
11315         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
11316                 {0x19, 0x40000000},
11317                 {0x1a, 0x40000000}),
11318         SND_HDA_PIN_QUIRK(0x10ec0236, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
11319                 {0x19, 0x40000000},
11320                 {0x1a, 0x40000000}),
11321         SND_HDA_PIN_QUIRK(0x10ec0274, 0x1028, "Dell", ALC274_FIXUP_DELL_AIO_LINEOUT_VERB,
11322                 {0x19, 0x40000000},
11323                 {0x1a, 0x40000000}),
11324         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC2XX_FIXUP_HEADSET_MIC,
11325                 {0x19, 0x40000000}),
11326         {}
11327 };
11328 
11329 static void alc269_fill_coef(struct hda_codec *codec)
11330 {
11331         struct alc_spec *spec = codec->spec;
11332         int val;
11333 
11334         if (spec->codec_variant != ALC269_TYPE_ALC269VB)
11335                 return;
11336 
11337         if ((alc_get_coef0(codec) & 0x00ff) < 0x015) {
11338                 alc_write_coef_idx(codec, 0xf, 0x960b);
11339                 alc_write_coef_idx(codec, 0xe, 0x8817);
11340         }
11341 
11342         if ((alc_get_coef0(codec) & 0x00ff) == 0x016) {
11343                 alc_write_coef_idx(codec, 0xf, 0x960b);
11344                 alc_write_coef_idx(codec, 0xe, 0x8814);
11345         }
11346 
11347         if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
11348                 /* Power up output pin */
11349                 alc_update_coef_idx(codec, 0x04, 0, 1<<11);
11350         }
11351 
11352         if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
11353                 val = alc_read_coef_idx(codec, 0xd);
11354                 if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {
11355                         /* Capless ramp up clock control */
11356                         alc_write_coef_idx(codec, 0xd, val | (1<<10));
11357                 }
11358                 val = alc_read_coef_idx(codec, 0x17);
11359                 if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {
11360                         /* Class D power on reset */
11361                         alc_write_coef_idx(codec, 0x17, val | (1<<7));
11362                 }
11363         }
11364 
11365         /* HP */
11366         alc_update_coef_idx(codec, 0x4, 0, 1<<11);
11367 }
11368 
11369 /*
11370  */
11371 static int patch_alc269(struct hda_codec *codec)
11372 {
11373         struct alc_spec *spec;
11374         int err;
11375 
11376         err = alc_alloc_spec(codec, 0x0b);
11377         if (err < 0)
11378                 return err;
11379 
11380         spec = codec->spec;
11381         spec->gen.shared_mic_vref_pin = 0x18;
11382         codec->power_save_node = 0;
11383         spec->en_3kpull_low = true;
11384 
11385         codec->patch_ops.suspend = alc269_suspend;
11386         codec->patch_ops.resume = alc269_resume;
11387         spec->shutup = alc_default_shutup;
11388         spec->init_hook = alc_default_init;
11389 
11390         switch (codec->core.vendor_id) {
11391         case 0x10ec0269:
11392                 spec->codec_variant = ALC269_TYPE_ALC269VA;
11393                 switch (alc_get_coef0(codec) & 0x00f0) {
11394                 case 0x0010:
11395                         if (codec->bus->pci &&
11396                             codec->bus->pci->subsystem_vendor == 0x1025 &&
11397                             spec->cdefine.platform_type == 1)
11398                                 err = alc_codec_rename(codec, "ALC271X");
11399                         spec->codec_variant = ALC269_TYPE_ALC269VB;
11400                         break;
11401                 case 0x0020:
11402                         if (codec->bus->pci &&
11403                             codec->bus->pci->subsystem_vendor == 0x17aa &&
11404                             codec->bus->pci->subsystem_device == 0x21f3)
11405                                 err = alc_codec_rename(codec, "ALC3202");
11406                         spec->codec_variant = ALC269_TYPE_ALC269VC;
11407                         break;
11408                 case 0x0030:
11409                         spec->codec_variant = ALC269_TYPE_ALC269VD;
11410                         break;
11411                 default:
11412                         alc_fix_pll_init(codec, 0x20, 0x04, 15);
11413                 }
11414                 if (err < 0)
11415                         goto error;
11416                 spec->shutup = alc269_shutup;
11417                 spec->init_hook = alc269_fill_coef;
11418                 alc269_fill_coef(codec);
11419                 break;
11420 
11421         case 0x10ec0280:
11422         case 0x10ec0290:
11423                 spec->codec_variant = ALC269_TYPE_ALC280;
11424                 break;
11425         case 0x10ec0282:
11426                 spec->codec_variant = ALC269_TYPE_ALC282;
11427                 spec->shutup = alc282_shutup;
11428                 spec->init_hook = alc282_init;
11429                 break;
11430         case 0x10ec0233:
11431         case 0x10ec0283:
11432                 spec->codec_variant = ALC269_TYPE_ALC283;
11433                 spec->shutup = alc283_shutup;
11434                 spec->init_hook = alc283_init;
11435                 break;
11436         case 0x10ec0284:
11437         case 0x10ec0292:
11438                 spec->codec_variant = ALC269_TYPE_ALC284;
11439                 break;
11440         case 0x10ec0293:
11441                 spec->codec_variant = ALC269_TYPE_ALC293;
11442                 break;
11443         case 0x10ec0286:
11444         case 0x10ec0288:
11445                 spec->codec_variant = ALC269_TYPE_ALC286;
11446                 break;
11447         case 0x10ec0298:
11448                 spec->codec_variant = ALC269_TYPE_ALC298;
11449                 break;
11450         case 0x10ec0235:
11451         case 0x10ec0255:
11452                 spec->codec_variant = ALC269_TYPE_ALC255;
11453                 spec->shutup = alc256_shutup;
11454                 spec->init_hook = alc256_init;
11455                 break;
11456         case 0x10ec0230:
11457         case 0x10ec0236:
11458         case 0x10ec0256:
11459         case 0x19e58326:
11460                 spec->codec_variant = ALC269_TYPE_ALC256;
11461                 spec->shutup = alc256_shutup;
11462                 spec->init_hook = alc256_init;
11463                 spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */
11464                 if (codec->core.vendor_id == 0x10ec0236 &&
11465                     codec->bus->pci->vendor != PCI_VENDOR_ID_AMD)
11466                         spec->en_3kpull_low = false;
11467                 break;
11468         case 0x10ec0257:
11469                 spec->codec_variant = ALC269_TYPE_ALC257;
11470                 spec->shutup = alc256_shutup;
11471                 spec->init_hook = alc256_init;
11472                 spec->gen.mixer_nid = 0;
11473                 spec->en_3kpull_low = false;
11474                 break;
11475         case 0x10ec0215:
11476         case 0x10ec0245:
11477         case 0x10ec0285:
11478         case 0x10ec0289:
11479                 if (alc_get_coef0(codec) & 0x0010)
11480                         spec->codec_variant = ALC269_TYPE_ALC245;
11481                 else
11482                         spec->codec_variant = ALC269_TYPE_ALC215;
11483                 spec->shutup = alc225_shutup;
11484                 spec->init_hook = alc225_init;
11485                 spec->gen.mixer_nid = 0;
11486                 break;
11487         case 0x10ec0225:
11488         case 0x10ec0295:
11489         case 0x10ec0299:
11490                 spec->codec_variant = ALC269_TYPE_ALC225;
11491                 spec->shutup = alc225_shutup;
11492                 spec->init_hook = alc225_init;
11493                 spec->gen.mixer_nid = 0; /* no loopback on ALC225, ALC295 and ALC299 */
11494                 break;
11495         case 0x10ec0287:
11496                 spec->codec_variant = ALC269_TYPE_ALC287;
11497                 spec->shutup = alc225_shutup;
11498                 spec->init_hook = alc225_init;
11499                 spec->gen.mixer_nid = 0; /* no loopback on ALC287 */
11500                 break;
11501         case 0x10ec0234:
11502         case 0x10ec0274:
11503         case 0x10ec0294:
11504                 spec->codec_variant = ALC269_TYPE_ALC294;
11505                 spec->gen.mixer_nid = 0; /* ALC2x4 does not have any loopback mixer path */
11506                 alc_update_coef_idx(codec, 0x6b, 0x0018, (1<<4) | (1<<3)); /* UAJ MIC Vref control by verb */
11507                 spec->init_hook = alc294_init;
11508                 break;
11509         case 0x10ec0300:
11510                 spec->codec_variant = ALC269_TYPE_ALC300;
11511                 spec->gen.mixer_nid = 0; /* no loopback on ALC300 */
11512                 break;
11513         case 0x10ec0623:
11514                 spec->codec_variant = ALC269_TYPE_ALC623;
11515                 break;
11516         case 0x10ec0700:
11517         case 0x10ec0701:
11518         case 0x10ec0703:
11519         case 0x10ec0711:
11520                 spec->codec_variant = ALC269_TYPE_ALC700;
11521                 spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */
11522                 alc_update_coef_idx(codec, 0x4a, 1 << 15, 0); /* Combo jack auto trigger control */
11523                 spec->init_hook = alc294_init;
11524                 break;
11525 
11526         }
11527 
11528         if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {
11529                 spec->has_alc5505_dsp = 1;
11530                 spec->init_hook = alc5505_dsp_init;
11531         }
11532 
11533         alc_pre_init(codec);
11534 
11535         snd_hda_pick_fixup(codec, alc269_fixup_models,
11536                        alc269_fixup_tbl, alc269_fixups);
11537         /* FIXME: both TX300 and ROG Strix G17 have the same SSID, and
11538          * the quirk breaks the latter (bko#214101).
11539          * Clear the wrong entry.
11540          */
11541         if (codec->fixup_id == ALC282_FIXUP_ASUS_TX300 &&
11542             codec->core.vendor_id == 0x10ec0294) {
11543                 codec_dbg(codec, "Clear wrong fixup for ASUS ROG Strix G17\n");
11544                 codec->fixup_id = HDA_FIXUP_ID_NOT_SET;
11545         }
11546 
11547         snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups, true);
11548         snd_hda_pick_pin_fixup(codec, alc269_fallback_pin_fixup_tbl, alc269_fixups, false);
11549         snd_hda_pick_fixup(codec, NULL, alc269_fixup_vendor_tbl,
11550                            alc269_fixups);
11551         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
11552 
11553         alc_auto_parse_customize_define(codec);
11554 
11555         if (has_cdefine_beep(codec))
11556                 spec->gen.beep_nid = 0x01;
11557 
11558         /* automatic parse from the BIOS config */
11559         err = alc269_parse_auto_config(codec);
11560         if (err < 0)
11561                 goto error;
11562 
11563         if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid) {
11564                 err = set_beep_amp(spec, spec->gen.mixer_nid, 0x04, HDA_INPUT);
11565                 if (err < 0)
11566                         goto error;
11567         }
11568 
11569         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
11570 
11571         return 0;
11572 
11573  error:
11574         alc_free(codec);
11575         return err;
11576 }
11577 
11578 /*
11579  * ALC861
11580  */
11581 
11582 static int alc861_parse_auto_config(struct hda_codec *codec)
11583 {
11584         static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
11585         static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 };
11586         return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids);
11587 }
11588 
11589 /* Pin config fixes */
11590 enum {
11591         ALC861_FIXUP_FSC_AMILO_PI1505,
11592         ALC861_FIXUP_AMP_VREF_0F,
11593         ALC861_FIXUP_NO_JACK_DETECT,
11594         ALC861_FIXUP_ASUS_A6RP,
11595         ALC660_FIXUP_ASUS_W7J,
11596 };
11597 
11598 /* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */
11599 static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,
11600                         const struct hda_fixup *fix, int action)
11601 {
11602         struct alc_spec *spec = codec->spec;
11603         unsigned int val;
11604 
11605         if (action != HDA_FIXUP_ACT_INIT)
11606                 return;
11607         val = snd_hda_codec_get_pin_target(codec, 0x0f);
11608         if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)))
11609                 val |= AC_PINCTL_IN_EN;
11610         val |= AC_PINCTL_VREF_50;
11611         snd_hda_set_pin_ctl(codec, 0x0f, val);
11612         spec->gen.keep_vref_in_automute = 1;
11613 }
11614 
11615 /* suppress the jack-detection */
11616 static void alc_fixup_no_jack_detect(struct hda_codec *codec,
11617                                      const struct hda_fixup *fix, int action)
11618 {
11619         if (action == HDA_FIXUP_ACT_PRE_PROBE)
11620                 codec->no_jack_detect = 1;
11621 }
11622 
11623 static const struct hda_fixup alc861_fixups[] = {
11624         [ALC861_FIXUP_FSC_AMILO_PI1505] = {
11625                 .type = HDA_FIXUP_PINS,
11626                 .v.pins = (const struct hda_pintbl[]) {
11627                         { 0x0b, 0x0221101f }, /* HP */
11628                         { 0x0f, 0x90170310 }, /* speaker */
11629                         { }
11630                 }
11631         },
11632         [ALC861_FIXUP_AMP_VREF_0F] = {
11633                 .type = HDA_FIXUP_FUNC,
11634                 .v.func = alc861_fixup_asus_amp_vref_0f,
11635         },
11636         [ALC861_FIXUP_NO_JACK_DETECT] = {
11637                 .type = HDA_FIXUP_FUNC,
11638                 .v.func = alc_fixup_no_jack_detect,
11639         },
11640         [ALC861_FIXUP_ASUS_A6RP] = {
11641                 .type = HDA_FIXUP_FUNC,
11642                 .v.func = alc861_fixup_asus_amp_vref_0f,
11643                 .chained = true,
11644                 .chain_id = ALC861_FIXUP_NO_JACK_DETECT,
11645         },
11646         [ALC660_FIXUP_ASUS_W7J] = {
11647                 .type = HDA_FIXUP_VERBS,
11648                 .v.verbs = (const struct hda_verb[]) {
11649                         /* ASUS W7J needs a magic pin setup on unused NID 0x10
11650                          * for enabling outputs
11651                          */
11652                         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
11653                         { }
11654                 },
11655         }
11656 };
11657 
11658 static const struct snd_pci_quirk alc861_fixup_tbl[] = {
11659         SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J),
11660         SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J),
11661         SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),
11662         SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),
11663         SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),
11664         SND_PCI_QUIRK_VENDOR(0x1584, "Haier/Uniwill", ALC861_FIXUP_AMP_VREF_0F),
11665         SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505),
11666         {}
11667 };
11668 
11669 /*
11670  */
11671 static int patch_alc861(struct hda_codec *codec)
11672 {
11673         struct alc_spec *spec;
11674         int err;
11675 
11676         err = alc_alloc_spec(codec, 0x15);
11677         if (err < 0)
11678                 return err;
11679 
11680         spec = codec->spec;
11681         if (has_cdefine_beep(codec))
11682                 spec->gen.beep_nid = 0x23;
11683 
11684         spec->power_hook = alc_power_eapd;
11685 
11686         alc_pre_init(codec);
11687 
11688         snd_hda_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
11689         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
11690 
11691         /* automatic parse from the BIOS config */
11692         err = alc861_parse_auto_config(codec);
11693         if (err < 0)
11694                 goto error;
11695 
11696         if (!spec->gen.no_analog) {
11697                 err = set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
11698                 if (err < 0)
11699                         goto error;
11700         }
11701 
11702         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
11703 
11704         return 0;
11705 
11706  error:
11707         alc_free(codec);
11708         return err;
11709 }
11710 
11711 /*
11712  * ALC861-VD support
11713  *
11714  * Based on ALC882
11715  *
11716  * In addition, an independent DAC
11717  */
11718 static int alc861vd_parse_auto_config(struct hda_codec *codec)
11719 {
11720         static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
11721         static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 };
11722         return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids);
11723 }
11724 
11725 enum {
11726         ALC660VD_FIX_ASUS_GPIO1,
11727         ALC861VD_FIX_DALLAS,
11728 };
11729 
11730 /* exclude VREF80 */
11731 static void alc861vd_fixup_dallas(struct hda_codec *codec,
11732                                   const struct hda_fixup *fix, int action)
11733 {
11734         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11735                 snd_hda_override_pin_caps(codec, 0x18, 0x00000734);
11736                 snd_hda_override_pin_caps(codec, 0x19, 0x0000073c);
11737         }
11738 }
11739 
11740 /* reset GPIO1 */
11741 static void alc660vd_fixup_asus_gpio1(struct hda_codec *codec,
11742                                       const struct hda_fixup *fix, int action)
11743 {
11744         struct alc_spec *spec = codec->spec;
11745 
11746         if (action == HDA_FIXUP_ACT_PRE_PROBE)
11747                 spec->gpio_mask |= 0x02;
11748         alc_fixup_gpio(codec, action, 0x01);
11749 }
11750 
11751 static const struct hda_fixup alc861vd_fixups[] = {
11752         [ALC660VD_FIX_ASUS_GPIO1] = {
11753                 .type = HDA_FIXUP_FUNC,
11754                 .v.func = alc660vd_fixup_asus_gpio1,
11755         },
11756         [ALC861VD_FIX_DALLAS] = {
11757                 .type = HDA_FIXUP_FUNC,
11758                 .v.func = alc861vd_fixup_dallas,
11759         },
11760 };
11761 
11762 static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
11763         SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS),
11764         SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
11765         SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS),
11766         {}
11767 };
11768 
11769 /*
11770  */
11771 static int patch_alc861vd(struct hda_codec *codec)
11772 {
11773         struct alc_spec *spec;
11774         int err;
11775 
11776         err = alc_alloc_spec(codec, 0x0b);
11777         if (err < 0)
11778                 return err;
11779 
11780         spec = codec->spec;
11781         if (has_cdefine_beep(codec))
11782                 spec->gen.beep_nid = 0x23;
11783 
11784         spec->shutup = alc_eapd_shutup;
11785 
11786         alc_pre_init(codec);
11787 
11788         snd_hda_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
11789         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
11790 
11791         /* automatic parse from the BIOS config */
11792         err = alc861vd_parse_auto_config(codec);
11793         if (err < 0)
11794                 goto error;
11795 
11796         if (!spec->gen.no_analog) {
11797                 err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
11798                 if (err < 0)
11799                         goto error;
11800         }
11801 
11802         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
11803 
11804         return 0;
11805 
11806  error:
11807         alc_free(codec);
11808         return err;
11809 }
11810 
11811 /*
11812  * ALC662 support
11813  *
11814  * ALC662 is almost identical with ALC880 but has cleaner and more flexible
11815  * configuration.  Each pin widget can choose any input DACs and a mixer.
11816  * Each ADC is connected from a mixer of all inputs.  This makes possible
11817  * 6-channel independent captures.
11818  *
11819  * In addition, an independent DAC for the multi-playback (not used in this
11820  * driver yet).
11821  */
11822 
11823 /*
11824  * BIOS auto configuration
11825  */
11826 
11827 static int alc662_parse_auto_config(struct hda_codec *codec)
11828 {
11829         static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
11830         static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 };
11831         static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 };
11832         const hda_nid_t *ssids;
11833 
11834         if (codec->core.vendor_id == 0x10ec0272 || codec->core.vendor_id == 0x10ec0663 ||
11835             codec->core.vendor_id == 0x10ec0665 || codec->core.vendor_id == 0x10ec0670 ||
11836             codec->core.vendor_id == 0x10ec0671)
11837                 ssids = alc663_ssids;
11838         else
11839                 ssids = alc662_ssids;
11840         return alc_parse_auto_config(codec, alc662_ignore, ssids);
11841 }
11842 
11843 static void alc272_fixup_mario(struct hda_codec *codec,
11844                                const struct hda_fixup *fix, int action)
11845 {
11846         if (action != HDA_FIXUP_ACT_PRE_PROBE)
11847                 return;
11848         if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
11849                                       (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
11850                                       (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
11851                                       (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
11852                                       (0 << AC_AMPCAP_MUTE_SHIFT)))
11853                 codec_warn(codec, "failed to override amp caps for NID 0x2\n");
11854 }
11855 
11856 static const struct snd_pcm_chmap_elem asus_pcm_2_1_chmaps[] = {
11857         { .channels = 2,
11858           .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
11859         { .channels = 4,
11860           .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
11861                    SNDRV_CHMAP_NA, SNDRV_CHMAP_LFE } }, /* LFE only on right */
11862         { }
11863 };
11864 
11865 /* override the 2.1 chmap */
11866 static void alc_fixup_bass_chmap(struct hda_codec *codec,
11867                                     const struct hda_fixup *fix, int action)
11868 {
11869         if (action == HDA_FIXUP_ACT_BUILD) {
11870                 struct alc_spec *spec = codec->spec;
11871                 spec->gen.pcm_rec[0]->stream[0].chmap = asus_pcm_2_1_chmaps;
11872         }
11873 }
11874 
11875 /* avoid D3 for keeping GPIO up */
11876 static unsigned int gpio_led_power_filter(struct hda_codec *codec,
11877                                           hda_nid_t nid,
11878                                           unsigned int power_state)
11879 {
11880         struct alc_spec *spec = codec->spec;
11881         if (nid == codec->core.afg && power_state == AC_PWRST_D3 && spec->gpio_data)
11882                 return AC_PWRST_D0;
11883         return power_state;
11884 }
11885 
11886 static void alc662_fixup_led_gpio1(struct hda_codec *codec,
11887                                    const struct hda_fixup *fix, int action)
11888 {
11889         struct alc_spec *spec = codec->spec;
11890 
11891         alc_fixup_hp_gpio_led(codec, action, 0x01, 0);
11892         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11893                 spec->mute_led_polarity = 1;
11894                 codec->power_filter = gpio_led_power_filter;
11895         }
11896 }
11897 
11898 static void alc662_usi_automute_hook(struct hda_codec *codec,
11899                                          struct hda_jack_callback *jack)
11900 {
11901         struct alc_spec *spec = codec->spec;
11902         int vref;
11903         msleep(200);
11904         snd_hda_gen_hp_automute(codec, jack);
11905 
11906         vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
11907         msleep(100);
11908         snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
11909                             vref);
11910 }
11911 
11912 static void alc662_fixup_usi_headset_mic(struct hda_codec *codec,
11913                                      const struct hda_fixup *fix, int action)
11914 {
11915         struct alc_spec *spec = codec->spec;
11916         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
11917                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
11918                 spec->gen.hp_automute_hook = alc662_usi_automute_hook;
11919         }
11920 }
11921 
11922 static void alc662_aspire_ethos_mute_speakers(struct hda_codec *codec,
11923                                         struct hda_jack_callback *cb)
11924 {
11925         /* surround speakers at 0x1b already get muted automatically when
11926          * headphones are plugged in, but we have to mute/unmute the remaining
11927          * channels manually:
11928          * 0x15 - front left/front right
11929          * 0x18 - front center/ LFE
11930          */
11931         if (snd_hda_jack_detect_state(codec, 0x1b) == HDA_JACK_PRESENT) {
11932                 snd_hda_set_pin_ctl_cache(codec, 0x15, 0);
11933                 snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
11934         } else {
11935                 snd_hda_set_pin_ctl_cache(codec, 0x15, PIN_OUT);
11936                 snd_hda_set_pin_ctl_cache(codec, 0x18, PIN_OUT);
11937         }
11938 }
11939 
11940 static void alc662_fixup_aspire_ethos_hp(struct hda_codec *codec,
11941                                         const struct hda_fixup *fix, int action)
11942 {
11943     /* Pin 0x1b: shared headphones jack and surround speakers */
11944         if (!is_jack_detectable(codec, 0x1b))
11945                 return;
11946 
11947         switch (action) {
11948         case HDA_FIXUP_ACT_PRE_PROBE:
11949                 snd_hda_jack_detect_enable_callback(codec, 0x1b,
11950                                 alc662_aspire_ethos_mute_speakers);
11951                 /* subwoofer needs an extra GPIO setting to become audible */
11952                 alc_setup_gpio(codec, 0x02);
11953                 break;
11954         case HDA_FIXUP_ACT_INIT:
11955                 /* Make sure to start in a correct state, i.e. if
11956                  * headphones have been plugged in before powering up the system
11957                  */
11958                 alc662_aspire_ethos_mute_speakers(codec, NULL);
11959                 break;
11960         }
11961 }
11962 
11963 static void alc671_fixup_hp_headset_mic2(struct hda_codec *codec,
11964                                              const struct hda_fixup *fix, int action)
11965 {
11966         struct alc_spec *spec = codec->spec;
11967 
11968         static const struct hda_pintbl pincfgs[] = {
11969                 { 0x19, 0x02a11040 }, /* use as headset mic, with its own jack detect */
11970                 { 0x1b, 0x0181304f },
11971                 { }
11972         };
11973 
11974         switch (action) {
11975         case HDA_FIXUP_ACT_PRE_PROBE:
11976                 spec->gen.mixer_nid = 0;
11977                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
11978                 snd_hda_apply_pincfgs(codec, pincfgs);
11979                 break;
11980         case HDA_FIXUP_ACT_INIT:
11981                 alc_write_coef_idx(codec, 0x19, 0xa054);
11982                 break;
11983         }
11984 }
11985 
11986 static void alc897_hp_automute_hook(struct hda_codec *codec,
11987                                          struct hda_jack_callback *jack)
11988 {
11989         struct alc_spec *spec = codec->spec;
11990         int vref;
11991 
11992         snd_hda_gen_hp_automute(codec, jack);
11993         vref = spec->gen.hp_jack_present ? (PIN_HP | AC_PINCTL_VREF_100) : PIN_HP;
11994         snd_hda_set_pin_ctl(codec, 0x1b, vref);
11995 }
11996 
11997 static void alc897_fixup_lenovo_headset_mic(struct hda_codec *codec,
11998                                      const struct hda_fixup *fix, int action)
11999 {
12000         struct alc_spec *spec = codec->spec;
12001         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
12002                 spec->gen.hp_automute_hook = alc897_hp_automute_hook;
12003                 spec->no_shutup_pins = 1;
12004         }
12005         if (action == HDA_FIXUP_ACT_PROBE) {
12006                 snd_hda_set_pin_ctl_cache(codec, 0x1a, PIN_IN | AC_PINCTL_VREF_100);
12007         }
12008 }
12009 
12010 static void alc897_fixup_lenovo_headset_mode(struct hda_codec *codec,
12011                                      const struct hda_fixup *fix, int action)
12012 {
12013         struct alc_spec *spec = codec->spec;
12014 
12015         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
12016                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
12017                 spec->gen.hp_automute_hook = alc897_hp_automute_hook;
12018         }
12019 }
12020 
12021 static const struct coef_fw alc668_coefs[] = {
12022         WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03,    0x0),
12023         WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06,    0x0), WRITE_COEF(0x07, 0x0f80),
12024         WRITE_COEF(0x08, 0x0031), WRITE_COEF(0x0a, 0x0060), WRITE_COEF(0x0b,    0x0),
12025         WRITE_COEF(0x0c, 0x7cf7), WRITE_COEF(0x0d, 0x1080), WRITE_COEF(0x0e, 0x7f7f),
12026         WRITE_COEF(0x0f, 0xcccc), WRITE_COEF(0x10, 0xddcc), WRITE_COEF(0x11, 0x0001),
12027         WRITE_COEF(0x13,    0x0), WRITE_COEF(0x14, 0x2aa0), WRITE_COEF(0x17, 0xa940),
12028         WRITE_COEF(0x19,    0x0), WRITE_COEF(0x1a,    0x0), WRITE_COEF(0x1b,    0x0),
12029         WRITE_COEF(0x1c,    0x0), WRITE_COEF(0x1d,    0x0), WRITE_COEF(0x1e, 0x7418),
12030         WRITE_COEF(0x1f, 0x0804), WRITE_COEF(0x20, 0x4200), WRITE_COEF(0x21, 0x0468),
12031         WRITE_COEF(0x22, 0x8ccc), WRITE_COEF(0x23, 0x0250), WRITE_COEF(0x24, 0x7418),
12032         WRITE_COEF(0x27,    0x0), WRITE_COEF(0x28, 0x8ccc), WRITE_COEF(0x2a, 0xff00),
12033         WRITE_COEF(0x2b, 0x8000), WRITE_COEF(0xa7, 0xff00), WRITE_COEF(0xa8, 0x8000),
12034         WRITE_COEF(0xaa, 0x2e17), WRITE_COEF(0xab, 0xa0c0), WRITE_COEF(0xac,    0x0),
12035         WRITE_COEF(0xad,    0x0), WRITE_COEF(0xae, 0x2ac6), WRITE_COEF(0xaf, 0xa480),
12036         WRITE_COEF(0xb0,    0x0), WRITE_COEF(0xb1,    0x0), WRITE_COEF(0xb2,    0x0),
12037         WRITE_COEF(0xb3,    0x0), WRITE_COEF(0xb4,    0x0), WRITE_COEF(0xb5, 0x1040),
12038         WRITE_COEF(0xb6, 0xd697), WRITE_COEF(0xb7, 0x902b), WRITE_COEF(0xb8, 0xd697),
12039         WRITE_COEF(0xb9, 0x902b), WRITE_COEF(0xba, 0xb8ba), WRITE_COEF(0xbb, 0xaaab),
12040         WRITE_COEF(0xbc, 0xaaaf), WRITE_COEF(0xbd, 0x6aaa), WRITE_COEF(0xbe, 0x1c02),
12041         WRITE_COEF(0xc0, 0x00ff), WRITE_COEF(0xc1, 0x0fa6),
12042         {}
12043 };
12044 
12045 static void alc668_restore_default_value(struct hda_codec *codec)
12046 {
12047         alc_process_coef_fw(codec, alc668_coefs);
12048 }
12049 
12050 enum {
12051         ALC662_FIXUP_ASPIRE,
12052         ALC662_FIXUP_LED_GPIO1,
12053         ALC662_FIXUP_IDEAPAD,
12054         ALC272_FIXUP_MARIO,
12055         ALC662_FIXUP_CZC_ET26,
12056         ALC662_FIXUP_CZC_P10T,
12057         ALC662_FIXUP_SKU_IGNORE,
12058         ALC662_FIXUP_HP_RP5800,
12059         ALC662_FIXUP_ASUS_MODE1,
12060         ALC662_FIXUP_ASUS_MODE2,
12061         ALC662_FIXUP_ASUS_MODE3,
12062         ALC662_FIXUP_ASUS_MODE4,
12063         ALC662_FIXUP_ASUS_MODE5,
12064         ALC662_FIXUP_ASUS_MODE6,
12065         ALC662_FIXUP_ASUS_MODE7,
12066         ALC662_FIXUP_ASUS_MODE8,
12067         ALC662_FIXUP_NO_JACK_DETECT,
12068         ALC662_FIXUP_ZOTAC_Z68,
12069         ALC662_FIXUP_INV_DMIC,
12070         ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
12071         ALC668_FIXUP_DELL_MIC_NO_PRESENCE,
12072         ALC662_FIXUP_HEADSET_MODE,
12073         ALC668_FIXUP_HEADSET_MODE,
12074         ALC662_FIXUP_BASS_MODE4_CHMAP,
12075         ALC662_FIXUP_BASS_16,
12076         ALC662_FIXUP_BASS_1A,
12077         ALC662_FIXUP_BASS_CHMAP,
12078         ALC668_FIXUP_AUTO_MUTE,
12079         ALC668_FIXUP_DELL_DISABLE_AAMIX,
12080         ALC668_FIXUP_DELL_XPS13,
12081         ALC662_FIXUP_ASUS_Nx50,
12082         ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
12083         ALC668_FIXUP_ASUS_Nx51,
12084         ALC668_FIXUP_MIC_COEF,
12085         ALC668_FIXUP_ASUS_G751,
12086         ALC891_FIXUP_HEADSET_MODE,
12087         ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
12088         ALC662_FIXUP_ACER_VERITON,
12089         ALC892_FIXUP_ASROCK_MOBO,
12090         ALC662_FIXUP_USI_FUNC,
12091         ALC662_FIXUP_USI_HEADSET_MODE,
12092         ALC662_FIXUP_LENOVO_MULTI_CODECS,
12093         ALC669_FIXUP_ACER_ASPIRE_ETHOS,
12094         ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET,
12095         ALC671_FIXUP_HP_HEADSET_MIC2,
12096         ALC662_FIXUP_ACER_X2660G_HEADSET_MODE,
12097         ALC662_FIXUP_ACER_NITRO_HEADSET_MODE,
12098         ALC668_FIXUP_ASUS_NO_HEADSET_MIC,
12099         ALC668_FIXUP_HEADSET_MIC,
12100         ALC668_FIXUP_MIC_DET_COEF,
12101         ALC897_FIXUP_LENOVO_HEADSET_MIC,
12102         ALC897_FIXUP_HEADSET_MIC_PIN,
12103         ALC897_FIXUP_HP_HSMIC_VERB,
12104         ALC897_FIXUP_LENOVO_HEADSET_MODE,
12105         ALC897_FIXUP_HEADSET_MIC_PIN2,
12106         ALC897_FIXUP_UNIS_H3C_X500S,
12107         ALC897_FIXUP_HEADSET_MIC_PIN3,
12108 };
12109 
12110 static const struct hda_fixup alc662_fixups[] = {
12111         [ALC662_FIXUP_ASPIRE] = {
12112                 .type = HDA_FIXUP_PINS,
12113                 .v.pins = (const struct hda_pintbl[]) {
12114                         { 0x15, 0x99130112 }, /* subwoofer */
12115                         { }
12116                 }
12117         },
12118         [ALC662_FIXUP_LED_GPIO1] = {
12119                 .type = HDA_FIXUP_FUNC,
12120                 .v.func = alc662_fixup_led_gpio1,
12121         },
12122         [ALC662_FIXUP_IDEAPAD] = {
12123                 .type = HDA_FIXUP_PINS,
12124                 .v.pins = (const struct hda_pintbl[]) {
12125                         { 0x17, 0x99130112 }, /* subwoofer */
12126                         { }
12127                 },
12128                 .chained = true,
12129                 .chain_id = ALC662_FIXUP_LED_GPIO1,
12130         },
12131         [ALC272_FIXUP_MARIO] = {
12132                 .type = HDA_FIXUP_FUNC,
12133                 .v.func = alc272_fixup_mario,
12134         },
12135         [ALC662_FIXUP_CZC_ET26] = {
12136                 .type = HDA_FIXUP_PINS,
12137                 .v.pins = (const struct hda_pintbl[]) {
12138                         {0x12, 0x403cc000},
12139                         {0x14, 0x90170110}, /* speaker */
12140                         {0x15, 0x411111f0},
12141                         {0x16, 0x411111f0},
12142                         {0x18, 0x01a19030}, /* mic */
12143                         {0x19, 0x90a7013f}, /* int-mic */
12144                         {0x1a, 0x01014020},
12145                         {0x1b, 0x0121401f},
12146                         {0x1c, 0x411111f0},
12147                         {0x1d, 0x411111f0},
12148                         {0x1e, 0x40478e35},
12149                         {}
12150                 },
12151                 .chained = true,
12152                 .chain_id = ALC662_FIXUP_SKU_IGNORE
12153         },
12154         [ALC662_FIXUP_CZC_P10T] = {
12155                 .type = HDA_FIXUP_VERBS,
12156                 .v.verbs = (const struct hda_verb[]) {
12157                         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
12158                         {}
12159                 }
12160         },
12161         [ALC662_FIXUP_SKU_IGNORE] = {
12162                 .type = HDA_FIXUP_FUNC,
12163                 .v.func = alc_fixup_sku_ignore,
12164         },
12165         [ALC662_FIXUP_HP_RP5800] = {
12166                 .type = HDA_FIXUP_PINS,
12167                 .v.pins = (const struct hda_pintbl[]) {
12168                         { 0x14, 0x0221201f }, /* HP out */
12169                         { }
12170                 },
12171                 .chained = true,
12172                 .chain_id = ALC662_FIXUP_SKU_IGNORE
12173         },
12174         [ALC662_FIXUP_ASUS_MODE1] = {
12175                 .type = HDA_FIXUP_PINS,
12176                 .v.pins = (const struct hda_pintbl[]) {
12177                         { 0x14, 0x99130110 }, /* speaker */
12178                         { 0x18, 0x01a19c20 }, /* mic */
12179                         { 0x19, 0x99a3092f }, /* int-mic */
12180                         { 0x21, 0x0121401f }, /* HP out */
12181                         { }
12182                 },
12183                 .chained = true,
12184                 .chain_id = ALC662_FIXUP_SKU_IGNORE
12185         },
12186         [ALC662_FIXUP_ASUS_MODE2] = {
12187                 .type = HDA_FIXUP_PINS,
12188                 .v.pins = (const struct hda_pintbl[]) {
12189                         { 0x14, 0x99130110 }, /* speaker */
12190                         { 0x18, 0x01a19820 }, /* mic */
12191                         { 0x19, 0x99a3092f }, /* int-mic */
12192                         { 0x1b, 0x0121401f }, /* HP out */
12193                         { }
12194                 },
12195                 .chained = true,
12196                 .chain_id = ALC662_FIXUP_SKU_IGNORE
12197         },
12198         [ALC662_FIXUP_ASUS_MODE3] = {
12199                 .type = HDA_FIXUP_PINS,
12200                 .v.pins = (const struct hda_pintbl[]) {
12201                         { 0x14, 0x99130110 }, /* speaker */
12202                         { 0x15, 0x0121441f }, /* HP */
12203                         { 0x18, 0x01a19840 }, /* mic */
12204                         { 0x19, 0x99a3094f }, /* int-mic */
12205                         { 0x21, 0x01211420 }, /* HP2 */
12206                         { }
12207                 },
12208                 .chained = true,
12209                 .chain_id = ALC662_FIXUP_SKU_IGNORE
12210         },
12211         [ALC662_FIXUP_ASUS_MODE4] = {
12212                 .type = HDA_FIXUP_PINS,
12213                 .v.pins = (const struct hda_pintbl[]) {
12214                         { 0x14, 0x99130110 }, /* speaker */
12215                         { 0x16, 0x99130111 }, /* speaker */
12216                         { 0x18, 0x01a19840 }, /* mic */
12217                         { 0x19, 0x99a3094f }, /* int-mic */
12218                         { 0x21, 0x0121441f }, /* HP */
12219                         { }
12220                 },
12221                 .chained = true,
12222                 .chain_id = ALC662_FIXUP_SKU_IGNORE
12223         },
12224         [ALC662_FIXUP_ASUS_MODE5] = {
12225                 .type = HDA_FIXUP_PINS,
12226                 .v.pins = (const struct hda_pintbl[]) {
12227                         { 0x14, 0x99130110 }, /* speaker */
12228                         { 0x15, 0x0121441f }, /* HP */
12229                         { 0x16, 0x99130111 }, /* speaker */
12230                         { 0x18, 0x01a19840 }, /* mic */
12231                         { 0x19, 0x99a3094f }, /* int-mic */
12232                         { }
12233                 },
12234                 .chained = true,
12235                 .chain_id = ALC662_FIXUP_SKU_IGNORE
12236         },
12237         [ALC662_FIXUP_ASUS_MODE6] = {
12238                 .type = HDA_FIXUP_PINS,
12239                 .v.pins = (const struct hda_pintbl[]) {
12240                         { 0x14, 0x99130110 }, /* speaker */
12241                         { 0x15, 0x01211420 }, /* HP2 */
12242                         { 0x18, 0x01a19840 }, /* mic */
12243                         { 0x19, 0x99a3094f }, /* int-mic */
12244                         { 0x1b, 0x0121441f }, /* HP */
12245                         { }
12246                 },
12247                 .chained = true,
12248                 .chain_id = ALC662_FIXUP_SKU_IGNORE
12249         },
12250         [ALC662_FIXUP_ASUS_MODE7] = {
12251                 .type = HDA_FIXUP_PINS,
12252                 .v.pins = (const struct hda_pintbl[]) {
12253                         { 0x14, 0x99130110 }, /* speaker */
12254                         { 0x17, 0x99130111 }, /* speaker */
12255                         { 0x18, 0x01a19840 }, /* mic */
12256                         { 0x19, 0x99a3094f }, /* int-mic */
12257                         { 0x1b, 0x01214020 }, /* HP */
12258                         { 0x21, 0x0121401f }, /* HP */
12259                         { }
12260                 },
12261                 .chained = true,
12262                 .chain_id = ALC662_FIXUP_SKU_IGNORE
12263         },
12264         [ALC662_FIXUP_ASUS_MODE8] = {
12265                 .type = HDA_FIXUP_PINS,
12266                 .v.pins = (const struct hda_pintbl[]) {
12267                         { 0x14, 0x99130110 }, /* speaker */
12268                         { 0x12, 0x99a30970 }, /* int-mic */
12269                         { 0x15, 0x01214020 }, /* HP */
12270                         { 0x17, 0x99130111 }, /* speaker */
12271                         { 0x18, 0x01a19840 }, /* mic */
12272                         { 0x21, 0x0121401f }, /* HP */
12273                         { }
12274                 },
12275                 .chained = true,
12276                 .chain_id = ALC662_FIXUP_SKU_IGNORE
12277         },
12278         [ALC662_FIXUP_NO_JACK_DETECT] = {
12279                 .type = HDA_FIXUP_FUNC,
12280                 .v.func = alc_fixup_no_jack_detect,
12281         },
12282         [ALC662_FIXUP_ZOTAC_Z68] = {
12283                 .type = HDA_FIXUP_PINS,
12284                 .v.pins = (const struct hda_pintbl[]) {
12285                         { 0x1b, 0x02214020 }, /* Front HP */
12286                         { }
12287                 }
12288         },
12289         [ALC662_FIXUP_INV_DMIC] = {
12290                 .type = HDA_FIXUP_FUNC,
12291                 .v.func = alc_fixup_inv_dmic,
12292         },
12293         [ALC668_FIXUP_DELL_XPS13] = {
12294                 .type = HDA_FIXUP_FUNC,
12295                 .v.func = alc_fixup_dell_xps13,
12296                 .chained = true,
12297                 .chain_id = ALC668_FIXUP_DELL_DISABLE_AAMIX
12298         },
12299         [ALC668_FIXUP_DELL_DISABLE_AAMIX] = {
12300                 .type = HDA_FIXUP_FUNC,
12301                 .v.func = alc_fixup_disable_aamix,
12302                 .chained = true,
12303                 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
12304         },
12305         [ALC668_FIXUP_AUTO_MUTE] = {
12306                 .type = HDA_FIXUP_FUNC,
12307                 .v.func = alc_fixup_auto_mute_via_amp,
12308                 .chained = true,
12309                 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
12310         },
12311         [ALC662_FIXUP_DELL_MIC_NO_PRESENCE] = {
12312                 .type = HDA_FIXUP_PINS,
12313                 .v.pins = (const struct hda_pintbl[]) {
12314                         { 0x19, 0x03a1113c }, /* use as headset mic, without its own jack detect */
12315                         /* headphone mic by setting pin control of 0x1b (headphone out) to in + vref_50 */
12316                         { }
12317                 },
12318                 .chained = true,
12319                 .chain_id = ALC662_FIXUP_HEADSET_MODE
12320         },
12321         [ALC662_FIXUP_HEADSET_MODE] = {
12322                 .type = HDA_FIXUP_FUNC,
12323                 .v.func = alc_fixup_headset_mode_alc662,
12324         },
12325         [ALC668_FIXUP_DELL_MIC_NO_PRESENCE] = {
12326                 .type = HDA_FIXUP_PINS,
12327                 .v.pins = (const struct hda_pintbl[]) {
12328                         { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
12329                         { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
12330                         { }
12331                 },
12332                 .chained = true,
12333                 .chain_id = ALC668_FIXUP_HEADSET_MODE
12334         },
12335         [ALC668_FIXUP_HEADSET_MODE] = {
12336                 .type = HDA_FIXUP_FUNC,
12337                 .v.func = alc_fixup_headset_mode_alc668,
12338         },
12339         [ALC662_FIXUP_BASS_MODE4_CHMAP] = {
12340                 .type = HDA_FIXUP_FUNC,
12341                 .v.func = alc_fixup_bass_chmap,
12342                 .chained = true,
12343                 .chain_id = ALC662_FIXUP_ASUS_MODE4
12344         },
12345         [ALC662_FIXUP_BASS_16] = {
12346                 .type = HDA_FIXUP_PINS,
12347                 .v.pins = (const struct hda_pintbl[]) {
12348                         {0x16, 0x80106111}, /* bass speaker */
12349                         {}
12350                 },
12351                 .chained = true,
12352                 .chain_id = ALC662_FIXUP_BASS_CHMAP,
12353         },
12354         [ALC662_FIXUP_BASS_1A] = {
12355                 .type = HDA_FIXUP_PINS,
12356                 .v.pins = (const struct hda_pintbl[]) {
12357                         {0x1a, 0x80106111}, /* bass speaker */
12358                         {}
12359                 },
12360                 .chained = true,
12361                 .chain_id = ALC662_FIXUP_BASS_CHMAP,
12362         },
12363         [ALC662_FIXUP_BASS_CHMAP] = {
12364                 .type = HDA_FIXUP_FUNC,
12365                 .v.func = alc_fixup_bass_chmap,
12366         },
12367         [ALC662_FIXUP_ASUS_Nx50] = {
12368                 .type = HDA_FIXUP_FUNC,
12369                 .v.func = alc_fixup_auto_mute_via_amp,
12370                 .chained = true,
12371                 .chain_id = ALC662_FIXUP_BASS_1A
12372         },
12373         [ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE] = {
12374                 .type = HDA_FIXUP_FUNC,
12375                 .v.func = alc_fixup_headset_mode_alc668,
12376                 .chain_id = ALC662_FIXUP_BASS_CHMAP
12377         },
12378         [ALC668_FIXUP_ASUS_Nx51] = {
12379                 .type = HDA_FIXUP_PINS,
12380                 .v.pins = (const struct hda_pintbl[]) {
12381                         { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
12382                         { 0x1a, 0x90170151 }, /* bass speaker */
12383                         { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
12384                         {}
12385                 },
12386                 .chained = true,
12387                 .chain_id = ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
12388         },
12389         [ALC668_FIXUP_MIC_COEF] = {
12390                 .type = HDA_FIXUP_VERBS,
12391                 .v.verbs = (const struct hda_verb[]) {
12392                         { 0x20, AC_VERB_SET_COEF_INDEX, 0xc3 },
12393                         { 0x20, AC_VERB_SET_PROC_COEF, 0x4000 },
12394                         {}
12395                 },
12396         },
12397         [ALC668_FIXUP_ASUS_G751] = {
12398                 .type = HDA_FIXUP_PINS,
12399                 .v.pins = (const struct hda_pintbl[]) {
12400                         { 0x16, 0x0421101f }, /* HP */
12401                         {}
12402                 },
12403                 .chained = true,
12404                 .chain_id = ALC668_FIXUP_MIC_COEF
12405         },
12406         [ALC891_FIXUP_HEADSET_MODE] = {
12407                 .type = HDA_FIXUP_FUNC,
12408                 .v.func = alc_fixup_headset_mode,
12409         },
12410         [ALC891_FIXUP_DELL_MIC_NO_PRESENCE] = {
12411                 .type = HDA_FIXUP_PINS,
12412                 .v.pins = (const struct hda_pintbl[]) {
12413                         { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
12414                         { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
12415                         { }
12416                 },
12417                 .chained = true,
12418                 .chain_id = ALC891_FIXUP_HEADSET_MODE
12419         },
12420         [ALC662_FIXUP_ACER_VERITON] = {
12421                 .type = HDA_FIXUP_PINS,
12422                 .v.pins = (const struct hda_pintbl[]) {
12423                         { 0x15, 0x50170120 }, /* no internal speaker */
12424                         { }
12425                 }
12426         },
12427         [ALC892_FIXUP_ASROCK_MOBO] = {
12428                 .type = HDA_FIXUP_PINS,
12429                 .v.pins = (const struct hda_pintbl[]) {
12430                         { 0x15, 0x40f000f0 }, /* disabled */
12431                         { 0x16, 0x40f000f0 }, /* disabled */
12432                         { }
12433                 }
12434         },
12435         [ALC662_FIXUP_USI_FUNC] = {
12436                 .type = HDA_FIXUP_FUNC,
12437                 .v.func = alc662_fixup_usi_headset_mic,
12438         },
12439         [ALC662_FIXUP_USI_HEADSET_MODE] = {
12440                 .type = HDA_FIXUP_PINS,
12441                 .v.pins = (const struct hda_pintbl[]) {
12442                         { 0x19, 0x02a1913c }, /* use as headset mic, without its own jack detect */
12443                         { 0x18, 0x01a1903d },
12444                         { }
12445                 },
12446                 .chained = true,
12447                 .chain_id = ALC662_FIXUP_USI_FUNC
12448         },
12449         [ALC662_FIXUP_LENOVO_MULTI_CODECS] = {
12450                 .type = HDA_FIXUP_FUNC,
12451                 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
12452         },
12453         [ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET] = {
12454                 .type = HDA_FIXUP_FUNC,
12455                 .v.func = alc662_fixup_aspire_ethos_hp,
12456         },
12457         [ALC669_FIXUP_ACER_ASPIRE_ETHOS] = {
12458                 .type = HDA_FIXUP_PINS,
12459                 .v.pins = (const struct hda_pintbl[]) {
12460                         { 0x15, 0x92130110 }, /* front speakers */
12461                         { 0x18, 0x99130111 }, /* center/subwoofer */
12462                         { 0x1b, 0x11130012 }, /* surround plus jack for HP */
12463                         { }
12464                 },
12465                 .chained = true,
12466                 .chain_id = ALC669_FIXUP_ACER_ASPIRE_ETHOS_HEADSET
12467         },
12468         [ALC671_FIXUP_HP_HEADSET_MIC2] = {
12469                 .type = HDA_FIXUP_FUNC,
12470                 .v.func = alc671_fixup_hp_headset_mic2,
12471         },
12472         [ALC662_FIXUP_ACER_X2660G_HEADSET_MODE] = {
12473                 .type = HDA_FIXUP_PINS,
12474                 .v.pins = (const struct hda_pintbl[]) {
12475                         { 0x1a, 0x02a1113c }, /* use as headset mic, without its own jack detect */
12476                         { }
12477                 },
12478                 .chained = true,
12479                 .chain_id = ALC662_FIXUP_USI_FUNC
12480         },
12481         [ALC662_FIXUP_ACER_NITRO_HEADSET_MODE] = {
12482                 .type = HDA_FIXUP_PINS,
12483                 .v.pins = (const struct hda_pintbl[]) {
12484                         { 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */
12485                         { 0x1b, 0x0221144f },
12486                         { }
12487                 },
12488                 .chained = true,
12489                 .chain_id = ALC662_FIXUP_USI_FUNC
12490         },
12491         [ALC668_FIXUP_ASUS_NO_HEADSET_MIC] = {
12492                 .type = HDA_FIXUP_PINS,
12493                 .v.pins = (const struct hda_pintbl[]) {
12494                         { 0x1b, 0x04a1112c },
12495                         { }
12496                 },
12497                 .chained = true,
12498                 .chain_id = ALC668_FIXUP_HEADSET_MIC
12499         },
12500         [ALC668_FIXUP_HEADSET_MIC] = {
12501                 .type = HDA_FIXUP_FUNC,
12502                 .v.func = alc269_fixup_headset_mic,
12503                 .chained = true,
12504                 .chain_id = ALC668_FIXUP_MIC_DET_COEF
12505         },
12506         [ALC668_FIXUP_MIC_DET_COEF] = {
12507                 .type = HDA_FIXUP_VERBS,
12508                 .v.verbs = (const struct hda_verb[]) {
12509                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x15 },
12510                         { 0x20, AC_VERB_SET_PROC_COEF, 0x0d60 },
12511                         {}
12512                 },
12513         },
12514         [ALC897_FIXUP_LENOVO_HEADSET_MIC] = {
12515                 .type = HDA_FIXUP_FUNC,
12516                 .v.func = alc897_fixup_lenovo_headset_mic,
12517         },
12518         [ALC897_FIXUP_HEADSET_MIC_PIN] = {
12519                 .type = HDA_FIXUP_PINS,
12520                 .v.pins = (const struct hda_pintbl[]) {
12521                         { 0x1a, 0x03a11050 },
12522                         { }
12523                 },
12524                 .chained = true,
12525                 .chain_id = ALC897_FIXUP_LENOVO_HEADSET_MIC
12526         },
12527         [ALC897_FIXUP_HP_HSMIC_VERB] = {
12528                 .type = HDA_FIXUP_PINS,
12529                 .v.pins = (const struct hda_pintbl[]) {
12530                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
12531                         { }
12532                 },
12533         },
12534         [ALC897_FIXUP_LENOVO_HEADSET_MODE] = {
12535                 .type = HDA_FIXUP_FUNC,
12536                 .v.func = alc897_fixup_lenovo_headset_mode,
12537         },
12538         [ALC897_FIXUP_HEADSET_MIC_PIN2] = {
12539                 .type = HDA_FIXUP_PINS,
12540                 .v.pins = (const struct hda_pintbl[]) {
12541                         { 0x1a, 0x01a11140 }, /* use as headset mic, without its own jack detect */
12542                         { }
12543                 },
12544                 .chained = true,
12545                 .chain_id = ALC897_FIXUP_LENOVO_HEADSET_MODE
12546         },
12547         [ALC897_FIXUP_UNIS_H3C_X500S] = {
12548                 .type = HDA_FIXUP_VERBS,
12549                 .v.verbs = (const struct hda_verb[]) {
12550                         { 0x14, AC_VERB_SET_EAPD_BTLENABLE, 0 },
12551                         {}
12552                 },
12553         },
12554         [ALC897_FIXUP_HEADSET_MIC_PIN3] = {
12555                 .type = HDA_FIXUP_PINS,
12556                 .v.pins = (const struct hda_pintbl[]) {
12557                         { 0x19, 0x03a11050 }, /* use as headset mic */
12558                         { }
12559                 },
12560         },
12561 };
12562 
12563 static const struct snd_pci_quirk alc662_fixup_tbl[] = {
12564         SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2),
12565         SND_PCI_QUIRK(0x1019, 0x9859, "JP-IK LEAP W502", ALC897_FIXUP_HEADSET_MIC_PIN3),
12566         SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC),
12567         SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", ALC662_FIXUP_INV_DMIC),
12568         SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
12569         SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
12570         SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC),
12571         SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC),
12572         SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
12573         SND_PCI_QUIRK(0x1025, 0x0566, "Acer Aspire Ethos 8951G", ALC669_FIXUP_ACER_ASPIRE_ETHOS),
12574         SND_PCI_QUIRK(0x1025, 0x123c, "Acer Nitro N50-600", ALC662_FIXUP_ACER_NITRO_HEADSET_MODE),
12575         SND_PCI_QUIRK(0x1025, 0x124e, "Acer 2660G", ALC662_FIXUP_ACER_X2660G_HEADSET_MODE),
12576         SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
12577         SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
12578         SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13),
12579         SND_PCI_QUIRK(0x1028, 0x060a, "Dell XPS 13", ALC668_FIXUP_DELL_XPS13),
12580         SND_PCI_QUIRK(0x1028, 0x060d, "Dell M3800", ALC668_FIXUP_DELL_XPS13),
12581         SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
12582         SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
12583         SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
12584         SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
12585         SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
12586         SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
12587         SND_PCI_QUIRK(0x103c, 0x870c, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
12588         SND_PCI_QUIRK(0x103c, 0x8719, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
12589         SND_PCI_QUIRK(0x103c, 0x872b, "HP", ALC897_FIXUP_HP_HSMIC_VERB),
12590         SND_PCI_QUIRK(0x103c, 0x873e, "HP", ALC671_FIXUP_HP_HEADSET_MIC2),
12591         SND_PCI_QUIRK(0x103c, 0x8768, "HP Slim Desktop S01", ALC671_FIXUP_HP_HEADSET_MIC2),
12592         SND_PCI_QUIRK(0x103c, 0x877e, "HP 288 Pro G6", ALC671_FIXUP_HP_HEADSET_MIC2),
12593         SND_PCI_QUIRK(0x103c, 0x885f, "HP 288 Pro G8", ALC671_FIXUP_HP_HEADSET_MIC2),
12594         SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE),
12595         SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50),
12596         SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50),
12597         SND_PCI_QUIRK(0x1043, 0x12ff, "ASUS G751", ALC668_FIXUP_ASUS_G751),
12598         SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A),
12599         SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
12600         SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16),
12601         SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51),
12602         SND_PCI_QUIRK(0x1043, 0x17bd, "ASUS N751", ALC668_FIXUP_ASUS_Nx51),
12603         SND_PCI_QUIRK(0x1043, 0x185d, "ASUS G551JW", ALC668_FIXUP_ASUS_NO_HEADSET_MIC),
12604         SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71SL", ALC662_FIXUP_ASUS_MODE8),
12605         SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16),
12606         SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
12607         SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
12608         SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
12609         SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
12610         SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE),
12611         SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC662_FIXUP_LENOVO_MULTI_CODECS),
12612         SND_PCI_QUIRK(0x17aa, 0x1057, "Lenovo P360", ALC897_FIXUP_HEADSET_MIC_PIN),
12613         SND_PCI_QUIRK(0x17aa, 0x1064, "Lenovo P3 Tower", ALC897_FIXUP_HEADSET_MIC_PIN),
12614         SND_PCI_QUIRK(0x17aa, 0x32ca, "Lenovo ThinkCentre M80", ALC897_FIXUP_HEADSET_MIC_PIN),
12615         SND_PCI_QUIRK(0x17aa, 0x32cb, "Lenovo ThinkCentre M70", ALC897_FIXUP_HEADSET_MIC_PIN),
12616         SND_PCI_QUIRK(0x17aa, 0x32cf, "Lenovo ThinkCentre M950", ALC897_FIXUP_HEADSET_MIC_PIN),
12617         SND_PCI_QUIRK(0x17aa, 0x32f7, "Lenovo ThinkCentre M90", ALC897_FIXUP_HEADSET_MIC_PIN),
12618         SND_PCI_QUIRK(0x17aa, 0x3321, "Lenovo ThinkCentre M70 Gen4", ALC897_FIXUP_HEADSET_MIC_PIN),
12619         SND_PCI_QUIRK(0x17aa, 0x331b, "Lenovo ThinkCentre M90 Gen4", ALC897_FIXUP_HEADSET_MIC_PIN),
12620         SND_PCI_QUIRK(0x17aa, 0x3364, "Lenovo ThinkCentre M90 Gen5", ALC897_FIXUP_HEADSET_MIC_PIN),
12621         SND_PCI_QUIRK(0x17aa, 0x3742, "Lenovo TianYi510Pro-14IOB", ALC897_FIXUP_HEADSET_MIC_PIN2),
12622         SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
12623         SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
12624         SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),
12625         SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68),
12626         SND_PCI_QUIRK(0x1b0a, 0x01b8, "ACER Veriton", ALC662_FIXUP_ACER_VERITON),
12627         SND_PCI_QUIRK(0x1b35, 0x1234, "CZC ET26", ALC662_FIXUP_CZC_ET26),
12628         SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
12629         SND_PCI_QUIRK(0x1c6c, 0x1239, "Compaq N14JP6-V2", ALC897_FIXUP_HP_HSMIC_VERB),
12630 
12631 #if 0
12632         /* Below is a quirk table taken from the old code.
12633          * Basically the device should work as is without the fixup table.
12634          * If BIOS doesn't give a proper info, enable the corresponding
12635          * fixup entry.
12636          */
12637         SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),
12638         SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),
12639         SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1),
12640         SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC662_FIXUP_ASUS_MODE3),
12641         SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
12642         SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12643         SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
12644         SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC662_FIXUP_ASUS_MODE1),
12645         SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC662_FIXUP_ASUS_MODE1),
12646         SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12647         SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC662_FIXUP_ASUS_MODE7),
12648         SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC662_FIXUP_ASUS_MODE7),
12649         SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC662_FIXUP_ASUS_MODE8),
12650         SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC662_FIXUP_ASUS_MODE3),
12651         SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC662_FIXUP_ASUS_MODE1),
12652         SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12653         SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_FIXUP_ASUS_MODE2),
12654         SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC662_FIXUP_ASUS_MODE1),
12655         SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12656         SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
12657         SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
12658         SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12659         SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC662_FIXUP_ASUS_MODE1),
12660         SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC662_FIXUP_ASUS_MODE3),
12661         SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_FIXUP_ASUS_MODE2),
12662         SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12663         SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC662_FIXUP_ASUS_MODE5),
12664         SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
12665         SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12666         SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC662_FIXUP_ASUS_MODE1),
12667         SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12668         SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12669         SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC662_FIXUP_ASUS_MODE3),
12670         SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC662_FIXUP_ASUS_MODE3),
12671         SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC662_FIXUP_ASUS_MODE1),
12672         SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC662_FIXUP_ASUS_MODE1),
12673         SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC662_FIXUP_ASUS_MODE1),
12674         SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC662_FIXUP_ASUS_MODE1),
12675         SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC662_FIXUP_ASUS_MODE1),
12676         SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
12677         SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_FIXUP_ASUS_MODE2),
12678         SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC662_FIXUP_ASUS_MODE1),
12679         SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
12680         SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC662_FIXUP_ASUS_MODE3),
12681         SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC662_FIXUP_ASUS_MODE1),
12682         SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC662_FIXUP_ASUS_MODE1),
12683         SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC662_FIXUP_ASUS_MODE1),
12684         SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_FIXUP_ASUS_MODE2),
12685         SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
12686         SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE4),
12687 #endif
12688         {}
12689 };
12690 
12691 static const struct hda_model_fixup alc662_fixup_models[] = {
12692         {.id = ALC662_FIXUP_ASPIRE, .name = "aspire"},
12693         {.id = ALC662_FIXUP_IDEAPAD, .name = "ideapad"},
12694         {.id = ALC272_FIXUP_MARIO, .name = "mario"},
12695         {.id = ALC662_FIXUP_HP_RP5800, .name = "hp-rp5800"},
12696         {.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"},
12697         {.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"},
12698         {.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"},
12699         {.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"},
12700         {.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"},
12701         {.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
12702         {.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
12703         {.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
12704         {.id = ALC662_FIXUP_ZOTAC_Z68, .name = "zotac-z68"},
12705         {.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},
12706         {.id = ALC662_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc662-headset-multi"},
12707         {.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
12708         {.id = ALC662_FIXUP_HEADSET_MODE, .name = "alc662-headset"},
12709         {.id = ALC668_FIXUP_HEADSET_MODE, .name = "alc668-headset"},
12710         {.id = ALC662_FIXUP_BASS_16, .name = "bass16"},
12711         {.id = ALC662_FIXUP_BASS_1A, .name = "bass1a"},
12712         {.id = ALC668_FIXUP_AUTO_MUTE, .name = "automute"},
12713         {.id = ALC668_FIXUP_DELL_XPS13, .name = "dell-xps13"},
12714         {.id = ALC662_FIXUP_ASUS_Nx50, .name = "asus-nx50"},
12715         {.id = ALC668_FIXUP_ASUS_Nx51, .name = "asus-nx51"},
12716         {.id = ALC668_FIXUP_ASUS_G751, .name = "asus-g751"},
12717         {.id = ALC891_FIXUP_HEADSET_MODE, .name = "alc891-headset"},
12718         {.id = ALC891_FIXUP_DELL_MIC_NO_PRESENCE, .name = "alc891-headset-multi"},
12719         {.id = ALC662_FIXUP_ACER_VERITON, .name = "acer-veriton"},
12720         {.id = ALC892_FIXUP_ASROCK_MOBO, .name = "asrock-mobo"},
12721         {.id = ALC662_FIXUP_USI_HEADSET_MODE, .name = "usi-headset"},
12722         {.id = ALC662_FIXUP_LENOVO_MULTI_CODECS, .name = "dual-codecs"},
12723         {.id = ALC669_FIXUP_ACER_ASPIRE_ETHOS, .name = "aspire-ethos"},
12724         {.id = ALC897_FIXUP_UNIS_H3C_X500S, .name = "unis-h3c-x500s"},
12725         {}
12726 };
12727 
12728 static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {
12729         SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
12730                 {0x17, 0x02211010},
12731                 {0x18, 0x01a19030},
12732                 {0x1a, 0x01813040},
12733                 {0x21, 0x01014020}),
12734         SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
12735                 {0x16, 0x01813030},
12736                 {0x17, 0x02211010},
12737                 {0x18, 0x01a19040},
12738                 {0x21, 0x01014020}),
12739         SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
12740                 {0x14, 0x01014010},
12741                 {0x18, 0x01a19020},
12742                 {0x1a, 0x0181302f},
12743                 {0x1b, 0x0221401f}),
12744         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
12745                 {0x12, 0x99a30130},
12746                 {0x14, 0x90170110},
12747                 {0x15, 0x0321101f},
12748                 {0x16, 0x03011020}),
12749         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
12750                 {0x12, 0x99a30140},
12751                 {0x14, 0x90170110},
12752                 {0x15, 0x0321101f},
12753                 {0x16, 0x03011020}),
12754         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
12755                 {0x12, 0x99a30150},
12756                 {0x14, 0x90170110},
12757                 {0x15, 0x0321101f},
12758                 {0x16, 0x03011020}),
12759         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
12760                 {0x14, 0x90170110},
12761                 {0x15, 0x0321101f},
12762                 {0x16, 0x03011020}),
12763         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell XPS 15", ALC668_FIXUP_AUTO_MUTE,
12764                 {0x12, 0x90a60130},
12765                 {0x14, 0x90170110},
12766                 {0x15, 0x0321101f}),
12767         SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
12768                 {0x14, 0x01014010},
12769                 {0x17, 0x90170150},
12770                 {0x19, 0x02a11060},
12771                 {0x1b, 0x01813030},
12772                 {0x21, 0x02211020}),
12773         SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
12774                 {0x14, 0x01014010},
12775                 {0x18, 0x01a19040},
12776                 {0x1b, 0x01813030},
12777                 {0x21, 0x02211020}),
12778         SND_HDA_PIN_QUIRK(0x10ec0671, 0x103c, "HP cPC", ALC671_FIXUP_HP_HEADSET_MIC2,
12779                 {0x14, 0x01014020},
12780                 {0x17, 0x90170110},
12781                 {0x18, 0x01a19050},
12782                 {0x1b, 0x01813040},
12783                 {0x21, 0x02211030}),
12784         {}
12785 };
12786 
12787 /*
12788  */
12789 static int patch_alc662(struct hda_codec *codec)
12790 {
12791         struct alc_spec *spec;
12792         int err;
12793 
12794         err = alc_alloc_spec(codec, 0x0b);
12795         if (err < 0)
12796                 return err;
12797 
12798         spec = codec->spec;
12799 
12800         spec->shutup = alc_eapd_shutup;
12801 
12802         /* handle multiple HPs as is */
12803         spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
12804 
12805         alc_fix_pll_init(codec, 0x20, 0x04, 15);
12806 
12807         switch (codec->core.vendor_id) {
12808         case 0x10ec0668:
12809                 spec->init_hook = alc668_restore_default_value;
12810                 break;
12811         }
12812 
12813         alc_pre_init(codec);
12814 
12815         snd_hda_pick_fixup(codec, alc662_fixup_models,
12816                        alc662_fixup_tbl, alc662_fixups);
12817         snd_hda_pick_pin_fixup(codec, alc662_pin_fixup_tbl, alc662_fixups, true);
12818         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
12819 
12820         alc_auto_parse_customize_define(codec);
12821 
12822         if (has_cdefine_beep(codec))
12823                 spec->gen.beep_nid = 0x01;
12824 
12825         if ((alc_get_coef0(codec) & (1 << 14)) &&
12826             codec->bus->pci && codec->bus->pci->subsystem_vendor == 0x1025 &&
12827             spec->cdefine.platform_type == 1) {
12828                 err = alc_codec_rename(codec, "ALC272X");
12829                 if (err < 0)
12830                         goto error;
12831         }
12832 
12833         /* automatic parse from the BIOS config */
12834         err = alc662_parse_auto_config(codec);
12835         if (err < 0)
12836                 goto error;
12837 
12838         if (!spec->gen.no_analog && spec->gen.beep_nid) {
12839                 switch (codec->core.vendor_id) {
12840                 case 0x10ec0662:
12841                         err = set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
12842                         break;
12843                 case 0x10ec0272:
12844                 case 0x10ec0663:
12845                 case 0x10ec0665:
12846                 case 0x10ec0668:
12847                         err = set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
12848                         break;
12849                 case 0x10ec0273:
12850                         err = set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
12851                         break;
12852                 }
12853                 if (err < 0)
12854                         goto error;
12855         }
12856 
12857         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
12858 
12859         return 0;
12860 
12861  error:
12862         alc_free(codec);
12863         return err;
12864 }
12865 
12866 /*
12867  * ALC680 support
12868  */
12869 
12870 static int alc680_parse_auto_config(struct hda_codec *codec)
12871 {
12872         return alc_parse_auto_config(codec, NULL, NULL);
12873 }
12874 
12875 /*
12876  */
12877 static int patch_alc680(struct hda_codec *codec)
12878 {
12879         int err;
12880 
12881         /* ALC680 has no aa-loopback mixer */
12882         err = alc_alloc_spec(codec, 0);
12883         if (err < 0)
12884                 return err;
12885 
12886         /* automatic parse from the BIOS config */
12887         err = alc680_parse_auto_config(codec);
12888         if (err < 0) {
12889                 alc_free(codec);
12890                 return err;
12891         }
12892 
12893         return 0;
12894 }
12895 
12896 /*
12897  * patch entries
12898  */
12899 static const struct hda_device_id snd_hda_id_realtek[] = {
12900         HDA_CODEC_ENTRY(0x10ec0215, "ALC215", patch_alc269),
12901         HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),
12902         HDA_CODEC_ENTRY(0x10ec0222, "ALC222", patch_alc269),
12903         HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),
12904         HDA_CODEC_ENTRY(0x10ec0230, "ALC236", patch_alc269),
12905         HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),
12906         HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269),
12907         HDA_CODEC_ENTRY(0x10ec0234, "ALC234", patch_alc269),
12908         HDA_CODEC_ENTRY(0x10ec0235, "ALC233", patch_alc269),
12909         HDA_CODEC_ENTRY(0x10ec0236, "ALC236", patch_alc269),
12910         HDA_CODEC_ENTRY(0x10ec0245, "ALC245", patch_alc269),
12911         HDA_CODEC_ENTRY(0x10ec0255, "ALC255", patch_alc269),
12912         HDA_CODEC_ENTRY(0x10ec0256, "ALC256", patch_alc269),
12913         HDA_CODEC_ENTRY(0x10ec0257, "ALC257", patch_alc269),
12914         HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260),
12915         HDA_CODEC_ENTRY(0x10ec0262, "ALC262", patch_alc262),
12916         HDA_CODEC_ENTRY(0x10ec0267, "ALC267", patch_alc268),
12917         HDA_CODEC_ENTRY(0x10ec0268, "ALC268", patch_alc268),
12918         HDA_CODEC_ENTRY(0x10ec0269, "ALC269", patch_alc269),
12919         HDA_CODEC_ENTRY(0x10ec0270, "ALC270", patch_alc269),
12920         HDA_CODEC_ENTRY(0x10ec0272, "ALC272", patch_alc662),
12921         HDA_CODEC_ENTRY(0x10ec0274, "ALC274", patch_alc269),
12922         HDA_CODEC_ENTRY(0x10ec0275, "ALC275", patch_alc269),
12923         HDA_CODEC_ENTRY(0x10ec0276, "ALC276", patch_alc269),
12924         HDA_CODEC_ENTRY(0x10ec0280, "ALC280", patch_alc269),
12925         HDA_CODEC_ENTRY(0x10ec0282, "ALC282", patch_alc269),
12926         HDA_CODEC_ENTRY(0x10ec0283, "ALC283", patch_alc269),
12927         HDA_CODEC_ENTRY(0x10ec0284, "ALC284", patch_alc269),
12928         HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269),
12929         HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269),
12930         HDA_CODEC_ENTRY(0x10ec0287, "ALC287", patch_alc269),
12931         HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269),
12932         HDA_CODEC_ENTRY(0x10ec0289, "ALC289", patch_alc269),
12933         HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269),
12934         HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269),
12935         HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269),
12936         HDA_CODEC_ENTRY(0x10ec0294, "ALC294", patch_alc269),
12937         HDA_CODEC_ENTRY(0x10ec0295, "ALC295", patch_alc269),
12938         HDA_CODEC_ENTRY(0x10ec0298, "ALC298", patch_alc269),
12939         HDA_CODEC_ENTRY(0x10ec0299, "ALC299", patch_alc269),
12940         HDA_CODEC_ENTRY(0x10ec0300, "ALC300", patch_alc269),
12941         HDA_CODEC_ENTRY(0x10ec0623, "ALC623", patch_alc269),
12942         HDA_CODEC_REV_ENTRY(0x10ec0861, 0x100340, "ALC660", patch_alc861),
12943         HDA_CODEC_ENTRY(0x10ec0660, "ALC660-VD", patch_alc861vd),
12944         HDA_CODEC_ENTRY(0x10ec0861, "ALC861", patch_alc861),
12945         HDA_CODEC_ENTRY(0x10ec0862, "ALC861-VD", patch_alc861vd),
12946         HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100002, "ALC662 rev2", patch_alc882),
12947         HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100101, "ALC662 rev1", patch_alc662),
12948         HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100300, "ALC662 rev3", patch_alc662),
12949         HDA_CODEC_ENTRY(0x10ec0663, "ALC663", patch_alc662),
12950         HDA_CODEC_ENTRY(0x10ec0665, "ALC665", patch_alc662),
12951         HDA_CODEC_ENTRY(0x10ec0667, "ALC667", patch_alc662),
12952         HDA_CODEC_ENTRY(0x10ec0668, "ALC668", patch_alc662),
12953         HDA_CODEC_ENTRY(0x10ec0670, "ALC670", patch_alc662),
12954         HDA_CODEC_ENTRY(0x10ec0671, "ALC671", patch_alc662),
12955         HDA_CODEC_ENTRY(0x10ec0680, "ALC680", patch_alc680),
12956         HDA_CODEC_ENTRY(0x10ec0700, "ALC700", patch_alc269),
12957         HDA_CODEC_ENTRY(0x10ec0701, "ALC701", patch_alc269),
12958         HDA_CODEC_ENTRY(0x10ec0703, "ALC703", patch_alc269),
12959         HDA_CODEC_ENTRY(0x10ec0711, "ALC711", patch_alc269),
12960         HDA_CODEC_ENTRY(0x10ec0867, "ALC891", patch_alc662),
12961         HDA_CODEC_ENTRY(0x10ec0880, "ALC880", patch_alc880),
12962         HDA_CODEC_ENTRY(0x10ec0882, "ALC882", patch_alc882),
12963         HDA_CODEC_ENTRY(0x10ec0883, "ALC883", patch_alc882),
12964         HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100101, "ALC889A", patch_alc882),
12965         HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100103, "ALC889A", patch_alc882),
12966         HDA_CODEC_ENTRY(0x10ec0885, "ALC885", patch_alc882),
12967         HDA_CODEC_ENTRY(0x10ec0887, "ALC887", patch_alc882),
12968         HDA_CODEC_REV_ENTRY(0x10ec0888, 0x100101, "ALC1200", patch_alc882),
12969         HDA_CODEC_ENTRY(0x10ec0888, "ALC888", patch_alc882),
12970         HDA_CODEC_ENTRY(0x10ec0889, "ALC889", patch_alc882),
12971         HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662),
12972         HDA_CODEC_ENTRY(0x10ec0897, "ALC897", patch_alc662),
12973         HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882),
12974         HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882),
12975         HDA_CODEC_ENTRY(0x10ec0b00, "ALCS1200A", patch_alc882),
12976         HDA_CODEC_ENTRY(0x10ec1168, "ALC1220", patch_alc882),
12977         HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882),
12978         HDA_CODEC_ENTRY(0x19e58326, "HW8326", patch_alc269),
12979         {} /* terminator */
12980 };
12981 MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_realtek);
12982 
12983 MODULE_LICENSE("GPL");
12984 MODULE_DESCRIPTION("Realtek HD-audio codec");
12985 MODULE_IMPORT_NS(SND_HDA_SCODEC_COMPONENT);
12986 
12987 static struct hda_codec_driver realtek_driver = {
12988         .id = snd_hda_id_realtek,
12989 };
12990 
12991 module_hda_codec_driver(realtek_driver);
12992 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php