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