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