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