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