]> git.karo-electronics.de Git - karo-tx-linux.git/blob - sound/pci/hda/patch_realtek.c
ufs_truncate_blocks(): fix the case when size is in the last direct block
[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(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
2332         SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
2333         SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_FIXUP_EAPD),
2334         SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Y530", ALC882_FIXUP_LENOVO_Y530),
2335         SND_PCI_QUIRK(0x8086, 0x0022, "DX58SO", ALC889_FIXUP_COEF),
2336         {}
2337 };
2338
2339 static const struct hda_model_fixup alc882_fixup_models[] = {
2340         {.id = ALC882_FIXUP_ACER_ASPIRE_4930G, .name = "acer-aspire-4930g"},
2341         {.id = ALC882_FIXUP_ACER_ASPIRE_8930G, .name = "acer-aspire-8930g"},
2342         {.id = ALC883_FIXUP_ACER_EAPD, .name = "acer-aspire"},
2343         {.id = ALC882_FIXUP_INV_DMIC, .name = "inv-dmic"},
2344         {.id = ALC882_FIXUP_NO_PRIMARY_HP, .name = "no-primary-hp"},
2345         {}
2346 };
2347
2348 /*
2349  * BIOS auto configuration
2350  */
2351 /* almost identical with ALC880 parser... */
2352 static int alc882_parse_auto_config(struct hda_codec *codec)
2353 {
2354         static const hda_nid_t alc882_ignore[] = { 0x1d, 0 };
2355         static const hda_nid_t alc882_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2356         return alc_parse_auto_config(codec, alc882_ignore, alc882_ssids);
2357 }
2358
2359 /*
2360  */
2361 static int patch_alc882(struct hda_codec *codec)
2362 {
2363         struct alc_spec *spec;
2364         int err;
2365
2366         err = alc_alloc_spec(codec, 0x0b);
2367         if (err < 0)
2368                 return err;
2369
2370         spec = codec->spec;
2371
2372         switch (codec->core.vendor_id) {
2373         case 0x10ec0882:
2374         case 0x10ec0885:
2375         case 0x10ec0900:
2376         case 0x10ec1220:
2377                 break;
2378         default:
2379                 /* ALC883 and variants */
2380                 alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2381                 break;
2382         }
2383
2384         snd_hda_pick_fixup(codec, alc882_fixup_models, alc882_fixup_tbl,
2385                        alc882_fixups);
2386         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2387
2388         alc_auto_parse_customize_define(codec);
2389
2390         if (has_cdefine_beep(codec))
2391                 spec->gen.beep_nid = 0x01;
2392
2393         /* automatic parse from the BIOS config */
2394         err = alc882_parse_auto_config(codec);
2395         if (err < 0)
2396                 goto error;
2397
2398         if (!spec->gen.no_analog && spec->gen.beep_nid)
2399                 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2400
2401         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2402
2403         return 0;
2404
2405  error:
2406         alc_free(codec);
2407         return err;
2408 }
2409
2410
2411 /*
2412  * ALC262 support
2413  */
2414 static int alc262_parse_auto_config(struct hda_codec *codec)
2415 {
2416         static const hda_nid_t alc262_ignore[] = { 0x1d, 0 };
2417         static const hda_nid_t alc262_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2418         return alc_parse_auto_config(codec, alc262_ignore, alc262_ssids);
2419 }
2420
2421 /*
2422  * Pin config fixes
2423  */
2424 enum {
2425         ALC262_FIXUP_FSC_H270,
2426         ALC262_FIXUP_FSC_S7110,
2427         ALC262_FIXUP_HP_Z200,
2428         ALC262_FIXUP_TYAN,
2429         ALC262_FIXUP_LENOVO_3000,
2430         ALC262_FIXUP_BENQ,
2431         ALC262_FIXUP_BENQ_T31,
2432         ALC262_FIXUP_INV_DMIC,
2433         ALC262_FIXUP_INTEL_BAYLEYBAY,
2434 };
2435
2436 static const struct hda_fixup alc262_fixups[] = {
2437         [ALC262_FIXUP_FSC_H270] = {
2438                 .type = HDA_FIXUP_PINS,
2439                 .v.pins = (const struct hda_pintbl[]) {
2440                         { 0x14, 0x99130110 }, /* speaker */
2441                         { 0x15, 0x0221142f }, /* front HP */
2442                         { 0x1b, 0x0121141f }, /* rear HP */
2443                         { }
2444                 }
2445         },
2446         [ALC262_FIXUP_FSC_S7110] = {
2447                 .type = HDA_FIXUP_PINS,
2448                 .v.pins = (const struct hda_pintbl[]) {
2449                         { 0x15, 0x90170110 }, /* speaker */
2450                         { }
2451                 },
2452                 .chained = true,
2453                 .chain_id = ALC262_FIXUP_BENQ,
2454         },
2455         [ALC262_FIXUP_HP_Z200] = {
2456                 .type = HDA_FIXUP_PINS,
2457                 .v.pins = (const struct hda_pintbl[]) {
2458                         { 0x16, 0x99130120 }, /* internal speaker */
2459                         { }
2460                 }
2461         },
2462         [ALC262_FIXUP_TYAN] = {
2463                 .type = HDA_FIXUP_PINS,
2464                 .v.pins = (const struct hda_pintbl[]) {
2465                         { 0x14, 0x1993e1f0 }, /* int AUX */
2466                         { }
2467                 }
2468         },
2469         [ALC262_FIXUP_LENOVO_3000] = {
2470                 .type = HDA_FIXUP_PINCTLS,
2471                 .v.pins = (const struct hda_pintbl[]) {
2472                         { 0x19, PIN_VREF50 },
2473                         {}
2474                 },
2475                 .chained = true,
2476                 .chain_id = ALC262_FIXUP_BENQ,
2477         },
2478         [ALC262_FIXUP_BENQ] = {
2479                 .type = HDA_FIXUP_VERBS,
2480                 .v.verbs = (const struct hda_verb[]) {
2481                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2482                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3070 },
2483                         {}
2484                 }
2485         },
2486         [ALC262_FIXUP_BENQ_T31] = {
2487                 .type = HDA_FIXUP_VERBS,
2488                 .v.verbs = (const struct hda_verb[]) {
2489                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x07 },
2490                         { 0x20, AC_VERB_SET_PROC_COEF, 0x3050 },
2491                         {}
2492                 }
2493         },
2494         [ALC262_FIXUP_INV_DMIC] = {
2495                 .type = HDA_FIXUP_FUNC,
2496                 .v.func = alc_fixup_inv_dmic,
2497         },
2498         [ALC262_FIXUP_INTEL_BAYLEYBAY] = {
2499                 .type = HDA_FIXUP_FUNC,
2500                 .v.func = alc_fixup_no_depop_delay,
2501         },
2502 };
2503
2504 static const struct snd_pci_quirk alc262_fixup_tbl[] = {
2505         SND_PCI_QUIRK(0x103c, 0x170b, "HP Z200", ALC262_FIXUP_HP_Z200),
2506         SND_PCI_QUIRK(0x10cf, 0x1397, "Fujitsu Lifebook S7110", ALC262_FIXUP_FSC_S7110),
2507         SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FIXUP_BENQ),
2508         SND_PCI_QUIRK(0x10f1, 0x2915, "Tyan Thunder n6650W", ALC262_FIXUP_TYAN),
2509         SND_PCI_QUIRK(0x1734, 0x1147, "FSC Celsius H270", ALC262_FIXUP_FSC_H270),
2510         SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000", ALC262_FIXUP_LENOVO_3000),
2511         SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_FIXUP_BENQ),
2512         SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_FIXUP_BENQ_T31),
2513         SND_PCI_QUIRK(0x8086, 0x7270, "BayleyBay", ALC262_FIXUP_INTEL_BAYLEYBAY),
2514         {}
2515 };
2516
2517 static const struct hda_model_fixup alc262_fixup_models[] = {
2518         {.id = ALC262_FIXUP_INV_DMIC, .name = "inv-dmic"},
2519         {}
2520 };
2521
2522 /*
2523  */
2524 static int patch_alc262(struct hda_codec *codec)
2525 {
2526         struct alc_spec *spec;
2527         int err;
2528
2529         err = alc_alloc_spec(codec, 0x0b);
2530         if (err < 0)
2531                 return err;
2532
2533         spec = codec->spec;
2534         spec->gen.shared_mic_vref_pin = 0x18;
2535
2536         spec->shutup = alc_eapd_shutup;
2537
2538 #if 0
2539         /* pshou 07/11/05  set a zero PCM sample to DAC when FIFO is
2540          * under-run
2541          */
2542         alc_update_coefex_idx(codec, 0x1a, 7, 0, 0x80);
2543 #endif
2544         alc_fix_pll_init(codec, 0x20, 0x0a, 10);
2545
2546         snd_hda_pick_fixup(codec, alc262_fixup_models, alc262_fixup_tbl,
2547                        alc262_fixups);
2548         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2549
2550         alc_auto_parse_customize_define(codec);
2551
2552         if (has_cdefine_beep(codec))
2553                 spec->gen.beep_nid = 0x01;
2554
2555         /* automatic parse from the BIOS config */
2556         err = alc262_parse_auto_config(codec);
2557         if (err < 0)
2558                 goto error;
2559
2560         if (!spec->gen.no_analog && spec->gen.beep_nid)
2561                 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
2562
2563         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2564
2565         return 0;
2566
2567  error:
2568         alc_free(codec);
2569         return err;
2570 }
2571
2572 /*
2573  *  ALC268
2574  */
2575 /* bind Beep switches of both NID 0x0f and 0x10 */
2576 static const struct hda_bind_ctls alc268_bind_beep_sw = {
2577         .ops = &snd_hda_bind_sw,
2578         .values = {
2579                 HDA_COMPOSE_AMP_VAL(0x0f, 3, 1, HDA_INPUT),
2580                 HDA_COMPOSE_AMP_VAL(0x10, 3, 1, HDA_INPUT),
2581                 0
2582         },
2583 };
2584
2585 static const struct snd_kcontrol_new alc268_beep_mixer[] = {
2586         HDA_CODEC_VOLUME("Beep Playback Volume", 0x1d, 0x0, HDA_INPUT),
2587         HDA_BIND_SW("Beep Playback Switch", &alc268_bind_beep_sw),
2588         { }
2589 };
2590
2591 /* set PCBEEP vol = 0, mute connections */
2592 static const struct hda_verb alc268_beep_init_verbs[] = {
2593         {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
2594         {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2595         {0x10, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
2596         { }
2597 };
2598
2599 enum {
2600         ALC268_FIXUP_INV_DMIC,
2601         ALC268_FIXUP_HP_EAPD,
2602         ALC268_FIXUP_SPDIF,
2603 };
2604
2605 static const struct hda_fixup alc268_fixups[] = {
2606         [ALC268_FIXUP_INV_DMIC] = {
2607                 .type = HDA_FIXUP_FUNC,
2608                 .v.func = alc_fixup_inv_dmic,
2609         },
2610         [ALC268_FIXUP_HP_EAPD] = {
2611                 .type = HDA_FIXUP_VERBS,
2612                 .v.verbs = (const struct hda_verb[]) {
2613                         {0x15, AC_VERB_SET_EAPD_BTLENABLE, 0},
2614                         {}
2615                 }
2616         },
2617         [ALC268_FIXUP_SPDIF] = {
2618                 .type = HDA_FIXUP_PINS,
2619                 .v.pins = (const struct hda_pintbl[]) {
2620                         { 0x1e, 0x014b1180 }, /* enable SPDIF out */
2621                         {}
2622                 }
2623         },
2624 };
2625
2626 static const struct hda_model_fixup alc268_fixup_models[] = {
2627         {.id = ALC268_FIXUP_INV_DMIC, .name = "inv-dmic"},
2628         {.id = ALC268_FIXUP_HP_EAPD, .name = "hp-eapd"},
2629         {}
2630 };
2631
2632 static const struct snd_pci_quirk alc268_fixup_tbl[] = {
2633         SND_PCI_QUIRK(0x1025, 0x0139, "Acer TravelMate 6293", ALC268_FIXUP_SPDIF),
2634         SND_PCI_QUIRK(0x1025, 0x015b, "Acer AOA 150 (ZG5)", ALC268_FIXUP_INV_DMIC),
2635         /* below is codec SSID since multiple Toshiba laptops have the
2636          * same PCI SSID 1179:ff00
2637          */
2638         SND_PCI_QUIRK(0x1179, 0xff06, "Toshiba P200", ALC268_FIXUP_HP_EAPD),
2639         {}
2640 };
2641
2642 /*
2643  * BIOS auto configuration
2644  */
2645 static int alc268_parse_auto_config(struct hda_codec *codec)
2646 {
2647         static const hda_nid_t alc268_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2648         return alc_parse_auto_config(codec, NULL, alc268_ssids);
2649 }
2650
2651 /*
2652  */
2653 static int patch_alc268(struct hda_codec *codec)
2654 {
2655         struct alc_spec *spec;
2656         int err;
2657
2658         /* ALC268 has no aa-loopback mixer */
2659         err = alc_alloc_spec(codec, 0);
2660         if (err < 0)
2661                 return err;
2662
2663         spec = codec->spec;
2664         spec->gen.beep_nid = 0x01;
2665
2666         spec->shutup = alc_eapd_shutup;
2667
2668         snd_hda_pick_fixup(codec, alc268_fixup_models, alc268_fixup_tbl, alc268_fixups);
2669         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
2670
2671         /* automatic parse from the BIOS config */
2672         err = alc268_parse_auto_config(codec);
2673         if (err < 0)
2674                 goto error;
2675
2676         if (err > 0 && !spec->gen.no_analog &&
2677             spec->gen.autocfg.speaker_pins[0] != 0x1d) {
2678                 add_mixer(spec, alc268_beep_mixer);
2679                 snd_hda_add_verbs(codec, alc268_beep_init_verbs);
2680                 if (!query_amp_caps(codec, 0x1d, HDA_INPUT))
2681                         /* override the amp caps for beep generator */
2682                         snd_hda_override_amp_caps(codec, 0x1d, HDA_INPUT,
2683                                           (0x0c << AC_AMPCAP_OFFSET_SHIFT) |
2684                                           (0x0c << AC_AMPCAP_NUM_STEPS_SHIFT) |
2685                                           (0x07 << AC_AMPCAP_STEP_SIZE_SHIFT) |
2686                                           (0 << AC_AMPCAP_MUTE_SHIFT));
2687         }
2688
2689         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
2690
2691         return 0;
2692
2693  error:
2694         alc_free(codec);
2695         return err;
2696 }
2697
2698 /*
2699  * ALC269
2700  */
2701
2702 static const struct hda_pcm_stream alc269_44k_pcm_analog_playback = {
2703         .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
2704 };
2705
2706 static const struct hda_pcm_stream alc269_44k_pcm_analog_capture = {
2707         .rates = SNDRV_PCM_RATE_44100, /* fixed rate */
2708 };
2709
2710 /* different alc269-variants */
2711 enum {
2712         ALC269_TYPE_ALC269VA,
2713         ALC269_TYPE_ALC269VB,
2714         ALC269_TYPE_ALC269VC,
2715         ALC269_TYPE_ALC269VD,
2716         ALC269_TYPE_ALC280,
2717         ALC269_TYPE_ALC282,
2718         ALC269_TYPE_ALC283,
2719         ALC269_TYPE_ALC284,
2720         ALC269_TYPE_ALC285,
2721         ALC269_TYPE_ALC286,
2722         ALC269_TYPE_ALC298,
2723         ALC269_TYPE_ALC255,
2724         ALC269_TYPE_ALC256,
2725         ALC269_TYPE_ALC225,
2726         ALC269_TYPE_ALC294,
2727         ALC269_TYPE_ALC700,
2728 };
2729
2730 /*
2731  * BIOS auto configuration
2732  */
2733 static int alc269_parse_auto_config(struct hda_codec *codec)
2734 {
2735         static const hda_nid_t alc269_ignore[] = { 0x1d, 0 };
2736         static const hda_nid_t alc269_ssids[] = { 0, 0x1b, 0x14, 0x21 };
2737         static const hda_nid_t alc269va_ssids[] = { 0x15, 0x1b, 0x14, 0 };
2738         struct alc_spec *spec = codec->spec;
2739         const hda_nid_t *ssids;
2740
2741         switch (spec->codec_variant) {
2742         case ALC269_TYPE_ALC269VA:
2743         case ALC269_TYPE_ALC269VC:
2744         case ALC269_TYPE_ALC280:
2745         case ALC269_TYPE_ALC284:
2746         case ALC269_TYPE_ALC285:
2747                 ssids = alc269va_ssids;
2748                 break;
2749         case ALC269_TYPE_ALC269VB:
2750         case ALC269_TYPE_ALC269VD:
2751         case ALC269_TYPE_ALC282:
2752         case ALC269_TYPE_ALC283:
2753         case ALC269_TYPE_ALC286:
2754         case ALC269_TYPE_ALC298:
2755         case ALC269_TYPE_ALC255:
2756         case ALC269_TYPE_ALC256:
2757         case ALC269_TYPE_ALC225:
2758         case ALC269_TYPE_ALC294:
2759         case ALC269_TYPE_ALC700:
2760                 ssids = alc269_ssids;
2761                 break;
2762         default:
2763                 ssids = alc269_ssids;
2764                 break;
2765         }
2766
2767         return alc_parse_auto_config(codec, alc269_ignore, ssids);
2768 }
2769
2770 static int find_ext_mic_pin(struct hda_codec *codec);
2771
2772 static void alc286_shutup(struct hda_codec *codec)
2773 {
2774         int i;
2775         int mic_pin = find_ext_mic_pin(codec);
2776         /* don't shut up pins when unloading the driver; otherwise it breaks
2777          * the default pin setup at the next load of the driver
2778          */
2779         if (codec->bus->shutdown)
2780                 return;
2781         for (i = 0; i < codec->init_pins.used; i++) {
2782                 struct hda_pincfg *pin = snd_array_elem(&codec->init_pins, i);
2783                 /* use read here for syncing after issuing each verb */
2784                 if (pin->nid != mic_pin)
2785                         snd_hda_codec_read(codec, pin->nid, 0,
2786                                         AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
2787         }
2788         codec->pins_shutup = 1;
2789 }
2790
2791 static void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)
2792 {
2793         alc_update_coef_idx(codec, 0x04, 1 << 11, power_up ? (1 << 11) : 0);
2794 }
2795
2796 static void alc269_shutup(struct hda_codec *codec)
2797 {
2798         struct alc_spec *spec = codec->spec;
2799
2800         if (spec->codec_variant == ALC269_TYPE_ALC269VB)
2801                 alc269vb_toggle_power_output(codec, 0);
2802         if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
2803                         (alc_get_coef0(codec) & 0x00ff) == 0x018) {
2804                 msleep(150);
2805         }
2806         snd_hda_shutup_pins(codec);
2807 }
2808
2809 static struct coef_fw alc282_coefs[] = {
2810         WRITE_COEF(0x03, 0x0002), /* Power Down Control */
2811         UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
2812         WRITE_COEF(0x07, 0x0200), /* DMIC control */
2813         UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
2814         UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
2815         WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
2816         WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
2817         WRITE_COEF(0x0e, 0x6e00), /* LDO1/2/3, DAC/ADC */
2818         UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
2819         UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
2820         WRITE_COEF(0x6f, 0x0), /* Class D test 4 */
2821         UPDATE_COEF(0x0c, 0xfe00, 0), /* IO power down directly */
2822         WRITE_COEF(0x34, 0xa0c0), /* ANC */
2823         UPDATE_COEF(0x16, 0x0008, 0), /* AGC MUX */
2824         UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
2825         UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
2826         WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
2827         WRITE_COEF(0x63, 0x2902), /* PLL */
2828         WRITE_COEF(0x68, 0xa080), /* capless control 2 */
2829         WRITE_COEF(0x69, 0x3400), /* capless control 3 */
2830         WRITE_COEF(0x6a, 0x2f3e), /* capless control 4 */
2831         WRITE_COEF(0x6b, 0x0), /* capless control 5 */
2832         UPDATE_COEF(0x6d, 0x0fff, 0x0900), /* class D test 2 */
2833         WRITE_COEF(0x6e, 0x110a), /* class D test 3 */
2834         UPDATE_COEF(0x70, 0x00f8, 0x00d8), /* class D test 5 */
2835         WRITE_COEF(0x71, 0x0014), /* class D test 6 */
2836         WRITE_COEF(0x72, 0xc2ba), /* classD OCP */
2837         UPDATE_COEF(0x77, 0x0f80, 0), /* classD pure DC test */
2838         WRITE_COEF(0x6c, 0xfc06), /* Class D amp control */
2839         {}
2840 };
2841
2842 static void alc282_restore_default_value(struct hda_codec *codec)
2843 {
2844         alc_process_coef_fw(codec, alc282_coefs);
2845 }
2846
2847 static void alc282_init(struct hda_codec *codec)
2848 {
2849         struct alc_spec *spec = codec->spec;
2850         hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
2851         bool hp_pin_sense;
2852         int coef78;
2853
2854         alc282_restore_default_value(codec);
2855
2856         if (!hp_pin)
2857                 return;
2858         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
2859         coef78 = alc_read_coef_idx(codec, 0x78);
2860
2861         /* Index 0x78 Direct Drive HP AMP LPM Control 1 */
2862         /* Headphone capless set to high power mode */
2863         alc_write_coef_idx(codec, 0x78, 0x9004);
2864
2865         if (hp_pin_sense)
2866                 msleep(2);
2867
2868         snd_hda_codec_write(codec, hp_pin, 0,
2869                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
2870
2871         if (hp_pin_sense)
2872                 msleep(85);
2873
2874         snd_hda_codec_write(codec, hp_pin, 0,
2875                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
2876
2877         if (hp_pin_sense)
2878                 msleep(100);
2879
2880         /* Headphone capless set to normal mode */
2881         alc_write_coef_idx(codec, 0x78, coef78);
2882 }
2883
2884 static void alc282_shutup(struct hda_codec *codec)
2885 {
2886         struct alc_spec *spec = codec->spec;
2887         hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
2888         bool hp_pin_sense;
2889         int coef78;
2890
2891         if (!hp_pin) {
2892                 alc269_shutup(codec);
2893                 return;
2894         }
2895
2896         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
2897         coef78 = alc_read_coef_idx(codec, 0x78);
2898         alc_write_coef_idx(codec, 0x78, 0x9004);
2899
2900         if (hp_pin_sense)
2901                 msleep(2);
2902
2903         snd_hda_codec_write(codec, hp_pin, 0,
2904                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
2905
2906         if (hp_pin_sense)
2907                 msleep(85);
2908
2909         snd_hda_codec_write(codec, hp_pin, 0,
2910                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
2911
2912         if (hp_pin_sense)
2913                 msleep(100);
2914
2915         alc_auto_setup_eapd(codec, false);
2916         snd_hda_shutup_pins(codec);
2917         alc_write_coef_idx(codec, 0x78, coef78);
2918 }
2919
2920 static struct coef_fw alc283_coefs[] = {
2921         WRITE_COEF(0x03, 0x0002), /* Power Down Control */
2922         UPDATE_COEF(0x05, 0xff3f, 0x0700), /* FIFO and filter clock */
2923         WRITE_COEF(0x07, 0x0200), /* DMIC control */
2924         UPDATE_COEF(0x06, 0x00f0, 0), /* Analog clock */
2925         UPDATE_COEF(0x08, 0xfffc, 0x0c2c), /* JD */
2926         WRITE_COEF(0x0a, 0xcccc), /* JD offset1 */
2927         WRITE_COEF(0x0b, 0xcccc), /* JD offset2 */
2928         WRITE_COEF(0x0e, 0x6fc0), /* LDO1/2/3, DAC/ADC */
2929         UPDATE_COEF(0x0f, 0xf800, 0x1000), /* JD */
2930         UPDATE_COEF(0x10, 0xfc00, 0x0c00), /* Capless */
2931         WRITE_COEF(0x3a, 0x0), /* Class D test 4 */
2932         UPDATE_COEF(0x0c, 0xfe00, 0x0), /* IO power down directly */
2933         WRITE_COEF(0x22, 0xa0c0), /* ANC */
2934         UPDATE_COEFEX(0x53, 0x01, 0x000f, 0x0008), /* AGC MUX */
2935         UPDATE_COEF(0x1d, 0x00e0, 0), /* DAC simple content protection */
2936         UPDATE_COEF(0x1f, 0x00e0, 0), /* ADC simple content protection */
2937         WRITE_COEF(0x21, 0x8804), /* DAC ADC Zero Detection */
2938         WRITE_COEF(0x2e, 0x2902), /* PLL */
2939         WRITE_COEF(0x33, 0xa080), /* capless control 2 */
2940         WRITE_COEF(0x34, 0x3400), /* capless control 3 */
2941         WRITE_COEF(0x35, 0x2f3e), /* capless control 4 */
2942         WRITE_COEF(0x36, 0x0), /* capless control 5 */
2943         UPDATE_COEF(0x38, 0x0fff, 0x0900), /* class D test 2 */
2944         WRITE_COEF(0x39, 0x110a), /* class D test 3 */
2945         UPDATE_COEF(0x3b, 0x00f8, 0x00d8), /* class D test 5 */
2946         WRITE_COEF(0x3c, 0x0014), /* class D test 6 */
2947         WRITE_COEF(0x3d, 0xc2ba), /* classD OCP */
2948         UPDATE_COEF(0x42, 0x0f80, 0x0), /* classD pure DC test */
2949         WRITE_COEF(0x49, 0x0), /* test mode */
2950         UPDATE_COEF(0x40, 0xf800, 0x9800), /* Class D DC enable */
2951         UPDATE_COEF(0x42, 0xf000, 0x2000), /* DC offset */
2952         WRITE_COEF(0x37, 0xfc06), /* Class D amp control */
2953         UPDATE_COEF(0x1b, 0x8000, 0), /* HP JD control */
2954         {}
2955 };
2956
2957 static void alc283_restore_default_value(struct hda_codec *codec)
2958 {
2959         alc_process_coef_fw(codec, alc283_coefs);
2960 }
2961
2962 static void alc283_init(struct hda_codec *codec)
2963 {
2964         struct alc_spec *spec = codec->spec;
2965         hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
2966         bool hp_pin_sense;
2967
2968         if (!spec->gen.autocfg.hp_outs) {
2969                 if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
2970                         hp_pin = spec->gen.autocfg.line_out_pins[0];
2971         }
2972
2973         alc283_restore_default_value(codec);
2974
2975         if (!hp_pin)
2976                 return;
2977
2978         msleep(30);
2979         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
2980
2981         /* Index 0x43 Direct Drive HP AMP LPM Control 1 */
2982         /* Headphone capless set to high power mode */
2983         alc_write_coef_idx(codec, 0x43, 0x9004);
2984
2985         snd_hda_codec_write(codec, hp_pin, 0,
2986                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
2987
2988         if (hp_pin_sense)
2989                 msleep(85);
2990
2991         snd_hda_codec_write(codec, hp_pin, 0,
2992                             AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT);
2993
2994         if (hp_pin_sense)
2995                 msleep(85);
2996         /* Index 0x46 Combo jack auto switch control 2 */
2997         /* 3k pull low control for Headset jack. */
2998         alc_update_coef_idx(codec, 0x46, 3 << 12, 0);
2999         /* Headphone capless set to normal mode */
3000         alc_write_coef_idx(codec, 0x43, 0x9614);
3001 }
3002
3003 static void alc283_shutup(struct hda_codec *codec)
3004 {
3005         struct alc_spec *spec = codec->spec;
3006         hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
3007         bool hp_pin_sense;
3008
3009         if (!spec->gen.autocfg.hp_outs) {
3010                 if (spec->gen.autocfg.line_out_type == AC_JACK_HP_OUT)
3011                         hp_pin = spec->gen.autocfg.line_out_pins[0];
3012         }
3013
3014         if (!hp_pin) {
3015                 alc269_shutup(codec);
3016                 return;
3017         }
3018
3019         hp_pin_sense = snd_hda_jack_detect(codec, hp_pin);
3020
3021         alc_write_coef_idx(codec, 0x43, 0x9004);
3022
3023         /*depop hp during suspend*/
3024         alc_write_coef_idx(codec, 0x06, 0x2100);
3025
3026         snd_hda_codec_write(codec, hp_pin, 0,
3027                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
3028
3029         if (hp_pin_sense)
3030                 msleep(100);
3031
3032         snd_hda_codec_write(codec, hp_pin, 0,
3033                             AC_VERB_SET_PIN_WIDGET_CONTROL, 0x0);
3034
3035         alc_update_coef_idx(codec, 0x46, 0, 3 << 12);
3036
3037         if (hp_pin_sense)
3038                 msleep(100);
3039         alc_auto_setup_eapd(codec, false);
3040         snd_hda_shutup_pins(codec);
3041         alc_write_coef_idx(codec, 0x43, 0x9614);
3042 }
3043
3044 static void alc5505_coef_set(struct hda_codec *codec, unsigned int index_reg,
3045                              unsigned int val)
3046 {
3047         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3048         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val & 0xffff); /* LSB */
3049         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_PROC_COEF, val >> 16); /* MSB */
3050 }
3051
3052 static int alc5505_coef_get(struct hda_codec *codec, unsigned int index_reg)
3053 {
3054         unsigned int val;
3055
3056         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_COEF_INDEX, index_reg >> 1);
3057         val = snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3058                 & 0xffff;
3059         val |= snd_hda_codec_read(codec, 0x51, 0, AC_VERB_GET_PROC_COEF, 0)
3060                 << 16;
3061         return val;
3062 }
3063
3064 static void alc5505_dsp_halt(struct hda_codec *codec)
3065 {
3066         unsigned int val;
3067
3068         alc5505_coef_set(codec, 0x3000, 0x000c); /* DSP CPU stop */
3069         alc5505_coef_set(codec, 0x880c, 0x0008); /* DDR enter self refresh */
3070         alc5505_coef_set(codec, 0x61c0, 0x11110080); /* Clock control for PLL and CPU */
3071         alc5505_coef_set(codec, 0x6230, 0xfc0d4011); /* Disable Input OP */
3072         alc5505_coef_set(codec, 0x61b4, 0x040a2b03); /* Stop PLL2 */
3073         alc5505_coef_set(codec, 0x61b0, 0x00005b17); /* Stop PLL1 */
3074         alc5505_coef_set(codec, 0x61b8, 0x04133303); /* Stop PLL3 */
3075         val = alc5505_coef_get(codec, 0x6220);
3076         alc5505_coef_set(codec, 0x6220, (val | 0x3000)); /* switch Ringbuffer clock to DBUS clock */
3077 }
3078
3079 static void alc5505_dsp_back_from_halt(struct hda_codec *codec)
3080 {
3081         alc5505_coef_set(codec, 0x61b8, 0x04133302);
3082         alc5505_coef_set(codec, 0x61b0, 0x00005b16);
3083         alc5505_coef_set(codec, 0x61b4, 0x040a2b02);
3084         alc5505_coef_set(codec, 0x6230, 0xf80d4011);
3085         alc5505_coef_set(codec, 0x6220, 0x2002010f);
3086         alc5505_coef_set(codec, 0x880c, 0x00000004);
3087 }
3088
3089 static void alc5505_dsp_init(struct hda_codec *codec)
3090 {
3091         unsigned int val;
3092
3093         alc5505_dsp_halt(codec);
3094         alc5505_dsp_back_from_halt(codec);
3095         alc5505_coef_set(codec, 0x61b0, 0x5b14); /* PLL1 control */
3096         alc5505_coef_set(codec, 0x61b0, 0x5b16);
3097         alc5505_coef_set(codec, 0x61b4, 0x04132b00); /* PLL2 control */
3098         alc5505_coef_set(codec, 0x61b4, 0x04132b02);
3099         alc5505_coef_set(codec, 0x61b8, 0x041f3300); /* PLL3 control*/
3100         alc5505_coef_set(codec, 0x61b8, 0x041f3302);
3101         snd_hda_codec_write(codec, 0x51, 0, AC_VERB_SET_CODEC_RESET, 0); /* Function reset */
3102         alc5505_coef_set(codec, 0x61b8, 0x041b3302);
3103         alc5505_coef_set(codec, 0x61b8, 0x04173302);
3104         alc5505_coef_set(codec, 0x61b8, 0x04163302);
3105         alc5505_coef_set(codec, 0x8800, 0x348b328b); /* DRAM control */
3106         alc5505_coef_set(codec, 0x8808, 0x00020022); /* DRAM control */
3107         alc5505_coef_set(codec, 0x8818, 0x00000400); /* DRAM control */
3108
3109         val = alc5505_coef_get(codec, 0x6200) >> 16; /* Read revision ID */
3110         if (val <= 3)
3111                 alc5505_coef_set(codec, 0x6220, 0x2002010f); /* I/O PAD Configuration */
3112         else
3113                 alc5505_coef_set(codec, 0x6220, 0x6002018f);
3114
3115         alc5505_coef_set(codec, 0x61ac, 0x055525f0); /**/
3116         alc5505_coef_set(codec, 0x61c0, 0x12230080); /* Clock control */
3117         alc5505_coef_set(codec, 0x61b4, 0x040e2b02); /* PLL2 control */
3118         alc5505_coef_set(codec, 0x61bc, 0x010234f8); /* OSC Control */
3119         alc5505_coef_set(codec, 0x880c, 0x00000004); /* DRAM Function control */
3120         alc5505_coef_set(codec, 0x880c, 0x00000003);
3121         alc5505_coef_set(codec, 0x880c, 0x00000010);
3122
3123 #ifdef HALT_REALTEK_ALC5505
3124         alc5505_dsp_halt(codec);
3125 #endif
3126 }
3127
3128 #ifdef HALT_REALTEK_ALC5505
3129 #define alc5505_dsp_suspend(codec)      /* NOP */
3130 #define alc5505_dsp_resume(codec)       /* NOP */
3131 #else
3132 #define alc5505_dsp_suspend(codec)      alc5505_dsp_halt(codec)
3133 #define alc5505_dsp_resume(codec)       alc5505_dsp_back_from_halt(codec)
3134 #endif
3135
3136 #ifdef CONFIG_PM
3137 static int alc269_suspend(struct hda_codec *codec)
3138 {
3139         struct alc_spec *spec = codec->spec;
3140
3141         if (spec->has_alc5505_dsp)
3142                 alc5505_dsp_suspend(codec);
3143         return alc_suspend(codec);
3144 }
3145
3146 static int alc269_resume(struct hda_codec *codec)
3147 {
3148         struct alc_spec *spec = codec->spec;
3149
3150         if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3151                 alc269vb_toggle_power_output(codec, 0);
3152         if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3153                         (alc_get_coef0(codec) & 0x00ff) == 0x018) {
3154                 msleep(150);
3155         }
3156
3157         codec->patch_ops.init(codec);
3158
3159         if (spec->codec_variant == ALC269_TYPE_ALC269VB)
3160                 alc269vb_toggle_power_output(codec, 1);
3161         if (spec->codec_variant == ALC269_TYPE_ALC269VB &&
3162                         (alc_get_coef0(codec) & 0x00ff) == 0x017) {
3163                 msleep(200);
3164         }
3165
3166         regcache_sync(codec->core.regmap);
3167         hda_call_check_power_status(codec, 0x01);
3168
3169         /* on some machine, the BIOS will clear the codec gpio data when enter
3170          * suspend, and won't restore the data after resume, so we restore it
3171          * in the driver.
3172          */
3173         if (spec->gpio_led)
3174                 snd_hda_codec_write(codec, codec->core.afg, 0, AC_VERB_SET_GPIO_DATA,
3175                             spec->gpio_led);
3176
3177         if (spec->has_alc5505_dsp)
3178                 alc5505_dsp_resume(codec);
3179
3180         return 0;
3181 }
3182 #endif /* CONFIG_PM */
3183
3184 static void alc269_fixup_pincfg_no_hp_to_lineout(struct hda_codec *codec,
3185                                                  const struct hda_fixup *fix, int action)
3186 {
3187         struct alc_spec *spec = codec->spec;
3188
3189         if (action == HDA_FIXUP_ACT_PRE_PROBE)
3190                 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
3191 }
3192
3193 static void alc269_fixup_hweq(struct hda_codec *codec,
3194                                const struct hda_fixup *fix, int action)
3195 {
3196         if (action == HDA_FIXUP_ACT_INIT)
3197                 alc_update_coef_idx(codec, 0x1e, 0, 0x80);
3198 }
3199
3200 static void alc269_fixup_headset_mic(struct hda_codec *codec,
3201                                        const struct hda_fixup *fix, int action)
3202 {
3203         struct alc_spec *spec = codec->spec;
3204
3205         if (action == HDA_FIXUP_ACT_PRE_PROBE)
3206                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
3207 }
3208
3209 static void alc271_fixup_dmic(struct hda_codec *codec,
3210                               const struct hda_fixup *fix, int action)
3211 {
3212         static const struct hda_verb verbs[] = {
3213                 {0x20, AC_VERB_SET_COEF_INDEX, 0x0d},
3214                 {0x20, AC_VERB_SET_PROC_COEF, 0x4000},
3215                 {}
3216         };
3217         unsigned int cfg;
3218
3219         if (strcmp(codec->core.chip_name, "ALC271X") &&
3220             strcmp(codec->core.chip_name, "ALC269VB"))
3221                 return;
3222         cfg = snd_hda_codec_get_pincfg(codec, 0x12);
3223         if (get_defcfg_connect(cfg) == AC_JACK_PORT_FIXED)
3224                 snd_hda_sequence_write(codec, verbs);
3225 }
3226
3227 static void alc269_fixup_pcm_44k(struct hda_codec *codec,
3228                                  const struct hda_fixup *fix, int action)
3229 {
3230         struct alc_spec *spec = codec->spec;
3231
3232         if (action != HDA_FIXUP_ACT_PROBE)
3233                 return;
3234
3235         /* Due to a hardware problem on Lenovo Ideadpad, we need to
3236          * fix the sample rate of analog I/O to 44.1kHz
3237          */
3238         spec->gen.stream_analog_playback = &alc269_44k_pcm_analog_playback;
3239         spec->gen.stream_analog_capture = &alc269_44k_pcm_analog_capture;
3240 }
3241
3242 static void alc269_fixup_stereo_dmic(struct hda_codec *codec,
3243                                      const struct hda_fixup *fix, int action)
3244 {
3245         /* The digital-mic unit sends PDM (differential signal) instead of
3246          * the standard PCM, thus you can't record a valid mono stream as is.
3247          * Below is a workaround specific to ALC269 to control the dmic
3248          * signal source as mono.
3249          */
3250         if (action == HDA_FIXUP_ACT_INIT)
3251                 alc_update_coef_idx(codec, 0x07, 0, 0x80);
3252 }
3253
3254 static void alc269_quanta_automute(struct hda_codec *codec)
3255 {
3256         snd_hda_gen_update_outputs(codec);
3257
3258         alc_write_coef_idx(codec, 0x0c, 0x680);
3259         alc_write_coef_idx(codec, 0x0c, 0x480);
3260 }
3261
3262 static void alc269_fixup_quanta_mute(struct hda_codec *codec,
3263                                      const struct hda_fixup *fix, int action)
3264 {
3265         struct alc_spec *spec = codec->spec;
3266         if (action != HDA_FIXUP_ACT_PROBE)
3267                 return;
3268         spec->gen.automute_hook = alc269_quanta_automute;
3269 }
3270
3271 static void alc269_x101_hp_automute_hook(struct hda_codec *codec,
3272                                          struct hda_jack_callback *jack)
3273 {
3274         struct alc_spec *spec = codec->spec;
3275         int vref;
3276         msleep(200);
3277         snd_hda_gen_hp_automute(codec, jack);
3278
3279         vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
3280         msleep(100);
3281         snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
3282                             vref);
3283         msleep(500);
3284         snd_hda_codec_write(codec, 0x18, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
3285                             vref);
3286 }
3287
3288 static void alc269_fixup_x101_headset_mic(struct hda_codec *codec,
3289                                      const struct hda_fixup *fix, int action)
3290 {
3291         struct alc_spec *spec = codec->spec;
3292         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3293                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
3294                 spec->gen.hp_automute_hook = alc269_x101_hp_automute_hook;
3295         }
3296 }
3297
3298
3299 /* update mute-LED according to the speaker mute state via mic VREF pin */
3300 static void alc269_fixup_mic_mute_hook(void *private_data, int enabled)
3301 {
3302         struct hda_codec *codec = private_data;
3303         struct alc_spec *spec = codec->spec;
3304         unsigned int pinval;
3305
3306         if (spec->mute_led_polarity)
3307                 enabled = !enabled;
3308         pinval = snd_hda_codec_get_pin_target(codec, spec->mute_led_nid);
3309         pinval &= ~AC_PINCTL_VREFEN;
3310         pinval |= enabled ? AC_PINCTL_VREF_HIZ : AC_PINCTL_VREF_80;
3311         if (spec->mute_led_nid)
3312                 snd_hda_set_pin_ctl_cache(codec, spec->mute_led_nid, pinval);
3313 }
3314
3315 /* Make sure the led works even in runtime suspend */
3316 static unsigned int led_power_filter(struct hda_codec *codec,
3317                                                   hda_nid_t nid,
3318                                                   unsigned int power_state)
3319 {
3320         struct alc_spec *spec = codec->spec;
3321
3322         if (power_state != AC_PWRST_D3 || nid == 0 ||
3323             (nid != spec->mute_led_nid && nid != spec->cap_mute_led_nid))
3324                 return power_state;
3325
3326         /* Set pin ctl again, it might have just been set to 0 */
3327         snd_hda_set_pin_ctl(codec, nid,
3328                             snd_hda_codec_get_pin_target(codec, nid));
3329
3330         return snd_hda_gen_path_power_filter(codec, nid, power_state);
3331 }
3332
3333 static void alc269_fixup_hp_mute_led(struct hda_codec *codec,
3334                                      const struct hda_fixup *fix, int action)
3335 {
3336         struct alc_spec *spec = codec->spec;
3337         const struct dmi_device *dev = NULL;
3338
3339         if (action != HDA_FIXUP_ACT_PRE_PROBE)
3340                 return;
3341
3342         while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING, NULL, dev))) {
3343                 int pol, pin;
3344                 if (sscanf(dev->name, "HP_Mute_LED_%d_%x", &pol, &pin) != 2)
3345                         continue;
3346                 if (pin < 0x0a || pin >= 0x10)
3347                         break;
3348                 spec->mute_led_polarity = pol;
3349                 spec->mute_led_nid = pin - 0x0a + 0x18;
3350                 spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook;
3351                 spec->gen.vmaster_mute_enum = 1;
3352                 codec->power_filter = led_power_filter;
3353                 codec_dbg(codec,
3354                           "Detected mute LED for %x:%d\n", spec->mute_led_nid,
3355                            spec->mute_led_polarity);
3356                 break;
3357         }
3358 }
3359
3360 static void alc269_fixup_hp_mute_led_mic1(struct hda_codec *codec,
3361                                 const struct hda_fixup *fix, int action)
3362 {
3363         struct alc_spec *spec = codec->spec;
3364         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3365                 spec->mute_led_polarity = 0;
3366                 spec->mute_led_nid = 0x18;
3367                 spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook;
3368                 spec->gen.vmaster_mute_enum = 1;
3369                 codec->power_filter = led_power_filter;
3370         }
3371 }
3372
3373 static void alc269_fixup_hp_mute_led_mic2(struct hda_codec *codec,
3374                                 const struct hda_fixup *fix, int action)
3375 {
3376         struct alc_spec *spec = codec->spec;
3377         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3378                 spec->mute_led_polarity = 0;
3379                 spec->mute_led_nid = 0x19;
3380                 spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook;
3381                 spec->gen.vmaster_mute_enum = 1;
3382                 codec->power_filter = led_power_filter;
3383         }
3384 }
3385
3386 /* update LED status via GPIO */
3387 static void alc_update_gpio_led(struct hda_codec *codec, unsigned int mask,
3388                                 bool enabled)
3389 {
3390         struct alc_spec *spec = codec->spec;
3391         unsigned int oldval = spec->gpio_led;
3392
3393         if (spec->mute_led_polarity)
3394                 enabled = !enabled;
3395
3396         if (enabled)
3397                 spec->gpio_led &= ~mask;
3398         else
3399                 spec->gpio_led |= mask;
3400         if (spec->gpio_led != oldval)
3401                 snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
3402                                     spec->gpio_led);
3403 }
3404
3405 /* turn on/off mute LED via GPIO per vmaster hook */
3406 static void alc_fixup_gpio_mute_hook(void *private_data, int enabled)
3407 {
3408         struct hda_codec *codec = private_data;
3409         struct alc_spec *spec = codec->spec;
3410
3411         alc_update_gpio_led(codec, spec->gpio_mute_led_mask, enabled);
3412 }
3413
3414 /* turn on/off mic-mute LED via GPIO per capture hook */
3415 static void alc_fixup_gpio_mic_mute_hook(struct hda_codec *codec,
3416                                          struct snd_kcontrol *kcontrol,
3417                                          struct snd_ctl_elem_value *ucontrol)
3418 {
3419         struct alc_spec *spec = codec->spec;
3420
3421         if (ucontrol)
3422                 alc_update_gpio_led(codec, spec->gpio_mic_led_mask,
3423                                     ucontrol->value.integer.value[0] ||
3424                                     ucontrol->value.integer.value[1]);
3425 }
3426
3427 static void alc269_fixup_hp_gpio_led(struct hda_codec *codec,
3428                                 const struct hda_fixup *fix, int action)
3429 {
3430         struct alc_spec *spec = codec->spec;
3431         static const struct hda_verb gpio_init[] = {
3432                 { 0x01, AC_VERB_SET_GPIO_MASK, 0x18 },
3433                 { 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x18 },
3434                 {}
3435         };
3436
3437         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3438                 spec->gen.vmaster_mute.hook = alc_fixup_gpio_mute_hook;
3439                 spec->gen.cap_sync_hook = alc_fixup_gpio_mic_mute_hook;
3440                 spec->gpio_led = 0;
3441                 spec->mute_led_polarity = 0;
3442                 spec->gpio_mute_led_mask = 0x08;
3443                 spec->gpio_mic_led_mask = 0x10;
3444                 snd_hda_add_verbs(codec, gpio_init);
3445         }
3446 }
3447
3448 static void alc286_fixup_hp_gpio_led(struct hda_codec *codec,
3449                                 const struct hda_fixup *fix, int action)
3450 {
3451         struct alc_spec *spec = codec->spec;
3452         static const struct hda_verb gpio_init[] = {
3453                 { 0x01, AC_VERB_SET_GPIO_MASK, 0x22 },
3454                 { 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x22 },
3455                 {}
3456         };
3457
3458         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3459                 spec->gen.vmaster_mute.hook = alc_fixup_gpio_mute_hook;
3460                 spec->gen.cap_sync_hook = alc_fixup_gpio_mic_mute_hook;
3461                 spec->gpio_led = 0;
3462                 spec->mute_led_polarity = 0;
3463                 spec->gpio_mute_led_mask = 0x02;
3464                 spec->gpio_mic_led_mask = 0x20;
3465                 snd_hda_add_verbs(codec, gpio_init);
3466         }
3467 }
3468
3469 /* turn on/off mic-mute LED per capture hook */
3470 static void alc269_fixup_hp_cap_mic_mute_hook(struct hda_codec *codec,
3471                                                struct snd_kcontrol *kcontrol,
3472                                                struct snd_ctl_elem_value *ucontrol)
3473 {
3474         struct alc_spec *spec = codec->spec;
3475         unsigned int pinval, enable, disable;
3476
3477         pinval = snd_hda_codec_get_pin_target(codec, spec->cap_mute_led_nid);
3478         pinval &= ~AC_PINCTL_VREFEN;
3479         enable  = pinval | AC_PINCTL_VREF_80;
3480         disable = pinval | AC_PINCTL_VREF_HIZ;
3481
3482         if (!ucontrol)
3483                 return;
3484
3485         if (ucontrol->value.integer.value[0] ||
3486             ucontrol->value.integer.value[1])
3487                 pinval = disable;
3488         else
3489                 pinval = enable;
3490
3491         if (spec->cap_mute_led_nid)
3492                 snd_hda_set_pin_ctl_cache(codec, spec->cap_mute_led_nid, pinval);
3493 }
3494
3495 static void alc269_fixup_hp_gpio_mic1_led(struct hda_codec *codec,
3496                                 const struct hda_fixup *fix, int action)
3497 {
3498         struct alc_spec *spec = codec->spec;
3499         static const struct hda_verb gpio_init[] = {
3500                 { 0x01, AC_VERB_SET_GPIO_MASK, 0x08 },
3501                 { 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x08 },
3502                 {}
3503         };
3504
3505         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3506                 spec->gen.vmaster_mute.hook = alc_fixup_gpio_mute_hook;
3507                 spec->gen.cap_sync_hook = alc269_fixup_hp_cap_mic_mute_hook;
3508                 spec->gpio_led = 0;
3509                 spec->mute_led_polarity = 0;
3510                 spec->gpio_mute_led_mask = 0x08;
3511                 spec->cap_mute_led_nid = 0x18;
3512                 snd_hda_add_verbs(codec, gpio_init);
3513                 codec->power_filter = led_power_filter;
3514         }
3515 }
3516
3517 static void alc280_fixup_hp_gpio4(struct hda_codec *codec,
3518                                    const struct hda_fixup *fix, int action)
3519 {
3520         /* Like hp_gpio_mic1_led, but also needs GPIO4 low to enable headphone amp */
3521         struct alc_spec *spec = codec->spec;
3522         static const struct hda_verb gpio_init[] = {
3523                 { 0x01, AC_VERB_SET_GPIO_MASK, 0x18 },
3524                 { 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x18 },
3525                 {}
3526         };
3527
3528         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3529                 spec->gen.vmaster_mute.hook = alc_fixup_gpio_mute_hook;
3530                 spec->gen.cap_sync_hook = alc269_fixup_hp_cap_mic_mute_hook;
3531                 spec->gpio_led = 0;
3532                 spec->mute_led_polarity = 0;
3533                 spec->gpio_mute_led_mask = 0x08;
3534                 spec->cap_mute_led_nid = 0x18;
3535                 snd_hda_add_verbs(codec, gpio_init);
3536                 codec->power_filter = led_power_filter;
3537         }
3538 }
3539
3540 static void gpio2_mic_hotkey_event(struct hda_codec *codec,
3541                                    struct hda_jack_callback *event)
3542 {
3543         struct alc_spec *spec = codec->spec;
3544
3545         /* GPIO2 just toggles on a keypress/keyrelease cycle. Therefore
3546            send both key on and key off event for every interrupt. */
3547         input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 1);
3548         input_sync(spec->kb_dev);
3549         input_report_key(spec->kb_dev, spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX], 0);
3550         input_sync(spec->kb_dev);
3551 }
3552
3553 static int alc_register_micmute_input_device(struct hda_codec *codec)
3554 {
3555         struct alc_spec *spec = codec->spec;
3556         int i;
3557
3558         spec->kb_dev = input_allocate_device();
3559         if (!spec->kb_dev) {
3560                 codec_err(codec, "Out of memory (input_allocate_device)\n");
3561                 return -ENOMEM;
3562         }
3563
3564         spec->alc_mute_keycode_map[ALC_KEY_MICMUTE_INDEX] = KEY_MICMUTE;
3565
3566         spec->kb_dev->name = "Microphone Mute Button";
3567         spec->kb_dev->evbit[0] = BIT_MASK(EV_KEY);
3568         spec->kb_dev->keycodesize = sizeof(spec->alc_mute_keycode_map[0]);
3569         spec->kb_dev->keycodemax = ARRAY_SIZE(spec->alc_mute_keycode_map);
3570         spec->kb_dev->keycode = spec->alc_mute_keycode_map;
3571         for (i = 0; i < ARRAY_SIZE(spec->alc_mute_keycode_map); i++)
3572                 set_bit(spec->alc_mute_keycode_map[i], spec->kb_dev->keybit);
3573
3574         if (input_register_device(spec->kb_dev)) {
3575                 codec_err(codec, "input_register_device failed\n");
3576                 input_free_device(spec->kb_dev);
3577                 spec->kb_dev = NULL;
3578                 return -ENOMEM;
3579         }
3580
3581         return 0;
3582 }
3583
3584 static void alc280_fixup_hp_gpio2_mic_hotkey(struct hda_codec *codec,
3585                                              const struct hda_fixup *fix, int action)
3586 {
3587         /* GPIO1 = set according to SKU external amp
3588            GPIO2 = mic mute hotkey
3589            GPIO3 = mute LED
3590            GPIO4 = mic mute LED */
3591         static const struct hda_verb gpio_init[] = {
3592                 { 0x01, AC_VERB_SET_GPIO_MASK, 0x1e },
3593                 { 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x1a },
3594                 { 0x01, AC_VERB_SET_GPIO_DATA, 0x02 },
3595                 {}
3596         };
3597
3598         struct alc_spec *spec = codec->spec;
3599
3600         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3601                 if (alc_register_micmute_input_device(codec) != 0)
3602                         return;
3603
3604                 snd_hda_add_verbs(codec, gpio_init);
3605                 snd_hda_codec_write_cache(codec, codec->core.afg, 0,
3606                                           AC_VERB_SET_GPIO_UNSOLICITED_RSP_MASK, 0x04);
3607                 snd_hda_jack_detect_enable_callback(codec, codec->core.afg,
3608                                                     gpio2_mic_hotkey_event);
3609
3610                 spec->gen.vmaster_mute.hook = alc_fixup_gpio_mute_hook;
3611                 spec->gen.cap_sync_hook = alc_fixup_gpio_mic_mute_hook;
3612                 spec->gpio_led = 0;
3613                 spec->mute_led_polarity = 0;
3614                 spec->gpio_mute_led_mask = 0x08;
3615                 spec->gpio_mic_led_mask = 0x10;
3616                 return;
3617         }
3618
3619         if (!spec->kb_dev)
3620                 return;
3621
3622         switch (action) {
3623         case HDA_FIXUP_ACT_PROBE:
3624                 spec->init_amp = ALC_INIT_DEFAULT;
3625                 break;
3626         case HDA_FIXUP_ACT_FREE:
3627                 input_unregister_device(spec->kb_dev);
3628                 spec->kb_dev = NULL;
3629         }
3630 }
3631
3632 static void alc233_fixup_lenovo_line2_mic_hotkey(struct hda_codec *codec,
3633                                              const struct hda_fixup *fix, int action)
3634 {
3635         /* Line2 = mic mute hotkey
3636            GPIO2 = mic mute LED */
3637         static const struct hda_verb gpio_init[] = {
3638                 { 0x01, AC_VERB_SET_GPIO_MASK, 0x04 },
3639                 { 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04 },
3640                 {}
3641         };
3642
3643         struct alc_spec *spec = codec->spec;
3644
3645         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3646                 if (alc_register_micmute_input_device(codec) != 0)
3647                         return;
3648
3649                 snd_hda_add_verbs(codec, gpio_init);
3650                 snd_hda_jack_detect_enable_callback(codec, 0x1b,
3651                                                     gpio2_mic_hotkey_event);
3652
3653                 spec->gen.cap_sync_hook = alc_fixup_gpio_mic_mute_hook;
3654                 spec->gpio_led = 0;
3655                 spec->mute_led_polarity = 0;
3656                 spec->gpio_mic_led_mask = 0x04;
3657                 return;
3658         }
3659
3660         if (!spec->kb_dev)
3661                 return;
3662
3663         switch (action) {
3664         case HDA_FIXUP_ACT_PROBE:
3665                 spec->init_amp = ALC_INIT_DEFAULT;
3666                 break;
3667         case HDA_FIXUP_ACT_FREE:
3668                 input_unregister_device(spec->kb_dev);
3669                 spec->kb_dev = NULL;
3670         }
3671 }
3672
3673 static void alc269_fixup_hp_line1_mic1_led(struct hda_codec *codec,
3674                                 const struct hda_fixup *fix, int action)
3675 {
3676         struct alc_spec *spec = codec->spec;
3677
3678         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
3679                 spec->gen.vmaster_mute.hook = alc269_fixup_mic_mute_hook;
3680                 spec->gen.cap_sync_hook = alc269_fixup_hp_cap_mic_mute_hook;
3681                 spec->mute_led_polarity = 0;
3682                 spec->mute_led_nid = 0x1a;
3683                 spec->cap_mute_led_nid = 0x18;
3684                 spec->gen.vmaster_mute_enum = 1;
3685                 codec->power_filter = led_power_filter;
3686         }
3687 }
3688
3689 static void alc_headset_mode_unplugged(struct hda_codec *codec)
3690 {
3691         static struct coef_fw coef0255[] = {
3692                 WRITE_COEF(0x45, 0xd089), /* UAJ function set to menual mode */
3693                 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0), /* Direct Drive HP Amp control(Set to verb control)*/
3694                 WRITE_COEF(0x06, 0x6104), /* Set MIC2 Vref gate with HP */
3695                 WRITE_COEFEX(0x57, 0x03, 0x8aa6), /* Direct Drive HP Amp control */
3696                 {}
3697         };
3698         static struct coef_fw coef0255_1[] = {
3699                 WRITE_COEF(0x1b, 0x0c0b), /* LDO and MISC control */
3700                 {}
3701         };
3702         static struct coef_fw coef0256[] = {
3703                 WRITE_COEF(0x1b, 0x0c4b), /* LDO and MISC control */
3704                 {}
3705         };
3706         static struct coef_fw coef0233[] = {
3707                 WRITE_COEF(0x1b, 0x0c0b),
3708                 WRITE_COEF(0x45, 0xc429),
3709                 UPDATE_COEF(0x35, 0x4000, 0),
3710                 WRITE_COEF(0x06, 0x2104),
3711                 WRITE_COEF(0x1a, 0x0001),
3712                 WRITE_COEF(0x26, 0x0004),
3713                 WRITE_COEF(0x32, 0x42a3),
3714                 {}
3715         };
3716         static struct coef_fw coef0288[] = {
3717                 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
3718                 UPDATE_COEF(0x50, 0x2000, 0x2000),
3719                 UPDATE_COEF(0x56, 0x0006, 0x0006),
3720                 UPDATE_COEF(0x66, 0x0008, 0),
3721                 UPDATE_COEF(0x67, 0x2000, 0),
3722                 {}
3723         };
3724         static struct coef_fw coef0292[] = {
3725                 WRITE_COEF(0x76, 0x000e),
3726                 WRITE_COEF(0x6c, 0x2400),
3727                 WRITE_COEF(0x18, 0x7308),
3728                 WRITE_COEF(0x6b, 0xc429),
3729                 {}
3730         };
3731         static struct coef_fw coef0293[] = {
3732                 UPDATE_COEF(0x10, 7<<8, 6<<8), /* SET Line1 JD to 0 */
3733                 UPDATE_COEFEX(0x57, 0x05, 1<<15|1<<13, 0x0), /* SET charge pump by verb */
3734                 UPDATE_COEFEX(0x57, 0x03, 1<<10, 1<<10), /* SET EN_OSW to 1 */
3735                 UPDATE_COEF(0x1a, 1<<3, 1<<3), /* Combo JD gating with LINE1-VREFO */
3736                 WRITE_COEF(0x45, 0xc429), /* Set to TRS type */
3737                 UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
3738                 {}
3739         };
3740         static struct coef_fw coef0668[] = {
3741                 WRITE_COEF(0x15, 0x0d40),
3742                 WRITE_COEF(0xb7, 0x802b),
3743                 {}
3744         };
3745         static struct coef_fw coef0225[] = {
3746                 UPDATE_COEF(0x4a, 1<<8, 0),
3747                 UPDATE_COEFEX(0x57, 0x05, 1<<14, 0),
3748                 UPDATE_COEF(0x63, 3<<14, 3<<14),
3749                 UPDATE_COEF(0x4a, 3<<4, 2<<4),
3750                 UPDATE_COEF(0x4a, 3<<10, 3<<10),
3751                 UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10),
3752                 UPDATE_COEF(0x4a, 3<<10, 0),
3753                 {}
3754         };
3755
3756         switch (codec->core.vendor_id) {
3757         case 0x10ec0255:
3758                 alc_process_coef_fw(codec, coef0255_1);
3759                 alc_process_coef_fw(codec, coef0255);
3760                 break;
3761         case 0x10ec0256:
3762                 alc_process_coef_fw(codec, coef0256);
3763                 alc_process_coef_fw(codec, coef0255);
3764                 break;
3765         case 0x10ec0233:
3766         case 0x10ec0283:
3767                 alc_process_coef_fw(codec, coef0233);
3768                 break;
3769         case 0x10ec0286:
3770         case 0x10ec0288:
3771         case 0x10ec0298:
3772                 alc_process_coef_fw(codec, coef0288);
3773                 break;
3774         case 0x10ec0292:
3775                 alc_process_coef_fw(codec, coef0292);
3776                 break;
3777         case 0x10ec0293:
3778                 alc_process_coef_fw(codec, coef0293);
3779                 break;
3780         case 0x10ec0668:
3781                 alc_process_coef_fw(codec, coef0668);
3782                 break;
3783         case 0x10ec0225:
3784         case 0x10ec0295:
3785         case 0x10ec0299:
3786                 alc_process_coef_fw(codec, coef0225);
3787                 break;
3788         case 0x10ec0867:
3789                 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
3790                 break;
3791         }
3792         codec_dbg(codec, "Headset jack set to unplugged mode.\n");
3793 }
3794
3795
3796 static void alc_headset_mode_mic_in(struct hda_codec *codec, hda_nid_t hp_pin,
3797                                     hda_nid_t mic_pin)
3798 {
3799         static struct coef_fw coef0255[] = {
3800                 WRITE_COEFEX(0x57, 0x03, 0x8aa6),
3801                 WRITE_COEF(0x06, 0x6100), /* Set MIC2 Vref gate to normal */
3802                 {}
3803         };
3804         static struct coef_fw coef0233[] = {
3805                 UPDATE_COEF(0x35, 0, 1<<14),
3806                 WRITE_COEF(0x06, 0x2100),
3807                 WRITE_COEF(0x1a, 0x0021),
3808                 WRITE_COEF(0x26, 0x008c),
3809                 {}
3810         };
3811         static struct coef_fw coef0288[] = {
3812                 UPDATE_COEF(0x50, 0x2000, 0),
3813                 UPDATE_COEF(0x56, 0x0006, 0),
3814                 UPDATE_COEF(0x4f, 0xfcc0, 0xc400),
3815                 UPDATE_COEF(0x66, 0x0008, 0x0008),
3816                 UPDATE_COEF(0x67, 0x2000, 0x2000),
3817                 {}
3818         };
3819         static struct coef_fw coef0292[] = {
3820                 WRITE_COEF(0x19, 0xa208),
3821                 WRITE_COEF(0x2e, 0xacf0),
3822                 {}
3823         };
3824         static struct coef_fw coef0293[] = {
3825                 UPDATE_COEFEX(0x57, 0x05, 0, 1<<15|1<<13), /* SET charge pump by verb */
3826                 UPDATE_COEFEX(0x57, 0x03, 1<<10, 0), /* SET EN_OSW to 0 */
3827                 UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
3828                 {}
3829         };
3830         static struct coef_fw coef0688[] = {
3831                 WRITE_COEF(0xb7, 0x802b),
3832                 WRITE_COEF(0xb5, 0x1040),
3833                 UPDATE_COEF(0xc3, 0, 1<<12),
3834                 {}
3835         };
3836         static struct coef_fw coef0225[] = {
3837                 UPDATE_COEFEX(0x57, 0x05, 1<<14, 1<<14),
3838                 UPDATE_COEF(0x4a, 3<<4, 2<<4),
3839                 UPDATE_COEF(0x63, 3<<14, 0),
3840                 {}
3841         };
3842
3843
3844         switch (codec->core.vendor_id) {
3845         case 0x10ec0255:
3846         case 0x10ec0256:
3847                 alc_write_coef_idx(codec, 0x45, 0xc489);
3848                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
3849                 alc_process_coef_fw(codec, coef0255);
3850                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
3851                 break;
3852         case 0x10ec0233:
3853         case 0x10ec0283:
3854                 alc_write_coef_idx(codec, 0x45, 0xc429);
3855                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
3856                 alc_process_coef_fw(codec, coef0233);
3857                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
3858                 break;
3859         case 0x10ec0286:
3860         case 0x10ec0288:
3861         case 0x10ec0298:
3862                 alc_update_coef_idx(codec, 0x4f, 0x000c, 0);
3863                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
3864                 alc_process_coef_fw(codec, coef0288);
3865                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
3866                 break;
3867         case 0x10ec0292:
3868                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
3869                 alc_process_coef_fw(codec, coef0292);
3870                 break;
3871         case 0x10ec0293:
3872                 /* Set to TRS mode */
3873                 alc_write_coef_idx(codec, 0x45, 0xc429);
3874                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
3875                 alc_process_coef_fw(codec, coef0293);
3876                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
3877                 break;
3878         case 0x10ec0867:
3879                 alc_update_coefex_idx(codec, 0x57, 0x5, 0, 1<<14);
3880                 /* fallthru */
3881         case 0x10ec0221:
3882         case 0x10ec0662:
3883                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
3884                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
3885                 break;
3886         case 0x10ec0668:
3887                 alc_write_coef_idx(codec, 0x11, 0x0001);
3888                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
3889                 alc_process_coef_fw(codec, coef0688);
3890                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
3891                 break;
3892         case 0x10ec0225:
3893         case 0x10ec0295:
3894         case 0x10ec0299:
3895                 alc_update_coef_idx(codec, 0x45, 0x3f<<10, 0x31<<10);
3896                 snd_hda_set_pin_ctl_cache(codec, hp_pin, 0);
3897                 alc_process_coef_fw(codec, coef0225);
3898                 snd_hda_set_pin_ctl_cache(codec, mic_pin, PIN_VREF50);
3899                 break;
3900         }
3901         codec_dbg(codec, "Headset jack set to mic-in mode.\n");
3902 }
3903
3904 static void alc_headset_mode_default(struct hda_codec *codec)
3905 {
3906         static struct coef_fw coef0225[] = {
3907                 UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10),
3908                 {}
3909         };
3910         static struct coef_fw coef0255[] = {
3911                 WRITE_COEF(0x45, 0xc089),
3912                 WRITE_COEF(0x45, 0xc489),
3913                 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
3914                 WRITE_COEF(0x49, 0x0049),
3915                 {}
3916         };
3917         static struct coef_fw coef0233[] = {
3918                 WRITE_COEF(0x06, 0x2100),
3919                 WRITE_COEF(0x32, 0x4ea3),
3920                 {}
3921         };
3922         static struct coef_fw coef0288[] = {
3923                 UPDATE_COEF(0x4f, 0xfcc0, 0xc400), /* Set to TRS type */
3924                 UPDATE_COEF(0x50, 0x2000, 0x2000),
3925                 UPDATE_COEF(0x56, 0x0006, 0x0006),
3926                 UPDATE_COEF(0x66, 0x0008, 0),
3927                 UPDATE_COEF(0x67, 0x2000, 0),
3928                 {}
3929         };
3930         static struct coef_fw coef0292[] = {
3931                 WRITE_COEF(0x76, 0x000e),
3932                 WRITE_COEF(0x6c, 0x2400),
3933                 WRITE_COEF(0x6b, 0xc429),
3934                 WRITE_COEF(0x18, 0x7308),
3935                 {}
3936         };
3937         static struct coef_fw coef0293[] = {
3938                 UPDATE_COEF(0x4a, 0x000f, 0x000e), /* Combo Jack auto detect */
3939                 WRITE_COEF(0x45, 0xC429), /* Set to TRS type */
3940                 UPDATE_COEF(0x1a, 1<<3, 0), /* Combo JD gating without LINE1-VREFO */
3941                 {}
3942         };
3943         static struct coef_fw coef0688[] = {
3944                 WRITE_COEF(0x11, 0x0041),
3945                 WRITE_COEF(0x15, 0x0d40),
3946                 WRITE_COEF(0xb7, 0x802b),
3947                 {}
3948         };
3949
3950         switch (codec->core.vendor_id) {
3951         case 0x10ec0225:
3952         case 0x10ec0295:
3953         case 0x10ec0299:
3954                 alc_process_coef_fw(codec, coef0225);
3955                 break;
3956         case 0x10ec0255:
3957         case 0x10ec0256:
3958                 alc_process_coef_fw(codec, coef0255);
3959                 break;
3960         case 0x10ec0233:
3961         case 0x10ec0283:
3962                 alc_process_coef_fw(codec, coef0233);
3963                 break;
3964         case 0x10ec0286:
3965         case 0x10ec0288:
3966         case 0x10ec0298:
3967                 alc_process_coef_fw(codec, coef0288);
3968                 break;
3969         case 0x10ec0292:
3970                 alc_process_coef_fw(codec, coef0292);
3971                 break;
3972         case 0x10ec0293:
3973                 alc_process_coef_fw(codec, coef0293);
3974                 break;
3975         case 0x10ec0668:
3976                 alc_process_coef_fw(codec, coef0688);
3977                 break;
3978         case 0x10ec0867:
3979                 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
3980                 break;
3981         }
3982         codec_dbg(codec, "Headset jack set to headphone (default) mode.\n");
3983 }
3984
3985 /* Iphone type */
3986 static void alc_headset_mode_ctia(struct hda_codec *codec)
3987 {
3988         static struct coef_fw coef0255[] = {
3989                 WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
3990                 WRITE_COEF(0x1b, 0x0c2b),
3991                 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
3992                 {}
3993         };
3994         static struct coef_fw coef0256[] = {
3995                 WRITE_COEF(0x45, 0xd489), /* Set to CTIA type */
3996                 WRITE_COEF(0x1b, 0x0c6b),
3997                 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
3998                 {}
3999         };
4000         static struct coef_fw coef0233[] = {
4001                 WRITE_COEF(0x45, 0xd429),
4002                 WRITE_COEF(0x1b, 0x0c2b),
4003                 WRITE_COEF(0x32, 0x4ea3),
4004                 {}
4005         };
4006         static struct coef_fw coef0288[] = {
4007                 UPDATE_COEF(0x50, 0x2000, 0x2000),
4008                 UPDATE_COEF(0x56, 0x0006, 0x0006),
4009                 UPDATE_COEF(0x66, 0x0008, 0),
4010                 UPDATE_COEF(0x67, 0x2000, 0),
4011                 {}
4012         };
4013         static struct coef_fw coef0292[] = {
4014                 WRITE_COEF(0x6b, 0xd429),
4015                 WRITE_COEF(0x76, 0x0008),
4016                 WRITE_COEF(0x18, 0x7388),
4017                 {}
4018         };
4019         static struct coef_fw coef0293[] = {
4020                 WRITE_COEF(0x45, 0xd429), /* Set to ctia type */
4021                 UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
4022                 {}
4023         };
4024         static struct coef_fw coef0688[] = {
4025                 WRITE_COEF(0x11, 0x0001),
4026                 WRITE_COEF(0x15, 0x0d60),
4027                 WRITE_COEF(0xc3, 0x0000),
4028                 {}
4029         };
4030         static struct coef_fw coef0225[] = {
4031                 UPDATE_COEF(0x45, 0x3f<<10, 0x35<<10),
4032                 UPDATE_COEF(0x49, 1<<8, 1<<8),
4033                 UPDATE_COEF(0x4a, 7<<6, 7<<6),
4034                 UPDATE_COEF(0x4a, 3<<4, 3<<4),
4035                 {}
4036         };
4037
4038         switch (codec->core.vendor_id) {
4039         case 0x10ec0255:
4040                 alc_process_coef_fw(codec, coef0255);
4041                 break;
4042         case 0x10ec0256:
4043                 alc_process_coef_fw(codec, coef0256);
4044                 break;
4045         case 0x10ec0233:
4046         case 0x10ec0283:
4047                 alc_process_coef_fw(codec, coef0233);
4048                 break;
4049         case 0x10ec0298:
4050                 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020);/* Headset output enable */
4051                 /* ALC298 jack type setting is the same with ALC286/ALC288 */
4052         case 0x10ec0286:
4053         case 0x10ec0288:
4054                 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xd400);
4055                 msleep(300);
4056                 alc_process_coef_fw(codec, coef0288);
4057                 break;
4058         case 0x10ec0292:
4059                 alc_process_coef_fw(codec, coef0292);
4060                 break;
4061         case 0x10ec0293:
4062                 alc_process_coef_fw(codec, coef0293);
4063                 break;
4064         case 0x10ec0668:
4065                 alc_process_coef_fw(codec, coef0688);
4066                 break;
4067         case 0x10ec0225:
4068         case 0x10ec0295:
4069         case 0x10ec0299:
4070                 alc_process_coef_fw(codec, coef0225);
4071                 break;
4072         case 0x10ec0867:
4073                 alc_update_coefex_idx(codec, 0x57, 0x5, 1<<14, 0);
4074                 break;
4075         }
4076         codec_dbg(codec, "Headset jack set to iPhone-style headset mode.\n");
4077 }
4078
4079 /* Nokia type */
4080 static void alc_headset_mode_omtp(struct hda_codec *codec)
4081 {
4082         static struct coef_fw coef0255[] = {
4083                 WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
4084                 WRITE_COEF(0x1b, 0x0c2b),
4085                 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
4086                 {}
4087         };
4088         static struct coef_fw coef0256[] = {
4089                 WRITE_COEF(0x45, 0xe489), /* Set to OMTP Type */
4090                 WRITE_COEF(0x1b, 0x0c6b),
4091                 WRITE_COEFEX(0x57, 0x03, 0x8ea6),
4092                 {}
4093         };
4094         static struct coef_fw coef0233[] = {
4095                 WRITE_COEF(0x45, 0xe429),
4096                 WRITE_COEF(0x1b, 0x0c2b),
4097                 WRITE_COEF(0x32, 0x4ea3),
4098                 {}
4099         };
4100         static struct coef_fw coef0288[] = {
4101                 UPDATE_COEF(0x50, 0x2000, 0x2000),
4102                 UPDATE_COEF(0x56, 0x0006, 0x0006),
4103                 UPDATE_COEF(0x66, 0x0008, 0),
4104                 UPDATE_COEF(0x67, 0x2000, 0),
4105                 {}
4106         };
4107         static struct coef_fw coef0292[] = {
4108                 WRITE_COEF(0x6b, 0xe429),
4109                 WRITE_COEF(0x76, 0x0008),
4110                 WRITE_COEF(0x18, 0x7388),
4111                 {}
4112         };
4113         static struct coef_fw coef0293[] = {
4114                 WRITE_COEF(0x45, 0xe429), /* Set to omtp type */
4115                 UPDATE_COEF(0x10, 7<<8, 7<<8), /* SET Line1 JD to 1 */
4116                 {}
4117         };
4118         static struct coef_fw coef0688[] = {
4119                 WRITE_COEF(0x11, 0x0001),
4120                 WRITE_COEF(0x15, 0x0d50),
4121                 WRITE_COEF(0xc3, 0x0000),
4122                 {}
4123         };
4124         static struct coef_fw coef0225[] = {
4125                 UPDATE_COEF(0x45, 0x3f<<10, 0x39<<10),
4126                 UPDATE_COEF(0x49, 1<<8, 1<<8),
4127                 UPDATE_COEF(0x4a, 7<<6, 7<<6),
4128                 UPDATE_COEF(0x4a, 3<<4, 3<<4),
4129                 {}
4130         };
4131
4132         switch (codec->core.vendor_id) {
4133         case 0x10ec0255:
4134                 alc_process_coef_fw(codec, coef0255);
4135                 break;
4136         case 0x10ec0256:
4137                 alc_process_coef_fw(codec, coef0256);
4138                 break;
4139         case 0x10ec0233:
4140         case 0x10ec0283:
4141                 alc_process_coef_fw(codec, coef0233);
4142                 break;
4143         case 0x10ec0298:
4144                 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0010);/* Headset output enable */
4145                 /* ALC298 jack type setting is the same with ALC286/ALC288 */
4146         case 0x10ec0286:
4147         case 0x10ec0288:
4148                 alc_update_coef_idx(codec, 0x4f, 0xfcc0, 0xe400);
4149                 msleep(300);
4150                 alc_process_coef_fw(codec, coef0288);
4151                 break;
4152         case 0x10ec0292:
4153                 alc_process_coef_fw(codec, coef0292);
4154                 break;
4155         case 0x10ec0293:
4156                 alc_process_coef_fw(codec, coef0293);
4157                 break;
4158         case 0x10ec0668:
4159                 alc_process_coef_fw(codec, coef0688);
4160                 break;
4161         case 0x10ec0225:
4162         case 0x10ec0295:
4163         case 0x10ec0299:
4164                 alc_process_coef_fw(codec, coef0225);
4165                 break;
4166         }
4167         codec_dbg(codec, "Headset jack set to Nokia-style headset mode.\n");
4168 }
4169
4170 static void alc_determine_headset_type(struct hda_codec *codec)
4171 {
4172         int val;
4173         bool is_ctia = false;
4174         struct alc_spec *spec = codec->spec;
4175         static struct coef_fw coef0255[] = {
4176                 WRITE_COEF(0x45, 0xd089), /* combo jack auto switch control(Check type)*/
4177                 WRITE_COEF(0x49, 0x0149), /* combo jack auto switch control(Vref
4178  conteol) */
4179                 {}
4180         };
4181         static struct coef_fw coef0288[] = {
4182                 UPDATE_COEF(0x4f, 0xfcc0, 0xd400), /* Check Type */
4183                 {}
4184         };
4185         static struct coef_fw coef0293[] = {
4186                 UPDATE_COEF(0x4a, 0x000f, 0x0008), /* Combo Jack auto detect */
4187                 WRITE_COEF(0x45, 0xD429), /* Set to ctia type */
4188                 {}
4189         };
4190         static struct coef_fw coef0688[] = {
4191                 WRITE_COEF(0x11, 0x0001),
4192                 WRITE_COEF(0xb7, 0x802b),
4193                 WRITE_COEF(0x15, 0x0d60),
4194                 WRITE_COEF(0xc3, 0x0c00),
4195                 {}
4196         };
4197         static struct coef_fw coef0225[] = {
4198                 UPDATE_COEF(0x45, 0x3f<<10, 0x34<<10),
4199                 UPDATE_COEF(0x49, 1<<8, 1<<8),
4200                 {}
4201         };
4202
4203         switch (codec->core.vendor_id) {
4204         case 0x10ec0255:
4205         case 0x10ec0256:
4206                 alc_process_coef_fw(codec, coef0255);
4207                 msleep(300);
4208                 val = alc_read_coef_idx(codec, 0x46);
4209                 is_ctia = (val & 0x0070) == 0x0070;
4210                 break;
4211         case 0x10ec0233:
4212         case 0x10ec0283:
4213                 alc_write_coef_idx(codec, 0x45, 0xd029);
4214                 msleep(300);
4215                 val = alc_read_coef_idx(codec, 0x46);
4216                 is_ctia = (val & 0x0070) == 0x0070;
4217                 break;
4218         case 0x10ec0298:
4219                 alc_update_coef_idx(codec, 0x8e, 0x0070, 0x0020); /* Headset output enable */
4220                 /* ALC298 check jack type is the same with ALC286/ALC288 */
4221         case 0x10ec0286:
4222         case 0x10ec0288:
4223                 alc_process_coef_fw(codec, coef0288);
4224                 msleep(350);
4225                 val = alc_read_coef_idx(codec, 0x50);
4226                 is_ctia = (val & 0x0070) == 0x0070;
4227                 break;
4228         case 0x10ec0292:
4229                 alc_write_coef_idx(codec, 0x6b, 0xd429);
4230                 msleep(300);
4231                 val = alc_read_coef_idx(codec, 0x6c);
4232                 is_ctia = (val & 0x001c) == 0x001c;
4233                 break;
4234         case 0x10ec0293:
4235                 alc_process_coef_fw(codec, coef0293);
4236                 msleep(300);
4237                 val = alc_read_coef_idx(codec, 0x46);
4238                 is_ctia = (val & 0x0070) == 0x0070;
4239                 break;
4240         case 0x10ec0668:
4241                 alc_process_coef_fw(codec, coef0688);
4242                 msleep(300);
4243                 val = alc_read_coef_idx(codec, 0xbe);
4244                 is_ctia = (val & 0x1c02) == 0x1c02;
4245                 break;
4246         case 0x10ec0225:
4247         case 0x10ec0295:
4248         case 0x10ec0299:
4249                 alc_process_coef_fw(codec, coef0225);
4250                 msleep(800);
4251                 val = alc_read_coef_idx(codec, 0x46);
4252                 is_ctia = (val & 0x00f0) == 0x00f0;
4253                 break;
4254         case 0x10ec0867:
4255                 is_ctia = true;
4256                 break;
4257         }
4258
4259         codec_dbg(codec, "Headset jack detected iPhone-style headset: %s\n",
4260                     is_ctia ? "yes" : "no");
4261         spec->current_headset_type = is_ctia ? ALC_HEADSET_TYPE_CTIA : ALC_HEADSET_TYPE_OMTP;
4262 }
4263
4264 static void alc_update_headset_mode(struct hda_codec *codec)
4265 {
4266         struct alc_spec *spec = codec->spec;
4267
4268         hda_nid_t mux_pin = spec->gen.imux_pins[spec->gen.cur_mux[0]];
4269         hda_nid_t hp_pin = spec->gen.autocfg.hp_pins[0];
4270
4271         int new_headset_mode;
4272
4273         if (!snd_hda_jack_detect(codec, hp_pin))
4274                 new_headset_mode = ALC_HEADSET_MODE_UNPLUGGED;
4275         else if (mux_pin == spec->headset_mic_pin)
4276                 new_headset_mode = ALC_HEADSET_MODE_HEADSET;
4277         else if (mux_pin == spec->headphone_mic_pin)
4278                 new_headset_mode = ALC_HEADSET_MODE_MIC;
4279         else
4280                 new_headset_mode = ALC_HEADSET_MODE_HEADPHONE;
4281
4282         if (new_headset_mode == spec->current_headset_mode) {
4283                 snd_hda_gen_update_outputs(codec);
4284                 return;
4285         }
4286
4287         switch (new_headset_mode) {
4288         case ALC_HEADSET_MODE_UNPLUGGED:
4289                 alc_headset_mode_unplugged(codec);
4290                 spec->gen.hp_jack_present = false;
4291                 break;
4292         case ALC_HEADSET_MODE_HEADSET:
4293                 if (spec->current_headset_type == ALC_HEADSET_TYPE_UNKNOWN)
4294                         alc_determine_headset_type(codec);
4295                 if (spec->current_headset_type == ALC_HEADSET_TYPE_CTIA)
4296                         alc_headset_mode_ctia(codec);
4297                 else if (spec->current_headset_type == ALC_HEADSET_TYPE_OMTP)
4298                         alc_headset_mode_omtp(codec);
4299                 spec->gen.hp_jack_present = true;
4300                 break;
4301         case ALC_HEADSET_MODE_MIC:
4302                 alc_headset_mode_mic_in(codec, hp_pin, spec->headphone_mic_pin);
4303                 spec->gen.hp_jack_present = false;
4304                 break;
4305         case ALC_HEADSET_MODE_HEADPHONE:
4306                 alc_headset_mode_default(codec);
4307                 spec->gen.hp_jack_present = true;
4308                 break;
4309         }
4310         if (new_headset_mode != ALC_HEADSET_MODE_MIC) {
4311                 snd_hda_set_pin_ctl_cache(codec, hp_pin,
4312                                           AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN);
4313                 if (spec->headphone_mic_pin && spec->headphone_mic_pin != hp_pin)
4314                         snd_hda_set_pin_ctl_cache(codec, spec->headphone_mic_pin,
4315                                                   PIN_VREFHIZ);
4316         }
4317         spec->current_headset_mode = new_headset_mode;
4318
4319         snd_hda_gen_update_outputs(codec);
4320 }
4321
4322 static void alc_update_headset_mode_hook(struct hda_codec *codec,
4323                                          struct snd_kcontrol *kcontrol,
4324                                          struct snd_ctl_elem_value *ucontrol)
4325 {
4326         alc_update_headset_mode(codec);
4327 }
4328
4329 static void alc_update_headset_jack_cb(struct hda_codec *codec,
4330                                        struct hda_jack_callback *jack)
4331 {
4332         struct alc_spec *spec = codec->spec;
4333         spec->current_headset_type = ALC_HEADSET_TYPE_UNKNOWN;
4334         snd_hda_gen_hp_automute(codec, jack);
4335 }
4336
4337 static void alc_probe_headset_mode(struct hda_codec *codec)
4338 {
4339         int i;
4340         struct alc_spec *spec = codec->spec;
4341         struct auto_pin_cfg *cfg = &spec->gen.autocfg;
4342
4343         /* Find mic pins */
4344         for (i = 0; i < cfg->num_inputs; i++) {
4345                 if (cfg->inputs[i].is_headset_mic && !spec->headset_mic_pin)
4346                         spec->headset_mic_pin = cfg->inputs[i].pin;
4347                 if (cfg->inputs[i].is_headphone_mic && !spec->headphone_mic_pin)
4348                         spec->headphone_mic_pin = cfg->inputs[i].pin;
4349         }
4350
4351         spec->gen.cap_sync_hook = alc_update_headset_mode_hook;
4352         spec->gen.automute_hook = alc_update_headset_mode;
4353         spec->gen.hp_automute_hook = alc_update_headset_jack_cb;
4354 }
4355
4356 static void alc_fixup_headset_mode(struct hda_codec *codec,
4357                                 const struct hda_fixup *fix, int action)
4358 {
4359         struct alc_spec *spec = codec->spec;
4360
4361         switch (action) {
4362         case HDA_FIXUP_ACT_PRE_PROBE:
4363                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC | HDA_PINCFG_HEADPHONE_MIC;
4364                 break;
4365         case HDA_FIXUP_ACT_PROBE:
4366                 alc_probe_headset_mode(codec);
4367                 break;
4368         case HDA_FIXUP_ACT_INIT:
4369                 spec->current_headset_mode = 0;
4370                 alc_update_headset_mode(codec);
4371                 break;
4372         }
4373 }
4374
4375 static void alc_fixup_headset_mode_no_hp_mic(struct hda_codec *codec,
4376                                 const struct hda_fixup *fix, int action)
4377 {
4378         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4379                 struct alc_spec *spec = codec->spec;
4380                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4381         }
4382         else
4383                 alc_fixup_headset_mode(codec, fix, action);
4384 }
4385
4386 static void alc255_set_default_jack_type(struct hda_codec *codec)
4387 {
4388         /* Set to iphone type */
4389         static struct coef_fw alc255fw[] = {
4390                 WRITE_COEF(0x1b, 0x880b),
4391                 WRITE_COEF(0x45, 0xd089),
4392                 WRITE_COEF(0x1b, 0x080b),
4393                 WRITE_COEF(0x46, 0x0004),
4394                 WRITE_COEF(0x1b, 0x0c0b),
4395                 {}
4396         };
4397         static struct coef_fw alc256fw[] = {
4398                 WRITE_COEF(0x1b, 0x884b),
4399                 WRITE_COEF(0x45, 0xd089),
4400                 WRITE_COEF(0x1b, 0x084b),
4401                 WRITE_COEF(0x46, 0x0004),
4402                 WRITE_COEF(0x1b, 0x0c4b),
4403                 {}
4404         };
4405         switch (codec->core.vendor_id) {
4406         case 0x10ec0255:
4407                 alc_process_coef_fw(codec, alc255fw);
4408                 break;
4409         case 0x10ec0256:
4410                 alc_process_coef_fw(codec, alc256fw);
4411                 break;
4412         }
4413         msleep(30);
4414 }
4415
4416 static void alc_fixup_headset_mode_alc255(struct hda_codec *codec,
4417                                 const struct hda_fixup *fix, int action)
4418 {
4419         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4420                 alc255_set_default_jack_type(codec);
4421         }
4422         alc_fixup_headset_mode(codec, fix, action);
4423 }
4424
4425 static void alc_fixup_headset_mode_alc255_no_hp_mic(struct hda_codec *codec,
4426                                 const struct hda_fixup *fix, int action)
4427 {
4428         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4429                 struct alc_spec *spec = codec->spec;
4430                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4431                 alc255_set_default_jack_type(codec);
4432         } 
4433         else
4434                 alc_fixup_headset_mode(codec, fix, action);
4435 }
4436
4437 static void alc288_update_headset_jack_cb(struct hda_codec *codec,
4438                                        struct hda_jack_callback *jack)
4439 {
4440         struct alc_spec *spec = codec->spec;
4441         int present;
4442
4443         alc_update_headset_jack_cb(codec, jack);
4444         /* Headset Mic enable or disable, only for Dell Dino */
4445         present = spec->gen.hp_jack_present ? 0x40 : 0;
4446         snd_hda_codec_write(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
4447                                 present);
4448 }
4449
4450 static void alc_fixup_headset_mode_dell_alc288(struct hda_codec *codec,
4451                                 const struct hda_fixup *fix, int action)
4452 {
4453         alc_fixup_headset_mode(codec, fix, action);
4454         if (action == HDA_FIXUP_ACT_PROBE) {
4455                 struct alc_spec *spec = codec->spec;
4456                 spec->gen.hp_automute_hook = alc288_update_headset_jack_cb;
4457         }
4458 }
4459
4460 static void alc_fixup_auto_mute_via_amp(struct hda_codec *codec,
4461                                         const struct hda_fixup *fix, int action)
4462 {
4463         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4464                 struct alc_spec *spec = codec->spec;
4465                 spec->gen.auto_mute_via_amp = 1;
4466         }
4467 }
4468
4469 static void alc_no_shutup(struct hda_codec *codec)
4470 {
4471 }
4472
4473 static void alc_fixup_no_shutup(struct hda_codec *codec,
4474                                 const struct hda_fixup *fix, int action)
4475 {
4476         if (action == HDA_FIXUP_ACT_PROBE) {
4477                 struct alc_spec *spec = codec->spec;
4478                 spec->shutup = alc_no_shutup;
4479         }
4480 }
4481
4482 static void alc_fixup_disable_aamix(struct hda_codec *codec,
4483                                     const struct hda_fixup *fix, int action)
4484 {
4485         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4486                 struct alc_spec *spec = codec->spec;
4487                 /* Disable AA-loopback as it causes white noise */
4488                 spec->gen.mixer_nid = 0;
4489         }
4490 }
4491
4492 /* fixup for Thinkpad docks: add dock pins, avoid HP parser fixup */
4493 static void alc_fixup_tpt440_dock(struct hda_codec *codec,
4494                                   const struct hda_fixup *fix, int action)
4495 {
4496         static const struct hda_pintbl pincfgs[] = {
4497                 { 0x16, 0x21211010 }, /* dock headphone */
4498                 { 0x19, 0x21a11010 }, /* dock mic */
4499                 { }
4500         };
4501         struct alc_spec *spec = codec->spec;
4502
4503         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4504                 spec->shutup = alc_no_shutup; /* reduce click noise */
4505                 spec->reboot_notify = alc_d3_at_reboot; /* reduce noise */
4506                 spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
4507                 codec->power_save_node = 0; /* avoid click noises */
4508                 snd_hda_apply_pincfgs(codec, pincfgs);
4509         }
4510 }
4511
4512 static void alc_shutup_dell_xps13(struct hda_codec *codec)
4513 {
4514         struct alc_spec *spec = codec->spec;
4515         int hp_pin = spec->gen.autocfg.hp_pins[0];
4516
4517         /* Prevent pop noises when headphones are plugged in */
4518         snd_hda_codec_write(codec, hp_pin, 0,
4519                             AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE);
4520         msleep(20);
4521 }
4522
4523 static void alc_fixup_dell_xps13(struct hda_codec *codec,
4524                                 const struct hda_fixup *fix, int action)
4525 {
4526         struct alc_spec *spec = codec->spec;
4527         struct hda_input_mux *imux = &spec->gen.input_mux;
4528         int i;
4529
4530         switch (action) {
4531         case HDA_FIXUP_ACT_PRE_PROBE:
4532                 /* mic pin 0x19 must be initialized with Vref Hi-Z, otherwise
4533                  * it causes a click noise at start up
4534                  */
4535                 snd_hda_codec_set_pin_target(codec, 0x19, PIN_VREFHIZ);
4536                 break;
4537         case HDA_FIXUP_ACT_PROBE:
4538                 spec->shutup = alc_shutup_dell_xps13;
4539
4540                 /* Make the internal mic the default input source. */
4541                 for (i = 0; i < imux->num_items; i++) {
4542                         if (spec->gen.imux_pins[i] == 0x12) {
4543                                 spec->gen.cur_mux[0] = i;
4544                                 break;
4545                         }
4546                 }
4547                 break;
4548         }
4549 }
4550
4551 static void alc_fixup_headset_mode_alc662(struct hda_codec *codec,
4552                                 const struct hda_fixup *fix, int action)
4553 {
4554         struct alc_spec *spec = codec->spec;
4555
4556         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4557                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
4558                 spec->gen.hp_mic = 1; /* Mic-in is same pin as headphone */
4559
4560                 /* Disable boost for mic-in permanently. (This code is only called
4561                    from quirks that guarantee that the headphone is at NID 0x1b.) */
4562                 snd_hda_codec_write(codec, 0x1b, 0, AC_VERB_SET_AMP_GAIN_MUTE, 0x7000);
4563                 snd_hda_override_wcaps(codec, 0x1b, get_wcaps(codec, 0x1b) & ~AC_WCAP_IN_AMP);
4564         } else
4565                 alc_fixup_headset_mode(codec, fix, action);
4566 }
4567
4568 static void alc_fixup_headset_mode_alc668(struct hda_codec *codec,
4569                                 const struct hda_fixup *fix, int action)
4570 {
4571         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4572                 alc_write_coef_idx(codec, 0xc4, 0x8000);
4573                 alc_update_coef_idx(codec, 0xc2, ~0xfe, 0);
4574                 snd_hda_set_pin_ctl_cache(codec, 0x18, 0);
4575         }
4576         alc_fixup_headset_mode(codec, fix, action);
4577 }
4578
4579 /* Returns the nid of the external mic input pin, or 0 if it cannot be found. */
4580 static int find_ext_mic_pin(struct hda_codec *codec)
4581 {
4582         struct alc_spec *spec = codec->spec;
4583         struct auto_pin_cfg *cfg = &spec->gen.autocfg;
4584         hda_nid_t nid;
4585         unsigned int defcfg;
4586         int i;
4587
4588         for (i = 0; i < cfg->num_inputs; i++) {
4589                 if (cfg->inputs[i].type != AUTO_PIN_MIC)
4590                         continue;
4591                 nid = cfg->inputs[i].pin;
4592                 defcfg = snd_hda_codec_get_pincfg(codec, nid);
4593                 if (snd_hda_get_input_pin_attr(defcfg) == INPUT_PIN_ATTR_INT)
4594                         continue;
4595                 return nid;
4596         }
4597
4598         return 0;
4599 }
4600
4601 static void alc271_hp_gate_mic_jack(struct hda_codec *codec,
4602                                     const struct hda_fixup *fix,
4603                                     int action)
4604 {
4605         struct alc_spec *spec = codec->spec;
4606
4607         if (action == HDA_FIXUP_ACT_PROBE) {
4608                 int mic_pin = find_ext_mic_pin(codec);
4609                 int hp_pin = spec->gen.autocfg.hp_pins[0];
4610
4611                 if (snd_BUG_ON(!mic_pin || !hp_pin))
4612                         return;
4613                 snd_hda_jack_set_gating_jack(codec, mic_pin, hp_pin);
4614         }
4615 }
4616
4617 static void alc269_fixup_limit_int_mic_boost(struct hda_codec *codec,
4618                                              const struct hda_fixup *fix,
4619                                              int action)
4620 {
4621         struct alc_spec *spec = codec->spec;
4622         struct auto_pin_cfg *cfg = &spec->gen.autocfg;
4623         int i;
4624
4625         /* The mic boosts on level 2 and 3 are too noisy
4626            on the internal mic input.
4627            Therefore limit the boost to 0 or 1. */
4628
4629         if (action != HDA_FIXUP_ACT_PROBE)
4630                 return;
4631
4632         for (i = 0; i < cfg->num_inputs; i++) {
4633                 hda_nid_t nid = cfg->inputs[i].pin;
4634                 unsigned int defcfg;
4635                 if (cfg->inputs[i].type != AUTO_PIN_MIC)
4636                         continue;
4637                 defcfg = snd_hda_codec_get_pincfg(codec, nid);
4638                 if (snd_hda_get_input_pin_attr(defcfg) != INPUT_PIN_ATTR_INT)
4639                         continue;
4640
4641                 snd_hda_override_amp_caps(codec, nid, HDA_INPUT,
4642                                           (0x00 << AC_AMPCAP_OFFSET_SHIFT) |
4643                                           (0x01 << AC_AMPCAP_NUM_STEPS_SHIFT) |
4644                                           (0x2f << AC_AMPCAP_STEP_SIZE_SHIFT) |
4645                                           (0 << AC_AMPCAP_MUTE_SHIFT));
4646         }
4647 }
4648
4649 static void alc283_hp_automute_hook(struct hda_codec *codec,
4650                                     struct hda_jack_callback *jack)
4651 {
4652         struct alc_spec *spec = codec->spec;
4653         int vref;
4654
4655         msleep(200);
4656         snd_hda_gen_hp_automute(codec, jack);
4657
4658         vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
4659
4660         msleep(600);
4661         snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
4662                             vref);
4663 }
4664
4665 static void alc283_fixup_chromebook(struct hda_codec *codec,
4666                                     const struct hda_fixup *fix, int action)
4667 {
4668         struct alc_spec *spec = codec->spec;
4669
4670         switch (action) {
4671         case HDA_FIXUP_ACT_PRE_PROBE:
4672                 snd_hda_override_wcaps(codec, 0x03, 0);
4673                 /* Disable AA-loopback as it causes white noise */
4674                 spec->gen.mixer_nid = 0;
4675                 break;
4676         case HDA_FIXUP_ACT_INIT:
4677                 /* MIC2-VREF control */
4678                 /* Set to manual mode */
4679                 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
4680                 /* Enable Line1 input control by verb */
4681                 alc_update_coef_idx(codec, 0x1a, 0, 1 << 4);
4682                 break;
4683         }
4684 }
4685
4686 static void alc283_fixup_sense_combo_jack(struct hda_codec *codec,
4687                                     const struct hda_fixup *fix, int action)
4688 {
4689         struct alc_spec *spec = codec->spec;
4690
4691         switch (action) {
4692         case HDA_FIXUP_ACT_PRE_PROBE:
4693                 spec->gen.hp_automute_hook = alc283_hp_automute_hook;
4694                 break;
4695         case HDA_FIXUP_ACT_INIT:
4696                 /* MIC2-VREF control */
4697                 /* Set to manual mode */
4698                 alc_update_coef_idx(codec, 0x06, 0x000c, 0);
4699                 break;
4700         }
4701 }
4702
4703 /* mute tablet speaker pin (0x14) via dock plugging in addition */
4704 static void asus_tx300_automute(struct hda_codec *codec)
4705 {
4706         struct alc_spec *spec = codec->spec;
4707         snd_hda_gen_update_outputs(codec);
4708         if (snd_hda_jack_detect(codec, 0x1b))
4709                 spec->gen.mute_bits |= (1ULL << 0x14);
4710 }
4711
4712 static void alc282_fixup_asus_tx300(struct hda_codec *codec,
4713                                     const struct hda_fixup *fix, int action)
4714 {
4715         struct alc_spec *spec = codec->spec;
4716         /* TX300 needs to set up GPIO2 for the speaker amp */
4717         static const struct hda_verb gpio2_verbs[] = {
4718                 { 0x01, AC_VERB_SET_GPIO_MASK, 0x04 },
4719                 { 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04 },
4720                 { 0x01, AC_VERB_SET_GPIO_DATA, 0x04 },
4721                 {}
4722         };
4723         static const struct hda_pintbl dock_pins[] = {
4724                 { 0x1b, 0x21114000 }, /* dock speaker pin */
4725                 {}
4726         };
4727
4728         switch (action) {
4729         case HDA_FIXUP_ACT_PRE_PROBE:
4730                 snd_hda_add_verbs(codec, gpio2_verbs);
4731                 snd_hda_apply_pincfgs(codec, dock_pins);
4732                 spec->gen.auto_mute_via_amp = 1;
4733                 spec->gen.automute_hook = asus_tx300_automute;
4734                 snd_hda_jack_detect_enable_callback(codec, 0x1b,
4735                                                     snd_hda_gen_hp_automute);
4736                 break;
4737         case HDA_FIXUP_ACT_BUILD:
4738                 /* this is a bit tricky; give more sane names for the main
4739                  * (tablet) speaker and the dock speaker, respectively
4740                  */
4741                 rename_ctl(codec, "Speaker Playback Switch",
4742                            "Dock Speaker Playback Switch");
4743                 rename_ctl(codec, "Bass Speaker Playback Switch",
4744                            "Speaker Playback Switch");
4745                 break;
4746         }
4747 }
4748
4749 static void alc290_fixup_mono_speakers(struct hda_codec *codec,
4750                                        const struct hda_fixup *fix, int action)
4751 {
4752         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4753                 /* DAC node 0x03 is giving mono output. We therefore want to
4754                    make sure 0x14 (front speaker) and 0x15 (headphones) use the
4755                    stereo DAC, while leaving 0x17 (bass speaker) for node 0x03. */
4756                 hda_nid_t conn1[2] = { 0x0c };
4757                 snd_hda_override_conn_list(codec, 0x14, 1, conn1);
4758                 snd_hda_override_conn_list(codec, 0x15, 1, conn1);
4759         }
4760 }
4761
4762 static void alc298_fixup_speaker_volume(struct hda_codec *codec,
4763                                         const struct hda_fixup *fix, int action)
4764 {
4765         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4766                 /* The speaker is routed to the Node 0x06 by a mistake, as a result
4767                    we can't adjust the speaker's volume since this node does not has
4768                    Amp-out capability. we change the speaker's route to:
4769                    Node 0x02 (Audio Output) -> Node 0x0c (Audio Mixer) -> Node 0x17 (
4770                    Pin Complex), since Node 0x02 has Amp-out caps, we can adjust
4771                    speaker's volume now. */
4772
4773                 hda_nid_t conn1[1] = { 0x0c };
4774                 snd_hda_override_conn_list(codec, 0x17, 1, conn1);
4775         }
4776 }
4777
4778 /* Hook to update amp GPIO4 for automute */
4779 static void alc280_hp_gpio4_automute_hook(struct hda_codec *codec,
4780                                           struct hda_jack_callback *jack)
4781 {
4782         struct alc_spec *spec = codec->spec;
4783
4784         snd_hda_gen_hp_automute(codec, jack);
4785         /* mute_led_polarity is set to 0, so we pass inverted value here */
4786         alc_update_gpio_led(codec, 0x10, !spec->gen.hp_jack_present);
4787 }
4788
4789 /* Manage GPIOs for HP EliteBook Folio 9480m.
4790  *
4791  * GPIO4 is the headphone amplifier power control
4792  * GPIO3 is the audio output mute indicator LED
4793  */
4794
4795 static void alc280_fixup_hp_9480m(struct hda_codec *codec,
4796                                   const struct hda_fixup *fix,
4797                                   int action)
4798 {
4799         struct alc_spec *spec = codec->spec;
4800         static const struct hda_verb gpio_init[] = {
4801                 { 0x01, AC_VERB_SET_GPIO_MASK, 0x18 },
4802                 { 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x18 },
4803                 {}
4804         };
4805
4806         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
4807                 /* Set the hooks to turn the headphone amp on/off
4808                  * as needed
4809                  */
4810                 spec->gen.vmaster_mute.hook = alc_fixup_gpio_mute_hook;
4811                 spec->gen.hp_automute_hook = alc280_hp_gpio4_automute_hook;
4812
4813                 /* The GPIOs are currently off */
4814                 spec->gpio_led = 0;
4815
4816                 /* GPIO3 is connected to the output mute LED,
4817                  * high is on, low is off
4818                  */
4819                 spec->mute_led_polarity = 0;
4820                 spec->gpio_mute_led_mask = 0x08;
4821
4822                 /* Initialize GPIO configuration */
4823                 snd_hda_add_verbs(codec, gpio_init);
4824         }
4825 }
4826
4827 static void alc233_alc662_fixup_lenovo_dual_codecs(struct hda_codec *codec,
4828                                          const struct hda_fixup *fix,
4829                                          int action)
4830 {
4831         alc_fixup_dual_codecs(codec, fix, action);
4832         switch (action) {
4833         case HDA_FIXUP_ACT_PRE_PROBE:
4834                 /* override card longname to provide a unique UCM profile */
4835                 strcpy(codec->card->longname, "HDAudio-Lenovo-DualCodecs");
4836                 break;
4837         case HDA_FIXUP_ACT_BUILD:
4838                 /* rename Capture controls depending on the codec */
4839                 rename_ctl(codec, "Capture Volume",
4840                            codec->addr == 0 ?
4841                            "Rear-Panel Capture Volume" :
4842                            "Front-Panel Capture Volume");
4843                 rename_ctl(codec, "Capture Switch",
4844                            codec->addr == 0 ?
4845                            "Rear-Panel Capture Switch" :
4846                            "Front-Panel Capture Switch");
4847                 break;
4848         }
4849 }
4850
4851 /* for hda_fixup_thinkpad_acpi() */
4852 #include "thinkpad_helper.c"
4853
4854 /* for dell wmi mic mute led */
4855 #include "dell_wmi_helper.c"
4856
4857 enum {
4858         ALC269_FIXUP_SONY_VAIO,
4859         ALC275_FIXUP_SONY_VAIO_GPIO2,
4860         ALC269_FIXUP_DELL_M101Z,
4861         ALC269_FIXUP_SKU_IGNORE,
4862         ALC269_FIXUP_ASUS_G73JW,
4863         ALC269_FIXUP_LENOVO_EAPD,
4864         ALC275_FIXUP_SONY_HWEQ,
4865         ALC275_FIXUP_SONY_DISABLE_AAMIX,
4866         ALC271_FIXUP_DMIC,
4867         ALC269_FIXUP_PCM_44K,
4868         ALC269_FIXUP_STEREO_DMIC,
4869         ALC269_FIXUP_HEADSET_MIC,
4870         ALC269_FIXUP_QUANTA_MUTE,
4871         ALC269_FIXUP_LIFEBOOK,
4872         ALC269_FIXUP_LIFEBOOK_EXTMIC,
4873         ALC269_FIXUP_LIFEBOOK_HP_PIN,
4874         ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT,
4875         ALC269_FIXUP_AMIC,
4876         ALC269_FIXUP_DMIC,
4877         ALC269VB_FIXUP_AMIC,
4878         ALC269VB_FIXUP_DMIC,
4879         ALC269_FIXUP_HP_MUTE_LED,
4880         ALC269_FIXUP_HP_MUTE_LED_MIC1,
4881         ALC269_FIXUP_HP_MUTE_LED_MIC2,
4882         ALC269_FIXUP_HP_GPIO_LED,
4883         ALC269_FIXUP_HP_GPIO_MIC1_LED,
4884         ALC269_FIXUP_HP_LINE1_MIC1_LED,
4885         ALC269_FIXUP_INV_DMIC,
4886         ALC269_FIXUP_LENOVO_DOCK,
4887         ALC269_FIXUP_NO_SHUTUP,
4888         ALC286_FIXUP_SONY_MIC_NO_PRESENCE,
4889         ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT,
4890         ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
4891         ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
4892         ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
4893         ALC269_FIXUP_HEADSET_MODE,
4894         ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC,
4895         ALC269_FIXUP_ASPIRE_HEADSET_MIC,
4896         ALC269_FIXUP_ASUS_X101_FUNC,
4897         ALC269_FIXUP_ASUS_X101_VERB,
4898         ALC269_FIXUP_ASUS_X101,
4899         ALC271_FIXUP_AMIC_MIC2,
4900         ALC271_FIXUP_HP_GATE_MIC_JACK,
4901         ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572,
4902         ALC269_FIXUP_ACER_AC700,
4903         ALC269_FIXUP_LIMIT_INT_MIC_BOOST,
4904         ALC269VB_FIXUP_ASUS_ZENBOOK,
4905         ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A,
4906         ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED,
4907         ALC269VB_FIXUP_ORDISSIMO_EVE2,
4908         ALC283_FIXUP_CHROME_BOOK,
4909         ALC283_FIXUP_SENSE_COMBO_JACK,
4910         ALC282_FIXUP_ASUS_TX300,
4911         ALC283_FIXUP_INT_MIC,
4912         ALC290_FIXUP_MONO_SPEAKERS,
4913         ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
4914         ALC290_FIXUP_SUBWOOFER,
4915         ALC290_FIXUP_SUBWOOFER_HSJACK,
4916         ALC269_FIXUP_THINKPAD_ACPI,
4917         ALC269_FIXUP_DMIC_THINKPAD_ACPI,
4918         ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
4919         ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
4920         ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
4921         ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
4922         ALC255_FIXUP_HEADSET_MODE,
4923         ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC,
4924         ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
4925         ALC292_FIXUP_TPT440_DOCK,
4926         ALC292_FIXUP_TPT440,
4927         ALC283_FIXUP_HEADSET_MIC,
4928         ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED,
4929         ALC282_FIXUP_ASPIRE_V5_PINS,
4930         ALC280_FIXUP_HP_GPIO4,
4931         ALC286_FIXUP_HP_GPIO_LED,
4932         ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
4933         ALC280_FIXUP_HP_DOCK_PINS,
4934         ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,
4935         ALC280_FIXUP_HP_9480M,
4936         ALC288_FIXUP_DELL_HEADSET_MODE,
4937         ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
4938         ALC288_FIXUP_DELL_XPS_13_GPIO6,
4939         ALC288_FIXUP_DELL_XPS_13,
4940         ALC288_FIXUP_DISABLE_AAMIX,
4941         ALC292_FIXUP_DELL_E7X,
4942         ALC292_FIXUP_DISABLE_AAMIX,
4943         ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK,
4944         ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
4945         ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
4946         ALC275_FIXUP_DELL_XPS,
4947         ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE,
4948         ALC293_FIXUP_LENOVO_SPK_NOISE,
4949         ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY,
4950         ALC255_FIXUP_DELL_SPK_NOISE,
4951         ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
4952         ALC280_FIXUP_HP_HEADSET_MIC,
4953         ALC221_FIXUP_HP_FRONT_MIC,
4954         ALC292_FIXUP_TPT460,
4955         ALC298_FIXUP_SPK_VOLUME,
4956         ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER,
4957         ALC269_FIXUP_ATIV_BOOK_8,
4958         ALC221_FIXUP_HP_MIC_NO_PRESENCE,
4959         ALC256_FIXUP_ASUS_HEADSET_MODE,
4960         ALC256_FIXUP_ASUS_MIC,
4961         ALC256_FIXUP_ASUS_AIO_GPIO2,
4962         ALC233_FIXUP_ASUS_MIC_NO_PRESENCE,
4963         ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE,
4964         ALC233_FIXUP_LENOVO_MULTI_CODECS,
4965 };
4966
4967 static const struct hda_fixup alc269_fixups[] = {
4968         [ALC269_FIXUP_SONY_VAIO] = {
4969                 .type = HDA_FIXUP_PINCTLS,
4970                 .v.pins = (const struct hda_pintbl[]) {
4971                         {0x19, PIN_VREFGRD},
4972                         {}
4973                 }
4974         },
4975         [ALC275_FIXUP_SONY_VAIO_GPIO2] = {
4976                 .type = HDA_FIXUP_VERBS,
4977                 .v.verbs = (const struct hda_verb[]) {
4978                         {0x01, AC_VERB_SET_GPIO_MASK, 0x04},
4979                         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04},
4980                         {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
4981                         { }
4982                 },
4983                 .chained = true,
4984                 .chain_id = ALC269_FIXUP_SONY_VAIO
4985         },
4986         [ALC269_FIXUP_DELL_M101Z] = {
4987                 .type = HDA_FIXUP_VERBS,
4988                 .v.verbs = (const struct hda_verb[]) {
4989                         /* Enables internal speaker */
4990                         {0x20, AC_VERB_SET_COEF_INDEX, 13},
4991                         {0x20, AC_VERB_SET_PROC_COEF, 0x4040},
4992                         {}
4993                 }
4994         },
4995         [ALC269_FIXUP_SKU_IGNORE] = {
4996                 .type = HDA_FIXUP_FUNC,
4997                 .v.func = alc_fixup_sku_ignore,
4998         },
4999         [ALC269_FIXUP_ASUS_G73JW] = {
5000                 .type = HDA_FIXUP_PINS,
5001                 .v.pins = (const struct hda_pintbl[]) {
5002                         { 0x17, 0x99130111 }, /* subwoofer */
5003                         { }
5004                 }
5005         },
5006         [ALC269_FIXUP_LENOVO_EAPD] = {
5007                 .type = HDA_FIXUP_VERBS,
5008                 .v.verbs = (const struct hda_verb[]) {
5009                         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
5010                         {}
5011                 }
5012         },
5013         [ALC275_FIXUP_SONY_HWEQ] = {
5014                 .type = HDA_FIXUP_FUNC,
5015                 .v.func = alc269_fixup_hweq,
5016                 .chained = true,
5017                 .chain_id = ALC275_FIXUP_SONY_VAIO_GPIO2
5018         },
5019         [ALC275_FIXUP_SONY_DISABLE_AAMIX] = {
5020                 .type = HDA_FIXUP_FUNC,
5021                 .v.func = alc_fixup_disable_aamix,
5022                 .chained = true,
5023                 .chain_id = ALC269_FIXUP_SONY_VAIO
5024         },
5025         [ALC271_FIXUP_DMIC] = {
5026                 .type = HDA_FIXUP_FUNC,
5027                 .v.func = alc271_fixup_dmic,
5028         },
5029         [ALC269_FIXUP_PCM_44K] = {
5030                 .type = HDA_FIXUP_FUNC,
5031                 .v.func = alc269_fixup_pcm_44k,
5032                 .chained = true,
5033                 .chain_id = ALC269_FIXUP_QUANTA_MUTE
5034         },
5035         [ALC269_FIXUP_STEREO_DMIC] = {
5036                 .type = HDA_FIXUP_FUNC,
5037                 .v.func = alc269_fixup_stereo_dmic,
5038         },
5039         [ALC269_FIXUP_HEADSET_MIC] = {
5040                 .type = HDA_FIXUP_FUNC,
5041                 .v.func = alc269_fixup_headset_mic,
5042         },
5043         [ALC269_FIXUP_QUANTA_MUTE] = {
5044                 .type = HDA_FIXUP_FUNC,
5045                 .v.func = alc269_fixup_quanta_mute,
5046         },
5047         [ALC269_FIXUP_LIFEBOOK] = {
5048                 .type = HDA_FIXUP_PINS,
5049                 .v.pins = (const struct hda_pintbl[]) {
5050                         { 0x1a, 0x2101103f }, /* dock line-out */
5051                         { 0x1b, 0x23a11040 }, /* dock mic-in */
5052                         { }
5053                 },
5054                 .chained = true,
5055                 .chain_id = ALC269_FIXUP_QUANTA_MUTE
5056         },
5057         [ALC269_FIXUP_LIFEBOOK_EXTMIC] = {
5058                 .type = HDA_FIXUP_PINS,
5059                 .v.pins = (const struct hda_pintbl[]) {
5060                         { 0x19, 0x01a1903c }, /* headset mic, with jack detect */
5061                         { }
5062                 },
5063         },
5064         [ALC269_FIXUP_LIFEBOOK_HP_PIN] = {
5065                 .type = HDA_FIXUP_PINS,
5066                 .v.pins = (const struct hda_pintbl[]) {
5067                         { 0x21, 0x0221102f }, /* HP out */
5068                         { }
5069                 },
5070         },
5071         [ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT] = {
5072                 .type = HDA_FIXUP_FUNC,
5073                 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
5074         },
5075         [ALC269_FIXUP_AMIC] = {
5076                 .type = HDA_FIXUP_PINS,
5077                 .v.pins = (const struct hda_pintbl[]) {
5078                         { 0x14, 0x99130110 }, /* speaker */
5079                         { 0x15, 0x0121401f }, /* HP out */
5080                         { 0x18, 0x01a19c20 }, /* mic */
5081                         { 0x19, 0x99a3092f }, /* int-mic */
5082                         { }
5083                 },
5084         },
5085         [ALC269_FIXUP_DMIC] = {
5086                 .type = HDA_FIXUP_PINS,
5087                 .v.pins = (const struct hda_pintbl[]) {
5088                         { 0x12, 0x99a3092f }, /* int-mic */
5089                         { 0x14, 0x99130110 }, /* speaker */
5090                         { 0x15, 0x0121401f }, /* HP out */
5091                         { 0x18, 0x01a19c20 }, /* mic */
5092                         { }
5093                 },
5094         },
5095         [ALC269VB_FIXUP_AMIC] = {
5096                 .type = HDA_FIXUP_PINS,
5097                 .v.pins = (const struct hda_pintbl[]) {
5098                         { 0x14, 0x99130110 }, /* speaker */
5099                         { 0x18, 0x01a19c20 }, /* mic */
5100                         { 0x19, 0x99a3092f }, /* int-mic */
5101                         { 0x21, 0x0121401f }, /* HP out */
5102                         { }
5103                 },
5104         },
5105         [ALC269VB_FIXUP_DMIC] = {
5106                 .type = HDA_FIXUP_PINS,
5107                 .v.pins = (const struct hda_pintbl[]) {
5108                         { 0x12, 0x99a3092f }, /* int-mic */
5109                         { 0x14, 0x99130110 }, /* speaker */
5110                         { 0x18, 0x01a19c20 }, /* mic */
5111                         { 0x21, 0x0121401f }, /* HP out */
5112                         { }
5113                 },
5114         },
5115         [ALC269_FIXUP_HP_MUTE_LED] = {
5116                 .type = HDA_FIXUP_FUNC,
5117                 .v.func = alc269_fixup_hp_mute_led,
5118         },
5119         [ALC269_FIXUP_HP_MUTE_LED_MIC1] = {
5120                 .type = HDA_FIXUP_FUNC,
5121                 .v.func = alc269_fixup_hp_mute_led_mic1,
5122         },
5123         [ALC269_FIXUP_HP_MUTE_LED_MIC2] = {
5124                 .type = HDA_FIXUP_FUNC,
5125                 .v.func = alc269_fixup_hp_mute_led_mic2,
5126         },
5127         [ALC269_FIXUP_HP_GPIO_LED] = {
5128                 .type = HDA_FIXUP_FUNC,
5129                 .v.func = alc269_fixup_hp_gpio_led,
5130         },
5131         [ALC269_FIXUP_HP_GPIO_MIC1_LED] = {
5132                 .type = HDA_FIXUP_FUNC,
5133                 .v.func = alc269_fixup_hp_gpio_mic1_led,
5134         },
5135         [ALC269_FIXUP_HP_LINE1_MIC1_LED] = {
5136                 .type = HDA_FIXUP_FUNC,
5137                 .v.func = alc269_fixup_hp_line1_mic1_led,
5138         },
5139         [ALC269_FIXUP_INV_DMIC] = {
5140                 .type = HDA_FIXUP_FUNC,
5141                 .v.func = alc_fixup_inv_dmic,
5142         },
5143         [ALC269_FIXUP_NO_SHUTUP] = {
5144                 .type = HDA_FIXUP_FUNC,
5145                 .v.func = alc_fixup_no_shutup,
5146         },
5147         [ALC269_FIXUP_LENOVO_DOCK] = {
5148                 .type = HDA_FIXUP_PINS,
5149                 .v.pins = (const struct hda_pintbl[]) {
5150                         { 0x19, 0x23a11040 }, /* dock mic */
5151                         { 0x1b, 0x2121103f }, /* dock headphone */
5152                         { }
5153                 },
5154                 .chained = true,
5155                 .chain_id = ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT
5156         },
5157         [ALC269_FIXUP_PINCFG_NO_HP_TO_LINEOUT] = {
5158                 .type = HDA_FIXUP_FUNC,
5159                 .v.func = alc269_fixup_pincfg_no_hp_to_lineout,
5160                 .chained = true,
5161                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
5162         },
5163         [ALC269_FIXUP_DELL1_MIC_NO_PRESENCE] = {
5164                 .type = HDA_FIXUP_PINS,
5165                 .v.pins = (const struct hda_pintbl[]) {
5166                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5167                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
5168                         { }
5169                 },
5170                 .chained = true,
5171                 .chain_id = ALC269_FIXUP_HEADSET_MODE
5172         },
5173         [ALC269_FIXUP_DELL2_MIC_NO_PRESENCE] = {
5174                 .type = HDA_FIXUP_PINS,
5175                 .v.pins = (const struct hda_pintbl[]) {
5176                         { 0x16, 0x21014020 }, /* dock line out */
5177                         { 0x19, 0x21a19030 }, /* dock mic */
5178                         { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5179                         { }
5180                 },
5181                 .chained = true,
5182                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
5183         },
5184         [ALC269_FIXUP_DELL3_MIC_NO_PRESENCE] = {
5185                 .type = HDA_FIXUP_PINS,
5186                 .v.pins = (const struct hda_pintbl[]) {
5187                         { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5188                         { }
5189                 },
5190                 .chained = true,
5191                 .chain_id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC
5192         },
5193         [ALC269_FIXUP_HEADSET_MODE] = {
5194                 .type = HDA_FIXUP_FUNC,
5195                 .v.func = alc_fixup_headset_mode,
5196                 .chained = true,
5197                 .chain_id = ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED
5198         },
5199         [ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
5200                 .type = HDA_FIXUP_FUNC,
5201                 .v.func = alc_fixup_headset_mode_no_hp_mic,
5202         },
5203         [ALC269_FIXUP_ASPIRE_HEADSET_MIC] = {
5204                 .type = HDA_FIXUP_PINS,
5205                 .v.pins = (const struct hda_pintbl[]) {
5206                         { 0x19, 0x01a1913c }, /* headset mic w/o jack detect */
5207                         { }
5208                 },
5209                 .chained = true,
5210                 .chain_id = ALC269_FIXUP_HEADSET_MODE,
5211         },
5212         [ALC286_FIXUP_SONY_MIC_NO_PRESENCE] = {
5213                 .type = HDA_FIXUP_PINS,
5214                 .v.pins = (const struct hda_pintbl[]) {
5215                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5216                         { }
5217                 },
5218                 .chained = true,
5219                 .chain_id = ALC269_FIXUP_HEADSET_MIC
5220         },
5221         [ALC269_FIXUP_ASUS_X101_FUNC] = {
5222                 .type = HDA_FIXUP_FUNC,
5223                 .v.func = alc269_fixup_x101_headset_mic,
5224         },
5225         [ALC269_FIXUP_ASUS_X101_VERB] = {
5226                 .type = HDA_FIXUP_VERBS,
5227                 .v.verbs = (const struct hda_verb[]) {
5228                         {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, 0},
5229                         {0x20, AC_VERB_SET_COEF_INDEX, 0x08},
5230                         {0x20, AC_VERB_SET_PROC_COEF,  0x0310},
5231                         { }
5232                 },
5233                 .chained = true,
5234                 .chain_id = ALC269_FIXUP_ASUS_X101_FUNC
5235         },
5236         [ALC269_FIXUP_ASUS_X101] = {
5237                 .type = HDA_FIXUP_PINS,
5238                 .v.pins = (const struct hda_pintbl[]) {
5239                         { 0x18, 0x04a1182c }, /* Headset mic */
5240                         { }
5241                 },
5242                 .chained = true,
5243                 .chain_id = ALC269_FIXUP_ASUS_X101_VERB
5244         },
5245         [ALC271_FIXUP_AMIC_MIC2] = {
5246                 .type = HDA_FIXUP_PINS,
5247                 .v.pins = (const struct hda_pintbl[]) {
5248                         { 0x14, 0x99130110 }, /* speaker */
5249                         { 0x19, 0x01a19c20 }, /* mic */
5250                         { 0x1b, 0x99a7012f }, /* int-mic */
5251                         { 0x21, 0x0121401f }, /* HP out */
5252                         { }
5253                 },
5254         },
5255         [ALC271_FIXUP_HP_GATE_MIC_JACK] = {
5256                 .type = HDA_FIXUP_FUNC,
5257                 .v.func = alc271_hp_gate_mic_jack,
5258                 .chained = true,
5259                 .chain_id = ALC271_FIXUP_AMIC_MIC2,
5260         },
5261         [ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572] = {
5262                 .type = HDA_FIXUP_FUNC,
5263                 .v.func = alc269_fixup_limit_int_mic_boost,
5264                 .chained = true,
5265                 .chain_id = ALC271_FIXUP_HP_GATE_MIC_JACK,
5266         },
5267         [ALC269_FIXUP_ACER_AC700] = {
5268                 .type = HDA_FIXUP_PINS,
5269                 .v.pins = (const struct hda_pintbl[]) {
5270                         { 0x12, 0x99a3092f }, /* int-mic */
5271                         { 0x14, 0x99130110 }, /* speaker */
5272                         { 0x18, 0x03a11c20 }, /* mic */
5273                         { 0x1e, 0x0346101e }, /* SPDIF1 */
5274                         { 0x21, 0x0321101f }, /* HP out */
5275                         { }
5276                 },
5277                 .chained = true,
5278                 .chain_id = ALC271_FIXUP_DMIC,
5279         },
5280         [ALC269_FIXUP_LIMIT_INT_MIC_BOOST] = {
5281                 .type = HDA_FIXUP_FUNC,
5282                 .v.func = alc269_fixup_limit_int_mic_boost,
5283                 .chained = true,
5284                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
5285         },
5286         [ALC269VB_FIXUP_ASUS_ZENBOOK] = {
5287                 .type = HDA_FIXUP_FUNC,
5288                 .v.func = alc269_fixup_limit_int_mic_boost,
5289                 .chained = true,
5290                 .chain_id = ALC269VB_FIXUP_DMIC,
5291         },
5292         [ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A] = {
5293                 .type = HDA_FIXUP_VERBS,
5294                 .v.verbs = (const struct hda_verb[]) {
5295                         /* class-D output amp +5dB */
5296                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x12 },
5297                         { 0x20, AC_VERB_SET_PROC_COEF, 0x2800 },
5298                         {}
5299                 },
5300                 .chained = true,
5301                 .chain_id = ALC269VB_FIXUP_ASUS_ZENBOOK,
5302         },
5303         [ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED] = {
5304                 .type = HDA_FIXUP_FUNC,
5305                 .v.func = alc269_fixup_limit_int_mic_boost,
5306                 .chained = true,
5307                 .chain_id = ALC269_FIXUP_HP_MUTE_LED_MIC1,
5308         },
5309         [ALC269VB_FIXUP_ORDISSIMO_EVE2] = {
5310                 .type = HDA_FIXUP_PINS,
5311                 .v.pins = (const struct hda_pintbl[]) {
5312                         { 0x12, 0x99a3092f }, /* int-mic */
5313                         { 0x18, 0x03a11d20 }, /* mic */
5314                         { 0x19, 0x411111f0 }, /* Unused bogus pin */
5315                         { }
5316                 },
5317         },
5318         [ALC283_FIXUP_CHROME_BOOK] = {
5319                 .type = HDA_FIXUP_FUNC,
5320                 .v.func = alc283_fixup_chromebook,
5321         },
5322         [ALC283_FIXUP_SENSE_COMBO_JACK] = {
5323                 .type = HDA_FIXUP_FUNC,
5324                 .v.func = alc283_fixup_sense_combo_jack,
5325                 .chained = true,
5326                 .chain_id = ALC283_FIXUP_CHROME_BOOK,
5327         },
5328         [ALC282_FIXUP_ASUS_TX300] = {
5329                 .type = HDA_FIXUP_FUNC,
5330                 .v.func = alc282_fixup_asus_tx300,
5331         },
5332         [ALC283_FIXUP_INT_MIC] = {
5333                 .type = HDA_FIXUP_VERBS,
5334                 .v.verbs = (const struct hda_verb[]) {
5335                         {0x20, AC_VERB_SET_COEF_INDEX, 0x1a},
5336                         {0x20, AC_VERB_SET_PROC_COEF, 0x0011},
5337                         { }
5338                 },
5339                 .chained = true,
5340                 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
5341         },
5342         [ALC290_FIXUP_SUBWOOFER_HSJACK] = {
5343                 .type = HDA_FIXUP_PINS,
5344                 .v.pins = (const struct hda_pintbl[]) {
5345                         { 0x17, 0x90170112 }, /* subwoofer */
5346                         { }
5347                 },
5348                 .chained = true,
5349                 .chain_id = ALC290_FIXUP_MONO_SPEAKERS_HSJACK,
5350         },
5351         [ALC290_FIXUP_SUBWOOFER] = {
5352                 .type = HDA_FIXUP_PINS,
5353                 .v.pins = (const struct hda_pintbl[]) {
5354                         { 0x17, 0x90170112 }, /* subwoofer */
5355                         { }
5356                 },
5357                 .chained = true,
5358                 .chain_id = ALC290_FIXUP_MONO_SPEAKERS,
5359         },
5360         [ALC290_FIXUP_MONO_SPEAKERS] = {
5361                 .type = HDA_FIXUP_FUNC,
5362                 .v.func = alc290_fixup_mono_speakers,
5363         },
5364         [ALC290_FIXUP_MONO_SPEAKERS_HSJACK] = {
5365                 .type = HDA_FIXUP_FUNC,
5366                 .v.func = alc290_fixup_mono_speakers,
5367                 .chained = true,
5368                 .chain_id = ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
5369         },
5370         [ALC269_FIXUP_THINKPAD_ACPI] = {
5371                 .type = HDA_FIXUP_FUNC,
5372                 .v.func = hda_fixup_thinkpad_acpi,
5373                 .chained = true,
5374                 .chain_id = ALC269_FIXUP_SKU_IGNORE,
5375         },
5376         [ALC269_FIXUP_DMIC_THINKPAD_ACPI] = {
5377                 .type = HDA_FIXUP_FUNC,
5378                 .v.func = alc_fixup_inv_dmic,
5379                 .chained = true,
5380                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI,
5381         },
5382         [ALC255_FIXUP_ACER_MIC_NO_PRESENCE] = {
5383                 .type = HDA_FIXUP_PINS,
5384                 .v.pins = (const struct hda_pintbl[]) {
5385                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5386                         { }
5387                 },
5388                 .chained = true,
5389                 .chain_id = ALC255_FIXUP_HEADSET_MODE
5390         },
5391         [ALC255_FIXUP_ASUS_MIC_NO_PRESENCE] = {
5392                 .type = HDA_FIXUP_PINS,
5393                 .v.pins = (const struct hda_pintbl[]) {
5394                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5395                         { }
5396                 },
5397                 .chained = true,
5398                 .chain_id = ALC255_FIXUP_HEADSET_MODE
5399         },
5400         [ALC255_FIXUP_DELL1_MIC_NO_PRESENCE] = {
5401                 .type = HDA_FIXUP_PINS,
5402                 .v.pins = (const struct hda_pintbl[]) {
5403                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5404                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
5405                         { }
5406                 },
5407                 .chained = true,
5408                 .chain_id = ALC255_FIXUP_HEADSET_MODE
5409         },
5410         [ALC255_FIXUP_DELL2_MIC_NO_PRESENCE] = {
5411                 .type = HDA_FIXUP_PINS,
5412                 .v.pins = (const struct hda_pintbl[]) {
5413                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5414                         { }
5415                 },
5416                 .chained = true,
5417                 .chain_id = ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC
5418         },
5419         [ALC255_FIXUP_HEADSET_MODE] = {
5420                 .type = HDA_FIXUP_FUNC,
5421                 .v.func = alc_fixup_headset_mode_alc255,
5422                 .chained = true,
5423                 .chain_id = ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED
5424         },
5425         [ALC255_FIXUP_HEADSET_MODE_NO_HP_MIC] = {
5426                 .type = HDA_FIXUP_FUNC,
5427                 .v.func = alc_fixup_headset_mode_alc255_no_hp_mic,
5428         },
5429         [ALC293_FIXUP_DELL1_MIC_NO_PRESENCE] = {
5430                 .type = HDA_FIXUP_PINS,
5431                 .v.pins = (const struct hda_pintbl[]) {
5432                         { 0x18, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
5433                         { 0x1a, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5434                         { }
5435                 },
5436                 .chained = true,
5437                 .chain_id = ALC269_FIXUP_HEADSET_MODE
5438         },
5439         [ALC292_FIXUP_TPT440_DOCK] = {
5440                 .type = HDA_FIXUP_FUNC,
5441                 .v.func = alc_fixup_tpt440_dock,
5442                 .chained = true,
5443                 .chain_id = ALC269_FIXUP_LIMIT_INT_MIC_BOOST
5444         },
5445         [ALC292_FIXUP_TPT440] = {
5446                 .type = HDA_FIXUP_FUNC,
5447                 .v.func = alc_fixup_disable_aamix,
5448                 .chained = true,
5449                 .chain_id = ALC292_FIXUP_TPT440_DOCK,
5450         },
5451         [ALC283_FIXUP_HEADSET_MIC] = {
5452                 .type = HDA_FIXUP_PINS,
5453                 .v.pins = (const struct hda_pintbl[]) {
5454                         { 0x19, 0x04a110f0 },
5455                         { },
5456                 },
5457         },
5458         [ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED] = {
5459                 .type = HDA_FIXUP_FUNC,
5460                 .v.func = alc_fixup_dell_wmi,
5461         },
5462         [ALC282_FIXUP_ASPIRE_V5_PINS] = {
5463                 .type = HDA_FIXUP_PINS,
5464                 .v.pins = (const struct hda_pintbl[]) {
5465                         { 0x12, 0x90a60130 },
5466                         { 0x14, 0x90170110 },
5467                         { 0x17, 0x40000008 },
5468                         { 0x18, 0x411111f0 },
5469                         { 0x19, 0x01a1913c },
5470                         { 0x1a, 0x411111f0 },
5471                         { 0x1b, 0x411111f0 },
5472                         { 0x1d, 0x40f89b2d },
5473                         { 0x1e, 0x411111f0 },
5474                         { 0x21, 0x0321101f },
5475                         { },
5476                 },
5477         },
5478         [ALC280_FIXUP_HP_GPIO4] = {
5479                 .type = HDA_FIXUP_FUNC,
5480                 .v.func = alc280_fixup_hp_gpio4,
5481         },
5482         [ALC286_FIXUP_HP_GPIO_LED] = {
5483                 .type = HDA_FIXUP_FUNC,
5484                 .v.func = alc286_fixup_hp_gpio_led,
5485         },
5486         [ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY] = {
5487                 .type = HDA_FIXUP_FUNC,
5488                 .v.func = alc280_fixup_hp_gpio2_mic_hotkey,
5489         },
5490         [ALC280_FIXUP_HP_DOCK_PINS] = {
5491                 .type = HDA_FIXUP_PINS,
5492                 .v.pins = (const struct hda_pintbl[]) {
5493                         { 0x1b, 0x21011020 }, /* line-out */
5494                         { 0x1a, 0x01a1903c }, /* headset mic */
5495                         { 0x18, 0x2181103f }, /* line-in */
5496                         { },
5497                 },
5498                 .chained = true,
5499                 .chain_id = ALC280_FIXUP_HP_GPIO4
5500         },
5501         [ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {
5502                 .type = HDA_FIXUP_PINS,
5503                 .v.pins = (const struct hda_pintbl[]) {
5504                         { 0x1b, 0x21011020 }, /* line-out */
5505                         { 0x18, 0x2181103f }, /* line-in */
5506                         { },
5507                 },
5508                 .chained = true,
5509                 .chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED
5510         },
5511         [ALC280_FIXUP_HP_9480M] = {
5512                 .type = HDA_FIXUP_FUNC,
5513                 .v.func = alc280_fixup_hp_9480m,
5514         },
5515         [ALC288_FIXUP_DELL_HEADSET_MODE] = {
5516                 .type = HDA_FIXUP_FUNC,
5517                 .v.func = alc_fixup_headset_mode_dell_alc288,
5518                 .chained = true,
5519                 .chain_id = ALC255_FIXUP_DELL_WMI_MIC_MUTE_LED
5520         },
5521         [ALC288_FIXUP_DELL1_MIC_NO_PRESENCE] = {
5522                 .type = HDA_FIXUP_PINS,
5523                 .v.pins = (const struct hda_pintbl[]) {
5524                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5525                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
5526                         { }
5527                 },
5528                 .chained = true,
5529                 .chain_id = ALC288_FIXUP_DELL_HEADSET_MODE
5530         },
5531         [ALC288_FIXUP_DELL_XPS_13_GPIO6] = {
5532                 .type = HDA_FIXUP_VERBS,
5533                 .v.verbs = (const struct hda_verb[]) {
5534                         {0x01, AC_VERB_SET_GPIO_MASK, 0x40},
5535                         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x40},
5536                         {0x01, AC_VERB_SET_GPIO_DATA, 0x00},
5537                         { }
5538                 },
5539                 .chained = true,
5540                 .chain_id = ALC288_FIXUP_DELL1_MIC_NO_PRESENCE
5541         },
5542         [ALC288_FIXUP_DISABLE_AAMIX] = {
5543                 .type = HDA_FIXUP_FUNC,
5544                 .v.func = alc_fixup_disable_aamix,
5545                 .chained = true,
5546                 .chain_id = ALC288_FIXUP_DELL_XPS_13_GPIO6
5547         },
5548         [ALC288_FIXUP_DELL_XPS_13] = {
5549                 .type = HDA_FIXUP_FUNC,
5550                 .v.func = alc_fixup_dell_xps13,
5551                 .chained = true,
5552                 .chain_id = ALC288_FIXUP_DISABLE_AAMIX
5553         },
5554         [ALC292_FIXUP_DISABLE_AAMIX] = {
5555                 .type = HDA_FIXUP_FUNC,
5556                 .v.func = alc_fixup_disable_aamix,
5557                 .chained = true,
5558                 .chain_id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE
5559         },
5560         [ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK] = {
5561                 .type = HDA_FIXUP_FUNC,
5562                 .v.func = alc_fixup_disable_aamix,
5563                 .chained = true,
5564                 .chain_id = ALC293_FIXUP_DELL1_MIC_NO_PRESENCE
5565         },
5566         [ALC292_FIXUP_DELL_E7X] = {
5567                 .type = HDA_FIXUP_FUNC,
5568                 .v.func = alc_fixup_dell_xps13,
5569                 .chained = true,
5570                 .chain_id = ALC292_FIXUP_DISABLE_AAMIX
5571         },
5572         [ALC298_FIXUP_DELL1_MIC_NO_PRESENCE] = {
5573                 .type = HDA_FIXUP_PINS,
5574                 .v.pins = (const struct hda_pintbl[]) {
5575                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5576                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
5577                         { }
5578                 },
5579                 .chained = true,
5580                 .chain_id = ALC269_FIXUP_HEADSET_MODE
5581         },
5582         [ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE] = {
5583                 .type = HDA_FIXUP_PINS,
5584                 .v.pins = (const struct hda_pintbl[]) {
5585                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5586                         { }
5587                 },
5588                 .chained = true,
5589                 .chain_id = ALC269_FIXUP_HEADSET_MODE
5590         },
5591         [ALC275_FIXUP_DELL_XPS] = {
5592                 .type = HDA_FIXUP_VERBS,
5593                 .v.verbs = (const struct hda_verb[]) {
5594                         /* Enables internal speaker */
5595                         {0x20, AC_VERB_SET_COEF_INDEX, 0x1f},
5596                         {0x20, AC_VERB_SET_PROC_COEF, 0x00c0},
5597                         {0x20, AC_VERB_SET_COEF_INDEX, 0x30},
5598                         {0x20, AC_VERB_SET_PROC_COEF, 0x00b1},
5599                         {}
5600                 }
5601         },
5602         [ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE] = {
5603                 .type = HDA_FIXUP_VERBS,
5604                 .v.verbs = (const struct hda_verb[]) {
5605                         /* Disable pass-through path for FRONT 14h */
5606                         {0x20, AC_VERB_SET_COEF_INDEX, 0x36},
5607                         {0x20, AC_VERB_SET_PROC_COEF, 0x1737},
5608                         {}
5609                 },
5610                 .chained = true,
5611                 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
5612         },
5613         [ALC293_FIXUP_LENOVO_SPK_NOISE] = {
5614                 .type = HDA_FIXUP_FUNC,
5615                 .v.func = alc_fixup_disable_aamix,
5616                 .chained = true,
5617                 .chain_id = ALC269_FIXUP_THINKPAD_ACPI
5618         },
5619         [ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY] = {
5620                 .type = HDA_FIXUP_FUNC,
5621                 .v.func = alc233_fixup_lenovo_line2_mic_hotkey,
5622         },
5623         [ALC255_FIXUP_DELL_SPK_NOISE] = {
5624                 .type = HDA_FIXUP_FUNC,
5625                 .v.func = alc_fixup_disable_aamix,
5626                 .chained = true,
5627                 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
5628         },
5629         [ALC225_FIXUP_DELL1_MIC_NO_PRESENCE] = {
5630                 .type = HDA_FIXUP_VERBS,
5631                 .v.verbs = (const struct hda_verb[]) {
5632                         /* Disable pass-through path for FRONT 14h */
5633                         { 0x20, AC_VERB_SET_COEF_INDEX, 0x36 },
5634                         { 0x20, AC_VERB_SET_PROC_COEF, 0x57d7 },
5635                         {}
5636                 },
5637                 .chained = true,
5638                 .chain_id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE
5639         },
5640         [ALC280_FIXUP_HP_HEADSET_MIC] = {
5641                 .type = HDA_FIXUP_FUNC,
5642                 .v.func = alc_fixup_disable_aamix,
5643                 .chained = true,
5644                 .chain_id = ALC269_FIXUP_HEADSET_MIC,
5645         },
5646         [ALC221_FIXUP_HP_FRONT_MIC] = {
5647                 .type = HDA_FIXUP_PINS,
5648                 .v.pins = (const struct hda_pintbl[]) {
5649                         { 0x19, 0x02a19020 }, /* Front Mic */
5650                         { }
5651                 },
5652         },
5653         [ALC292_FIXUP_TPT460] = {
5654                 .type = HDA_FIXUP_FUNC,
5655                 .v.func = alc_fixup_tpt440_dock,
5656                 .chained = true,
5657                 .chain_id = ALC293_FIXUP_LENOVO_SPK_NOISE,
5658         },
5659         [ALC298_FIXUP_SPK_VOLUME] = {
5660                 .type = HDA_FIXUP_FUNC,
5661                 .v.func = alc298_fixup_speaker_volume,
5662                 .chained = true,
5663                 .chain_id = ALC298_FIXUP_DELL_AIO_MIC_NO_PRESENCE,
5664         },
5665         [ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER] = {
5666                 .type = HDA_FIXUP_PINS,
5667                 .v.pins = (const struct hda_pintbl[]) {
5668                         { 0x1b, 0x90170151 },
5669                         { }
5670                 },
5671                 .chained = true,
5672                 .chain_id = ALC255_FIXUP_DELL1_MIC_NO_PRESENCE
5673         },
5674         [ALC269_FIXUP_ATIV_BOOK_8] = {
5675                 .type = HDA_FIXUP_FUNC,
5676                 .v.func = alc_fixup_auto_mute_via_amp,
5677                 .chained = true,
5678                 .chain_id = ALC269_FIXUP_NO_SHUTUP
5679         },
5680         [ALC221_FIXUP_HP_MIC_NO_PRESENCE] = {
5681                 .type = HDA_FIXUP_PINS,
5682                 .v.pins = (const struct hda_pintbl[]) {
5683                         { 0x18, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5684                         { 0x1a, 0x01a1913d }, /* use as headphone mic, without its own jack detect */
5685                         { }
5686                 },
5687                 .chained = true,
5688                 .chain_id = ALC269_FIXUP_HEADSET_MODE
5689         },
5690         [ALC256_FIXUP_ASUS_HEADSET_MODE] = {
5691                 .type = HDA_FIXUP_FUNC,
5692                 .v.func = alc_fixup_headset_mode,
5693         },
5694         [ALC256_FIXUP_ASUS_MIC] = {
5695                 .type = HDA_FIXUP_PINS,
5696                 .v.pins = (const struct hda_pintbl[]) {
5697                         { 0x13, 0x90a60160 }, /* use as internal mic */
5698                         { 0x19, 0x04a11120 }, /* use as headset mic, without its own jack detect */
5699                         { }
5700                 },
5701                 .chained = true,
5702                 .chain_id = ALC256_FIXUP_ASUS_HEADSET_MODE
5703         },
5704         [ALC256_FIXUP_ASUS_AIO_GPIO2] = {
5705                 .type = HDA_FIXUP_VERBS,
5706                 .v.verbs = (const struct hda_verb[]) {
5707                         /* Set up GPIO2 for the speaker amp */
5708                         { 0x01, AC_VERB_SET_GPIO_MASK, 0x04 },
5709                         { 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x04 },
5710                         { 0x01, AC_VERB_SET_GPIO_DATA, 0x04 },
5711                         {}
5712                 },
5713         },
5714         [ALC233_FIXUP_ASUS_MIC_NO_PRESENCE] = {
5715                 .type = HDA_FIXUP_PINS,
5716                 .v.pins = (const struct hda_pintbl[]) {
5717                         { 0x19, 0x01a1913c }, /* use as headset mic, without its own jack detect */
5718                         { }
5719                 },
5720                 .chained = true,
5721                 .chain_id = ALC269_FIXUP_HEADSET_MIC
5722         },
5723         [ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE] = {
5724                 .type = HDA_FIXUP_VERBS,
5725                 .v.verbs = (const struct hda_verb[]) {
5726                         /* Enables internal speaker */
5727                         {0x20, AC_VERB_SET_COEF_INDEX, 0x40},
5728                         {0x20, AC_VERB_SET_PROC_COEF, 0x8800},
5729                         {}
5730                 },
5731                 .chained = true,
5732                 .chain_id = ALC233_FIXUP_ASUS_MIC_NO_PRESENCE
5733         },
5734         [ALC233_FIXUP_LENOVO_MULTI_CODECS] = {
5735                 .type = HDA_FIXUP_FUNC,
5736                 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
5737         },
5738 };
5739
5740 static const struct snd_pci_quirk alc269_fixup_tbl[] = {
5741         SND_PCI_QUIRK(0x1025, 0x0283, "Acer TravelMate 8371", ALC269_FIXUP_INV_DMIC),
5742         SND_PCI_QUIRK(0x1025, 0x029b, "Acer 1810TZ", ALC269_FIXUP_INV_DMIC),
5743         SND_PCI_QUIRK(0x1025, 0x0349, "Acer AOD260", ALC269_FIXUP_INV_DMIC),
5744         SND_PCI_QUIRK(0x1025, 0x047c, "Acer AC700", ALC269_FIXUP_ACER_AC700),
5745         SND_PCI_QUIRK(0x1025, 0x072d, "Acer Aspire V5-571G", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
5746         SND_PCI_QUIRK(0x1025, 0x080d, "Acer Aspire V5-122P", ALC269_FIXUP_ASPIRE_HEADSET_MIC),
5747         SND_PCI_QUIRK(0x1025, 0x0740, "Acer AO725", ALC271_FIXUP_HP_GATE_MIC_JACK),
5748         SND_PCI_QUIRK(0x1025, 0x0742, "Acer AO756", ALC271_FIXUP_HP_GATE_MIC_JACK),
5749         SND_PCI_QUIRK(0x1025, 0x0762, "Acer Aspire E1-472", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
5750         SND_PCI_QUIRK(0x1025, 0x0775, "Acer Aspire E1-572", ALC271_FIXUP_HP_GATE_MIC_JACK_E1_572),
5751         SND_PCI_QUIRK(0x1025, 0x079b, "Acer Aspire V5-573G", ALC282_FIXUP_ASPIRE_V5_PINS),
5752         SND_PCI_QUIRK(0x1025, 0x106d, "Acer Cloudbook 14", ALC283_FIXUP_CHROME_BOOK),
5753         SND_PCI_QUIRK(0x1028, 0x0470, "Dell M101z", ALC269_FIXUP_DELL_M101Z),
5754         SND_PCI_QUIRK(0x1028, 0x054b, "Dell XPS one 2710", ALC275_FIXUP_DELL_XPS),
5755         SND_PCI_QUIRK(0x1028, 0x05bd, "Dell Latitude E6440", ALC292_FIXUP_DELL_E7X),
5756         SND_PCI_QUIRK(0x1028, 0x05be, "Dell Latitude E6540", ALC292_FIXUP_DELL_E7X),
5757         SND_PCI_QUIRK(0x1028, 0x05ca, "Dell Latitude E7240", ALC292_FIXUP_DELL_E7X),
5758         SND_PCI_QUIRK(0x1028, 0x05cb, "Dell Latitude E7440", ALC292_FIXUP_DELL_E7X),
5759         SND_PCI_QUIRK(0x1028, 0x05da, "Dell Vostro 5460", ALC290_FIXUP_SUBWOOFER),
5760         SND_PCI_QUIRK(0x1028, 0x05f4, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
5761         SND_PCI_QUIRK(0x1028, 0x05f5, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
5762         SND_PCI_QUIRK(0x1028, 0x05f6, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE),
5763         SND_PCI_QUIRK(0x1028, 0x0615, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
5764         SND_PCI_QUIRK(0x1028, 0x0616, "Dell Vostro 5470", ALC290_FIXUP_SUBWOOFER_HSJACK),
5765         SND_PCI_QUIRK(0x1028, 0x062c, "Dell Latitude E5550", ALC292_FIXUP_DELL_E7X),
5766         SND_PCI_QUIRK(0x1028, 0x062e, "Dell Latitude E7450", ALC292_FIXUP_DELL_E7X),
5767         SND_PCI_QUIRK(0x1028, 0x0638, "Dell Inspiron 5439", ALC290_FIXUP_MONO_SPEAKERS_HSJACK),
5768         SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
5769         SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
5770         SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),
5771         SND_PCI_QUIRK(0x1028, 0x0669, "Dell Optiplex 9020m", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
5772         SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
5773         SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
5774         SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
5775         SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
5776         SND_PCI_QUIRK(0x1028, 0x06db, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
5777         SND_PCI_QUIRK(0x1028, 0x06dd, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
5778         SND_PCI_QUIRK(0x1028, 0x06de, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
5779         SND_PCI_QUIRK(0x1028, 0x06df, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
5780         SND_PCI_QUIRK(0x1028, 0x06e0, "Dell", ALC293_FIXUP_DISABLE_AAMIX_MULTIJACK),
5781         SND_PCI_QUIRK(0x1028, 0x0704, "Dell XPS 13 9350", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE),
5782         SND_PCI_QUIRK(0x1028, 0x0706, "Dell Inspiron 7559", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
5783         SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE),
5784         SND_PCI_QUIRK(0x1028, 0x075b, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE),
5785         SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME),
5786         SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
5787         SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
5788         SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
5789         SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
5790         SND_PCI_QUIRK(0x103c, 0x18e6, "HP", ALC269_FIXUP_HP_GPIO_LED),
5791         SND_PCI_QUIRK(0x103c, 0x218b, "HP", ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED),
5792         SND_PCI_QUIRK(0x103c, 0x225f, "HP", ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY),
5793         /* ALC282 */
5794         SND_PCI_QUIRK(0x103c, 0x21f9, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5795         SND_PCI_QUIRK(0x103c, 0x2210, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5796         SND_PCI_QUIRK(0x103c, 0x2214, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5797         SND_PCI_QUIRK(0x103c, 0x2236, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
5798         SND_PCI_QUIRK(0x103c, 0x2237, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
5799         SND_PCI_QUIRK(0x103c, 0x2238, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
5800         SND_PCI_QUIRK(0x103c, 0x2239, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
5801         SND_PCI_QUIRK(0x103c, 0x224b, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED),
5802         SND_PCI_QUIRK(0x103c, 0x2268, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5803         SND_PCI_QUIRK(0x103c, 0x226a, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5804         SND_PCI_QUIRK(0x103c, 0x226b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5805         SND_PCI_QUIRK(0x103c, 0x226e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5806         SND_PCI_QUIRK(0x103c, 0x2271, "HP", ALC286_FIXUP_HP_GPIO_LED),
5807         SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC280_FIXUP_HP_DOCK_PINS),
5808         SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC280_FIXUP_HP_DOCK_PINS),
5809         SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5810         SND_PCI_QUIRK(0x103c, 0x22b2, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5811         SND_PCI_QUIRK(0x103c, 0x22b7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5812         SND_PCI_QUIRK(0x103c, 0x22bf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5813         SND_PCI_QUIRK(0x103c, 0x22cf, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5814         SND_PCI_QUIRK(0x103c, 0x22db, "HP", ALC280_FIXUP_HP_9480M),
5815         SND_PCI_QUIRK(0x103c, 0x22dc, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
5816         SND_PCI_QUIRK(0x103c, 0x22fb, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
5817         /* ALC290 */
5818         SND_PCI_QUIRK(0x103c, 0x221b, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
5819         SND_PCI_QUIRK(0x103c, 0x2221, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
5820         SND_PCI_QUIRK(0x103c, 0x2225, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
5821         SND_PCI_QUIRK(0x103c, 0x2253, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
5822         SND_PCI_QUIRK(0x103c, 0x2254, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
5823         SND_PCI_QUIRK(0x103c, 0x2255, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
5824         SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
5825         SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
5826         SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
5827         SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
5828         SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5829         SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5830         SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5831         SND_PCI_QUIRK(0x103c, 0x2265, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5832         SND_PCI_QUIRK(0x103c, 0x2272, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
5833         SND_PCI_QUIRK(0x103c, 0x2273, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
5834         SND_PCI_QUIRK(0x103c, 0x2278, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
5835         SND_PCI_QUIRK(0x103c, 0x227f, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5836         SND_PCI_QUIRK(0x103c, 0x2282, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5837         SND_PCI_QUIRK(0x103c, 0x228b, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5838         SND_PCI_QUIRK(0x103c, 0x228e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5839         SND_PCI_QUIRK(0x103c, 0x22c5, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5840         SND_PCI_QUIRK(0x103c, 0x22c7, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5841         SND_PCI_QUIRK(0x103c, 0x22c8, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5842         SND_PCI_QUIRK(0x103c, 0x22c4, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5843         SND_PCI_QUIRK(0x103c, 0x2334, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5844         SND_PCI_QUIRK(0x103c, 0x2335, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5845         SND_PCI_QUIRK(0x103c, 0x2336, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5846         SND_PCI_QUIRK(0x103c, 0x2337, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
5847         SND_PCI_QUIRK(0x103c, 0x221c, "HP EliteBook 755 G2", ALC280_FIXUP_HP_HEADSET_MIC),
5848         SND_PCI_QUIRK(0x103c, 0x8256, "HP", ALC221_FIXUP_HP_FRONT_MIC),
5849         SND_PCI_QUIRK(0x103c, 0x82bf, "HP", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
5850         SND_PCI_QUIRK(0x103c, 0x82c0, "HP", ALC221_FIXUP_HP_MIC_NO_PRESENCE),
5851         SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
5852         SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
5853         SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
5854         SND_PCI_QUIRK(0x1043, 0x10c0, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
5855         SND_PCI_QUIRK(0x1043, 0x115d, "Asus 1015E", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
5856         SND_PCI_QUIRK(0x1043, 0x12f0, "ASUS X541UV", ALC256_FIXUP_ASUS_MIC),
5857         SND_PCI_QUIRK(0x1043, 0x12e0, "ASUS X541SA", ALC256_FIXUP_ASUS_MIC),
5858         SND_PCI_QUIRK(0x1043, 0x13b0, "ASUS Z550SA", ALC256_FIXUP_ASUS_MIC),
5859         SND_PCI_QUIRK(0x1043, 0x1427, "Asus Zenbook UX31E", ALC269VB_FIXUP_ASUS_ZENBOOK),
5860         SND_PCI_QUIRK(0x1043, 0x1517, "Asus Zenbook UX31A", ALC269VB_FIXUP_ASUS_ZENBOOK_UX31A),
5861         SND_PCI_QUIRK(0x1043, 0x16e3, "ASUS UX50", ALC269_FIXUP_STEREO_DMIC),
5862         SND_PCI_QUIRK(0x1043, 0x1a13, "Asus G73Jw", ALC269_FIXUP_ASUS_G73JW),
5863         SND_PCI_QUIRK(0x1043, 0x1b13, "Asus U41SV", ALC269_FIXUP_INV_DMIC),
5864         SND_PCI_QUIRK(0x1043, 0x1c23, "Asus X55U", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
5865         SND_PCI_QUIRK(0x1043, 0x1bbd, "ASUS Z550MA", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
5866         SND_PCI_QUIRK(0x1043, 0x10d0, "ASUS X540LA/X540LJ", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
5867         SND_PCI_QUIRK(0x1043, 0x11c0, "ASUS X556UR", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE),
5868         SND_PCI_QUIRK(0x1043, 0x1290, "ASUS X441SA", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
5869         SND_PCI_QUIRK(0x1043, 0x12a0, "ASUS X441UV", ALC233_FIXUP_EAPD_COEF_AND_MIC_NO_PRESENCE),
5870         SND_PCI_QUIRK(0x1043, 0x1ccd, "ASUS X555UB", ALC256_FIXUP_ASUS_MIC),
5871         SND_PCI_QUIRK(0x1043, 0x3030, "ASUS ZN270IE", ALC256_FIXUP_ASUS_AIO_GPIO2),
5872         SND_PCI_QUIRK(0x1043, 0x831a, "ASUS P901", ALC269_FIXUP_STEREO_DMIC),
5873         SND_PCI_QUIRK(0x1043, 0x834a, "ASUS S101", ALC269_FIXUP_STEREO_DMIC),
5874         SND_PCI_QUIRK(0x1043, 0x8398, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
5875         SND_PCI_QUIRK(0x1043, 0x83ce, "ASUS P1005", ALC269_FIXUP_STEREO_DMIC),
5876         SND_PCI_QUIRK(0x1043, 0x8516, "ASUS X101CH", ALC269_FIXUP_ASUS_X101),
5877         SND_PCI_QUIRK(0x104d, 0x90b5, "Sony VAIO Pro 11", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
5878         SND_PCI_QUIRK(0x104d, 0x90b6, "Sony VAIO Pro 13", ALC286_FIXUP_SONY_MIC_NO_PRESENCE),
5879         SND_PCI_QUIRK(0x104d, 0x9073, "Sony VAIO", ALC275_FIXUP_SONY_VAIO_GPIO2),
5880         SND_PCI_QUIRK(0x104d, 0x907b, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
5881         SND_PCI_QUIRK(0x104d, 0x9084, "Sony VAIO", ALC275_FIXUP_SONY_HWEQ),
5882         SND_PCI_QUIRK(0x104d, 0x9099, "Sony VAIO S13", ALC275_FIXUP_SONY_DISABLE_AAMIX),
5883         SND_PCI_QUIRK(0x10cf, 0x1475, "Lifebook", ALC269_FIXUP_LIFEBOOK),
5884         SND_PCI_QUIRK(0x10cf, 0x159f, "Lifebook E780", ALC269_FIXUP_LIFEBOOK_NO_HP_TO_LINEOUT),
5885         SND_PCI_QUIRK(0x10cf, 0x15dc, "Lifebook T731", ALC269_FIXUP_LIFEBOOK_HP_PIN),
5886         SND_PCI_QUIRK(0x10cf, 0x1757, "Lifebook E752", ALC269_FIXUP_LIFEBOOK_HP_PIN),
5887         SND_PCI_QUIRK(0x10cf, 0x1845, "Lifebook U904", ALC269_FIXUP_LIFEBOOK_EXTMIC),
5888         SND_PCI_QUIRK(0x144d, 0xc109, "Samsung Ativ book 9 (NP900X3G)", ALC269_FIXUP_INV_DMIC),
5889         SND_PCI_QUIRK(0x144d, 0xc740, "Samsung Ativ book 8 (NP870Z5G)", ALC269_FIXUP_ATIV_BOOK_8),
5890         SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
5891         SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
5892         SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
5893         SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
5894         SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
5895         SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
5896         SND_PCI_QUIRK(0x17aa, 0x21ca, "Thinkpad L412", ALC269_FIXUP_SKU_IGNORE),
5897         SND_PCI_QUIRK(0x17aa, 0x21e9, "Thinkpad Edge 15", ALC269_FIXUP_SKU_IGNORE),
5898         SND_PCI_QUIRK(0x17aa, 0x21f6, "Thinkpad T530", ALC269_FIXUP_LENOVO_DOCK),
5899         SND_PCI_QUIRK(0x17aa, 0x21fa, "Thinkpad X230", ALC269_FIXUP_LENOVO_DOCK),
5900         SND_PCI_QUIRK(0x17aa, 0x21f3, "Thinkpad T430", ALC269_FIXUP_LENOVO_DOCK),
5901         SND_PCI_QUIRK(0x17aa, 0x21fb, "Thinkpad T430s", ALC269_FIXUP_LENOVO_DOCK),
5902         SND_PCI_QUIRK(0x17aa, 0x2203, "Thinkpad X230 Tablet", ALC269_FIXUP_LENOVO_DOCK),
5903         SND_PCI_QUIRK(0x17aa, 0x2208, "Thinkpad T431s", ALC269_FIXUP_LENOVO_DOCK),
5904         SND_PCI_QUIRK(0x17aa, 0x220c, "Thinkpad T440s", ALC292_FIXUP_TPT440),
5905         SND_PCI_QUIRK(0x17aa, 0x220e, "Thinkpad T440p", ALC292_FIXUP_TPT440_DOCK),
5906         SND_PCI_QUIRK(0x17aa, 0x2210, "Thinkpad T540p", ALC292_FIXUP_TPT440_DOCK),
5907         SND_PCI_QUIRK(0x17aa, 0x2211, "Thinkpad W541", ALC292_FIXUP_TPT440_DOCK),
5908         SND_PCI_QUIRK(0x17aa, 0x2212, "Thinkpad T440", ALC292_FIXUP_TPT440_DOCK),
5909         SND_PCI_QUIRK(0x17aa, 0x2214, "Thinkpad X240", ALC292_FIXUP_TPT440_DOCK),
5910         SND_PCI_QUIRK(0x17aa, 0x2215, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
5911         SND_PCI_QUIRK(0x17aa, 0x2218, "Thinkpad X1 Carbon 2nd", ALC292_FIXUP_TPT440_DOCK),
5912         SND_PCI_QUIRK(0x17aa, 0x2223, "ThinkPad T550", ALC292_FIXUP_TPT440_DOCK),
5913         SND_PCI_QUIRK(0x17aa, 0x2226, "ThinkPad X250", ALC292_FIXUP_TPT440_DOCK),
5914         SND_PCI_QUIRK(0x17aa, 0x2231, "Thinkpad T560", ALC292_FIXUP_TPT460),
5915         SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),
5916         SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
5917         SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
5918         SND_PCI_QUIRK(0x17aa, 0x3112, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
5919         SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
5920         SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
5921         SND_PCI_QUIRK(0x17aa, 0x3978, "IdeaPad Y410P", ALC269_FIXUP_NO_SHUTUP),
5922         SND_PCI_QUIRK(0x17aa, 0x5013, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
5923         SND_PCI_QUIRK(0x17aa, 0x501a, "Thinkpad", ALC283_FIXUP_INT_MIC),
5924         SND_PCI_QUIRK(0x17aa, 0x501e, "Thinkpad L440", ALC292_FIXUP_TPT440_DOCK),
5925         SND_PCI_QUIRK(0x17aa, 0x5026, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
5926         SND_PCI_QUIRK(0x17aa, 0x5034, "Thinkpad T450", ALC292_FIXUP_TPT440_DOCK),
5927         SND_PCI_QUIRK(0x17aa, 0x5036, "Thinkpad T450s", ALC292_FIXUP_TPT440_DOCK),
5928         SND_PCI_QUIRK(0x17aa, 0x503c, "Thinkpad L450", ALC292_FIXUP_TPT440_DOCK),
5929         SND_PCI_QUIRK(0x17aa, 0x504a, "ThinkPad X260", ALC292_FIXUP_TPT440_DOCK),
5930         SND_PCI_QUIRK(0x17aa, 0x504b, "Thinkpad", ALC293_FIXUP_LENOVO_SPK_NOISE),
5931         SND_PCI_QUIRK(0x17aa, 0x5050, "Thinkpad T560p", ALC292_FIXUP_TPT460),
5932         SND_PCI_QUIRK(0x17aa, 0x5051, "Thinkpad L460", ALC292_FIXUP_TPT460),
5933         SND_PCI_QUIRK(0x17aa, 0x5053, "Thinkpad T460", ALC292_FIXUP_TPT460),
5934         SND_PCI_QUIRK(0x17aa, 0x5109, "Thinkpad", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
5935         SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_PCM_44K),
5936         SND_PCI_QUIRK(0x17aa, 0x9e54, "LENOVO NB", ALC269_FIXUP_LENOVO_EAPD),
5937         SND_PCI_QUIRK(0x1b7d, 0xa831, "Ordissimo EVE2 ", ALC269VB_FIXUP_ORDISSIMO_EVE2), /* Also known as Malata PC-B1303 */
5938
5939 #if 0
5940         /* Below is a quirk table taken from the old code.
5941          * Basically the device should work as is without the fixup table.
5942          * If BIOS doesn't give a proper info, enable the corresponding
5943          * fixup entry.
5944          */
5945         SND_PCI_QUIRK(0x1043, 0x8330, "ASUS Eeepc P703 P900A",
5946                       ALC269_FIXUP_AMIC),
5947         SND_PCI_QUIRK(0x1043, 0x1013, "ASUS N61Da", ALC269_FIXUP_AMIC),
5948         SND_PCI_QUIRK(0x1043, 0x1143, "ASUS B53f", ALC269_FIXUP_AMIC),
5949         SND_PCI_QUIRK(0x1043, 0x1133, "ASUS UJ20ft", ALC269_FIXUP_AMIC),
5950         SND_PCI_QUIRK(0x1043, 0x1183, "ASUS K72DR", ALC269_FIXUP_AMIC),
5951         SND_PCI_QUIRK(0x1043, 0x11b3, "ASUS K52DR", ALC269_FIXUP_AMIC),
5952         SND_PCI_QUIRK(0x1043, 0x11e3, "ASUS U33Jc", ALC269_FIXUP_AMIC),
5953         SND_PCI_QUIRK(0x1043, 0x1273, "ASUS UL80Jt", ALC269_FIXUP_AMIC),
5954         SND_PCI_QUIRK(0x1043, 0x1283, "ASUS U53Jc", ALC269_FIXUP_AMIC),
5955         SND_PCI_QUIRK(0x1043, 0x12b3, "ASUS N82JV", ALC269_FIXUP_AMIC),
5956         SND_PCI_QUIRK(0x1043, 0x12d3, "ASUS N61Jv", ALC269_FIXUP_AMIC),
5957         SND_PCI_QUIRK(0x1043, 0x13a3, "ASUS UL30Vt", ALC269_FIXUP_AMIC),
5958         SND_PCI_QUIRK(0x1043, 0x1373, "ASUS G73JX", ALC269_FIXUP_AMIC),
5959         SND_PCI_QUIRK(0x1043, 0x1383, "ASUS UJ30Jc", ALC269_FIXUP_AMIC),
5960         SND_PCI_QUIRK(0x1043, 0x13d3, "ASUS N61JA", ALC269_FIXUP_AMIC),
5961         SND_PCI_QUIRK(0x1043, 0x1413, "ASUS UL50", ALC269_FIXUP_AMIC),
5962         SND_PCI_QUIRK(0x1043, 0x1443, "ASUS UL30", ALC269_FIXUP_AMIC),
5963         SND_PCI_QUIRK(0x1043, 0x1453, "ASUS M60Jv", ALC269_FIXUP_AMIC),
5964         SND_PCI_QUIRK(0x1043, 0x1483, "ASUS UL80", ALC269_FIXUP_AMIC),
5965         SND_PCI_QUIRK(0x1043, 0x14f3, "ASUS F83Vf", ALC269_FIXUP_AMIC),
5966         SND_PCI_QUIRK(0x1043, 0x14e3, "ASUS UL20", ALC269_FIXUP_AMIC),
5967         SND_PCI_QUIRK(0x1043, 0x1513, "ASUS UX30", ALC269_FIXUP_AMIC),
5968         SND_PCI_QUIRK(0x1043, 0x1593, "ASUS N51Vn", ALC269_FIXUP_AMIC),
5969         SND_PCI_QUIRK(0x1043, 0x15a3, "ASUS N60Jv", ALC269_FIXUP_AMIC),
5970         SND_PCI_QUIRK(0x1043, 0x15b3, "ASUS N60Dp", ALC269_FIXUP_AMIC),
5971         SND_PCI_QUIRK(0x1043, 0x15c3, "ASUS N70De", ALC269_FIXUP_AMIC),
5972         SND_PCI_QUIRK(0x1043, 0x15e3, "ASUS F83T", ALC269_FIXUP_AMIC),
5973         SND_PCI_QUIRK(0x1043, 0x1643, "ASUS M60J", ALC269_FIXUP_AMIC),
5974         SND_PCI_QUIRK(0x1043, 0x1653, "ASUS U50", ALC269_FIXUP_AMIC),
5975         SND_PCI_QUIRK(0x1043, 0x1693, "ASUS F50N", ALC269_FIXUP_AMIC),
5976         SND_PCI_QUIRK(0x1043, 0x16a3, "ASUS F5Q", ALC269_FIXUP_AMIC),
5977         SND_PCI_QUIRK(0x1043, 0x1723, "ASUS P80", ALC269_FIXUP_AMIC),
5978         SND_PCI_QUIRK(0x1043, 0x1743, "ASUS U80", ALC269_FIXUP_AMIC),
5979         SND_PCI_QUIRK(0x1043, 0x1773, "ASUS U20A", ALC269_FIXUP_AMIC),
5980         SND_PCI_QUIRK(0x1043, 0x1883, "ASUS F81Se", ALC269_FIXUP_AMIC),
5981         SND_PCI_QUIRK(0x152d, 0x1778, "Quanta ON1", ALC269_FIXUP_DMIC),
5982         SND_PCI_QUIRK(0x17aa, 0x3be9, "Quanta Wistron", ALC269_FIXUP_AMIC),
5983         SND_PCI_QUIRK(0x17aa, 0x3bf8, "Quanta FL1", ALC269_FIXUP_AMIC),
5984         SND_PCI_QUIRK(0x17ff, 0x059a, "Quanta EL3", ALC269_FIXUP_DMIC),
5985         SND_PCI_QUIRK(0x17ff, 0x059b, "Quanta JR1", ALC269_FIXUP_DMIC),
5986 #endif
5987         {}
5988 };
5989
5990 static const struct snd_pci_quirk alc269_fixup_vendor_tbl[] = {
5991         SND_PCI_QUIRK_VENDOR(0x1025, "Acer Aspire", ALC271_FIXUP_DMIC),
5992         SND_PCI_QUIRK_VENDOR(0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED),
5993         SND_PCI_QUIRK_VENDOR(0x104d, "Sony VAIO", ALC269_FIXUP_SONY_VAIO),
5994         SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad", ALC269_FIXUP_THINKPAD_ACPI),
5995         {}
5996 };
5997
5998 static const struct hda_model_fixup alc269_fixup_models[] = {
5999         {.id = ALC269_FIXUP_AMIC, .name = "laptop-amic"},
6000         {.id = ALC269_FIXUP_DMIC, .name = "laptop-dmic"},
6001         {.id = ALC269_FIXUP_STEREO_DMIC, .name = "alc269-dmic"},
6002         {.id = ALC271_FIXUP_DMIC, .name = "alc271-dmic"},
6003         {.id = ALC269_FIXUP_INV_DMIC, .name = "inv-dmic"},
6004         {.id = ALC269_FIXUP_HEADSET_MIC, .name = "headset-mic"},
6005         {.id = ALC269_FIXUP_HEADSET_MODE, .name = "headset-mode"},
6006         {.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = "headset-mode-no-hp-mic"},
6007         {.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
6008         {.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
6009         {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = "hp-dock-gpio-mic1-led"},
6010         {.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
6011         {.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
6012         {.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
6013         {.id = ALC283_FIXUP_SENSE_COMBO_JACK, .name = "alc283-sense-combo"},
6014         {.id = ALC292_FIXUP_TPT440_DOCK, .name = "tpt440-dock"},
6015         {.id = ALC292_FIXUP_TPT440, .name = "tpt440"},
6016         {.id = ALC292_FIXUP_TPT460, .name = "tpt460"},
6017         {}
6018 };
6019 #define ALC225_STANDARD_PINS \
6020         {0x21, 0x04211020}
6021
6022 #define ALC256_STANDARD_PINS \
6023         {0x12, 0x90a60140}, \
6024         {0x14, 0x90170110}, \
6025         {0x21, 0x02211020}
6026
6027 #define ALC282_STANDARD_PINS \
6028         {0x14, 0x90170110}
6029
6030 #define ALC290_STANDARD_PINS \
6031         {0x12, 0x99a30130}
6032
6033 #define ALC292_STANDARD_PINS \
6034         {0x14, 0x90170110}, \
6035         {0x15, 0x0221401f}
6036
6037 #define ALC295_STANDARD_PINS \
6038         {0x12, 0xb7a60130}, \
6039         {0x14, 0x90170110}, \
6040         {0x21, 0x04211020}
6041
6042 #define ALC298_STANDARD_PINS \
6043         {0x12, 0x90a60130}, \
6044         {0x21, 0x03211020}
6045
6046 static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
6047         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1025, "Acer", ALC255_FIXUP_ACER_MIC_NO_PRESENCE,
6048                 {0x12, 0x90a601c0},
6049                 {0x14, 0x90171120},
6050                 {0x21, 0x02211030}),
6051         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
6052                 {0x14, 0x90170110},
6053                 {0x1b, 0x90a70130},
6054                 {0x21, 0x03211020}),
6055         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1043, "ASUS", ALC255_FIXUP_ASUS_MIC_NO_PRESENCE,
6056                 {0x1a, 0x90a70130},
6057                 {0x1b, 0x90170110},
6058                 {0x21, 0x03211020}),
6059         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
6060                 ALC225_STANDARD_PINS,
6061                 {0x12, 0xb7a60130},
6062                 {0x14, 0x901701a0}),
6063         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
6064                 ALC225_STANDARD_PINS,
6065                 {0x12, 0xb7a60130},
6066                 {0x14, 0x901701b0}),
6067         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
6068                 ALC225_STANDARD_PINS,
6069                 {0x12, 0xb7a60150},
6070                 {0x14, 0x901701a0}),
6071         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
6072                 ALC225_STANDARD_PINS,
6073                 {0x12, 0xb7a60150},
6074                 {0x14, 0x901701b0}),
6075         SND_HDA_PIN_QUIRK(0x10ec0225, 0x1028, "Dell", ALC225_FIXUP_DELL1_MIC_NO_PRESENCE,
6076                 ALC225_STANDARD_PINS,
6077                 {0x12, 0xb7a60130},
6078                 {0x1b, 0x90170110}),
6079         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
6080                 {0x14, 0x90170110},
6081                 {0x21, 0x02211020}),
6082         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6083                 {0x14, 0x90170130},
6084                 {0x21, 0x02211040}),
6085         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6086                 {0x12, 0x90a60140},
6087                 {0x14, 0x90170110},
6088                 {0x21, 0x02211020}),
6089         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6090                 {0x12, 0x90a60160},
6091                 {0x14, 0x90170120},
6092                 {0x21, 0x02211030}),
6093         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6094                 {0x14, 0x90170110},
6095                 {0x1b, 0x02011020},
6096                 {0x21, 0x0221101f}),
6097         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6098                 {0x14, 0x90170110},
6099                 {0x1b, 0x01011020},
6100                 {0x21, 0x0221101f}),
6101         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6102                 {0x14, 0x90170130},
6103                 {0x1b, 0x01014020},
6104                 {0x21, 0x0221103f}),
6105         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6106                 {0x14, 0x90170130},
6107                 {0x1b, 0x01011020},
6108                 {0x21, 0x0221103f}),
6109         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6110                 {0x14, 0x90170130},
6111                 {0x1b, 0x02011020},
6112                 {0x21, 0x0221103f}),
6113         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6114                 {0x14, 0x90170150},
6115                 {0x1b, 0x02011020},
6116                 {0x21, 0x0221105f}),
6117         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6118                 {0x14, 0x90170110},
6119                 {0x1b, 0x01014020},
6120                 {0x21, 0x0221101f}),
6121         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6122                 {0x12, 0x90a60160},
6123                 {0x14, 0x90170120},
6124                 {0x17, 0x90170140},
6125                 {0x21, 0x0321102f}),
6126         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6127                 {0x12, 0x90a60160},
6128                 {0x14, 0x90170130},
6129                 {0x21, 0x02211040}),
6130         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6131                 {0x12, 0x90a60160},
6132                 {0x14, 0x90170140},
6133                 {0x21, 0x02211050}),
6134         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6135                 {0x12, 0x90a60170},
6136                 {0x14, 0x90170120},
6137                 {0x21, 0x02211030}),
6138         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6139                 {0x12, 0x90a60170},
6140                 {0x14, 0x90170130},
6141                 {0x21, 0x02211040}),
6142         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6143                 {0x12, 0x90a60170},
6144                 {0x14, 0x90171130},
6145                 {0x21, 0x02211040}),
6146         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6147                 {0x12, 0x90a60170},
6148                 {0x14, 0x90170140},
6149                 {0x21, 0x02211050}),
6150         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5548", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6151                 {0x12, 0x90a60180},
6152                 {0x14, 0x90170130},
6153                 {0x21, 0x02211040}),
6154         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell Inspiron 5565", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6155                 {0x12, 0x90a60180},
6156                 {0x14, 0x90170120},
6157                 {0x21, 0x02211030}),
6158         SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6159                 {0x1b, 0x01011020},
6160                 {0x21, 0x02211010}),
6161         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6162                 {0x12, 0x90a60160},
6163                 {0x14, 0x90170120},
6164                 {0x21, 0x02211030}),
6165         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6166                 {0x12, 0x90a60170},
6167                 {0x14, 0x90170120},
6168                 {0x21, 0x02211030}),
6169         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell Inspiron 5468", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6170                 {0x12, 0x90a60180},
6171                 {0x14, 0x90170120},
6172                 {0x21, 0x02211030}),
6173         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6174                 {0x12, 0xb7a60130},
6175                 {0x14, 0x90170110},
6176                 {0x21, 0x02211020}),
6177         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
6178                 ALC256_STANDARD_PINS),
6179         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
6180                 {0x14, 0x90170110},
6181                 {0x1b, 0x90a70130},
6182                 {0x21, 0x04211020}),
6183         SND_HDA_PIN_QUIRK(0x10ec0256, 0x1043, "ASUS", ALC256_FIXUP_ASUS_MIC,
6184                 {0x14, 0x90170110},
6185                 {0x1b, 0x90a70130},
6186                 {0x21, 0x03211020}),
6187         SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC280_FIXUP_HP_GPIO4,
6188                 {0x12, 0x90a60130},
6189                 {0x14, 0x90170110},
6190                 {0x15, 0x0421101f},
6191                 {0x1a, 0x04a11020}),
6192         SND_HDA_PIN_QUIRK(0x10ec0280, 0x103c, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED,
6193                 {0x12, 0x90a60140},
6194                 {0x14, 0x90170110},
6195                 {0x15, 0x0421101f},
6196                 {0x18, 0x02811030},
6197                 {0x1a, 0x04a1103f},
6198                 {0x1b, 0x02011020}),
6199         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP 15 Touchsmart", ALC269_FIXUP_HP_MUTE_LED_MIC1,
6200                 ALC282_STANDARD_PINS,
6201                 {0x12, 0x99a30130},
6202                 {0x19, 0x03a11020},
6203                 {0x21, 0x0321101f}),
6204         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
6205                 ALC282_STANDARD_PINS,
6206                 {0x12, 0x99a30130},
6207                 {0x19, 0x03a11020},
6208                 {0x21, 0x03211040}),
6209         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
6210                 ALC282_STANDARD_PINS,
6211                 {0x12, 0x99a30130},
6212                 {0x19, 0x03a11030},
6213                 {0x21, 0x03211020}),
6214         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
6215                 ALC282_STANDARD_PINS,
6216                 {0x12, 0x99a30130},
6217                 {0x19, 0x04a11020},
6218                 {0x21, 0x0421101f}),
6219         SND_HDA_PIN_QUIRK(0x10ec0282, 0x103c, "HP", ALC269_FIXUP_HP_LINE1_MIC1_LED,
6220                 ALC282_STANDARD_PINS,
6221                 {0x12, 0x90a60140},
6222                 {0x19, 0x04a11030},
6223                 {0x21, 0x04211020}),
6224         SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
6225                 ALC282_STANDARD_PINS,
6226                 {0x12, 0x90a60130},
6227                 {0x21, 0x0321101f}),
6228         SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
6229                 {0x12, 0x90a60160},
6230                 {0x14, 0x90170120},
6231                 {0x21, 0x02211030}),
6232         SND_HDA_PIN_QUIRK(0x10ec0283, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
6233                 ALC282_STANDARD_PINS,
6234                 {0x12, 0x90a60130},
6235                 {0x19, 0x03a11020},
6236                 {0x21, 0x0321101f}),
6237         SND_HDA_PIN_QUIRK(0x10ec0288, 0x1028, "Dell", ALC288_FIXUP_DELL_XPS_13_GPIO6,
6238                 {0x12, 0x90a60120},
6239                 {0x14, 0x90170110},
6240                 {0x21, 0x0321101f}),
6241         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
6242                 ALC290_STANDARD_PINS,
6243                 {0x15, 0x04211040},
6244                 {0x18, 0x90170112},
6245                 {0x1a, 0x04a11020}),
6246         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
6247                 ALC290_STANDARD_PINS,
6248                 {0x15, 0x04211040},
6249                 {0x18, 0x90170110},
6250                 {0x1a, 0x04a11020}),
6251         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
6252                 ALC290_STANDARD_PINS,
6253                 {0x15, 0x0421101f},
6254                 {0x1a, 0x04a11020}),
6255         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
6256                 ALC290_STANDARD_PINS,
6257                 {0x15, 0x04211020},
6258                 {0x1a, 0x04a11040}),
6259         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
6260                 ALC290_STANDARD_PINS,
6261                 {0x14, 0x90170110},
6262                 {0x15, 0x04211020},
6263                 {0x1a, 0x04a11040}),
6264         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
6265                 ALC290_STANDARD_PINS,
6266                 {0x14, 0x90170110},
6267                 {0x15, 0x04211020},
6268                 {0x1a, 0x04a11020}),
6269         SND_HDA_PIN_QUIRK(0x10ec0290, 0x103c, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1,
6270                 ALC290_STANDARD_PINS,
6271                 {0x14, 0x90170110},
6272                 {0x15, 0x0421101f},
6273                 {0x1a, 0x04a11020}),
6274         SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
6275                 ALC292_STANDARD_PINS,
6276                 {0x12, 0x90a60140},
6277                 {0x16, 0x01014020},
6278                 {0x19, 0x01a19030}),
6279         SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL2_MIC_NO_PRESENCE,
6280                 ALC292_STANDARD_PINS,
6281                 {0x12, 0x90a60140},
6282                 {0x16, 0x01014020},
6283                 {0x18, 0x02a19031},
6284                 {0x19, 0x01a1903e}),
6285         SND_HDA_PIN_QUIRK(0x10ec0292, 0x1028, "Dell", ALC269_FIXUP_DELL3_MIC_NO_PRESENCE,
6286                 ALC292_STANDARD_PINS,
6287                 {0x12, 0x90a60140}),
6288         SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
6289                 ALC292_STANDARD_PINS,
6290                 {0x13, 0x90a60140},
6291                 {0x16, 0x21014020},
6292                 {0x19, 0x21a19030}),
6293         SND_HDA_PIN_QUIRK(0x10ec0293, 0x1028, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE,
6294                 ALC292_STANDARD_PINS,
6295                 {0x13, 0x90a60140}),
6296         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
6297                 ALC295_STANDARD_PINS,
6298                 {0x17, 0x21014020},
6299                 {0x18, 0x21a19030}),
6300         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
6301                 ALC295_STANDARD_PINS,
6302                 {0x17, 0x21014040},
6303                 {0x18, 0x21a19050}),
6304         SND_HDA_PIN_QUIRK(0x10ec0295, 0x1028, "Dell", ALC269_FIXUP_DELL1_MIC_NO_PRESENCE,
6305                 ALC295_STANDARD_PINS),
6306         SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
6307                 ALC298_STANDARD_PINS,
6308                 {0x17, 0x90170110}),
6309         SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
6310                 ALC298_STANDARD_PINS,
6311                 {0x17, 0x90170140}),
6312         SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
6313                 ALC298_STANDARD_PINS,
6314                 {0x17, 0x90170150}),
6315         SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_SPK_VOLUME,
6316                 {0x12, 0xb7a60140},
6317                 {0x13, 0xb7a60150},
6318                 {0x17, 0x90170110},
6319                 {0x1a, 0x03011020},
6320                 {0x21, 0x03211030}),
6321         {}
6322 };
6323
6324 static void alc269_fill_coef(struct hda_codec *codec)
6325 {
6326         struct alc_spec *spec = codec->spec;
6327         int val;
6328
6329         if (spec->codec_variant != ALC269_TYPE_ALC269VB)
6330                 return;
6331
6332         if ((alc_get_coef0(codec) & 0x00ff) < 0x015) {
6333                 alc_write_coef_idx(codec, 0xf, 0x960b);
6334                 alc_write_coef_idx(codec, 0xe, 0x8817);
6335         }
6336
6337         if ((alc_get_coef0(codec) & 0x00ff) == 0x016) {
6338                 alc_write_coef_idx(codec, 0xf, 0x960b);
6339                 alc_write_coef_idx(codec, 0xe, 0x8814);
6340         }
6341
6342         if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
6343                 /* Power up output pin */
6344                 alc_update_coef_idx(codec, 0x04, 0, 1<<11);
6345         }
6346
6347         if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
6348                 val = alc_read_coef_idx(codec, 0xd);
6349                 if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {
6350                         /* Capless ramp up clock control */
6351                         alc_write_coef_idx(codec, 0xd, val | (1<<10));
6352                 }
6353                 val = alc_read_coef_idx(codec, 0x17);
6354                 if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {
6355                         /* Class D power on reset */
6356                         alc_write_coef_idx(codec, 0x17, val | (1<<7));
6357                 }
6358         }
6359
6360         /* HP */
6361         alc_update_coef_idx(codec, 0x4, 0, 1<<11);
6362 }
6363
6364 /*
6365  */
6366 static int patch_alc269(struct hda_codec *codec)
6367 {
6368         struct alc_spec *spec;
6369         int err;
6370
6371         err = alc_alloc_spec(codec, 0x0b);
6372         if (err < 0)
6373                 return err;
6374
6375         spec = codec->spec;
6376         spec->gen.shared_mic_vref_pin = 0x18;
6377         codec->power_save_node = 1;
6378
6379 #ifdef CONFIG_PM
6380         codec->patch_ops.suspend = alc269_suspend;
6381         codec->patch_ops.resume = alc269_resume;
6382 #endif
6383         spec->shutup = alc269_shutup;
6384
6385         snd_hda_pick_fixup(codec, alc269_fixup_models,
6386                        alc269_fixup_tbl, alc269_fixups);
6387         snd_hda_pick_pin_fixup(codec, alc269_pin_fixup_tbl, alc269_fixups);
6388         snd_hda_pick_fixup(codec, NULL, alc269_fixup_vendor_tbl,
6389                            alc269_fixups);
6390         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
6391
6392         alc_auto_parse_customize_define(codec);
6393
6394         if (has_cdefine_beep(codec))
6395                 spec->gen.beep_nid = 0x01;
6396
6397         switch (codec->core.vendor_id) {
6398         case 0x10ec0269:
6399                 spec->codec_variant = ALC269_TYPE_ALC269VA;
6400                 switch (alc_get_coef0(codec) & 0x00f0) {
6401                 case 0x0010:
6402                         if (codec->bus->pci &&
6403                             codec->bus->pci->subsystem_vendor == 0x1025 &&
6404                             spec->cdefine.platform_type == 1)
6405                                 err = alc_codec_rename(codec, "ALC271X");
6406                         spec->codec_variant = ALC269_TYPE_ALC269VB;
6407                         break;
6408                 case 0x0020:
6409                         if (codec->bus->pci &&
6410                             codec->bus->pci->subsystem_vendor == 0x17aa &&
6411                             codec->bus->pci->subsystem_device == 0x21f3)
6412                                 err = alc_codec_rename(codec, "ALC3202");
6413                         spec->codec_variant = ALC269_TYPE_ALC269VC;
6414                         break;
6415                 case 0x0030:
6416                         spec->codec_variant = ALC269_TYPE_ALC269VD;
6417                         break;
6418                 default:
6419                         alc_fix_pll_init(codec, 0x20, 0x04, 15);
6420                 }
6421                 if (err < 0)
6422                         goto error;
6423                 spec->init_hook = alc269_fill_coef;
6424                 alc269_fill_coef(codec);
6425                 break;
6426
6427         case 0x10ec0280:
6428         case 0x10ec0290:
6429                 spec->codec_variant = ALC269_TYPE_ALC280;
6430                 break;
6431         case 0x10ec0282:
6432                 spec->codec_variant = ALC269_TYPE_ALC282;
6433                 spec->shutup = alc282_shutup;
6434                 spec->init_hook = alc282_init;
6435                 break;
6436         case 0x10ec0233:
6437         case 0x10ec0283:
6438                 spec->codec_variant = ALC269_TYPE_ALC283;
6439                 spec->shutup = alc283_shutup;
6440                 spec->init_hook = alc283_init;
6441                 break;
6442         case 0x10ec0284:
6443         case 0x10ec0292:
6444                 spec->codec_variant = ALC269_TYPE_ALC284;
6445                 break;
6446         case 0x10ec0285:
6447         case 0x10ec0293:
6448                 spec->codec_variant = ALC269_TYPE_ALC285;
6449                 break;
6450         case 0x10ec0286:
6451         case 0x10ec0288:
6452                 spec->codec_variant = ALC269_TYPE_ALC286;
6453                 spec->shutup = alc286_shutup;
6454                 break;
6455         case 0x10ec0298:
6456                 spec->codec_variant = ALC269_TYPE_ALC298;
6457                 break;
6458         case 0x10ec0255:
6459                 spec->codec_variant = ALC269_TYPE_ALC255;
6460                 break;
6461         case 0x10ec0256:
6462                 spec->codec_variant = ALC269_TYPE_ALC256;
6463                 spec->gen.mixer_nid = 0; /* ALC256 does not have any loopback mixer path */
6464                 alc_update_coef_idx(codec, 0x36, 1 << 13, 1 << 5); /* Switch pcbeep path to Line in path*/
6465                 break;
6466         case 0x10ec0225:
6467         case 0x10ec0295:
6468         case 0x10ec0299:
6469                 spec->codec_variant = ALC269_TYPE_ALC225;
6470                 break;
6471         case 0x10ec0234:
6472         case 0x10ec0274:
6473         case 0x10ec0294:
6474                 spec->codec_variant = ALC269_TYPE_ALC294;
6475                 break;
6476         case 0x10ec0700:
6477         case 0x10ec0701:
6478         case 0x10ec0703:
6479                 spec->codec_variant = ALC269_TYPE_ALC700;
6480                 spec->gen.mixer_nid = 0; /* ALC700 does not have any loopback mixer path */
6481                 alc_update_coef_idx(codec, 0x4a, 0, 1 << 15); /* Combo jack auto trigger control */
6482                 break;
6483
6484         }
6485
6486         if (snd_hda_codec_read(codec, 0x51, 0, AC_VERB_PARAMETERS, 0) == 0x10ec5505) {
6487                 spec->has_alc5505_dsp = 1;
6488                 spec->init_hook = alc5505_dsp_init;
6489         }
6490
6491         /* automatic parse from the BIOS config */
6492         err = alc269_parse_auto_config(codec);
6493         if (err < 0)
6494                 goto error;
6495
6496         if (!spec->gen.no_analog && spec->gen.beep_nid && spec->gen.mixer_nid)
6497                 set_beep_amp(spec, spec->gen.mixer_nid, 0x04, HDA_INPUT);
6498
6499         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
6500
6501         return 0;
6502
6503  error:
6504         alc_free(codec);
6505         return err;
6506 }
6507
6508 /*
6509  * ALC861
6510  */
6511
6512 static int alc861_parse_auto_config(struct hda_codec *codec)
6513 {
6514         static const hda_nid_t alc861_ignore[] = { 0x1d, 0 };
6515         static const hda_nid_t alc861_ssids[] = { 0x0e, 0x0f, 0x0b, 0 };
6516         return alc_parse_auto_config(codec, alc861_ignore, alc861_ssids);
6517 }
6518
6519 /* Pin config fixes */
6520 enum {
6521         ALC861_FIXUP_FSC_AMILO_PI1505,
6522         ALC861_FIXUP_AMP_VREF_0F,
6523         ALC861_FIXUP_NO_JACK_DETECT,
6524         ALC861_FIXUP_ASUS_A6RP,
6525         ALC660_FIXUP_ASUS_W7J,
6526 };
6527
6528 /* On some laptops, VREF of pin 0x0f is abused for controlling the main amp */
6529 static void alc861_fixup_asus_amp_vref_0f(struct hda_codec *codec,
6530                         const struct hda_fixup *fix, int action)
6531 {
6532         struct alc_spec *spec = codec->spec;
6533         unsigned int val;
6534
6535         if (action != HDA_FIXUP_ACT_INIT)
6536                 return;
6537         val = snd_hda_codec_get_pin_target(codec, 0x0f);
6538         if (!(val & (AC_PINCTL_IN_EN | AC_PINCTL_OUT_EN)))
6539                 val |= AC_PINCTL_IN_EN;
6540         val |= AC_PINCTL_VREF_50;
6541         snd_hda_set_pin_ctl(codec, 0x0f, val);
6542         spec->gen.keep_vref_in_automute = 1;
6543 }
6544
6545 /* suppress the jack-detection */
6546 static void alc_fixup_no_jack_detect(struct hda_codec *codec,
6547                                      const struct hda_fixup *fix, int action)
6548 {
6549         if (action == HDA_FIXUP_ACT_PRE_PROBE)
6550                 codec->no_jack_detect = 1;
6551 }
6552
6553 static const struct hda_fixup alc861_fixups[] = {
6554         [ALC861_FIXUP_FSC_AMILO_PI1505] = {
6555                 .type = HDA_FIXUP_PINS,
6556                 .v.pins = (const struct hda_pintbl[]) {
6557                         { 0x0b, 0x0221101f }, /* HP */
6558                         { 0x0f, 0x90170310 }, /* speaker */
6559                         { }
6560                 }
6561         },
6562         [ALC861_FIXUP_AMP_VREF_0F] = {
6563                 .type = HDA_FIXUP_FUNC,
6564                 .v.func = alc861_fixup_asus_amp_vref_0f,
6565         },
6566         [ALC861_FIXUP_NO_JACK_DETECT] = {
6567                 .type = HDA_FIXUP_FUNC,
6568                 .v.func = alc_fixup_no_jack_detect,
6569         },
6570         [ALC861_FIXUP_ASUS_A6RP] = {
6571                 .type = HDA_FIXUP_FUNC,
6572                 .v.func = alc861_fixup_asus_amp_vref_0f,
6573                 .chained = true,
6574                 .chain_id = ALC861_FIXUP_NO_JACK_DETECT,
6575         },
6576         [ALC660_FIXUP_ASUS_W7J] = {
6577                 .type = HDA_FIXUP_VERBS,
6578                 .v.verbs = (const struct hda_verb[]) {
6579                         /* ASUS W7J needs a magic pin setup on unused NID 0x10
6580                          * for enabling outputs
6581                          */
6582                         {0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, 0x24},
6583                         { }
6584                 },
6585         }
6586 };
6587
6588 static const struct snd_pci_quirk alc861_fixup_tbl[] = {
6589         SND_PCI_QUIRK(0x1043, 0x1253, "ASUS W7J", ALC660_FIXUP_ASUS_W7J),
6590         SND_PCI_QUIRK(0x1043, 0x1263, "ASUS Z35HL", ALC660_FIXUP_ASUS_W7J),
6591         SND_PCI_QUIRK(0x1043, 0x1393, "ASUS A6Rp", ALC861_FIXUP_ASUS_A6RP),
6592         SND_PCI_QUIRK_VENDOR(0x1043, "ASUS laptop", ALC861_FIXUP_AMP_VREF_0F),
6593         SND_PCI_QUIRK(0x1462, 0x7254, "HP DX2200", ALC861_FIXUP_NO_JACK_DETECT),
6594         SND_PCI_QUIRK(0x1584, 0x2b01, "Haier W18", ALC861_FIXUP_AMP_VREF_0F),
6595         SND_PCI_QUIRK(0x1584, 0x0000, "Uniwill ECS M31EI", ALC861_FIXUP_AMP_VREF_0F),
6596         SND_PCI_QUIRK(0x1734, 0x10c7, "FSC Amilo Pi1505", ALC861_FIXUP_FSC_AMILO_PI1505),
6597         {}
6598 };
6599
6600 /*
6601  */
6602 static int patch_alc861(struct hda_codec *codec)
6603 {
6604         struct alc_spec *spec;
6605         int err;
6606
6607         err = alc_alloc_spec(codec, 0x15);
6608         if (err < 0)
6609                 return err;
6610
6611         spec = codec->spec;
6612         spec->gen.beep_nid = 0x23;
6613
6614 #ifdef CONFIG_PM
6615         spec->power_hook = alc_power_eapd;
6616 #endif
6617
6618         snd_hda_pick_fixup(codec, NULL, alc861_fixup_tbl, alc861_fixups);
6619         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
6620
6621         /* automatic parse from the BIOS config */
6622         err = alc861_parse_auto_config(codec);
6623         if (err < 0)
6624                 goto error;
6625
6626         if (!spec->gen.no_analog)
6627                 set_beep_amp(spec, 0x23, 0, HDA_OUTPUT);
6628
6629         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
6630
6631         return 0;
6632
6633  error:
6634         alc_free(codec);
6635         return err;
6636 }
6637
6638 /*
6639  * ALC861-VD support
6640  *
6641  * Based on ALC882
6642  *
6643  * In addition, an independent DAC
6644  */
6645 static int alc861vd_parse_auto_config(struct hda_codec *codec)
6646 {
6647         static const hda_nid_t alc861vd_ignore[] = { 0x1d, 0 };
6648         static const hda_nid_t alc861vd_ssids[] = { 0x15, 0x1b, 0x14, 0 };
6649         return alc_parse_auto_config(codec, alc861vd_ignore, alc861vd_ssids);
6650 }
6651
6652 enum {
6653         ALC660VD_FIX_ASUS_GPIO1,
6654         ALC861VD_FIX_DALLAS,
6655 };
6656
6657 /* exclude VREF80 */
6658 static void alc861vd_fixup_dallas(struct hda_codec *codec,
6659                                   const struct hda_fixup *fix, int action)
6660 {
6661         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6662                 snd_hda_override_pin_caps(codec, 0x18, 0x00000734);
6663                 snd_hda_override_pin_caps(codec, 0x19, 0x0000073c);
6664         }
6665 }
6666
6667 static const struct hda_fixup alc861vd_fixups[] = {
6668         [ALC660VD_FIX_ASUS_GPIO1] = {
6669                 .type = HDA_FIXUP_VERBS,
6670                 .v.verbs = (const struct hda_verb[]) {
6671                         /* reset GPIO1 */
6672                         {0x01, AC_VERB_SET_GPIO_MASK, 0x03},
6673                         {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01},
6674                         {0x01, AC_VERB_SET_GPIO_DATA, 0x01},
6675                         { }
6676                 }
6677         },
6678         [ALC861VD_FIX_DALLAS] = {
6679                 .type = HDA_FIXUP_FUNC,
6680                 .v.func = alc861vd_fixup_dallas,
6681         },
6682 };
6683
6684 static const struct snd_pci_quirk alc861vd_fixup_tbl[] = {
6685         SND_PCI_QUIRK(0x103c, 0x30bf, "HP TX1000", ALC861VD_FIX_DALLAS),
6686         SND_PCI_QUIRK(0x1043, 0x1339, "ASUS A7-K", ALC660VD_FIX_ASUS_GPIO1),
6687         SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba L30-149", ALC861VD_FIX_DALLAS),
6688         {}
6689 };
6690
6691 /*
6692  */
6693 static int patch_alc861vd(struct hda_codec *codec)
6694 {
6695         struct alc_spec *spec;
6696         int err;
6697
6698         err = alc_alloc_spec(codec, 0x0b);
6699         if (err < 0)
6700                 return err;
6701
6702         spec = codec->spec;
6703         spec->gen.beep_nid = 0x23;
6704
6705         spec->shutup = alc_eapd_shutup;
6706
6707         snd_hda_pick_fixup(codec, NULL, alc861vd_fixup_tbl, alc861vd_fixups);
6708         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
6709
6710         /* automatic parse from the BIOS config */
6711         err = alc861vd_parse_auto_config(codec);
6712         if (err < 0)
6713                 goto error;
6714
6715         if (!spec->gen.no_analog)
6716                 set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
6717
6718         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
6719
6720         return 0;
6721
6722  error:
6723         alc_free(codec);
6724         return err;
6725 }
6726
6727 /*
6728  * ALC662 support
6729  *
6730  * ALC662 is almost identical with ALC880 but has cleaner and more flexible
6731  * configuration.  Each pin widget can choose any input DACs and a mixer.
6732  * Each ADC is connected from a mixer of all inputs.  This makes possible
6733  * 6-channel independent captures.
6734  *
6735  * In addition, an independent DAC for the multi-playback (not used in this
6736  * driver yet).
6737  */
6738
6739 /*
6740  * BIOS auto configuration
6741  */
6742
6743 static int alc662_parse_auto_config(struct hda_codec *codec)
6744 {
6745         static const hda_nid_t alc662_ignore[] = { 0x1d, 0 };
6746         static const hda_nid_t alc663_ssids[] = { 0x15, 0x1b, 0x14, 0x21 };
6747         static const hda_nid_t alc662_ssids[] = { 0x15, 0x1b, 0x14, 0 };
6748         const hda_nid_t *ssids;
6749
6750         if (codec->core.vendor_id == 0x10ec0272 || codec->core.vendor_id == 0x10ec0663 ||
6751             codec->core.vendor_id == 0x10ec0665 || codec->core.vendor_id == 0x10ec0670 ||
6752             codec->core.vendor_id == 0x10ec0671)
6753                 ssids = alc663_ssids;
6754         else
6755                 ssids = alc662_ssids;
6756         return alc_parse_auto_config(codec, alc662_ignore, ssids);
6757 }
6758
6759 static void alc272_fixup_mario(struct hda_codec *codec,
6760                                const struct hda_fixup *fix, int action)
6761 {
6762         if (action != HDA_FIXUP_ACT_PRE_PROBE)
6763                 return;
6764         if (snd_hda_override_amp_caps(codec, 0x2, HDA_OUTPUT,
6765                                       (0x3b << AC_AMPCAP_OFFSET_SHIFT) |
6766                                       (0x3b << AC_AMPCAP_NUM_STEPS_SHIFT) |
6767                                       (0x03 << AC_AMPCAP_STEP_SIZE_SHIFT) |
6768                                       (0 << AC_AMPCAP_MUTE_SHIFT)))
6769                 codec_warn(codec, "failed to override amp caps for NID 0x2\n");
6770 }
6771
6772 static const struct snd_pcm_chmap_elem asus_pcm_2_1_chmaps[] = {
6773         { .channels = 2,
6774           .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR } },
6775         { .channels = 4,
6776           .map = { SNDRV_CHMAP_FL, SNDRV_CHMAP_FR,
6777                    SNDRV_CHMAP_NA, SNDRV_CHMAP_LFE } }, /* LFE only on right */
6778         { }
6779 };
6780
6781 /* override the 2.1 chmap */
6782 static void alc_fixup_bass_chmap(struct hda_codec *codec,
6783                                     const struct hda_fixup *fix, int action)
6784 {
6785         if (action == HDA_FIXUP_ACT_BUILD) {
6786                 struct alc_spec *spec = codec->spec;
6787                 spec->gen.pcm_rec[0]->stream[0].chmap = asus_pcm_2_1_chmaps;
6788         }
6789 }
6790
6791 /* avoid D3 for keeping GPIO up */
6792 static unsigned int gpio_led_power_filter(struct hda_codec *codec,
6793                                           hda_nid_t nid,
6794                                           unsigned int power_state)
6795 {
6796         struct alc_spec *spec = codec->spec;
6797         if (nid == codec->core.afg && power_state == AC_PWRST_D3 && spec->gpio_led)
6798                 return AC_PWRST_D0;
6799         return power_state;
6800 }
6801
6802 static void alc662_fixup_led_gpio1(struct hda_codec *codec,
6803                                    const struct hda_fixup *fix, int action)
6804 {
6805         struct alc_spec *spec = codec->spec;
6806         static const struct hda_verb gpio_init[] = {
6807                 { 0x01, AC_VERB_SET_GPIO_MASK, 0x01 },
6808                 { 0x01, AC_VERB_SET_GPIO_DIRECTION, 0x01 },
6809                 {}
6810         };
6811
6812         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6813                 spec->gen.vmaster_mute.hook = alc_fixup_gpio_mute_hook;
6814                 spec->gpio_led = 0;
6815                 spec->mute_led_polarity = 1;
6816                 spec->gpio_mute_led_mask = 0x01;
6817                 snd_hda_add_verbs(codec, gpio_init);
6818                 codec->power_filter = gpio_led_power_filter;
6819         }
6820 }
6821
6822 static void alc662_usi_automute_hook(struct hda_codec *codec,
6823                                          struct hda_jack_callback *jack)
6824 {
6825         struct alc_spec *spec = codec->spec;
6826         int vref;
6827         msleep(200);
6828         snd_hda_gen_hp_automute(codec, jack);
6829
6830         vref = spec->gen.hp_jack_present ? PIN_VREF80 : 0;
6831         msleep(100);
6832         snd_hda_codec_write(codec, 0x19, 0, AC_VERB_SET_PIN_WIDGET_CONTROL,
6833                             vref);
6834 }
6835
6836 static void alc662_fixup_usi_headset_mic(struct hda_codec *codec,
6837                                      const struct hda_fixup *fix, int action)
6838 {
6839         struct alc_spec *spec = codec->spec;
6840         if (action == HDA_FIXUP_ACT_PRE_PROBE) {
6841                 spec->parse_flags |= HDA_PINCFG_HEADSET_MIC;
6842                 spec->gen.hp_automute_hook = alc662_usi_automute_hook;
6843         }
6844 }
6845
6846 static struct coef_fw alc668_coefs[] = {
6847         WRITE_COEF(0x01, 0xbebe), WRITE_COEF(0x02, 0xaaaa), WRITE_COEF(0x03,    0x0),
6848         WRITE_COEF(0x04, 0x0180), WRITE_COEF(0x06,    0x0), WRITE_COEF(0x07, 0x0f80),
6849         WRITE_COEF(0x08, 0x0031), WRITE_COEF(0x0a, 0x0060), WRITE_COEF(0x0b,    0x0),
6850         WRITE_COEF(0x0c, 0x7cf7), WRITE_COEF(0x0d, 0x1080), WRITE_COEF(0x0e, 0x7f7f),
6851         WRITE_COEF(0x0f, 0xcccc), WRITE_COEF(0x10, 0xddcc), WRITE_COEF(0x11, 0x0001),
6852         WRITE_COEF(0x13,    0x0), WRITE_COEF(0x14, 0x2aa0), WRITE_COEF(0x17, 0xa940),
6853         WRITE_COEF(0x19,    0x0), WRITE_COEF(0x1a,    0x0), WRITE_COEF(0x1b,    0x0),
6854         WRITE_COEF(0x1c,    0x0), WRITE_COEF(0x1d,    0x0), WRITE_COEF(0x1e, 0x7418),
6855         WRITE_COEF(0x1f, 0x0804), WRITE_COEF(0x20, 0x4200), WRITE_COEF(0x21, 0x0468),
6856         WRITE_COEF(0x22, 0x8ccc), WRITE_COEF(0x23, 0x0250), WRITE_COEF(0x24, 0x7418),
6857         WRITE_COEF(0x27,    0x0), WRITE_COEF(0x28, 0x8ccc), WRITE_COEF(0x2a, 0xff00),
6858         WRITE_COEF(0x2b, 0x8000), WRITE_COEF(0xa7, 0xff00), WRITE_COEF(0xa8, 0x8000),
6859         WRITE_COEF(0xaa, 0x2e17), WRITE_COEF(0xab, 0xa0c0), WRITE_COEF(0xac,    0x0),
6860         WRITE_COEF(0xad,    0x0), WRITE_COEF(0xae, 0x2ac6), WRITE_COEF(0xaf, 0xa480),
6861         WRITE_COEF(0xb0,    0x0), WRITE_COEF(0xb1,    0x0), WRITE_COEF(0xb2,    0x0),
6862         WRITE_COEF(0xb3,    0x0), WRITE_COEF(0xb4,    0x0), WRITE_COEF(0xb5, 0x1040),
6863         WRITE_COEF(0xb6, 0xd697), WRITE_COEF(0xb7, 0x902b), WRITE_COEF(0xb8, 0xd697),
6864         WRITE_COEF(0xb9, 0x902b), WRITE_COEF(0xba, 0xb8ba), WRITE_COEF(0xbb, 0xaaab),
6865         WRITE_COEF(0xbc, 0xaaaf), WRITE_COEF(0xbd, 0x6aaa), WRITE_COEF(0xbe, 0x1c02),
6866         WRITE_COEF(0xc0, 0x00ff), WRITE_COEF(0xc1, 0x0fa6),
6867         {}
6868 };
6869
6870 static void alc668_restore_default_value(struct hda_codec *codec)
6871 {
6872         alc_process_coef_fw(codec, alc668_coefs);
6873 }
6874
6875 enum {
6876         ALC662_FIXUP_ASPIRE,
6877         ALC662_FIXUP_LED_GPIO1,
6878         ALC662_FIXUP_IDEAPAD,
6879         ALC272_FIXUP_MARIO,
6880         ALC662_FIXUP_CZC_P10T,
6881         ALC662_FIXUP_SKU_IGNORE,
6882         ALC662_FIXUP_HP_RP5800,
6883         ALC662_FIXUP_ASUS_MODE1,
6884         ALC662_FIXUP_ASUS_MODE2,
6885         ALC662_FIXUP_ASUS_MODE3,
6886         ALC662_FIXUP_ASUS_MODE4,
6887         ALC662_FIXUP_ASUS_MODE5,
6888         ALC662_FIXUP_ASUS_MODE6,
6889         ALC662_FIXUP_ASUS_MODE7,
6890         ALC662_FIXUP_ASUS_MODE8,
6891         ALC662_FIXUP_NO_JACK_DETECT,
6892         ALC662_FIXUP_ZOTAC_Z68,
6893         ALC662_FIXUP_INV_DMIC,
6894         ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
6895         ALC668_FIXUP_DELL_MIC_NO_PRESENCE,
6896         ALC662_FIXUP_HEADSET_MODE,
6897         ALC668_FIXUP_HEADSET_MODE,
6898         ALC662_FIXUP_BASS_MODE4_CHMAP,
6899         ALC662_FIXUP_BASS_16,
6900         ALC662_FIXUP_BASS_1A,
6901         ALC662_FIXUP_BASS_CHMAP,
6902         ALC668_FIXUP_AUTO_MUTE,
6903         ALC668_FIXUP_DELL_DISABLE_AAMIX,
6904         ALC668_FIXUP_DELL_XPS13,
6905         ALC662_FIXUP_ASUS_Nx50,
6906         ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
6907         ALC668_FIXUP_ASUS_Nx51,
6908         ALC891_FIXUP_HEADSET_MODE,
6909         ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
6910         ALC662_FIXUP_ACER_VERITON,
6911         ALC892_FIXUP_ASROCK_MOBO,
6912         ALC662_FIXUP_USI_FUNC,
6913         ALC662_FIXUP_USI_HEADSET_MODE,
6914         ALC662_FIXUP_LENOVO_MULTI_CODECS,
6915 };
6916
6917 static const struct hda_fixup alc662_fixups[] = {
6918         [ALC662_FIXUP_ASPIRE] = {
6919                 .type = HDA_FIXUP_PINS,
6920                 .v.pins = (const struct hda_pintbl[]) {
6921                         { 0x15, 0x99130112 }, /* subwoofer */
6922                         { }
6923                 }
6924         },
6925         [ALC662_FIXUP_LED_GPIO1] = {
6926                 .type = HDA_FIXUP_FUNC,
6927                 .v.func = alc662_fixup_led_gpio1,
6928         },
6929         [ALC662_FIXUP_IDEAPAD] = {
6930                 .type = HDA_FIXUP_PINS,
6931                 .v.pins = (const struct hda_pintbl[]) {
6932                         { 0x17, 0x99130112 }, /* subwoofer */
6933                         { }
6934                 },
6935                 .chained = true,
6936                 .chain_id = ALC662_FIXUP_LED_GPIO1,
6937         },
6938         [ALC272_FIXUP_MARIO] = {
6939                 .type = HDA_FIXUP_FUNC,
6940                 .v.func = alc272_fixup_mario,
6941         },
6942         [ALC662_FIXUP_CZC_P10T] = {
6943                 .type = HDA_FIXUP_VERBS,
6944                 .v.verbs = (const struct hda_verb[]) {
6945                         {0x14, AC_VERB_SET_EAPD_BTLENABLE, 0},
6946                         {}
6947                 }
6948         },
6949         [ALC662_FIXUP_SKU_IGNORE] = {
6950                 .type = HDA_FIXUP_FUNC,
6951                 .v.func = alc_fixup_sku_ignore,
6952         },
6953         [ALC662_FIXUP_HP_RP5800] = {
6954                 .type = HDA_FIXUP_PINS,
6955                 .v.pins = (const struct hda_pintbl[]) {
6956                         { 0x14, 0x0221201f }, /* HP out */
6957                         { }
6958                 },
6959                 .chained = true,
6960                 .chain_id = ALC662_FIXUP_SKU_IGNORE
6961         },
6962         [ALC662_FIXUP_ASUS_MODE1] = {
6963                 .type = HDA_FIXUP_PINS,
6964                 .v.pins = (const struct hda_pintbl[]) {
6965                         { 0x14, 0x99130110 }, /* speaker */
6966                         { 0x18, 0x01a19c20 }, /* mic */
6967                         { 0x19, 0x99a3092f }, /* int-mic */
6968                         { 0x21, 0x0121401f }, /* HP out */
6969                         { }
6970                 },
6971                 .chained = true,
6972                 .chain_id = ALC662_FIXUP_SKU_IGNORE
6973         },
6974         [ALC662_FIXUP_ASUS_MODE2] = {
6975                 .type = HDA_FIXUP_PINS,
6976                 .v.pins = (const struct hda_pintbl[]) {
6977                         { 0x14, 0x99130110 }, /* speaker */
6978                         { 0x18, 0x01a19820 }, /* mic */
6979                         { 0x19, 0x99a3092f }, /* int-mic */
6980                         { 0x1b, 0x0121401f }, /* HP out */
6981                         { }
6982                 },
6983                 .chained = true,
6984                 .chain_id = ALC662_FIXUP_SKU_IGNORE
6985         },
6986         [ALC662_FIXUP_ASUS_MODE3] = {
6987                 .type = HDA_FIXUP_PINS,
6988                 .v.pins = (const struct hda_pintbl[]) {
6989                         { 0x14, 0x99130110 }, /* speaker */
6990                         { 0x15, 0x0121441f }, /* HP */
6991                         { 0x18, 0x01a19840 }, /* mic */
6992                         { 0x19, 0x99a3094f }, /* int-mic */
6993                         { 0x21, 0x01211420 }, /* HP2 */
6994                         { }
6995                 },
6996                 .chained = true,
6997                 .chain_id = ALC662_FIXUP_SKU_IGNORE
6998         },
6999         [ALC662_FIXUP_ASUS_MODE4] = {
7000                 .type = HDA_FIXUP_PINS,
7001                 .v.pins = (const struct hda_pintbl[]) {
7002                         { 0x14, 0x99130110 }, /* speaker */
7003                         { 0x16, 0x99130111 }, /* speaker */
7004                         { 0x18, 0x01a19840 }, /* mic */
7005                         { 0x19, 0x99a3094f }, /* int-mic */
7006                         { 0x21, 0x0121441f }, /* HP */
7007                         { }
7008                 },
7009                 .chained = true,
7010                 .chain_id = ALC662_FIXUP_SKU_IGNORE
7011         },
7012         [ALC662_FIXUP_ASUS_MODE5] = {
7013                 .type = HDA_FIXUP_PINS,
7014                 .v.pins = (const struct hda_pintbl[]) {
7015                         { 0x14, 0x99130110 }, /* speaker */
7016                         { 0x15, 0x0121441f }, /* HP */
7017                         { 0x16, 0x99130111 }, /* speaker */
7018                         { 0x18, 0x01a19840 }, /* mic */
7019                         { 0x19, 0x99a3094f }, /* int-mic */
7020                         { }
7021                 },
7022                 .chained = true,
7023                 .chain_id = ALC662_FIXUP_SKU_IGNORE
7024         },
7025         [ALC662_FIXUP_ASUS_MODE6] = {
7026                 .type = HDA_FIXUP_PINS,
7027                 .v.pins = (const struct hda_pintbl[]) {
7028                         { 0x14, 0x99130110 }, /* speaker */
7029                         { 0x15, 0x01211420 }, /* HP2 */
7030                         { 0x18, 0x01a19840 }, /* mic */
7031                         { 0x19, 0x99a3094f }, /* int-mic */
7032                         { 0x1b, 0x0121441f }, /* HP */
7033                         { }
7034                 },
7035                 .chained = true,
7036                 .chain_id = ALC662_FIXUP_SKU_IGNORE
7037         },
7038         [ALC662_FIXUP_ASUS_MODE7] = {
7039                 .type = HDA_FIXUP_PINS,
7040                 .v.pins = (const struct hda_pintbl[]) {
7041                         { 0x14, 0x99130110 }, /* speaker */
7042                         { 0x17, 0x99130111 }, /* speaker */
7043                         { 0x18, 0x01a19840 }, /* mic */
7044                         { 0x19, 0x99a3094f }, /* int-mic */
7045                         { 0x1b, 0x01214020 }, /* HP */
7046                         { 0x21, 0x0121401f }, /* HP */
7047                         { }
7048                 },
7049                 .chained = true,
7050                 .chain_id = ALC662_FIXUP_SKU_IGNORE
7051         },
7052         [ALC662_FIXUP_ASUS_MODE8] = {
7053                 .type = HDA_FIXUP_PINS,
7054                 .v.pins = (const struct hda_pintbl[]) {
7055                         { 0x14, 0x99130110 }, /* speaker */
7056                         { 0x12, 0x99a30970 }, /* int-mic */
7057                         { 0x15, 0x01214020 }, /* HP */
7058                         { 0x17, 0x99130111 }, /* speaker */
7059                         { 0x18, 0x01a19840 }, /* mic */
7060                         { 0x21, 0x0121401f }, /* HP */
7061                         { }
7062                 },
7063                 .chained = true,
7064                 .chain_id = ALC662_FIXUP_SKU_IGNORE
7065         },
7066         [ALC662_FIXUP_NO_JACK_DETECT] = {
7067                 .type = HDA_FIXUP_FUNC,
7068                 .v.func = alc_fixup_no_jack_detect,
7069         },
7070         [ALC662_FIXUP_ZOTAC_Z68] = {
7071                 .type = HDA_FIXUP_PINS,
7072                 .v.pins = (const struct hda_pintbl[]) {
7073                         { 0x1b, 0x02214020 }, /* Front HP */
7074                         { }
7075                 }
7076         },
7077         [ALC662_FIXUP_INV_DMIC] = {
7078                 .type = HDA_FIXUP_FUNC,
7079                 .v.func = alc_fixup_inv_dmic,
7080         },
7081         [ALC668_FIXUP_DELL_XPS13] = {
7082                 .type = HDA_FIXUP_FUNC,
7083                 .v.func = alc_fixup_dell_xps13,
7084                 .chained = true,
7085                 .chain_id = ALC668_FIXUP_DELL_DISABLE_AAMIX
7086         },
7087         [ALC668_FIXUP_DELL_DISABLE_AAMIX] = {
7088                 .type = HDA_FIXUP_FUNC,
7089                 .v.func = alc_fixup_disable_aamix,
7090                 .chained = true,
7091                 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
7092         },
7093         [ALC668_FIXUP_AUTO_MUTE] = {
7094                 .type = HDA_FIXUP_FUNC,
7095                 .v.func = alc_fixup_auto_mute_via_amp,
7096                 .chained = true,
7097                 .chain_id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE
7098         },
7099         [ALC662_FIXUP_DELL_MIC_NO_PRESENCE] = {
7100                 .type = HDA_FIXUP_PINS,
7101                 .v.pins = (const struct hda_pintbl[]) {
7102                         { 0x19, 0x03a1113c }, /* use as headset mic, without its own jack detect */
7103                         /* headphone mic by setting pin control of 0x1b (headphone out) to in + vref_50 */
7104                         { }
7105                 },
7106                 .chained = true,
7107                 .chain_id = ALC662_FIXUP_HEADSET_MODE
7108         },
7109         [ALC662_FIXUP_HEADSET_MODE] = {
7110                 .type = HDA_FIXUP_FUNC,
7111                 .v.func = alc_fixup_headset_mode_alc662,
7112         },
7113         [ALC668_FIXUP_DELL_MIC_NO_PRESENCE] = {
7114                 .type = HDA_FIXUP_PINS,
7115                 .v.pins = (const struct hda_pintbl[]) {
7116                         { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
7117                         { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
7118                         { }
7119                 },
7120                 .chained = true,
7121                 .chain_id = ALC668_FIXUP_HEADSET_MODE
7122         },
7123         [ALC668_FIXUP_HEADSET_MODE] = {
7124                 .type = HDA_FIXUP_FUNC,
7125                 .v.func = alc_fixup_headset_mode_alc668,
7126         },
7127         [ALC662_FIXUP_BASS_MODE4_CHMAP] = {
7128                 .type = HDA_FIXUP_FUNC,
7129                 .v.func = alc_fixup_bass_chmap,
7130                 .chained = true,
7131                 .chain_id = ALC662_FIXUP_ASUS_MODE4
7132         },
7133         [ALC662_FIXUP_BASS_16] = {
7134                 .type = HDA_FIXUP_PINS,
7135                 .v.pins = (const struct hda_pintbl[]) {
7136                         {0x16, 0x80106111}, /* bass speaker */
7137                         {}
7138                 },
7139                 .chained = true,
7140                 .chain_id = ALC662_FIXUP_BASS_CHMAP,
7141         },
7142         [ALC662_FIXUP_BASS_1A] = {
7143                 .type = HDA_FIXUP_PINS,
7144                 .v.pins = (const struct hda_pintbl[]) {
7145                         {0x1a, 0x80106111}, /* bass speaker */
7146                         {}
7147                 },
7148                 .chained = true,
7149                 .chain_id = ALC662_FIXUP_BASS_CHMAP,
7150         },
7151         [ALC662_FIXUP_BASS_CHMAP] = {
7152                 .type = HDA_FIXUP_FUNC,
7153                 .v.func = alc_fixup_bass_chmap,
7154         },
7155         [ALC662_FIXUP_ASUS_Nx50] = {
7156                 .type = HDA_FIXUP_FUNC,
7157                 .v.func = alc_fixup_auto_mute_via_amp,
7158                 .chained = true,
7159                 .chain_id = ALC662_FIXUP_BASS_1A
7160         },
7161         [ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE] = {
7162                 .type = HDA_FIXUP_FUNC,
7163                 .v.func = alc_fixup_headset_mode_alc668,
7164                 .chain_id = ALC662_FIXUP_BASS_CHMAP
7165         },
7166         [ALC668_FIXUP_ASUS_Nx51] = {
7167                 .type = HDA_FIXUP_PINS,
7168                 .v.pins = (const struct hda_pintbl[]) {
7169                         { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
7170                         { 0x1a, 0x90170151 }, /* bass speaker */
7171                         { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
7172                         {}
7173                 },
7174                 .chained = true,
7175                 .chain_id = ALC668_FIXUP_ASUS_Nx51_HEADSET_MODE,
7176         },
7177         [ALC891_FIXUP_HEADSET_MODE] = {
7178                 .type = HDA_FIXUP_FUNC,
7179                 .v.func = alc_fixup_headset_mode,
7180         },
7181         [ALC891_FIXUP_DELL_MIC_NO_PRESENCE] = {
7182                 .type = HDA_FIXUP_PINS,
7183                 .v.pins = (const struct hda_pintbl[]) {
7184                         { 0x19, 0x03a1913d }, /* use as headphone mic, without its own jack detect */
7185                         { 0x1b, 0x03a1113c }, /* use as headset mic, without its own jack detect */
7186                         { }
7187                 },
7188                 .chained = true,
7189                 .chain_id = ALC891_FIXUP_HEADSET_MODE
7190         },
7191         [ALC662_FIXUP_ACER_VERITON] = {
7192                 .type = HDA_FIXUP_PINS,
7193                 .v.pins = (const struct hda_pintbl[]) {
7194                         { 0x15, 0x50170120 }, /* no internal speaker */
7195                         { }
7196                 }
7197         },
7198         [ALC892_FIXUP_ASROCK_MOBO] = {
7199                 .type = HDA_FIXUP_PINS,
7200                 .v.pins = (const struct hda_pintbl[]) {
7201                         { 0x15, 0x40f000f0 }, /* disabled */
7202                         { 0x16, 0x40f000f0 }, /* disabled */
7203                         { }
7204                 }
7205         },
7206         [ALC662_FIXUP_USI_FUNC] = {
7207                 .type = HDA_FIXUP_FUNC,
7208                 .v.func = alc662_fixup_usi_headset_mic,
7209         },
7210         [ALC662_FIXUP_USI_HEADSET_MODE] = {
7211                 .type = HDA_FIXUP_PINS,
7212                 .v.pins = (const struct hda_pintbl[]) {
7213                         { 0x19, 0x02a1913c }, /* use as headset mic, without its own jack detect */
7214                         { 0x18, 0x01a1903d },
7215                         { }
7216                 },
7217                 .chained = true,
7218                 .chain_id = ALC662_FIXUP_USI_FUNC
7219         },
7220         [ALC662_FIXUP_LENOVO_MULTI_CODECS] = {
7221                 .type = HDA_FIXUP_FUNC,
7222                 .v.func = alc233_alc662_fixup_lenovo_dual_codecs,
7223         },
7224 };
7225
7226 static const struct snd_pci_quirk alc662_fixup_tbl[] = {
7227         SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2),
7228         SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC),
7229         SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", ALC662_FIXUP_INV_DMIC),
7230         SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
7231         SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
7232         SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC),
7233         SND_PCI_QUIRK(0x1025, 0x034a, "Gateway LT27", ALC662_FIXUP_INV_DMIC),
7234         SND_PCI_QUIRK(0x1025, 0x038b, "Acer Aspire 8943G", ALC662_FIXUP_ASPIRE),
7235         SND_PCI_QUIRK(0x1028, 0x05d8, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
7236         SND_PCI_QUIRK(0x1028, 0x05db, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
7237         SND_PCI_QUIRK(0x1028, 0x05fe, "Dell XPS 15", ALC668_FIXUP_DELL_XPS13),
7238         SND_PCI_QUIRK(0x1028, 0x060a, "Dell XPS 13", ALC668_FIXUP_DELL_XPS13),
7239         SND_PCI_QUIRK(0x1028, 0x060d, "Dell M3800", ALC668_FIXUP_DELL_XPS13),
7240         SND_PCI_QUIRK(0x1028, 0x0625, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
7241         SND_PCI_QUIRK(0x1028, 0x0626, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
7242         SND_PCI_QUIRK(0x1028, 0x0696, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
7243         SND_PCI_QUIRK(0x1028, 0x0698, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
7244         SND_PCI_QUIRK(0x1028, 0x069f, "Dell", ALC668_FIXUP_DELL_MIC_NO_PRESENCE),
7245         SND_PCI_QUIRK(0x103c, 0x1632, "HP RP5800", ALC662_FIXUP_HP_RP5800),
7246         SND_PCI_QUIRK(0x1043, 0x1080, "Asus UX501VW", ALC668_FIXUP_HEADSET_MODE),
7247         SND_PCI_QUIRK(0x1043, 0x11cd, "Asus N550", ALC662_FIXUP_ASUS_Nx50),
7248         SND_PCI_QUIRK(0x1043, 0x13df, "Asus N550JX", ALC662_FIXUP_BASS_1A),
7249         SND_PCI_QUIRK(0x1043, 0x129d, "Asus N750", ALC662_FIXUP_ASUS_Nx50),
7250         SND_PCI_QUIRK(0x1043, 0x1477, "ASUS N56VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
7251         SND_PCI_QUIRK(0x1043, 0x15a7, "ASUS UX51VZH", ALC662_FIXUP_BASS_16),
7252         SND_PCI_QUIRK(0x1043, 0x177d, "ASUS N551", ALC668_FIXUP_ASUS_Nx51),
7253         SND_PCI_QUIRK(0x1043, 0x17bd, "ASUS N751", ALC668_FIXUP_ASUS_Nx51),
7254         SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71SL", ALC662_FIXUP_ASUS_MODE8),
7255         SND_PCI_QUIRK(0x1043, 0x1b73, "ASUS N55SF", ALC662_FIXUP_BASS_16),
7256         SND_PCI_QUIRK(0x1043, 0x1bf3, "ASUS N76VZ", ALC662_FIXUP_BASS_MODE4_CHMAP),
7257         SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
7258         SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
7259         SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
7260         SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE),
7261         SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC662_FIXUP_LENOVO_MULTI_CODECS),
7262         SND_PCI_QUIRK(0x17aa, 0x38af, "Lenovo Ideapad Y550P", ALC662_FIXUP_IDEAPAD),
7263         SND_PCI_QUIRK(0x17aa, 0x3a0d, "Lenovo Ideapad Y550", ALC662_FIXUP_IDEAPAD),
7264         SND_PCI_QUIRK(0x1849, 0x5892, "ASRock B150M", ALC892_FIXUP_ASROCK_MOBO),
7265         SND_PCI_QUIRK(0x19da, 0xa130, "Zotac Z68", ALC662_FIXUP_ZOTAC_Z68),
7266         SND_PCI_QUIRK(0x1b0a, 0x01b8, "ACER Veriton", ALC662_FIXUP_ACER_VERITON),
7267         SND_PCI_QUIRK(0x1b35, 0x2206, "CZC P10T", ALC662_FIXUP_CZC_P10T),
7268
7269 #if 0
7270         /* Below is a quirk table taken from the old code.
7271          * Basically the device should work as is without the fixup table.
7272          * If BIOS doesn't give a proper info, enable the corresponding
7273          * fixup entry.
7274          */
7275         SND_PCI_QUIRK(0x1043, 0x1000, "ASUS N50Vm", ALC662_FIXUP_ASUS_MODE1),
7276         SND_PCI_QUIRK(0x1043, 0x1092, "ASUS NB", ALC662_FIXUP_ASUS_MODE3),
7277         SND_PCI_QUIRK(0x1043, 0x1173, "ASUS K73Jn", ALC662_FIXUP_ASUS_MODE1),
7278         SND_PCI_QUIRK(0x1043, 0x11c3, "ASUS M70V", ALC662_FIXUP_ASUS_MODE3),
7279         SND_PCI_QUIRK(0x1043, 0x11d3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
7280         SND_PCI_QUIRK(0x1043, 0x11f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
7281         SND_PCI_QUIRK(0x1043, 0x1203, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
7282         SND_PCI_QUIRK(0x1043, 0x1303, "ASUS G60J", ALC662_FIXUP_ASUS_MODE1),
7283         SND_PCI_QUIRK(0x1043, 0x1333, "ASUS G60Jx", ALC662_FIXUP_ASUS_MODE1),
7284         SND_PCI_QUIRK(0x1043, 0x1339, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
7285         SND_PCI_QUIRK(0x1043, 0x13e3, "ASUS N71JA", ALC662_FIXUP_ASUS_MODE7),
7286         SND_PCI_QUIRK(0x1043, 0x1463, "ASUS N71", ALC662_FIXUP_ASUS_MODE7),
7287         SND_PCI_QUIRK(0x1043, 0x14d3, "ASUS G72", ALC662_FIXUP_ASUS_MODE8),
7288         SND_PCI_QUIRK(0x1043, 0x1563, "ASUS N90", ALC662_FIXUP_ASUS_MODE3),
7289         SND_PCI_QUIRK(0x1043, 0x15d3, "ASUS N50SF F50SF", ALC662_FIXUP_ASUS_MODE1),
7290         SND_PCI_QUIRK(0x1043, 0x16c3, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
7291         SND_PCI_QUIRK(0x1043, 0x16f3, "ASUS K40C K50C", ALC662_FIXUP_ASUS_MODE2),
7292         SND_PCI_QUIRK(0x1043, 0x1733, "ASUS N81De", ALC662_FIXUP_ASUS_MODE1),
7293         SND_PCI_QUIRK(0x1043, 0x1753, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
7294         SND_PCI_QUIRK(0x1043, 0x1763, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
7295         SND_PCI_QUIRK(0x1043, 0x1765, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
7296         SND_PCI_QUIRK(0x1043, 0x1783, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
7297         SND_PCI_QUIRK(0x1043, 0x1793, "ASUS F50GX", ALC662_FIXUP_ASUS_MODE1),
7298         SND_PCI_QUIRK(0x1043, 0x17b3, "ASUS F70SL", ALC662_FIXUP_ASUS_MODE3),
7299         SND_PCI_QUIRK(0x1043, 0x17f3, "ASUS X58LE", ALC662_FIXUP_ASUS_MODE2),
7300         SND_PCI_QUIRK(0x1043, 0x1813, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
7301         SND_PCI_QUIRK(0x1043, 0x1823, "ASUS NB", ALC662_FIXUP_ASUS_MODE5),
7302         SND_PCI_QUIRK(0x1043, 0x1833, "ASUS NB", ALC662_FIXUP_ASUS_MODE6),
7303         SND_PCI_QUIRK(0x1043, 0x1843, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
7304         SND_PCI_QUIRK(0x1043, 0x1853, "ASUS F50Z", ALC662_FIXUP_ASUS_MODE1),
7305         SND_PCI_QUIRK(0x1043, 0x1864, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
7306         SND_PCI_QUIRK(0x1043, 0x1876, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
7307         SND_PCI_QUIRK(0x1043, 0x1893, "ASUS M50Vm", ALC662_FIXUP_ASUS_MODE3),
7308         SND_PCI_QUIRK(0x1043, 0x1894, "ASUS X55", ALC662_FIXUP_ASUS_MODE3),
7309         SND_PCI_QUIRK(0x1043, 0x18b3, "ASUS N80Vc", ALC662_FIXUP_ASUS_MODE1),
7310         SND_PCI_QUIRK(0x1043, 0x18c3, "ASUS VX5", ALC662_FIXUP_ASUS_MODE1),
7311         SND_PCI_QUIRK(0x1043, 0x18d3, "ASUS N81Te", ALC662_FIXUP_ASUS_MODE1),
7312         SND_PCI_QUIRK(0x1043, 0x18f3, "ASUS N505Tp", ALC662_FIXUP_ASUS_MODE1),
7313         SND_PCI_QUIRK(0x1043, 0x1903, "ASUS F5GL", ALC662_FIXUP_ASUS_MODE1),
7314         SND_PCI_QUIRK(0x1043, 0x1913, "ASUS NB", ALC662_FIXUP_ASUS_MODE2),
7315         SND_PCI_QUIRK(0x1043, 0x1933, "ASUS F80Q", ALC662_FIXUP_ASUS_MODE2),
7316         SND_PCI_QUIRK(0x1043, 0x1943, "ASUS Vx3V", ALC662_FIXUP_ASUS_MODE1),
7317         SND_PCI_QUIRK(0x1043, 0x1953, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
7318         SND_PCI_QUIRK(0x1043, 0x1963, "ASUS X71C", ALC662_FIXUP_ASUS_MODE3),
7319         SND_PCI_QUIRK(0x1043, 0x1983, "ASUS N5051A", ALC662_FIXUP_ASUS_MODE1),
7320         SND_PCI_QUIRK(0x1043, 0x1993, "ASUS N20", ALC662_FIXUP_ASUS_MODE1),
7321         SND_PCI_QUIRK(0x1043, 0x19b3, "ASUS F7Z", ALC662_FIXUP_ASUS_MODE1),
7322         SND_PCI_QUIRK(0x1043, 0x19c3, "ASUS F5Z/F6x", ALC662_FIXUP_ASUS_MODE2),
7323         SND_PCI_QUIRK(0x1043, 0x19e3, "ASUS NB", ALC662_FIXUP_ASUS_MODE1),
7324         SND_PCI_QUIRK(0x1043, 0x19f3, "ASUS NB", ALC662_FIXUP_ASUS_MODE4),
7325 #endif
7326         {}
7327 };
7328
7329 static const struct hda_model_fixup alc662_fixup_models[] = {
7330         {.id = ALC272_FIXUP_MARIO, .name = "mario"},
7331         {.id = ALC662_FIXUP_ASUS_MODE1, .name = "asus-mode1"},
7332         {.id = ALC662_FIXUP_ASUS_MODE2, .name = "asus-mode2"},
7333         {.id = ALC662_FIXUP_ASUS_MODE3, .name = "asus-mode3"},
7334         {.id = ALC662_FIXUP_ASUS_MODE4, .name = "asus-mode4"},
7335         {.id = ALC662_FIXUP_ASUS_MODE5, .name = "asus-mode5"},
7336         {.id = ALC662_FIXUP_ASUS_MODE6, .name = "asus-mode6"},
7337         {.id = ALC662_FIXUP_ASUS_MODE7, .name = "asus-mode7"},
7338         {.id = ALC662_FIXUP_ASUS_MODE8, .name = "asus-mode8"},
7339         {.id = ALC662_FIXUP_INV_DMIC, .name = "inv-dmic"},
7340         {.id = ALC668_FIXUP_DELL_MIC_NO_PRESENCE, .name = "dell-headset-multi"},
7341         {}
7342 };
7343
7344 static const struct snd_hda_pin_quirk alc662_pin_fixup_tbl[] = {
7345         SND_HDA_PIN_QUIRK(0x10ec0867, 0x1028, "Dell", ALC891_FIXUP_DELL_MIC_NO_PRESENCE,
7346                 {0x17, 0x02211010},
7347                 {0x18, 0x01a19030},
7348                 {0x1a, 0x01813040},
7349                 {0x21, 0x01014020}),
7350         SND_HDA_PIN_QUIRK(0x10ec0662, 0x1028, "Dell", ALC662_FIXUP_DELL_MIC_NO_PRESENCE,
7351                 {0x14, 0x01014010},
7352                 {0x18, 0x01a19020},
7353                 {0x1a, 0x0181302f},
7354                 {0x1b, 0x0221401f}),
7355         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
7356                 {0x12, 0x99a30130},
7357                 {0x14, 0x90170110},
7358                 {0x15, 0x0321101f},
7359                 {0x16, 0x03011020}),
7360         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
7361                 {0x12, 0x99a30140},
7362                 {0x14, 0x90170110},
7363                 {0x15, 0x0321101f},
7364                 {0x16, 0x03011020}),
7365         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
7366                 {0x12, 0x99a30150},
7367                 {0x14, 0x90170110},
7368                 {0x15, 0x0321101f},
7369                 {0x16, 0x03011020}),
7370         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell", ALC668_FIXUP_AUTO_MUTE,
7371                 {0x14, 0x90170110},
7372                 {0x15, 0x0321101f},
7373                 {0x16, 0x03011020}),
7374         SND_HDA_PIN_QUIRK(0x10ec0668, 0x1028, "Dell XPS 15", ALC668_FIXUP_AUTO_MUTE,
7375                 {0x12, 0x90a60130},
7376                 {0x14, 0x90170110},
7377                 {0x15, 0x0321101f}),
7378         {}
7379 };
7380
7381 /*
7382  */
7383 static int patch_alc662(struct hda_codec *codec)
7384 {
7385         struct alc_spec *spec;
7386         int err;
7387
7388         err = alc_alloc_spec(codec, 0x0b);
7389         if (err < 0)
7390                 return err;
7391
7392         spec = codec->spec;
7393
7394         spec->shutup = alc_eapd_shutup;
7395
7396         /* handle multiple HPs as is */
7397         spec->parse_flags = HDA_PINCFG_NO_HP_FIXUP;
7398
7399         alc_fix_pll_init(codec, 0x20, 0x04, 15);
7400
7401         switch (codec->core.vendor_id) {
7402         case 0x10ec0668:
7403                 spec->init_hook = alc668_restore_default_value;
7404                 break;
7405         }
7406
7407         snd_hda_pick_fixup(codec, alc662_fixup_models,
7408                        alc662_fixup_tbl, alc662_fixups);
7409         snd_hda_pick_pin_fixup(codec, alc662_pin_fixup_tbl, alc662_fixups);
7410         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PRE_PROBE);
7411
7412         alc_auto_parse_customize_define(codec);
7413
7414         if (has_cdefine_beep(codec))
7415                 spec->gen.beep_nid = 0x01;
7416
7417         if ((alc_get_coef0(codec) & (1 << 14)) &&
7418             codec->bus->pci && codec->bus->pci->subsystem_vendor == 0x1025 &&
7419             spec->cdefine.platform_type == 1) {
7420                 err = alc_codec_rename(codec, "ALC272X");
7421                 if (err < 0)
7422                         goto error;
7423         }
7424
7425         /* automatic parse from the BIOS config */
7426         err = alc662_parse_auto_config(codec);
7427         if (err < 0)
7428                 goto error;
7429
7430         if (!spec->gen.no_analog && spec->gen.beep_nid) {
7431                 switch (codec->core.vendor_id) {
7432                 case 0x10ec0662:
7433                         set_beep_amp(spec, 0x0b, 0x05, HDA_INPUT);
7434                         break;
7435                 case 0x10ec0272:
7436                 case 0x10ec0663:
7437                 case 0x10ec0665:
7438                 case 0x10ec0668:
7439                         set_beep_amp(spec, 0x0b, 0x04, HDA_INPUT);
7440                         break;
7441                 case 0x10ec0273:
7442                         set_beep_amp(spec, 0x0b, 0x03, HDA_INPUT);
7443                         break;
7444                 }
7445         }
7446
7447         snd_hda_apply_fixup(codec, HDA_FIXUP_ACT_PROBE);
7448
7449         return 0;
7450
7451  error:
7452         alc_free(codec);
7453         return err;
7454 }
7455
7456 /*
7457  * ALC680 support
7458  */
7459
7460 static int alc680_parse_auto_config(struct hda_codec *codec)
7461 {
7462         return alc_parse_auto_config(codec, NULL, NULL);
7463 }
7464
7465 /*
7466  */
7467 static int patch_alc680(struct hda_codec *codec)
7468 {
7469         int err;
7470
7471         /* ALC680 has no aa-loopback mixer */
7472         err = alc_alloc_spec(codec, 0);
7473         if (err < 0)
7474                 return err;
7475
7476         /* automatic parse from the BIOS config */
7477         err = alc680_parse_auto_config(codec);
7478         if (err < 0) {
7479                 alc_free(codec);
7480                 return err;
7481         }
7482
7483         return 0;
7484 }
7485
7486 /*
7487  * patch entries
7488  */
7489 static const struct hda_device_id snd_hda_id_realtek[] = {
7490         HDA_CODEC_ENTRY(0x10ec0221, "ALC221", patch_alc269),
7491         HDA_CODEC_ENTRY(0x10ec0225, "ALC225", patch_alc269),
7492         HDA_CODEC_ENTRY(0x10ec0231, "ALC231", patch_alc269),
7493         HDA_CODEC_ENTRY(0x10ec0233, "ALC233", patch_alc269),
7494         HDA_CODEC_ENTRY(0x10ec0234, "ALC234", patch_alc269),
7495         HDA_CODEC_ENTRY(0x10ec0235, "ALC233", patch_alc269),
7496         HDA_CODEC_ENTRY(0x10ec0255, "ALC255", patch_alc269),
7497         HDA_CODEC_ENTRY(0x10ec0256, "ALC256", patch_alc269),
7498         HDA_CODEC_ENTRY(0x10ec0260, "ALC260", patch_alc260),
7499         HDA_CODEC_ENTRY(0x10ec0262, "ALC262", patch_alc262),
7500         HDA_CODEC_ENTRY(0x10ec0267, "ALC267", patch_alc268),
7501         HDA_CODEC_ENTRY(0x10ec0268, "ALC268", patch_alc268),
7502         HDA_CODEC_ENTRY(0x10ec0269, "ALC269", patch_alc269),
7503         HDA_CODEC_ENTRY(0x10ec0270, "ALC270", patch_alc269),
7504         HDA_CODEC_ENTRY(0x10ec0272, "ALC272", patch_alc662),
7505         HDA_CODEC_ENTRY(0x10ec0274, "ALC274", patch_alc269),
7506         HDA_CODEC_ENTRY(0x10ec0275, "ALC275", patch_alc269),
7507         HDA_CODEC_ENTRY(0x10ec0276, "ALC276", patch_alc269),
7508         HDA_CODEC_ENTRY(0x10ec0280, "ALC280", patch_alc269),
7509         HDA_CODEC_ENTRY(0x10ec0282, "ALC282", patch_alc269),
7510         HDA_CODEC_ENTRY(0x10ec0283, "ALC283", patch_alc269),
7511         HDA_CODEC_ENTRY(0x10ec0284, "ALC284", patch_alc269),
7512         HDA_CODEC_ENTRY(0x10ec0285, "ALC285", patch_alc269),
7513         HDA_CODEC_ENTRY(0x10ec0286, "ALC286", patch_alc269),
7514         HDA_CODEC_ENTRY(0x10ec0288, "ALC288", patch_alc269),
7515         HDA_CODEC_ENTRY(0x10ec0290, "ALC290", patch_alc269),
7516         HDA_CODEC_ENTRY(0x10ec0292, "ALC292", patch_alc269),
7517         HDA_CODEC_ENTRY(0x10ec0293, "ALC293", patch_alc269),
7518         HDA_CODEC_ENTRY(0x10ec0294, "ALC294", patch_alc269),
7519         HDA_CODEC_ENTRY(0x10ec0295, "ALC295", patch_alc269),
7520         HDA_CODEC_ENTRY(0x10ec0298, "ALC298", patch_alc269),
7521         HDA_CODEC_ENTRY(0x10ec0299, "ALC299", patch_alc269),
7522         HDA_CODEC_REV_ENTRY(0x10ec0861, 0x100340, "ALC660", patch_alc861),
7523         HDA_CODEC_ENTRY(0x10ec0660, "ALC660-VD", patch_alc861vd),
7524         HDA_CODEC_ENTRY(0x10ec0861, "ALC861", patch_alc861),
7525         HDA_CODEC_ENTRY(0x10ec0862, "ALC861-VD", patch_alc861vd),
7526         HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100002, "ALC662 rev2", patch_alc882),
7527         HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100101, "ALC662 rev1", patch_alc662),
7528         HDA_CODEC_REV_ENTRY(0x10ec0662, 0x100300, "ALC662 rev3", patch_alc662),
7529         HDA_CODEC_ENTRY(0x10ec0663, "ALC663", patch_alc662),
7530         HDA_CODEC_ENTRY(0x10ec0665, "ALC665", patch_alc662),
7531         HDA_CODEC_ENTRY(0x10ec0667, "ALC667", patch_alc662),
7532         HDA_CODEC_ENTRY(0x10ec0668, "ALC668", patch_alc662),
7533         HDA_CODEC_ENTRY(0x10ec0670, "ALC670", patch_alc662),
7534         HDA_CODEC_ENTRY(0x10ec0671, "ALC671", patch_alc662),
7535         HDA_CODEC_ENTRY(0x10ec0680, "ALC680", patch_alc680),
7536         HDA_CODEC_ENTRY(0x10ec0700, "ALC700", patch_alc269),
7537         HDA_CODEC_ENTRY(0x10ec0701, "ALC701", patch_alc269),
7538         HDA_CODEC_ENTRY(0x10ec0703, "ALC703", patch_alc269),
7539         HDA_CODEC_ENTRY(0x10ec0867, "ALC891", patch_alc662),
7540         HDA_CODEC_ENTRY(0x10ec0880, "ALC880", patch_alc880),
7541         HDA_CODEC_ENTRY(0x10ec0882, "ALC882", patch_alc882),
7542         HDA_CODEC_ENTRY(0x10ec0883, "ALC883", patch_alc882),
7543         HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100101, "ALC889A", patch_alc882),
7544         HDA_CODEC_REV_ENTRY(0x10ec0885, 0x100103, "ALC889A", patch_alc882),
7545         HDA_CODEC_ENTRY(0x10ec0885, "ALC885", patch_alc882),
7546         HDA_CODEC_ENTRY(0x10ec0887, "ALC887", patch_alc882),
7547         HDA_CODEC_REV_ENTRY(0x10ec0888, 0x100101, "ALC1200", patch_alc882),
7548         HDA_CODEC_ENTRY(0x10ec0888, "ALC888", patch_alc882),
7549         HDA_CODEC_ENTRY(0x10ec0889, "ALC889", patch_alc882),
7550         HDA_CODEC_ENTRY(0x10ec0892, "ALC892", patch_alc662),
7551         HDA_CODEC_ENTRY(0x10ec0899, "ALC898", patch_alc882),
7552         HDA_CODEC_ENTRY(0x10ec0900, "ALC1150", patch_alc882),
7553         HDA_CODEC_ENTRY(0x10ec1220, "ALC1220", patch_alc882),
7554         {} /* terminator */
7555 };
7556 MODULE_DEVICE_TABLE(hdaudio, snd_hda_id_realtek);
7557
7558 MODULE_LICENSE("GPL");
7559 MODULE_DESCRIPTION("Realtek HD-audio codec");
7560
7561 static struct hda_codec_driver realtek_driver = {
7562         .id = snd_hda_id_realtek,
7563 };
7564
7565 module_hda_codec_driver(realtek_driver);