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