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