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