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