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